diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..b56e5b9c67 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# Editor config +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +max_line_length = 100 +trim_trailing_whitespace = true + +[*.{md,mdx}] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env.example b/.env.example deleted file mode 100644 index 4ce02c1a8f..0000000000 --- a/.env.example +++ /dev/null @@ -1,8 +0,0 @@ -# rename this file to .env and supply the values listed below -# also make sure they are available to the build tool (e.g. Vercel) -# warning: variables prefixed with GATSBY_ will be made available to client-side code -# be careful not to expose sensitive data (in this case your Algolia admin key) -GATSBY_ALGOLIA_APP_ID="XXX" -GATSBY_ALGOLIA_SEARCH_KEY="XXX" -GATSBY_ALGOLIA_ADMIN_API_KEY="XXX" -GATSBY_ALGOLIA_INDEX_NAME="XXX" \ No newline at end of file diff --git a/.flycode.yaml b/.flycode.yaml deleted file mode 100644 index 4e02848c07..0000000000 --- a/.flycode.yaml +++ /dev/null @@ -1,11 +0,0 @@ -version: '0.1' -environments: - - name: main - branch: main - mode: pull-request -apps: - - name: docs - path: '' - text-resources: - - path: '*.tsx' - format: react-hardcoded diff --git a/.github/workflows/image-optimise.yml b/.github/workflows/image-optimise.yml index 3f961f2618..b8fb3b3b55 100644 --- a/.github/workflows/image-optimise.yml +++ b/.github/workflows/image-optimise.yml @@ -36,7 +36,7 @@ jobs: github.event.pull_request.head.repo.full_name == github.repository) steps: - name: Checkout Branch - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Compress Images id: calibre @@ -51,7 +51,7 @@ jobs: if: | github.event_name != 'pull_request' && steps.calibre.outputs.markdown != '' - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v6.0.2 with: title: Auto Compress Images branch-suffix: timestamp diff --git a/.github/workflows/list-changed-pages.yml b/.github/workflows/list-changed-pages.yml index d5b24ed7ac..b6d4583bae 100644 --- a/.github/workflows/list-changed-pages.yml +++ b/.github/workflows/list-changed-pages.yml @@ -1,99 +1,62 @@ -name: Comment based on changed pages (Vercel Deploy URLs + Redirect Suggestions) - +name: List Changed Pages on: pull_request: + branches: + - main + - docusaurus + paths: + - 'content/**/*' jobs: - post-comment-with-links-to-changed-pages: - name: Create or Update + post-files-changed-comment: + name: 'Post files changed comment' runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Get list of changed files - id: files - uses: Ana06/get-changed-files@v1.2 # it's a fork of jitterbit/get-changed-files@v1 which works better with pull requests - - name: List Vercel Deploy URLs - id: links - # Note that this uses `%0A` instead of `\n` because of https://github.com/peter-evans/create-or-update-comment#setting-the-comment-body-from-a-file which I could not get to work here - but this brute force method does. - run: | - body="This PR changes the following pages (Vercel Preview Deploy links):%0A%0A" - no_changed_pages="%0A- This PR does not change any pages the [GH Actions workflow](https://github.com/prisma/docs/blob/main/.github/workflows/list-changed-pages.yml) could detect." - vercelLinks="Changed Vercel links" - body="$body%0A%0A$vercelLinks" - for changed_file in ${{ steps.files.outputs.all }}; do - if [[ $changed_file == content/* ]] - then - no_changed_pages="" - - cleaned_file=$(echo "$changed_file" | sed -E 's:content/:/:g' | sed -E 's:/index.mdx::g' | sed -e 's/.mdx//g' | sed -E 's:/[0-9]+-:/:g' ) - branch_name=$(echo "${{github.event.pull_request.head.ref}}" | sed -e 's/\//-/g') - # TODO special case for images and similar non .mdx files - - # Output inside the action - echo "- https://docs-git-${branch_name}-prisma.vercel.app$cleaned_file" + - uses: actions/checkout@v4 - # Also collect into string - linksVercel="%0A- [/docs$cleaned_file](https://docs-git-${branch_name}-prisma.vercel.app$cleaned_file) ([currently](https://prisma.io/docs$cleaned_file))" - body="$body$linksVercel" - fi - done - - body="$body$no_changed_pages" - body="$body%0A%0A(Note that links will only be valid after Vercel preview deploy succeeded)" - echo "::set-output name=body::$body" - - - name: Find existing comment (links) - uses: peter-evans/find-comment@v1 - id: fc + - name: Get all changed markdown files + id: changed-files + uses: tj-actions/changed-files@v44 with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: following pages + files: content/**/*.{md,mdx} - - name: Create comment (links) - if: steps.fc.outputs.comment-id == '' - uses: peter-evans/create-or-update-comment@v1 - with: - issue-number: ${{ github.event.pull_request.number }} - body: ${{ steps.links.outputs.body }} - - - name: Update comment (links) - if: steps.fc.outputs.comment-id != '' - uses: peter-evans/create-or-update-comment@v1 - with: - comment-id: ${{ steps.fc.outputs.comment-id }} - body: ${{ steps.links.outputs.body }} - edit-mode: replace - - ### REDIRECTS ### - - - name: Create suggested redirects - id: redirects + - name: Build comment body + id: build-comment-body + env: + CHANGED_FILES: ${{ steps.changed-files.outputs.any_changed }} + ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} run: | - bash .github/workflows/scripts/generate-redirects.sh - - - name: Find existing comment (redirects) + OUTPUT="" + if [ ${CHANGED_FILES} == 'true' ]; then + OUTPUT="| original | preview |%0A| ------ | ------ |%0A" + for file in ${ALL_CHANGED_FILES} + do + OUTPUT+="| ${file} | |%0A" + done + else + OUTPUT="No files changed." + fi + echo "::set-output name=body::$OUTPUT" + + - name: Find existing comment uses: peter-evans/find-comment@v1 - id: fc2 + id: find-existing with: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' - body-includes: following redirects + body-includes: 'original | preview' - - name: Create comment (redirects) - if: steps.fc2.outputs.comment-id == '' + - name: Create comment + if: steps.find-existing.outputs.comment-id == '' uses: peter-evans/create-or-update-comment@v1 with: issue-number: ${{ github.event.pull_request.number }} - body: ${{ steps.redirects.outputs.body }} + body: ${{ steps.build-comment-body.outputs.body }} - - name: Update comment (redirects) - if: steps.fc2.outputs.comment-id != '' + - name: Update comment + if: steps.find-existing.outputs.comment-id != '' uses: peter-evans/create-or-update-comment@v1 with: - comment-id: ${{ steps.fc2.outputs.comment-id }} - body: ${{ steps.redirects.outputs.body }} + comment-id: ${{ steps.find-existing.outputs.comment-id }} + body: ${{ steps.build-comment-body.outputs.body }} edit-mode: replace diff --git a/.github/workflows/lost-pixel.yml b/.github/workflows/lost-pixel.yml index 325ba8eea0..e70a57fa63 100644 --- a/.github/workflows/lost-pixel.yml +++ b/.github/workflows/lost-pixel.yml @@ -1,38 +1,33 @@ ---- -name: LostPixel - +name: 'Lost Pixel' on: [push] jobs: - gatsby-for-percy: - name: Lost Pixel screenshots via Gatsby build + build: runs-on: ubuntu-latest + name: Lost Pixel + steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - cache: 'npm' - node-version: '14' - - run: npm ci - - name: Caching Gatsby - id: gatsby-cache-build - uses: actions/cache@v2 - with: - path: public - .cache - key: ${{ runner.os }}-gatsby-build-${{ github.run_id }} - restore-keys: | - ${{ runner.os }}-gatsby-build- - - name: Build Gatsby app - run: npx gatsby build --prefix-paths - env: - GATSBY_EXPERIMENTAL_PAGE_BUILD_ON_DATA_CHANGES: true - CI: true + node-version: 18 + + - name: Install deps + run: npm install + + - name: Build docs + run: npm run clean && npm run build + + - name: Start docs + run: npm run serve & + + - name: Generate sitemap + run: npx lost-pixel page-sitemap-gen http://172.17.0.1:3000/sitemap.xml "./lost-pixel-pages.json" - - name: Run Gatsby app - run: npx gatsby serve --host 172.17.0.1 & + - name: Edit page names + run: sed -i -e 's/_/\//g' -e 's|prisma\.io||g' -re 's/(name.+)(\/)(\")/\1-\3/g' lost-pixel-pages.json - name: Lost Pixel - uses: lost-pixel/lost-pixel@v3.4.4 + uses: lost-pixel/lost-pixel@v3.16.0 env: LOST_PIXEL_API_KEY: ${{ secrets.LOST_PIXEL_API_KEY }} diff --git a/.github/workflows/notion.yml b/.github/workflows/notion.yml deleted file mode 100644 index 44655e5f3a..0000000000 --- a/.github/workflows/notion.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Notion Board -on: - issues: - issue_comment: - workflow_dispatch: - inputs: - setup: - description: 'Populate your notion database with all the requried properties' - type: boolean - syncIssues: - description: 'sync all other existing issues in this repo' - type: boolean - issueType: - type: choice - description: 'The issue type you want to sync' - options: - - all - - open - - closed - default: open -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Notion Board - uses: Souvikns/Notion-Board@2.2.0 - with: - setup: ${{github.event.inputs.setup}} - syncIssues: ${{github.event.inputs.syncIssues}} - issueType: ${{github.event.inputs.issueType}} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }} - NOTION_DATABASE: ${{ secrets.NOTION_DATABASE }} diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml index 67dfe2cd3a..da289269f5 100644 --- a/.github/workflows/spellcheck.yml +++ b/.github/workflows/spellcheck.yml @@ -16,13 +16,13 @@ jobs: name: 'Docs: Spellcheck' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - name: Check out the code - - uses: actions/setup-node@v1 - name: Setup node + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: '18' - - run: npm install -g cspell - name: Install cSpell - - run: cspell --config ./cSpell.json "content/**/*.mdx" --no-progress - name: Run cSpell + node-version: 18 + + - name: Install cSpell + run: npm install -g cspell + + - name: Run cSpell + run: cspell --config ./cSpell.json "content/**/*.mdx" --no-progress diff --git a/.gitignore b/.gitignore index c6eb4f483f..b2381dedda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,92 +1,26 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ +# Dependencies +/node_modules -# Optional npm cache directory -.npm +# Production +/build +/public -# Optional eslint cache -.eslintcache +# Generated files +.docusaurus +.cache-loader +.cache -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# dotenv environment variables file -.env - -# gatsby files -.cache/ -public -reduxcache* - -# Mac files +# Misc .DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local -# Yarn -yarn-error.log -.pnp/ -.pnp.js -# Yarn Integrity file -.yarn-integrity -yarn.lock - -.envrc - -# Example page -content/00-example.mdx - -# History -.history/ - -# webStorm settings -.idea - -# vscode settings -.vscode/ -.vercel - -# nova settings -.nova +npm-debug.log* +yarn-debug.log* +yarn-error.log* -# gatsby typegen -src/gatsby-types.d.ts +# wrangler project +.dev.vars +.wrangler/ diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index a67e262429..0000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -# . "$(dirname "$0")/_/husky.sh" - -npx lint-staged diff --git a/.prettierignore b/.prettierignore index 77dd0b9762..b17149b31b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1 @@ -node_modules/ -public/ -.cache/ -static/ -out/ -history/ \ No newline at end of file +*.mdx \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 4e666722c2..123daf08ec 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,17 +1,6 @@ { - "printWidth": 100, - "jsxBracketSameLine": false, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "es5", - "semi": false, - "plugins": ["prettier-plugin-prisma"], - "overrides": [ - { - "files": "*.mdx", - "options": { - "printWidth": 80 - } - } - ] + "trailingComma": "es5", + "tabWidth": 4, + "semi": false, + "singleQuote": true } diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 9ad5ca195e..0000000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "ExpandedNodes": [""], - "PreviewInSolutionExplorer": false -} diff --git a/.vs/docs/v15/.suo b/.vs/docs/v15/.suo deleted file mode 100644 index 6e8b5972a3..0000000000 Binary files a/.vs/docs/v15/.suo and /dev/null differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index c6bca6a3e9..0000000000 Binary files a/.vs/slnx.sqlite and /dev/null differ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index cd37c80f45..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,19 +0,0 @@ -# Contributing to Prisma Documentation - -We welcome all contributions to the Prisma docs! If you come across some documentation that you feel is missing or incorrect, please open an issue or submit a pull request. - -## I am not sure my changes are valid - -If you are not sure your changes are valid, then please open an issue and we will discuss it. Contributions from community members are welcome and will be considered for inclusion. - -## Creating an issue - -There are no hard and fast rules for creating an issues to the repository. We only ask that you outline your reasoning for creating the issue and try to provide as much detail as possible. Depending on the issue, this could mean explaining what machine you are working on (Is it a Mac? Are you on a Windows machine?), or including a code snippet that demonstrates the issue. - -## Creating a pull request (PR) - -We have a pull request template. The basic breakdown is as follows: - -- Describe the reason for the PR. A little context goes a long way in helping to quickly scan the PR -- Briefly describe what changes were made -- Link to any relevant issues diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index 6510da3841..0c6c2c27be 100644 --- a/README.md +++ b/README.md @@ -1,175 +1,41 @@ -# Prisma Documentation +# Website -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/prisma/docs/blob/main/CONTRIBUTING.md) [![Slack](https://img.shields.io/badge/chat-on%20slack-blue.svg?style=flat-square)](https://slack.prisma.io/) [![Vercel](https://vercelbadge.vercel.app/api/prisma/docs)](https://vercel.com/prisma/docs/deployments) +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. -This repository contains the [source code](./src) and the [content](./content) for the [Prisma documentation](https://www.prisma.io/docs). - -## Contributing to the docs - -New contributors are welcome! Read through the [contributing guide](CONTRIBUTING.md) to learn how you can contribute to the Prisma documentation. - -## Prerequisites for Apple M1 chip (macOS BigSur and later) - -1. Install [`homebrew`](https://brew.sh/). -2. Install [`libvips`](https://github.com/libvips/libvips) via homebrew. - - ``` - brew install libvips - ``` - -## Run the docs site locally - -1. Clone this repository. -2. On your computer, open a terminal window in the repository's directory. -3. Run the following commands: +### Installation ``` -cd docs -npm install -npm run dev +$ yarn ``` -## Run functions locally - -Run a local build to run the functions using the following command: +### Local Development ``` -vercel dev +$ yarn start ``` -> Make sure you have the correct path to `POSTGRES_URL` in your local `.env` file to test the functions +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. -To prettify or format the code, run: +### Build ``` -npm run format +$ yarn build ``` -Visit `http://localhost:8000` to view the app. - -## Configure - -Write MDX files in `content` folder. - -Open `config.ts` for available config options for `gatsby`, `header`, `footer` and `siteMetadata`. - -- `gatsby` config for global configuration like - - - `pathPrefix` - Gatsby Path Prefix - - `siteUrl` - The url of the deployed site - - `titlePrefix` - The prefix to title that is added to the SEO title of the page - - `titleSuffix` - The suffix to title that is added to the SEO title of the page - -- `header` config for site header configuration like - - - `secondLevelHeaderMenuItems` - The text and links for the buckets on the second level of header - - `search` - The API keys for search functionality +This command generates static content into the `build` directory and can be served using any static contents hosting service. -- `footer` config for site footer configuration like +### Deployment - - `newsletter` - Newsletter text +Using SSH: -- `homepage` config for various links and content in the homepage of https://www.prisma.io/docs - - - `SummaryLinkData` - Links and text in the Summary section of homepage - - `GeneralLinkData` - Links and text in the General section of homepage - - `GuideLinkData` - Links and text in the Guide section of homepage - - `ReferenceLinkData` - Links and text in the Reference section of homepage - - `MoreUsefulLinks` - Links and text in the More Useful section of homepage - -- `siteMetadata` config for website related configuration - - - `title` - Title of the website in main page - - `description` - Description of the website - - `keywords` - Keywords of the website for SEO - -- `feedback` config for feedback urls - - - `sentimentUrl` - api path for sentiment details on feedback functionality - - `feedbackUrl` - api path for feedback details on feedback functionality - -## Inserting, moving and deleting files - -All files/folders in the context are prefixed with a _position_ which indicates the order in which they appear in the sidenav on the docs website. This makes it cumbersome to insert, move and delete files because the positions of a number of other files (if not all) in the same folder might need to be adjusted. Thanks to [Luca Steeb](https://github.com/steebchen/), you can perform these operations with a dedicated CLI called [`mdtool`](https://gist.githubusercontent.com/steebchen/bd085ebde1fcf4242e3fdd0df4d202a6/raw/c04e3d262eb6a302a9fab98f6428fec9329681e2/mdtool). - -### Install - -First, install `wget`: - -```bash -brew install wget ``` - -Then use `wget` to install `mdtool`: - -```bash -wget https://gist.githubusercontent.com/steebchen/bd085ebde1fcf4242e3fdd0df4d202a6/raw/c04e3d262eb6a302a9fab98f6428fec9329681e2/mdtool -qO /usr/local/bin/mdtool -chmod +x /usr/local/bin/mdtool +$ USE_SSH=true yarn deploy ``` -### Usage - -#### Overview +Not using SSH: ``` -mdtool insert 3 -mdtool swap A B -mdtool move A B -mdtool remove 4 +$ GIT_USER= yarn deploy ``` -#### `mdtool insert` - -Make place for a new file at given index and increment all numbers by one after that index: - -``` -$ mdtool insert INDEX - -# e.g.: -$ mdtool insert 2 - -# Result: for files 01-a, 02-b, 03-c, and 04-d; 03-c is renamed to 04-c and 04-d is renamed to 05-d so you can create a new file at index 2 -``` - -#### `mdtool swap` - -Swap two files; specify both filenames (prefix numbers get automatically adjusted): - -``` -$ mdtool swap FILENAME1 FILENAME2 - -# e.g.: -$ mdtool swap 03-file1.mdx 07-file2.mdx - -# Result: Files are now named: 03-file2.mdx 07-file1.mdx -``` - -#### `mdtool move` - -Move a given file to another given index - -``` -$ mdtool move FILENAME INDEX - -# e.g.: -$ mdtool move 05-file.mdx 2 - -# Result: 05-file.mdx is move to 02-file.mdx, plus previous files 02-*, 03-*, 04-* are incremented -``` - -#### `mdtool remove` - -Shift all other items by -1 at a given index: - -``` -$ mdtool remove INDEX - -# e.g.: -$ mdtool remove 2 - -# Result: 01-a, 02-b, 03-c, 04-d becomes 01-a, 02-b, 02-c, 03-d; 02-b is supposed to be manually deleted -``` - -#### Thanks Luca - -![](https://res.cloudinary.com/prismaio/image/upload/v1628765536/docs/LJ0FGHk_u2jjxv.png) +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 5d93b0ad8d..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,3 +0,0 @@ -# Security Policy - -If you have a security issue to report, please contact us at [security@prisma.io](mailto:security@prisma.io). diff --git a/api/feedback.js b/api/feedback.js deleted file mode 100644 index 27ce0a292b..0000000000 --- a/api/feedback.js +++ /dev/null @@ -1,40 +0,0 @@ -const { PrismaClient } = require('@prisma/client') - -const client = new PrismaClient() - -export default async function handle(req, res) { - const body = JSON.parse(req.body) - if (!body.feedback) { - throw new Error(`Please provide feedback `) - } - if (!body.id) { - throw new Error(`Please provide id to set the feedback for`) - } - - const fetchedFeedback = await client.feedback.findUnique({ - where: { - id: body.id, - }, - select: { - feedback: true, - }, - }) - - if (fetchedFeedback.feedback) { - // Don't allow updating existing feedback - return { - statusCode: 400, - } - } - - const feedback = await client.feedback.update({ - data: { - feedback: body.feedback, - }, - where: { - id: body.id, - }, - }) - - res.json(feedback) -} diff --git a/api/sentiment.js b/api/sentiment.js deleted file mode 100644 index 57c0b38718..0000000000 --- a/api/sentiment.js +++ /dev/null @@ -1,35 +0,0 @@ -const { PrismaClient } = require('@prisma/client') - -const client = new PrismaClient() - -export default async function handle(req, res) { - const { pageUrl, sentiment } = req.body - if (!pageUrl) { - throw new Error(`Please provide a pageUrl`) - } - - if (!sentiment) { - throw new Error(`Please provide a sentiment`) - } - - if (!['Happy', 'Unhappy'].includes(sentiment)) { - throw new Error(`Please provide "Happy" or "Unhappy" as the sentiment`) - } - const pagePath = stripTrailingSlash(pageUrl) - - const sentimentResult = await client.feedback.create({ - data: { - pageUrl: pagePath, - ip: req.headers['x-forwarded-for'], - userAgent: req.headers['user-agent'], - sentiment: sentiment, - }, - }) - res.setHeader('Access-Control-Allow-Origin', '*') - res.setHeader('Access-Control-Allow-Methods', '*') - return res.send(sentimentResult) -} - -function stripTrailingSlash(url) { - return url.replace(/\/$/, '') -} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000..e00595dae7 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/cSpell.json b/cSpell.json index f63b541815..fc82d6459f 100644 --- a/cSpell.json +++ b/cSpell.json @@ -27,6 +27,7 @@ "MSSQLSERVER", "neovim", "Nestjs", + "Overfetching", "pgbouncer", "planetscale", "pooler", @@ -73,7 +74,8 @@ "Rallly", "Dundring", "Letterpad", - "Hitori" + "Hitori", + "Zenstack" ], "ignoreWords": [ "Ania", @@ -92,7 +94,8 @@ "Distroless", "Nikolas", "Supavisor", - "inshellisense" + "inshellisense", + "janedoe" ], "patterns": [ { @@ -146,4 +149,4 @@ "HTML Tags" ], "ignorePaths": [] -} +} \ No newline at end of file diff --git a/config.ts b/config.ts deleted file mode 100644 index c02c94a7c5..0000000000 --- a/config.ts +++ /dev/null @@ -1,271 +0,0 @@ -const siteConfig = { - gatsby: { - pathPrefix: '/docs', - siteUrl: 'https://www.prisma.io', - titlePrefix: '', - titleSuffix: ' | Prisma Docs', - }, - redirects: [ - // Added this object for redirect because gatsby filters through the redirects key in gatsby-browser.js. - // This object will create a "dummy" page in percy, creating a 404 page of `/foo/index` - { - from: '/foo', - to: '/bar', - }, - ], - header: { - secondLevelHeaderMenuItems: [ - { - text: 'Get Started', - to: '/getting-started', - type: 'bucket', - bucketName: '/100-getting-started', - hidden: false, - }, - { - text: 'ORM', - to: '/orm', - type: 'bucket', - bucketName: '/200-orm', - hidden: false, - }, - { - text: 'Accelerate', - to: '/accelerate', - type: 'bucket', - bucketName: '/300-accelerate', - hidden: false, - }, - { - text: 'Pulse', - to: '/pulse', - type: 'bucket', - bucketName: '/400-pulse', - hidden: false, - }, - { - text: 'Platform', - to: '/platform', - type: 'bucket', - bucketName: '/500-platform', - hidden: false, - }, - { - text: 'About', - to: '/about', - type: 'bucket', - bucketName: '/600-about', - hidden: true, - }, - ], - search: { - indexName: process.env.GATSBY_ALGOLIA_INDEX_NAME, - algoliaAppId: process.env.GATSBY_ALGOLIA_APP_ID, - algoliaSearchKey: process.env.GATSBY_ALGOLIA_SEARCH_KEY, - algoliaAdminKey: process.env.GATSBY_ALGOLIA_ADMIN_API_KEY, - }, - }, - homepage: { - SummaryLinkData: { - gettingStarted: 'getting-started', - readyToRun: 'https://github.com/prisma/prisma-examples', - slack: 'https://slack.prisma.io/', - discord: 'https://pris.ly/discord', - git: 'https://github.com/prisma', - buttons: [ - { - text: 'Getting started', - url: 'getting-started', - special: true, - icon: 'DoubleArrow', - }, - { - text: 'Example projects', - url: 'https://github.com/prisma/prisma-examples', - special: false, - icon: null, - }, - ], - }, - ORMPlatformLinkData: { - porm: { - title: 'Prisma ORM', - icon: 'database', - description: - 'Open source Node.js and TypeScript ORM with an intuitive data model, automated migrations, type-safety, and auto-completion.', - links: [ - { - url: 'getting-started', - title: 'Getting started', - }, - { - url: 'https://github.com/prisma/prisma-examples', - title: 'Example projects', - external: true, - }, - ], - }, - pdp: { - title: 'Prisma Data Platform', - icon: 'triangle', - description: - 'An ecosystem of tools empowering teams to build data-heavy, global-first applications.', - links: [ - { - url: 'accelerate', - title: 'Prisma Accelerate', - }, - { - url: 'pulse', - title: 'Prisma Pulse', - }, - ], - }, - }, - GeneralLinkData: [ - { - title: `What is Prisma`, - description: 'An overview of what Prisma ORM is and how it works.', - url: 'orm/overview/introduction/what-is-prisma', - icon: 'fa-regular fa-question', - }, - { - title: `CRUD`, - description: 'How to perform CRUD operations with your generated Prisma Client API. ', - url: 'orm/prisma-client/queries/crud', - icon: 'fa-solid fa-arrow-right-arrow-left', - }, - { - title: `Prisma in your stack`, - description: - 'Use Prisma to build a GraphQL or REST API, or as part of a fullstack application.', - url: 'orm/overview/prisma-in-your-stack', - icon: 'fa-solid fa-server', - }, - { - title: `Preview features`, - description: 'Available preview features and how to enable them.', - url: 'orm/reference/preview-features', - icon: 'fa-solid fa-eye', - }, - { - title: `Adopting Prisma`, - description: 'Migrate to Prisma from other ORMs.', - url: 'orm/more/migrating-to-prisma', - icon: 'fa-solid fa-download', - }, - { - title: `Deployment guides`, - description: - 'Deploy Node.js applications with Prisma Client to platforms like Vercel, AWS Lambda, Netlify and Heroku.', - url: 'orm/prisma-client/deployment', - icon: 'fa-solid fa-book', - }, - ], - CommunityLinksData: [ - { - id: 'slack', - title: 'Slack', - description: 'Engage with a vibrant community of developers and companies adopting Prisma', - icon: 'fa-brands fa-slack', - link: 'https://slack.prisma.io/', - linkText: 'Join our channel', - }, - { - id: 'github', - title: 'GitHub', - description: - 'Browse the Prisma source code, send feedback, or join the discussion on GitHub.', - icon: 'fa-brands fa-github', - link: 'https://github.com/prisma', - linkText: 'Contribute in GitHub', - }, - { - id: 'discord', - title: 'Discord', - description: - 'Chat in real-time, hang out, and share ideas with community members and our team.', - icon: 'fa-brands fa-discord', - link: 'https://pris.ly/discord', - linkText: 'Join our server', - }, - ], - CardLinks: { - components: [ - { - url: 'orm/prisma-schema', - title: 'Prisma Schema', - }, - { - url: 'orm/tools/prisma-cli', - title: 'Prisma CLI', - }, - { - url: 'orm/prisma-client', - title: 'Prisma Client', - }, - { - url: 'orm/tools/prisma-studio', - title: 'Prisma Studio', - }, - { - url: 'orm/prisma-migrate', - title: 'Prisma Migrate', - }, - ], - reference: [ - { - url: 'orm/reference/prisma-client-reference', - title: 'Prisma Client API reference', - }, - { - url: 'orm/reference/prisma-schema-reference', - title: 'Prisma schema reference', - }, - { - url: 'orm/reference/error-reference', - title: 'Error message reference', - }, - { - url: 'orm/reference/prisma-cli-reference', - title: 'Prisma CLI reference', - }, - ], - }, - }, - siteMetadata: { - title: 'Prisma Documentation | ORM, Accelerate, Pulse & More', - description: - "Get started with Prisma in the official documentation, and learn more about all Prisma's features with reference documentation, guides, and more.", - keywords: 'Docs, Prisma, ORM', - docsLocation: 'https://github.com/prisma/docs/tree/main/content', - twitter: { - site: '@prisma', - creator: '@prisma', - image: '/social/docs-social.png', - }, - og: { - site_name: 'Prisma', - type: 'website', - image: { - alt: 'Database tools for modern developers', - height: '630', - type: 'image/png', - url: '/social/docs-social.png', - width: '1200', - }, - }, - SpecialPaths: ['prisma-cli', 'deployment', 'sql-views'], - }, - feedback: { - sentimentUrl: '/docs/api/sentiment', - feedbackUrl: '/docs/api/feedback', - }, - footer: { - newsletter: { - text: 'Stay up to date with the latest features and changes to Prisma', - }, - }, -} - -export default siteConfig diff --git a/content/100-getting-started/01-quickstart.mdx b/content/100-getting-started/01-quickstart.mdx index 440faaa0b3..234d207f98 100644 --- a/content/100-getting-started/01-quickstart.mdx +++ b/content/100-getting-started/01-quickstart.mdx @@ -1,19 +1,19 @@ --- title: 'Quickstart' -duration: '5 min' metaTitle: 'Quickstart with TypeScript & SQLite' -metaDescription: 'Get started with Prisma in 5 minutes. You will learn how to send queries to a SQLite database in a plain TypeScript script using Prisma Client.' +description: 'Get started with Prisma ORM in 5 minutes. You will learn how to send queries to a SQLite database in a plain TypeScript script using Prisma Client.' search: true +sidebar_custom_props: { badge: '5 min' } --- -In this Quickstart guide, you'll learn how to get started with Prisma from scratch using a plain **TypeScript** project and a local **SQLite** database file. It covers **data modeling**, **migrations** and **querying** a database. +In this Quickstart guide, you'll learn how to get started with Prisma ORM from scratch using a plain **TypeScript** project and a local **SQLite** database file. It covers **data modeling**, **migrations** and **querying** a database. -If you want to use Prisma with your own PostgreSQL, MySQL, MongoDB or any other supported database, go here instead: +If you want to use Prisma ORM with your own PostgreSQL, MySQL, MongoDB or any other supported database, go here instead: -- [Start with Prisma from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) -- [Add Prisma to an existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql) +- [Start with Prisma ORM from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) +- [Add Prisma ORM to an existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql) @@ -21,7 +21,7 @@ If you want to use Prisma with your own PostgreSQL, MySQL, MongoDB or any other You need Node.js v16.13.0 or higher for this guide (learn more about [system requirements](/orm/reference/system-requirements)). -## 1. Create TypeScript project and set up Prisma +## 1. Create TypeScript project and set up Prisma ORM As a first step, create a project directory and navigate into it: @@ -57,7 +57,7 @@ Then, install the Prisma CLI as a development dependency in the project: npm install prisma --save-dev ``` -Finally, set up Prisma with the `init` command of the Prisma CLI: +Finally, set up Prisma ORM with the `init` command of the Prisma CLI: ```terminal npx prisma init --datasource-provider sqlite @@ -69,7 +69,7 @@ This creates a new `prisma` directory with your Prisma schema file and configure The Prisma schema provides an intuitive way to model data. Add the following models to your `schema.prisma` file: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model User { id Int @id @default(autoincrement()) email String @unique @@ -122,7 +122,7 @@ touch script.ts Then, paste the following boilerplate into it: -```ts file=script.ts +```ts file=script.ts showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() @@ -148,12 +148,13 @@ This code contains a `main` function that's invoked at the end of the script. It Let's start with a small query to create a new `User` record in the database and log the resulting object to the console. Add the following code to your `script.ts` file: -```ts file=script.ts highlight=6-12;add +```ts file=script.ts highlight=6-12;add showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { + // add-start const user = await prisma.user.create({ data: { name: 'Alice', @@ -161,6 +162,7 @@ async function main() { }, }) console.log(user) + // add-end } main() @@ -181,21 +183,15 @@ Next, execute the script with the following command: - ```terminal npx ts-node script.ts ``` - - - ```code no-copy { id: 1, email: 'alice@prisma.io', name: 'Alice' } ``` - - Great job, you just created your first database record with Prisma Client! 🎉 @@ -208,14 +204,16 @@ Prisma Client offers various queries to read data from your database. In this se Delete the previous Prisma Client query and add the new `findMany` query instead: -```ts file=script.ts highlight=6-7;add +```ts file=script.ts highlight=6-7;add showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { + // add-start const users = await prisma.user.findMany() console.log(users) + // add-end } main() @@ -253,18 +251,19 @@ npx ts-node script.ts Notice how the single `User` object is now enclosed with square brackets in the console. That's because the `findMany` returned an array with a single object inside. -### 4.3. Explore relation queries with Prisma +### 4.3. Explore relation queries with Prisma Client One of the main features of Prisma Client is the ease of working with [relations](/orm/prisma-schema/data-model/relations). In this section, you'll learn how to create a `User` and a `Post` record in a nested write query. Afterwards, you'll see how you can retrieve the relation from the database using the `include` option. First, adjust your script to include the nested query: -```ts file=script.ts highlight=6-17;add +```ts file=script.ts highlight=6-17;add showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { + // add-start const user = await prisma.user.create({ data: { name: 'Bob', @@ -277,6 +276,7 @@ async function main() { }, }) console.log(user) + // add-end } main() @@ -312,22 +312,24 @@ npx ts-node script.ts -By default, Prisma only returns _scalar_ fields in the result objects of a query. That's why, even though you also created a new `Post` record for the new `User` record, the console only printed an object with three scalar fields: `id`, `email` and `name`. +By default, Prisma Client only returns _scalar_ fields in the result objects of a query. That's why, even though you also created a new `Post` record for the new `User` record, the console only printed an object with three scalar fields: `id`, `email` and `name`. In order to also retrieve the `Post` records that belong to a `User`, you can use the `include` option via the `posts` relation field: -```ts file=script.ts highlight=6-11;add +```ts file=script.ts highlight=6-11;add showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { +// add-start const usersWithPosts = await prisma.user.findMany({ include: { posts: true, }, }) console.dir(usersWithPosts, { depth: null }) + // add-end } main() @@ -385,30 +387,30 @@ Notice that the objects in the `usersWithPosts` array are fully typed as well. T ## 5. Next steps -In this Quickstart guide, you have learned how to get started with Prisma in a plain TypeScript project. Feel free to explore the Prisma Client API a bit more on your own, e.g. by including filtering, sorting, and pagination options in the `findMany` query or exploring more operations like `update` and `delete` queries. +In this Quickstart guide, you have learned how to get started with Prisma ORM in a plain TypeScript project. Feel free to explore the Prisma Client API a bit more on your own, e.g. by including filtering, sorting, and pagination options in the `findMany` query or exploring more operations like `update` and `delete` queries. ### Explore the data in Prisma Studio -Prisma comes with a built-in GUI to view and edit the data in your database. You can open it using the following command: +Prisma ORM comes with a built-in GUI to view and edit the data in your database. You can open it using the following command: ```terminal npx prisma studio ``` -### Set up Prisma with your own database +### Set up Prisma ORM with your own database -If you want to move forward with Prisma using your own PostgreSQL, MySQL, MongoDB or any other supported database, follow the Set Up Prisma guides: +If you want to move forward with Prisma ORM using your own PostgreSQL, MySQL, MongoDB or any other supported database, follow the Set Up Prisma ORM guides: -- [Start with Prisma from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) -- [Add Prisma to an existing project](/getting-started/setup-prisma/add-to-existing-project) +- [Start with Prisma ORM from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) +- [Add Prisma ORM to an existing project](/getting-started/setup-prisma/add-to-existing-project) -### Explore ready-to-run Prisma examples +### Explore ready-to-run Prisma ORM examples -Check out the [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository on GitHub to see how Prisma can be used with your favorite library. The repo contains examples with Express, NestJS, GraphQL as well as fullstack examples with Next.js and Vue.js, and a lot more. +Check out the [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository on GitHub to see how Prisma ORM can be used with your favorite library. The repo contains examples with Express, NestJS, GraphQL as well as fullstack examples with Next.js and Vue.js, and a lot more. -### Build an app with Prisma +### Build an app with Prisma ORM -The Prisma blog features comprehensive tutorials about Prisma, check out our latest ones: +The Prisma blog features comprehensive tutorials about Prisma ORM, check out our latest ones: - [Build a fullstack app with Remix](https://www.prisma.io/blog/fullstack-remix-prisma-mongodb-1-7D0BfTXBmB6r) (5 parts, including videos) - [Build a REST API with NestJS](https://www.prisma.io/blog/nestjs-prisma-rest-api-7D056s1BmOL0) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-cockroachdb.mdx new file mode 100644 index 0000000000..45407c7801 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-cockroachdb.mdx @@ -0,0 +1,52 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-cockroachdb +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [CockroachDB](https://www.cockroachlabs.com/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-mysql.mdx new file mode 100644 index 0000000000..97792e3a04 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-mysql.mdx @@ -0,0 +1,75 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-mysql +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [MySQL](https://www.mysql.com/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-planetscale.mdx new file mode 100644 index 0000000000..2f97a01a6d --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-planetscale.mdx @@ -0,0 +1,67 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-planetscale +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PlanetScale](https://www.planetscale.com/) database server running + + + +This tutorial will also assume that you can push to the `main` branch of your database. Do not do this if your `main` branch has been promoted to production. + + + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-postgresql.mdx new file mode 100644 index 0000000000..298c4002ec --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-postgresql.mdx @@ -0,0 +1,74 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgresql +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PostgreSQL](https://www.postgresql.org/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-sqlserver.mdx new file mode 100644 index 0000000000..f7ae90142b --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-node-sqlserver.mdx @@ -0,0 +1,77 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-sqlserver +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database + - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) + - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) + + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..bdc6619062 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-cockroachdb.mdx @@ -0,0 +1,80 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-cockroachdb +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [CockroachDB](https://www.cockroachlabs.com/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma typescript ts-node @types/node --save-dev +``` + +This creates a `package.json` with an initial setup for your TypeScript app. + +Next, initialize TypeScript: + +```terminal copy +npx tsc --init +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-mysql.mdx new file mode 100644 index 0000000000..80fc919e04 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-mysql.mdx @@ -0,0 +1,80 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-mysql +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [MySQL](https://www.mysql.com/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma typescript ts-node @types/node --save-dev +``` + +This creates a `package.json` with an initial setup for your TypeScript app. + +Next, initialize TypeScript: + +```terminal copy +npx tsc --init +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-planetscale.mdx new file mode 100644 index 0000000000..1c70e53922 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-planetscale.mdx @@ -0,0 +1,86 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PlanetScale](https://www.planetscale.com/) database server running + + + +This tutorial will also assume that you can push to the `main` branch of your database. Do not do this if your `main` branch has been promoted to production. + + + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma typescript ts-node @types/node --save-dev +``` + +This creates a `package.json` with an initial setup for your TypeScript app. + +Next, initialize TypeScript: + +```terminal copy +npx tsc --init +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-postgresql.mdx new file mode 100644 index 0000000000..349481e2a3 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-postgresql.mdx @@ -0,0 +1,79 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgresql +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PostgreSQL](https://www.postgresql.org/) database server running + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma typescript ts-node @types/node --save-dev +``` + +This creates a `package.json` with an initial setup for your TypeScript app. + +Next, initialize TypeScript: + +```terminal copy +npx tsc --init +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-sqlserver.mdx new file mode 100644 index 0000000000..0ba7498b8c --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases-typescript-sqlserver.mdx @@ -0,0 +1,82 @@ +--- +title: 'Relational databases' +metaTitle: 'Start from scratch with relational databases (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-sqlserver +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database + - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) + - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma typescript ts-node @types/node --save-dev +``` + +This creates a `package.json` with an initial setup for your TypeScript app. + +Next, initialize TypeScript: + +```terminal copy +npx tsc --init +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. + + + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx new file mode 100644 index 0000000000..e594c9d358 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx @@ -0,0 +1,71 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-cockroachdb +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "cockroachdb" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. +- `DATABASE`: The name of the database +- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). + +For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" +``` + +To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. + +For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" +``` + +Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-mysql.mdx new file mode 100644 index 0000000000..2ef1f7b568 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-mysql.mdx @@ -0,0 +1,78 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-mysql +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" +``` + +When running MySQL locally, your connection URL typically looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" +``` diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-planetscale.mdx new file mode 100644 index 0000000000..ee8fa87633 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-planetscale.mdx @@ -0,0 +1,106 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-planetscale +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +You will also need to set the relation mode type to `prisma` in order to [emulate foreign key constraints](/orm/overview/databases/planetscale#option-1-emulate-relations-in-prisma-client) in the `datasource` block: + +```prisma file=schema.prisma highlight=4;add showLineNumbers +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + //add-next-line + relationMode = "prisma" +} +``` + +> **Note**: Since February 2024, you can alternatively [use foreign key constraints on a database-level in PlanetScale](/orm/overview/databases/planetscale#option-2-enable-foreign-key-constraints-in-the-planetscale-database-settings), which omits the need for setting `relationMode = "prisma"`. + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. + +
+Alternative method: connecting using the PlanetScale CLI + +Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: + +```bash file=.env +DATABASE_URL="mysql://root@localhost:PORT/mydb" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +To connect to your branch, use the following command: + +```terminal +pscale connect prisma-test branchname --port PORT +``` + +The `--port` flag can be omitted if you are using the default port `3306`. + +
diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-postgresql.mdx new file mode 100644 index 0000000000..5abc868c54 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-postgresql.mdx @@ -0,0 +1,72 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgresql +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `HOST`: The name of your host name (for the local environment, it is `localhost`) +- `PORT`: The port where your database server is running (typically `5432` for PostgreSQL) +- `DATABASE`: The name of the [database](https://www.postgresql.org/docs/12/manage-ag-overview.html) +- `SCHEMA`: The name of the [schema](https://www.postgresql.org/docs/12/ddl-schemas.html) inside the database + +If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. + +As an example, for a PostgreSQL database hosted on Heroku, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" +``` + +When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: + +```bash file=.env +DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" +``` \ No newline at end of file diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-sqlserver.mdx new file mode 100644 index 0000000000..1ad9a3c660 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-node-sqlserver.mdx @@ -0,0 +1,47 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-sqlserver +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "sqlserver" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +The following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) + +```bash file=.env + DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. + +> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..8f09528c58 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx @@ -0,0 +1,71 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: 'hidden-sidebar tech-switch' +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-cockroachdb +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "cockroachdb" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. +- `DATABASE`: The name of the database +- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). + +For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" +``` + +To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. + +For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" +``` + +Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-mysql.mdx new file mode 100644 index 0000000000..09ac96ee68 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-mysql.mdx @@ -0,0 +1,78 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-mysql +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" +``` + +When running MySQL locally, your connection URL typically looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" +``` diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx new file mode 100644 index 0000000000..0cf77336b8 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx @@ -0,0 +1,106 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-planetscale +--- + + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +You will also need to set the relation mode type to `prisma` in order to [emulate foreign key constraints](/orm/overview/databases/planetscale#option-1-emulate-relations-in-prisma-client) in the `datasource` block: + +```prisma file=schema.prisma highlight=4;add showLineNumbers +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + //add-next-line + relationMode = "prisma" +} +``` + +> **Note**: Since February 2024, you can alternatively [use foreign key constraints on a database-level in PlanetScale](/orm/overview/databases/planetscale#option-2-enable-foreign-key-constraints-in-the-planetscale-database-settings), which omits the need for setting `relationMode = "prisma"`. + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. + +
+Alternative method: connecting using the PlanetScale CLI + +Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: + +```bash file=.env +DATABASE_URL="mysql://root@localhost:PORT/mydb" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +To connect to your branch, use the following command: + +```terminal +pscale connect prisma-test branchname --port PORT +``` + +The `--port` flag can be omitted if you are using the default port `3306`. + +
diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx new file mode 100644 index 0000000000..b31533ff4b --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx @@ -0,0 +1,70 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgresql +--- + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `HOST`: The name of your host name (for the local environment, it is `localhost`) +- `PORT`: The port where your database server is running (typically `5432` for PostgreSQL) +- `DATABASE`: The name of the [database](https://www.postgresql.org/docs/12/manage-ag-overview.html) +- `SCHEMA`: The name of the [schema](https://www.postgresql.org/docs/12/ddl-schemas.html) inside the database + +If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. + +As an example, for a PostgreSQL database hosted on Heroku, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" +``` + +When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: + +```bash file=.env +DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" +``` diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx new file mode 100644 index 0000000000..4075da5e1e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx @@ -0,0 +1,47 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-sqlserver +--- + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "sqlserver" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +The following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) + +```bash file=.env + DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" +``` + + + +We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. + + + +Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. + +> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database.mdx deleted file mode 100644 index 21ddb6ed77..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/100-connect-your-database.mdx +++ /dev/null @@ -1,549 +0,0 @@ ---- -title: 'Connect your database' -metaTitle: 'Connect your database' -metaDescription: 'Connect your database to your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Connect your database - -To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" -``` - - - -We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. - - - -You now need to adjust the connection URL to point to your own database. - -The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `HOST`: The name of your host name (for the local environment, it is `localhost`) -- `PORT`: The port where your database server is running (typically `5432` for PostgreSQL) -- `DATABASE`: The name of the [database](https://www.postgresql.org/docs/12/manage-ag-overview.html) -- `SCHEMA`: The name of the [schema](https://www.postgresql.org/docs/12/ddl-schemas.html) inside the database - -If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. - -As an example, for a PostgreSQL database hosted on Heroku, the [connection URL](/orm/reference/connection-urls) might look similar to this: - -```bash file=.env -DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" -``` - -When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: - -```bash file=.env -DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" -``` - - - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - -In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" -``` - - - -We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. - - - -You now need to adjust the connection URL to point to your own database. - -The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -mysql://USER:PASSWORD@HOST:PORT/DATABASE -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running (typically `3306` for MySQL) -- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) - -As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: - -```bash file=.env -DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" -``` - -When running MySQL locally, your connection URL typically looks similar to this: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" -``` - - - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - -You will also need to [set the relation mode type to `prisma`](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-with-the-prisma-relation-mode) in the `datasource` block: - -```prisma file=schema.prisma highlight=4;add -datasource db { - provider = "mysql" - url = env("DATABASE_URL") - relationMode = "prisma" -} -``` - -The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" -``` - -You now need to adjust the connection URL to point to your own database. - -The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -mysql://USER:PASSWORD@HOST:PORT/DATABASE -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running (typically `3306` for MySQL) -- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) - -For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" -``` - -The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. - -
Alternative method: connecting using the PlanetScale CLI - -Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: - -```bash file=.env -DATABASE_URL="mysql://root@localhost:PORT/mydb" -``` - - - -We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. - - - -To connect to your branch, use the following command: - -```terminal -pscale connect prisma-test branchname --port PORT -``` - -The `--port` flag can be omitted if you are using the default port `3306`. - -
- -
- - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "sqlserver" - url = env("DATABASE_URL") -} -``` - -In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: - -The following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) - -```bash file=.env - DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" -``` - - - -We recommend adding `.env` to your `.gitignore` file to prevent committing your environment variables. - - - -Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. - -> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` - - - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "cockroachdb" - url = env("DATABASE_URL") -} -``` - -The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. - -The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. -- `DATABASE`: The name of the database -- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). - -For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" -``` - -To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. - -For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" -``` - -Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Creating the database schema - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Creating the database schema - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - - - - - - - - Installation - - - - Using Prisma Migrate - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-cockroachdb.mdx new file mode 100644 index 0000000000..027a22061a --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-cockroachdb.mdx @@ -0,0 +1,66 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-cockroachdb +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id BigInt @id @default(sequence()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId BigInt +} + +model Profile { + id BigInt @id @default(sequence()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId BigInt @unique +} + +model User { + id BigInt @id @default(sequence()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +:::note +`generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. +::: + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-mysql.mdx new file mode 100644 index 0000000000..3583ef9977 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-mysql.mdx @@ -0,0 +1,65 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-mysql +--- + + + +## Creating the database schema + + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-planetscale.mdx new file mode 100644 index 0000000000..ba752732dd --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-planetscale.mdx @@ -0,0 +1,63 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-planetscale +--- + + + +## Creating the database schema + +In this guide, you'll use Prisma's [`db push` command](/orm/prisma-migrate/workflows/prototyping-your-schema) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int + + @@index(authorId) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique + + @@index(userId) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +You are now ready to push your new schema to your database. Connect to your `main` branch using the instructions in [Connect your database](/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale). + +Now use the `db push` CLI command to push to the `main` branch: + +```terminal +npx prisma db push +``` + +Great, you now created three tables in your database with Prisma's `db push` command 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-postgresql.mdx new file mode 100644 index 0000000000..68b24fcc4e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-postgresql.mdx @@ -0,0 +1,66 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgresql +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following data model to your [Prisma schema](/orm/prisma-schema) in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +:::note +`generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. +::: + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-sqlserver.mdx new file mode 100644 index 0000000000..77dd8ef9b1 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-node-sqlserver.mdx @@ -0,0 +1,64 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-sqlserver +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..db5f4c1566 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-cockroachdb.mdx @@ -0,0 +1,66 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-cockroachdb +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id BigInt @id @default(sequence()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId BigInt +} + +model Profile { + id BigInt @id @default(sequence()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId BigInt @unique +} + +model User { + id BigInt @id @default(sequence()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +:::note +`generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. +::: + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-mysql.mdx new file mode 100644 index 0000000000..7b22931cff --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-mysql.mdx @@ -0,0 +1,64 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-mysql +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-planetscale.mdx new file mode 100644 index 0000000000..2cecbbac97 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-planetscale.mdx @@ -0,0 +1,63 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-planetscale +--- + + + +## Creating the database schema + +In this guide, you'll use Prisma's [`db push` command](/orm/prisma-migrate/workflows/prototyping-your-schema) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int + + @@index(authorId) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique + + @@index(userId) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +You are now ready to push your new schema to your database. Connect to your `main` branch using the instructions in [Connect your database](/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale). + +Now use the `db push` CLI command to push to the `main` branch: + +```terminal +npx prisma db push +``` + +Great, you now created three tables in your database with Prisma's `db push` command 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-postgresql.mdx new file mode 100644 index 0000000000..0e22030984 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-postgresql.mdx @@ -0,0 +1,65 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgresql +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following data model to your [Prisma schema](/orm/prisma-schema) in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +:::note +`generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. +::: + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-sqlserver.mdx new file mode 100644 index 0000000000..2e3f5eeea3 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate-typescript-sqlserver.mdx @@ -0,0 +1,64 @@ +--- +title: 'Using Prisma Migrate' +metaTitle: 'Using Prisma Migrate' +description: 'Create database tables with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-sqlserver +--- + + + +## Creating the database schema + +In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: + +```prisma file=prisma/schema.prisma copy showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @db.VarChar(255) + content String? + published Boolean @default(false) + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] + profile Profile? +} +``` + +To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: + +```terminal +npx prisma migrate dev --name init +``` + +This command does two things: + +1. It creates a new SQL migration file for this migration +1. It runs the SQL migration file against the database + +> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. + +Great, you now created three tables in your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate.mdx deleted file mode 100644 index 734bfeee23..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/150-using-prisma-migrate.mdx +++ /dev/null @@ -1,841 +0,0 @@ ---- -title: 'Using Prisma Migrate' -metaTitle: 'Using Prisma Migrate' -metaDescription: 'Create database tables with Prisma Migrate' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Creating the database schema - - - -In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your [Prisma schema](/orm/prisma-schema) in `prisma/schema.prisma`: - -```prisma file=prisma/schema.prisma copy -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: - -```terminal -npx prisma migrate dev --name init -``` - -This command does two things: - -1. It creates a new SQL migration file for this migration -1. It runs the SQL migration file against the database - -> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. - -Great, you now created three tables in your database with Prisma Migrate 🚀 - - - - - -In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: - -```prisma file=prisma/schema.prisma copy -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: - -```terminal -npx prisma migrate dev --name init -``` - -This command does two things: - -1. It creates a new SQL migration file for this migration -1. It runs the SQL migration file against the database - -> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. - -Great, you now created three tables in your database with Prisma Migrate 🚀 - - - - - -In this guide, you'll use Prisma's [`db push` command](/orm/prisma-migrate/workflows/prototyping-your-schema) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: - -```prisma file=prisma/schema.prisma copy -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int - - @@index(authorId) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique - - @@index(userId) -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -You are now ready to push your new schema to your database. Connect to your `main` branch using the instructions in [Connect your database](/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale). - -Now use the `db push` CLI command to push to the `main` branch: - -```terminal -npx prisma db push -``` - -Great, you now created three tables in your database with Prisma's `db push` command 🚀 - - - - - -In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: - -```prisma file=prisma/schema.prisma copy -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: - -```terminal -npx prisma migrate dev --name init -``` - -This command does two things: - -1. It creates a new SQL migration file for this migration -1. It runs the SQL migration file against the database - -> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. - -Great, you now created three tables in your database with Prisma Migrate 🚀 - - - - - -, ]}> - - - -```sql -CREATE TABLE "Post" ( - "id" SERIAL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "title" VARCHAR(255) NOT NULL, - "content" TEXT, - "published" BOOLEAN NOT NULL DEFAULT false, - "authorId" INTEGER NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "Profile" ( - "id" SERIAL, - "bio" TEXT, - "userId" INTEGER NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "User" ( - "id" SERIAL, - "email" TEXT NOT NULL, - "name" TEXT, - PRIMARY KEY ("id") -); - -CREATE UNIQUE INDEX "Profile.userId_unique" ON "Profile"("userId"); -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); -ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "Profile" ADD FOREIGN KEY("userId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - - - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `TEXT` | No | No | No | - | -| `email` | `TEXT` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | -| `updatedAt` | `TIMESTAMP` | No | No | **✔️** | | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `TEXT` | No | No | No | - | -| `published` | `BOOLEAN` | No | No | **✔️** | `false` | -| `authorId` | `INTEGER` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `TEXT` | No | No | No | - | -| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | - - - - - - - - - -, ]}> - - - -```sql -CREATE TABLE "Post" ( - "id" SERIAL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT, - "published" BOOLEAN NOT NULL DEFAULT false, - "authorId" INTEGER NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "Profile" ( - "id" SERIAL, - "bio" TEXT, - "userId" INTEGER NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "User" ( - "id" SERIAL, - "email" TEXT NOT NULL, - "name" TEXT, - PRIMARY KEY ("id") -); - -CREATE UNIQUE INDEX "Profile.userId_unique" ON "Profile"("userId"); -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); -ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "Profile" ADD FOREIGN KEY("userId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - - - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `TEXT` | No | No | No | - | -| `email` | `TEXT` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | -| `updatedAt` | `TIMESTAMP` | No | No | **✔️** | | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `TEXT` | No | No | No | - | -| `published` | `BOOLEAN` | No | No | **✔️** | `false` | -| `authorId` | `INTEGER` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `TEXT` | No | No | No | - | -| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | - - - - - - - - - -, ]}> - - - -```sql -CREATE TABLE `Post` ( - `id` int NOT NULL AUTO_INCREMENT, - `createdAt` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` datetime(3) NOT NULL, - `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `published` tinyint(1) NOT NULL DEFAULT '0', - `authorId` int NOT NULL, - PRIMARY KEY (`id`), - KEY `Post_authorId_idx` (`authorId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -CREATE TABLE `Profile` ( - `id` int NOT NULL AUTO_INCREMENT, - `bio` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `userId` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `Profile_userId_key` (`userId`), - KEY `Profile_userId_idx` (`userId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -CREATE TABLE `User` ( - `id` int NOT NULL AUTO_INCREMENT, - `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `User_email_key` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -``` - - - - - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `varchar(191)` | No | No | No | - | -| `email` | `varchar(191)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `datetime(3)` | No | No | **✔️** | `now()` | -| `updatedAt` | `datetime(3)` | No | No | **✔️** | | -| `title` | `varchar(255)` | No | No | **✔️** | - | -| `content` | `varchar(191)` | No | No | No | - | -| `published` | `tinyint(1)` | No | No | **✔️** | `false` | -| `authorId` | `int` | No | No | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `varchar(191)` | No | No | No | - | -| `userId` | `int` | No | No | **✔️** | - | - - - - - - - - - -, ]}> - - - -```sql -BEGIN TRY - -BEGIN TRAN; - --- CreateTable -CREATE TABLE [dbo].[Post] ( - [id] INT NOT NULL IDENTITY(1,1), - [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, - [updatedAt] DATETIME2 NOT NULL, - [title] VARCHAR(255) NOT NULL, - [content] NVARCHAR(1000), - [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, - [authorId] INT NOT NULL, - CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) -); - --- CreateTable -CREATE TABLE [dbo].[Profile] ( - [id] INT NOT NULL IDENTITY(1,1), - [bio] NVARCHAR(1000), - [userId] INT NOT NULL, - CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), - CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) -); - --- CreateTable -CREATE TABLE [dbo].[User] ( - [id] INT NOT NULL IDENTITY(1,1), - [email] NVARCHAR(1000) NOT NULL, - [name] NVARCHAR(1000), - CONSTRAINT [User_pkey] PRIMARY KEY ([id]), - CONSTRAINT [User_email_key] UNIQUE ([email]) -); - --- AddForeignKey -ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; - -COMMIT TRAN; - -END TRY -BEGIN CATCH - -IF @@TRANCOUNT > 0 -BEGIN - ROLLBACK TRAN; -END; -THROW - -END CATCH -``` - - - - - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `NVARCHAR(1000)` | No | No | No | - | -| `email` | `NVARCHAR(1000)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `DATETIME2` | No | No | **✔️** | `now()` | -| `updatedAt` | `DATETIME2` | No | No | **✔️** | | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `NVARCHAR(1000)` | No | No | No | - | -| `published` | `BIT` | No | No | **✔️** | `false` | -| `authorId` | `INT` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `NVARCHAR(1000)` | No | No | No | - | -| `userId` | `INT` | No | **✔️** | **✔️** | - | - - - - - - - - - -In this guide, you'll use [Prisma Migrate](/orm/prisma-migrate) to create the tables in your database. Add the following Prisma data model to your Prisma schema in `prisma/schema.prisma`: - -```prisma file=prisma/schema.prisma copy -model Post { - id BigInt @id @default(sequence()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId BigInt -} - -model Profile { - id BigInt @id @default(sequence()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId BigInt @unique -} - -model User { - id BigInt @id @default(sequence()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -To map your data model to the database schema, you need to use the `prisma migrate` CLI commands: - -```terminal -npx prisma migrate dev --name init -``` - -This command does two things: - -1. It creates a new SQL migration file for this migration -1. It runs the SQL migration file against the database - -> **Note**: `generate` is called under the hood by default, after running `prisma migrate dev`. If the `prisma-client-js` generator is defined in your schema, this will check if `@prisma/client` is installed and install it if it's missing. - -Great, you now created three tables in your database with Prisma Migrate 🚀 - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx new file mode 100644 index 0000000000..3db50631c9 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx @@ -0,0 +1,31 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-cockroachdb +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-mysql.mdx new file mode 100644 index 0000000000..3669fe1fb4 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-mysql.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-mysql +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-planetscale.mdx new file mode 100644 index 0000000000..0de21b5183 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-planetscale.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-planetscale +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-postgresql.mdx new file mode 100644 index 0000000000..773a0c02a7 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-postgresql.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgresql +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx new file mode 100644 index 0000000000..7da057e5ce --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-sqlserver +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..64a1084603 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-cockroachdb +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx new file mode 100644 index 0000000000..89542cb2c5 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx @@ -0,0 +1,33 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-mysql +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx new file mode 100644 index 0000000000..c6a0afd6ac --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-planetscale +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx new file mode 100644 index 0000000000..cb881e522f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx @@ -0,0 +1,31 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgresql +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx new file mode 100644 index 0000000000..744bb40585 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-sqlserver +--- + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client.mdx deleted file mode 100644 index ad43659b34..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/200-install-prisma-client.mdx +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: 'Install Prisma Client' -metaTitle: 'Install Prisma Client' -metaDescription: 'Install and generate Prisma Client in your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Install and generate Prisma Client - -To get started with Prisma Client, you need to install the `@prisma/client` package: - -```terminal copy -npm install @prisma/client -``` - -The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. - -![Install and generate Prisma Client](../../../images/prisma-client-install-and-generate.png) - -Whenever you update your Prisma schema, you will have to update your database schema using either `prisma migrate dev` or `prisma db push`. This will keep your database schema in sync with your Prisma schema. The commands will also regenerate Prisma Client. - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Creating the database schema - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - - - - - - - - Using Prisma Migrate - - - - Querying the database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx new file mode 100644 index 0000000000..8e52572b93 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx @@ -0,0 +1,209 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-cockroachdb +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js highlight=2;delete|3,4;add showLineNumbers +async function main() { + //delete-next-line + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-mysql.mdx new file mode 100644 index 0000000000..314ac4f82d --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-mysql.mdx @@ -0,0 +1,209 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js highlight=2;delete|3,4; showLineNumbers +async function main() { + //delete-next-line + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-planetscale.mdx new file mode 100644 index 0000000000..0cf2dd8b65 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-planetscale.mdx @@ -0,0 +1,210 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js highlight=2;delete|3,4;add showLineNumbers +async function main() { + //delete-next-line + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + + +```js file=index.js copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-postgresql.mdx new file mode 100644 index 0000000000..b7a7c22da6 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-postgresql.mdx @@ -0,0 +1,210 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + + +```js file=index.js highlight=2;delete|3,4;add showLineNumbers +async function main() { + //delete-next-line + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-sqlserver.mdx new file mode 100644 index 0000000000..0fcb3dd1bb --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-node-sqlserver.mdx @@ -0,0 +1,209 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js highlight=2;delete|3,4;add showLineNumbers +async function main() { + //delete-next-line + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..2bad432106 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx @@ -0,0 +1,224 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.ts` and add the following code to it: + +```js file=index.ts copy showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts highlight=3,4;add showLineNumbers +async function main() { + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: + +```ts no-lines +const allUsers: (User & { + posts: Post[] +})[] + +export type Post = { + id: number + title: string + content: string | null + published: boolean + authorId: number | null +} +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +npx ts-node index.ts +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-mysql.mdx new file mode 100644 index 0000000000..2bad432106 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-mysql.mdx @@ -0,0 +1,224 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.ts` and add the following code to it: + +```js file=index.ts copy showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts highlight=3,4;add showLineNumbers +async function main() { + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: + +```ts no-lines +const allUsers: (User & { + posts: Post[] +})[] + +export type Post = { + id: number + title: string + content: string | null + published: boolean + authorId: number | null +} +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +npx ts-node index.ts +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx new file mode 100644 index 0000000000..38162989a4 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx @@ -0,0 +1,225 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.ts` and add the following code to it: + +```js file=index.ts copy showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts highlight=3,4;add showLineNumbers +async function main() { + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: + +```ts no-lines +const allUsers: (User & { + posts: Post[] +})[] + +export type Post = { + id: number + title: string + content: string | null + published: boolean + authorId: number | null +} +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +npx ts-node index.ts +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx new file mode 100644 index 0000000000..48a2021fd6 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx @@ -0,0 +1,223 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.ts` and add the following code to it: + +```js file=index.ts copy showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts highlight=3,4;add showLineNumbers +async function main() { + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: + +```ts no-lines +const allUsers: (User & { + posts: Post[] +})[] + +export type Post = { + id: number + title: string + content: string | null + published: boolean + authorId: number | null +} +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +npx ts-node index.ts +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx new file mode 100644 index 0000000000..aad13691e3 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx @@ -0,0 +1,226 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.ts` and add the following code to it: + +```js file=index.ts copy showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts highlight=3,4;add showLineNumbers +async function main() { + // ... you will write your Prisma Client queries here + //add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) + //add-end +} +``` + +Now run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +npx ts-node index.ts +``` + +The output should look similar to this: + +```js no-lines +[ + { + email: 'alice@prisma.io', + id: 1, + name: 'Alice', + posts: [ + { + content: null, + createdAt: 2020-03-21T16:45:01.246Z, + updatedAt: 2020-03-21T16:45:01.246Z, + id: 1, + published: false, + title: 'Hello World', + authorId: 1, + } + ], + profile: { + bio: 'I like turtles', + id: 1, + userId: 1, + } + } +] +``` + +Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: + +```ts no-lines +const allUsers: (User & { + posts: Post[] +})[] + +export type Post = { + id: number + title: string + content: string | null + published: boolean + authorId: number | null +} +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :----- | :------------------ | :-------- | +| `1` | `"alice@prisma.io"` | `"Alice"` | + +**Post** + +| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | +| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | +| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | + +**Profile** + +| **id** | **bio** | **userId** | +| :----- | :----------------- | :--------- | +| `1` | `"I like turtles"` | `1` | + +> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts copy showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +npx ts-node index.ts +``` + +You will see the following output: + +```js no-lines +{ + id: 1, + title: 'Hello World', + content: null, + published: true, + authorId: 1 +} +``` + +The `Post` record with an `id` of `1` now got updated in the database: + +**Post** + +| **id** | **title** | **content** | **published** | **authorId** | +| :----- | :-------------- | :---------- | :------------ | :----------- | +| `1` | `"Hello World"` | `null` | `true` | `1` | + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 + + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database.mdx deleted file mode 100644 index 5b85245b3e..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/250-querying-the-database.mdx +++ /dev/null @@ -1,605 +0,0 @@ ---- -title: 'Querying the database' -metaTitle: 'Querying the database' -metaDescription: 'Write data to and query the database' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Write your first query with Prisma Client - -Now that you have generated [Prisma Client](/orm/prisma-client), you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. - - - -Create a new file named `index.ts` and add the following code to it: - -```js file=index.ts copy -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - - - -Create a new file named `index.js` and add the following code to it: - -```js file=index.js copy -const { PrismaClient } = require('@prisma/client') - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - -Here's a quick overview of the different parts of the code snippet: - -1. Import the `PrismaClient` constructor from the `@prisma/client` node module -1. Instantiate `PrismaClient` -1. Define an `async` function named `main` to send queries to the database -1. Call the `main` function -1. Close the database connections when the script terminates - -Inside the `main` function, add the following query to read all `User` records from the database and print the result: - - - -```ts file=index.ts highlight=3,4;add -async function main() { - // ... you will write your Prisma Client queries here - const allUsers = await prisma.user.findMany() - console.log(allUsers) -} -``` - - - - - -```js file=index.js highlight=2;delete|3,4;add -async function main() { - // ... you will write your Prisma Client queries here - const allUsers = await prisma.user.findMany() - console.log(allUsers) -} -``` - - - -Now run the code with this command: - - - -```terminal copy -npx ts-node index.ts -``` - - - - - -```terminal copy -node index.js -``` - - - -This should print an empty array because there are no `User` records in the database yet: - -```json no-lines -[] -``` - -## Write data into the database - -The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. - -Adjust the `main` function to send a `create` query to the database: - - - -```ts file=index.ts highlight=2-21;add copy -async function main() { - await prisma.user.create({ - data: { - name: 'Alice', - email: 'alice@prisma.io', - posts: { - create: { title: 'Hello World' }, - }, - profile: { - create: { bio: 'I like turtles' }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - profile: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - - - -```js file=index.js highlight=2-21;add copy -async function main() { - await prisma.user.create({ - data: { - name: 'Alice', - email: 'alice@prisma.io', - posts: { - create: { title: 'Hello World' }, - }, - profile: { - create: { bio: 'I like turtles' }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - profile: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - -This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. - -Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. - -Run the code with this command: - - - -```terminal copy -npx ts-node index.ts -``` - - - - - -```terminal copy -node index.js -``` - - - -The output should look similar to this: - -```js no-lines -[ - { - email: 'alice@prisma.io', - id: 1, - name: 'Alice', - posts: [ - { - content: null, - createdAt: 2020-03-21T16:45:01.246Z, - updatedAt: 2020-03-21T16:45:01.246Z, - id: 1, - published: false, - title: 'Hello World', - authorId: 1, - } - ], - profile: { - bio: 'I like turtles', - id: 1, - userId: 1, - } - } -] -``` - - - -Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: - -```ts no-lines -const allUsers: (User & { - posts: Post[] -})[] - -export type Post = { - id: number - title: string - content: string | null - published: boolean - authorId: number | null -} -``` - - - -The query added new records to the `User` and the `Post` tables: - -**User** - -| **id** | **email** | **name** | -| :----- | :------------------ | :-------- | -| `1` | `"alice@prisma.io"` | `"Alice"` | - -**Post** - -| **id** | **createdAt** | **updatedAt** | **title** | **content** | **published** | **authorId** | -| :----- | :------------------------- | :------------------------: | :-------------- | :---------- | :------------ | :----------- | -| `1` | `2020-03-21T16:45:01.246Z` | `2020-03-21T16:45:01.246Z` | `"Hello World"` | `null` | `false` | `1` | - -**Profile** - -| **id** | **bio** | **userId** | -| :----- | :----------------- | :--------- | -| `1` | `"I like turtles"` | `1` | - -> **Note**: The numbers in the `authorId` column on `Post` and `userId` column on `Profile` both reference the `id` column of the `User` table, meaning the `id` value `1` column therefore refers to the first (and only) `User` record in the database. - -Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: - - - -```ts file=index.ts copy -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js copy -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -Now run the code using the same command as before: - -```terminal copy -npx ts-node index.ts -``` - - - - - -Now run the code using the same command as before: - -```terminal copy -node index.js -``` - - - -You will see the following output: - -```js no-lines -{ - id: 1, - title: 'Hello World', - content: null, - published: true, - authorId: 1 -} -``` - -The `Post` record with an `id` of `1` now got updated in the database: - -**Post** - -| **id** | **title** | **content** | **published** | **authorId** | -| :----- | :-------------- | :---------- | :------------ | :----------- | -| `1` | `"Hello World"` | `null` | `true` | `1` | - -Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/300-next-steps.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/300-next-steps.mdx index dc0d133e74..7140273e7a 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/300-next-steps.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/300-next-steps.mdx @@ -1,27 +1,28 @@ --- title: 'Next steps' metaTitle: 'Next steps' -metaDescription: 'Next steps to take now that you have successfully added Prisma to your project' +description: 'Next steps to take now that you have successfully added Prisma to your project' langSwitcher: ['typescript', 'node'] dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false +hide_table_of_contents: true --- ## Next steps -This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma. +This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma ORM. ### Continue exploring the Prisma Client API You can send a variety of queries with the Prisma Client API. Check out the [API reference](/orm/prisma-client) and use your existing database setup from this guide to try them out. - +:::tip You can use your editor's auto-completion feature to learn about the different API calls and the arguments it takes. Auto-completion is commonly invoked by hitting CTRL+SPACE on your keyboard. - +::: -
Expand for more Prisma Client API examples +
+Expand for more Prisma Client API examples Here are a few suggestions for a number of more queries you can send with Prisma Client: @@ -73,13 +74,13 @@ const deletedUser = await prisma.user.delete({ Prisma Studio is a visual editor for the data in your database. Run `npx prisma studio` in your terminal. -### Try a Prisma example +### Try a Prisma ORM example The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository contains a number of ready-to-run examples: -, ]}> + - + | Demo | Stack | Description | | :------------------------------------------------------------------------------------------------------------------ | :----------- | --------------------------------------------------------------------------------------------------- | @@ -89,9 +90,9 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/typescript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/typescript/grpc) | Backend only | Simple gRPC API | - + - + | Demo | Stack | Description | | :---------------------------------------------------------------------------------------------------------------- | :----------- | :-------------------------------------------------------------------------------------------------- | @@ -100,6 +101,6 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/javascript/grpc) | Backend only | Simple gRPC API | - + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/index.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/index.mdx deleted file mode 100644 index c8cb90bda0..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases/index.mdx +++ /dev/null @@ -1,300 +0,0 @@ ---- -title: 'Relational databases' -metaTitle: 'Start from scratch with relational databases (15 min)' -metaDescription: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your relational database and generating a Prisma Client for database access.' -duration: '15 min' -toc: false -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] ---- - - - -Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). - - - -## Prerequisites - -In order to successfully complete this guide, you need: - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [PostgreSQL](https://www.postgresql.org/) database server running - - - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [CockroachDB](https://www.cockroachlabs.com/) database server running - - - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [MySQL](https://www.mysql.com/) database server running - - - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [PlanetScale](https://www.planetscale.com/) database server running - - - -This tutorial will also assume that you can push to the `main` branch of your database. Do not do this if your `main` branch has been promoted to production. - - - - - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database - - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) - - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) - - - -> See [System requirements](/orm/reference/system-requirements) for exact version requirements. - -Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma, check out the [Quickstart](/getting-started/quickstart). - -## Create project setup - -As a first step, create a project directory and navigate into it: - -```terminal copy -mkdir hello-prisma -cd hello-prisma -``` - - - -Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: - -```terminal copy -npm init -y -npm install prisma typescript ts-node @types/node --save-dev -``` - -This creates a `package.json` with an initial setup for your TypeScript app. - -Next, initialize TypeScript: - -```terminal copy -npx tsc --init -``` - - - - - -Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: - -```terminal copy -npm init -y -npm install prisma --save-dev -``` - -This creates a `package.json` with an initial setup for a Node.js app. - - - - - -See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. - - - -You can now invoke the Prisma CLI by prefixing it with `npx`: - -```terminal -npx prisma -``` - -Next, set up your Prisma project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: - -```terminal copy -npx prisma init -``` - -This command does two things: - -- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models -- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-node-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-node-mongodb.mdx new file mode 100644 index 0000000000..ba08f9bec7 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-node-mongodb.mdx @@ -0,0 +1,74 @@ +--- +title: 'MongoDB' +metaTitle: 'Start from scratch with MongoDB (15 min)' +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your MongoDB database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/connect-your-database-node-mongodb +--- + + + +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your MongoDB database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli) and [Prisma Client](/orm/prisma-client). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- Access to a MongoDB 4.2+ server with a replica set deployment. We recommend using [MongoDB Atlas](https://www.mongodb.com/cloud/atlas). + + + + The MongoDB database connector uses transactions to support nested writes. Transactions **require** a [replica set](https://docs.mongodb.com/manual/tutorial/deploy-replica-set/) deployment. The easiest way to deploy a replica set is with [Atlas](https://docs.atlas.mongodb.com/getting-started/). It's free to get started. + + + +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +## Create project setup + +As a first step, create a project directory and navigate into it: + +```terminal copy +mkdir hello-prisma +cd hello-prisma +``` + +Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: + +```terminal copy +npm init -y +npm install prisma --save-dev +``` + +This creates a `package.json` with an initial setup for a Node.js app. + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/index.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-typescript-mongodb.mdx similarity index 57% rename from content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/index.mdx rename to content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-typescript-mongodb.mdx index d85b9fab97..6b6037ed8e 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/index.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb-typescript-mongodb.mdx @@ -1,16 +1,22 @@ --- title: 'MongoDB' metaTitle: 'Start from scratch with MongoDB (15 min)' -metaDescription: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your MongoDB database and generating a Prisma Client for database access.' -duration: '15 min' -toc: false +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your MongoDB database and generating a Prisma Client for database access.' +hide_table_of_contents: true langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] +sidebar_custom_props: { badge: '15 min' } +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/connect-your-database-typescript-mongodb --- - + -Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your MongoDB database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli) and [Prisma Client](/orm/prisma-client). +Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma ORM to your MongoDB database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli) and [Prisma Client](/orm/prisma-client). @@ -27,7 +33,7 @@ In order to successfully complete this guide, you need: -Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma, check out the [Quickstart](/getting-started/quickstart). +Make sure you have your database [connection URL](/orm/reference/connection-urls) at hand. If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). > See [System requirements](/orm/reference/system-requirements) for exact version requirements. @@ -40,8 +46,6 @@ mkdir hello-prisma cd hello-prisma ``` - - Next, initialize a TypeScript project and add the Prisma CLI as a development dependency to it: ```terminal copy @@ -57,28 +61,13 @@ Next, initialize TypeScript: npx tsc --init ``` - - - - -Next, initialize a Node.js project and add the Prisma CLI as a development dependency to it: - -```terminal copy -npm init -y -npm install prisma --save-dev -``` - -This creates a `package.json` with an initial setup for a Node.js app. - - - You can now invoke the Prisma CLI by prefixing it with `npx`: ```terminal npx prisma ``` -Next, set up your Prisma project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file with the following command: ```terminal copy npx prisma init @@ -88,37 +77,3 @@ This command does two things: - creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models - creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-node-mongodb.mdx similarity index 62% rename from content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database.mdx rename to content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-node-mongodb.mdx index 9edea9c598..760c3c5295 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-node-mongodb.mdx @@ -1,17 +1,27 @@ --- title: 'Connect your database (MongoDB)' metaTitle: 'Connect your database' -metaDescription: 'Connect your database to your project' +description: 'Connect your database to your project' langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar dbSwitcher: ['mongodb'] +hide_table_of_contents: true toc: false +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/creating-the-prisma-schema-node-mongodb --- + + ## Connect your database To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -20,7 +30,7 @@ datasource db { In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env` (the example uses a [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) URL): -```bash file=.env +```bash file=.env showLineNumbers DATABASE_URL="mongodb+srv://test:test@cluster0.ns1yp.mongodb.net/myFirstDatabase" ``` @@ -39,55 +49,3 @@ Here's a short explanation of each component: - `HOST`: The host where a [`mongod`](https://docs.mongodb.com/manual/reference/program/mongod/#mongodb-binary-bin.mongod) (or [`mongos`](https://docs.mongodb.com/manual/reference/program/mongos/#mongodb-binary-bin.mongos)) instance is running - `PORT`: The port where your database server is running (typically `27017` for MongoDB) - `DATABASE`: The name of the database - - - - - - - Installation - - - - Creating the Prisma schema - - - - - - - - - - - - Installation - - - - Creating the Prisma schema - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-typescript-mongodb.mdx new file mode 100644 index 0000000000..fd8120bae1 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/100-connect-your-database-typescript-mongodb.mdx @@ -0,0 +1,49 @@ +--- +title: 'Connect your database (MongoDB)' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/creating-the-prisma-schema-typescript-mongodb +--- + + + +## Connect your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env` (the example uses a [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) URL): + +```bash file=.env showLineNumbers +DATABASE_URL="mongodb+srv://test:test@cluster0.ns1yp.mongodb.net/myFirstDatabase" +``` + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For MongoDB, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mongodb://USERNAME:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USERNAME`: The name of your database user +- `PASSWORD`: The password for your database user +- `HOST`: The host where a [`mongod`](https://docs.mongodb.com/manual/reference/program/mongod/#mongodb-binary-bin.mongod) (or [`mongos`](https://docs.mongodb.com/manual/reference/program/mongos/#mongodb-binary-bin.mongos)) instance is running +- `PORT`: The port where your database server is running (typically `27017` for MongoDB) +- `DATABASE`: The name of the database diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-node-mongodb.mdx similarity index 61% rename from content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema.mdx rename to content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-node-mongodb.mdx index ece8f719b7..6967c78a52 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-node-mongodb.mdx @@ -1,17 +1,27 @@ --- title: 'Creating the Prisma schema' metaTitle: 'Creating the Prisma schema' -metaDescription: 'Update the Prisma schema for MongoDB' +description: 'Update the Prisma schema for MongoDB' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/install-prisma-client-node-mongodb --- + + + ## Update the Prisma schema Open the `prisma/schema.prisma` file and replace the default contents with the following: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -60,55 +70,3 @@ There are also a number of subtle differences in how the schema is setup when co For example, the underlying `ID` field name is always `_id` and must be mapped with `@map("_id")`. For more information check out the [MongoDB schema reference](/orm/reference/prisma-schema-reference#mongodb-2). - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-typescript-mongodb.mdx new file mode 100644 index 0000000000..ae26398d99 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/125-creating-the-prisma-schema-typescript-mongodb.mdx @@ -0,0 +1,71 @@ +--- +title: 'Creating the Prisma schema' +metaTitle: 'Creating the Prisma schema' +description: 'Update the Prisma schema for MongoDB' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/install-prisma-client-typescript-mongodb +--- + + + +## Update the Prisma schema + +Open the `prisma/schema.prisma` file and replace the default contents with the following: + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model Post { + id String @id @default(auto()) @map("_id") @db.ObjectId + slug String @unique + title String + body String + author User @relation(fields: [authorId], references: [id]) + authorId String @db.ObjectId + comments Comment[] +} + +model User { + id String @id @default(auto()) @map("_id") @db.ObjectId + email String @unique + name String? + address Address? + posts Post[] +} + +model Comment { + id String @id @default(auto()) @map("_id") @db.ObjectId + comment String + post Post @relation(fields: [postId], references: [id]) + postId String @db.ObjectId +} + +// Address is an embedded document +type Address { + street String + city String + state String + zip String +} +``` + +There are also a number of subtle differences in how the schema is setup when compared to relational databases like PostgreSQL. + +For example, the underlying `ID` field name is always `_id` and must be mapped with `@map("_id")`. + +For more information check out the [MongoDB schema reference](/orm/reference/prisma-schema-reference#mongodb-2). + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-node-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-node-mongodb.mdx new file mode 100644 index 0000000000..b7e273e47a --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-node-mongodb.mdx @@ -0,0 +1,31 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/querying-the-database-node-mongodb +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will need to run the `prisma db push` command to create new indexes and regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx new file mode 100644 index 0000000000..102bd70b97 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx @@ -0,0 +1,30 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/querying-the-database-typescript-mongodb +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you update your Prisma schema, you will need to run the `prisma db push` command to create new indexes and regenerate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client.mdx deleted file mode 100644 index e8e1ef9bf6..0000000000 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/200-install-prisma-client.mdx +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: 'Install Prisma Client' -metaTitle: 'Install Prisma Client' -metaDescription: 'Install and generate Prisma Client in your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['mongodb'] -toc: false ---- - -## Install and generate Prisma Client - -To get started with Prisma Client, you need to install the `@prisma/client` package: - -```terminal copy -npm install @prisma/client -``` - -The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. - -![Install and generate Prisma Client](./../../../images/prisma-client-install-and-generate.png) - -Whenever you update your Prisma schema, you will need to run the `prisma db push` command to create new indexes and regenerate Prisma Client. - - - - - - - Creating the Prisma schema - - - - Querying the database - - - - - - - - - - - - Creating the Prisma schema - - - - Querying the database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-node-mongodb.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-node-mongodb.mdx new file mode 100644 index 0000000000..7f880d4514 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-node-mongodb.mdx @@ -0,0 +1,221 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Connect to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js +async function main() { + //delete-next-line +- // ... you will write your Prisma Client queries here +//add-start ++ const allUsers = await prisma.user.findMany() ++ console.log(allUsers) +//add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +This should print an empty array because there are no `User` records in the database yet: + +```json no-lines +[] +``` + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post`, `User` and `Comment` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js highlight=2-21;add copy showLineNumbers +async function main() { + //add-start + await prisma.user.create({ + data: { + name: 'Rich', + email: 'hello@prisma.com', + posts: { + create: { + title: 'My first post', + body: 'Lots of really interesting stuff', + slug: 'my-first-post', + }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + }, + }) + console.dir(allUsers, { depth: null }) + //add-end +} +``` + +This code creates a new `User` record together with a new `Post` using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the other one via the `Post.author` ↔ `User.posts` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```json no-lines +[ + { + id: '60cc9b0e001e3bfd00a6eddf', + email: 'hello@prisma.com', + name: 'Rich', + address: null, + posts: [ + { + id: '60cc9bad005059d6007f45dd', + slug: 'my-first-post', + title: 'My first post', + body: 'Lots of really interesting stuff', + userId: '60cc9b0e001e3bfd00a6eddf', + }, + ], + }, +] +``` + +The query added new records to the `User` and the `Post` tables: + +**User** + +| **id** | **email** | **name** | +| :------------------------- | :------------------- | :------- | +| `60cc9b0e001e3bfd00a6eddf` | `"hello@prisma.com"` | `"Rich"` | + +**Post** + +| **id** | **createdAt** | **title** | **content** | **published** | **authorId** | +| :------------------------- | :------------------------- | :---------------- | :--------------------------------- | :------------ | :------------------------- | +| `60cc9bad005059d6007f45dd` | `2020-03-21T16:45:01.246Z` | `"My first post"` | `Lots of really interesting stuff` | `false` | `60cc9b0e001e3bfd00a6eddf` | + +> **Note**: The unique IDs in the `authorId` column on `Post` reference the `id` column of the `User` table, meaning the `id` value `60cc9b0e001e3bfd00a6eddf` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll add a couple of comments to the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy showLineNumbers +async function main() { + await prisma.post.update({ + where: { + slug: 'my-first-post', + }, + data: { + comments: { + createMany: { + data: [ + { comment: 'Great post!' }, + { comment: "Can't wait to read more!" }, + ], + }, + }, + }, + }) + const posts = await prisma.post.findMany({ + include: { + comments: true, + }, + }) + + console.dir(posts, { depth: Infinity }) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```json no-lines +[ + { + id: '60cc9bad005059d6007f45dd', + slug: 'my-first-post', + title: 'My first post', + body: 'Lots of really interesting stuff', + userId: '60cc9b0e001e3bfd00a6eddf', + comments: [ + { + id: '60cca420008a21d800578793', + postId: '60cca40300af8bf000f6ca99', + comment: 'Great post!', + }, + { + id: '60cca420008a21d800578794', + postId: '60cca40300af8bf000f6ca99', + comment: "Can't wait to try this!", + }, + ], + }, +] +``` + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-typescript-mongodb.mdx similarity index 63% rename from content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database.mdx rename to content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-typescript-mongodb.mdx index d650cc2032..4b11ad804e 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/250-querying-the-database-typescript-mongodb.mdx @@ -1,21 +1,27 @@ --- title: 'Querying the database' metaTitle: 'Querying the database' -metaDescription: 'Write data to and query the database' +description: 'Write data to and query the database' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/start-from-scratch/mongodb/next-steps --- + + ## Write your first query with Prisma Client Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. - - Create a new file named `index.ts` and add the following code to it: -```js file=index.ts copy +```js file=index.ts copy showLineNumbers import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() @@ -34,34 +40,6 @@ main() }) ``` - - - - -Create a new file named `index.js` and add the following code to it: - -```js file=index.js copy -const { PrismaClient } = require('@prisma/client') - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - Here's a quick overview of the different parts of the code snippet: 1. Import the `PrismaClient` constructor from the `@prisma/client` node module @@ -73,48 +51,22 @@ Here's a quick overview of the different parts of the code snippet: Inside the `main` function, add the following query to read all `User` records from the database and print the result: - - -```ts file=index.ts +```ts file=index.ts showLineNumbers async function main() { // ... you will write your Prisma Client queries here +//add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) +//add-end } ``` - - - - -```js file=index.js -async function main() { -- // ... you will write your Prisma Client queries here -+ const allUsers = await prisma.user.findMany() -+ console.log(allUsers) -} -``` - - - Now run the code with this command: - - ```terminal copy npx ts-node index.ts ``` - - - - -```terminal copy -node index.js -``` - - - This should print an empty array because there are no `User` records in the database yet: ```json no-lines @@ -127,39 +79,9 @@ The `findMany` query you used in the previous section only _reads_ data from the Adjust the `main` function to send a `create` query to the database: - - -```ts file=index.ts highlight=2-21;add copy -async function main() { - await prisma.user.create({ - data: { - name: 'Rich', - email: 'hello@prisma.com', - posts: { - create: { - title: 'My first post', - body: 'Lots of really interesting stuff', - slug: 'my-first-post', - }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - - - -```js file=index.js highlight=2-21;add copy +```ts file=index.ts highlight=2-21;add copy showLineNumbers async function main() { + //add-start await prisma.user.create({ data: { name: 'Rich', @@ -180,36 +102,23 @@ async function main() { }, }) console.dir(allUsers, { depth: null }) + //add-end } ``` - - This code creates a new `User` record together with a new `Post` using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the other one via the `Post.author` ↔ `User.posts` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` relations on the returned `User` objects. Run the code with this command: - - ```terminal copy npx ts-node index.ts ``` - - - - -```terminal copy -node index.js -``` - - - The output should look similar to this: -```json5 no-lines +```json no-lines [ { id: '60cc9b0e001e3bfd00a6eddf', @@ -229,8 +138,6 @@ The output should look similar to this: ] ``` - - Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: ```ts no-lines @@ -247,8 +154,6 @@ export type Post = { } ``` - - The query added new records to the `User` and the `Post` tables: **User** @@ -267,9 +172,7 @@ The query added new records to the `User` and the `Post` tables: Before moving on to the next section, you'll add a couple of comments to the `Post` record you just created using an `update` query. Adjust the `main` function as follows: - - -```ts file=index.ts copy +```ts file=index.ts copy showLineNumbers async function main() { await prisma.post.update({ where: { @@ -296,62 +199,15 @@ async function main() { } ``` - - - - -```js file=index.js copy -async function main() { - await prisma.post.update({ - where: { - slug: 'my-first-post', - }, - data: { - comments: { - createMany: { - data: [ - { comment: 'Great post!' }, - { comment: "Can't wait to read more!" }, - ], - }, - }, - }, - }) - const posts = await prisma.post.findMany({ - include: { - comments: true, - }, - }) - - console.dir(posts, { depth: Infinity }) -} -``` - - - - - Now run the code using the same command as before: ```terminal copy npx ts-node index.ts ``` - - - - -Now run the code using the same command as before: - -```terminal copy -node index.js -``` - - - You will see the following output: -```json5 no-lines +```json no-lines [ { id: '60cc9bad005059d6007f45dd', @@ -376,50 +232,3 @@ You will see the following output: ``` Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/300-next-steps.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/300-next-steps.mdx index 628f0abc58..1d6dfa6366 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/300-next-steps.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb/300-next-steps.mdx @@ -1,27 +1,28 @@ --- title: 'Next steps' metaTitle: 'Next steps' -metaDescription: 'Next steps to take now that you have successfully added Prisma to your project' +description: 'Next steps to take now that you have successfully added Prisma to your project' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true --- ## Next steps -This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma. +This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma ORM. ### Continue exploring the Prisma Client API You can send a variety of queries with the Prisma Client API. Check out the [API reference](/orm/prisma-client) and use your existing database setup from this guide to try them out. - +:::tip You can use your editor's auto-completion feature to learn about the different API calls and the arguments it takes. Auto-completion is commonly invoked by hitting CTRL+SPACE on your keyboard. - +::: -
Expand for more Prisma Client API examples +
+Expand for more Prisma Client API examples Here are a few suggestions for a number of more queries you can send with Prisma Client: @@ -75,13 +76,13 @@ const deletedUser = await prisma.user.delete({ Prisma Studio is a visual editor for the data in your database. Run `npx prisma studio` in your terminal. -### Try a Prisma example +### Try a Prisma ORM example The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository contains a number of ready-to-run examples: -, ]}> + - + | Demo | Stack | Description | | :------------------------------------------------------------------------------------------------------------------ | :----------- | --------------------------------------------------------------------------------------------------- | @@ -91,9 +92,9 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/typescript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/typescript/grpc) | Backend only | Simple gRPC API | - + - + | Demo | Stack | Description | | :---------------------------------------------------------------------------------------------------------------- | :----------- | :-------------------------------------------------------------------------------------------------- | @@ -102,6 +103,6 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/javascript/grpc) | Backend only | Simple gRPC API | - + diff --git a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/index.mdx b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/index.mdx index 491ba8b0b5..62b8aaa160 100644 --- a/content/100-getting-started/02-setup-prisma/100-start-from-scratch/index.mdx +++ b/content/100-getting-started/02-setup-prisma/100-start-from-scratch/index.mdx @@ -1,8 +1,8 @@ --- title: 'Start from scratch' metaTitle: 'Start from scratch with Prisma' -metaDescription: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your database of choice and generating a Prisma Client for database access.' -toc: false +description: 'Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your database of choice and generating a Prisma Client for database access.' +hide_table_of_contents: true --- diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-cockroachdb.mdx new file mode 100644 index 0000000000..8b25ab7054 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-cockroachdb.mdx @@ -0,0 +1,74 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-cockroachdb +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [CockroachDB](https://www.cockroachlabs.com) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-mysql.mdx new file mode 100644 index 0000000000..291618c7c9 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-mysql.mdx @@ -0,0 +1,75 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-mysql +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [MySQL](https://www.mysql.com/) database server running and a database with at least one table + + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-planetscale.mdx new file mode 100644 index 0000000000..04789d37da --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-planetscale.mdx @@ -0,0 +1,73 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-planetscale +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PlanetScale](https://www.planetscale.com/) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-postgresql.mdx new file mode 100644 index 0000000000..ef9ec4b373 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-postgresql.mdx @@ -0,0 +1,75 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgresql +--- + + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PostgreSQL](https://www.postgresql.org/) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-sqlserver.mdx new file mode 100644 index 0000000000..38d8bad221 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-node-sqlserver.mdx @@ -0,0 +1,74 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-sqlserver +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database + - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) + - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..36661470fd --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-cockroachdb.mdx @@ -0,0 +1,74 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-cockroachdb +--- + + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [CockroachDB](https://www.cockroachlabs.com) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-mysql.mdx new file mode 100644 index 0000000000..1a481c5f0f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-mysql.mdx @@ -0,0 +1,73 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-mysql +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [MySQL](https://www.mysql.com/) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-planetscale.mdx new file mode 100644 index 0000000000..cd04aac468 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-planetscale.mdx @@ -0,0 +1,73 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-planetscale +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PlanetScale](https://www.planetscale.com/) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-postgresql.mdx new file mode 100644 index 0000000000..b9ee959cfd --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-postgresql.mdx @@ -0,0 +1,73 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgresql +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- an existing Node.js project with a `package.json` +- [Node.js](https://nodejs.org/en/) installed on your machine +- a [PostgreSQL](https://www.postgresql.org/) database server running and a database with at least one table + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-sqlserver.mdx new file mode 100644 index 0000000000..b23137829f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases-typescript-sqlserver.mdx @@ -0,0 +1,74 @@ +--- +title: 'Relational databases' +metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-sqlserver +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + +:::tip + +If you're migrating to Prisma ORM from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. + +::: + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database + - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) + - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +## Set up Prisma ORM + +As a first step, navigate into your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + + + +See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma ORM using a different package manager. + + + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx new file mode 100644 index 0000000000..40959a2e53 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-cockroachdb.mdx @@ -0,0 +1,75 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +toc: false +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-cockroachdb +--- + + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "cockroachdb" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. +- `DATABASE`: The name of the database +- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). + +For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" +``` + +To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. + +For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" +``` + +Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-mysql.mdx new file mode 100644 index 0000000000..636e9150e4 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-mysql.mdx @@ -0,0 +1,75 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-mysql +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" +``` + +When running MySQL locally, your connection URL typically looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" +``` + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-planetscale.mdx new file mode 100644 index 0000000000..079697e91e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-planetscale.mdx @@ -0,0 +1,101 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-planetscale +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +You will also need to [set the relation mode type to `prisma`](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode) in the `datasource` block: + +```prisma file=schema.prisma highlight=4;add showLineNumbers +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + //add-next-line + relationMode = "prisma" +} +``` + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. + +
+Alternative method: connecting using the PlanetScale CLI + +Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: + +```bash file=.env +DATABASE_URL="mysql://root@localhost:PORT/mydb" +``` + +To connect to your branch, use the following command: + +```terminal +pscale connect prisma-test branchname --port PORT +``` + +The `--port` flag can be omitted if you are using the default port `3306`. + +
+ diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-postgresql.mdx new file mode 100644 index 0000000000..34566759af --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-postgresql.mdx @@ -0,0 +1,61 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgresql +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA +``` + +> **Note**: In most cases, you can use the [`postgres://` and `postgresql:// URI scheme designators interchangeably`](https://www.postgresql.org/docs/10/libpq-connect.html#id-1.7.3.8.3.6) - however, depending on how your database is hosted, you might need to be specific. + +If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. + +As an example, for a PostgreSQL database hosted on Heroku, the connection URL might look similar to this: + +```bash file=.env +DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" +``` + +When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: + +```bash file=.env +DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-sqlserver.mdx new file mode 100644 index 0000000000..ea669ad51f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-node-sqlserver.mdx @@ -0,0 +1,40 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-sqlserver +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "sqlserver" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema), the following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) + +```bash file=.env +DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" +``` + +Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. + +> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..6f77945e53 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-cockroachdb.mdx @@ -0,0 +1,73 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: 'hidden-sidebar tech-switch' +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-cockroachdb +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "cockroachdb" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. +- `DATABASE`: The name of the database +- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). + +For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" +``` + +To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. + +For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" +``` + +Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-mysql.mdx new file mode 100644 index 0000000000..acf175bc31 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-mysql.mdx @@ -0,0 +1,75 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-mysql +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: + +```bash file=.env +DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" +``` + +When running MySQL locally, your connection URL typically looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" +``` + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx new file mode 100644 index 0000000000..bb23a8f929 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-planetscale.mdx @@ -0,0 +1,100 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-planetscale +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: + +```prisma file=prisma/schema.prisma highlight=2;edit showLineNumbers +datasource db { + //edit-next-line + provider = "mysql" + url = env("DATABASE_URL") +} +``` + +You will also need to [set the relation mode type to `prisma`](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode) in the `datasource` block: + +```prisma file=schema.prisma highlight=4;add showLineNumbers +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + //add-next-line + relationMode = "prisma" +} +``` + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mysql://USER:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USER`: The name of your database user +- `PASSWORD`: The password for your database user +- `PORT`: The port where your database server is running (typically `3306` for MySQL) +- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) + +For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: + +```bash file=.env +DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" +``` + +The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. + +
+Alternative method: connecting using the PlanetScale CLI + +Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: + +```bash file=.env +DATABASE_URL="mysql://root@localhost:PORT/mydb" +``` + +To connect to your branch, use the following command: + +```terminal +pscale connect prisma-test branchname --port PORT +``` + +The `--port` flag can be omitted if you are using the default port `3306`. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx new file mode 100644 index 0000000000..67f5604ea9 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-postgresql.mdx @@ -0,0 +1,60 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgresql +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: + +```bash file=.env +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" +``` + +You now need to adjust the connection URL to point to your own database. + +

Connection URL

+ +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA +``` + +> **Note**: In most cases, you can use the [`postgres://` and `postgresql:// URI scheme designators interchangeably`](https://www.postgresql.org/docs/10/libpq-connect.html#id-1.7.3.8.3.6) - however, depending on how your database is hosted, you might need to be specific. + +If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. + +As an example, for a PostgreSQL database hosted on Heroku, the connection URL might look similar to this: + +```bash file=.env +DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" +``` + +When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: + +```bash file=.env +DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx new file mode 100644 index 0000000000..66815da841 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database-typescript-sqlserver.mdx @@ -0,0 +1,40 @@ +--- +title: 'Connect your database' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +toc: false +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-sqlserver +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "sqlserver" + url = env("DATABASE_URL") +} +``` + +The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema), the following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) + +```bash file=.env +DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" +``` + +Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. + +> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database.mdx deleted file mode 100644 index d1079ba7ce..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/100-connect-your-database.mdx +++ /dev/null @@ -1,519 +0,0 @@ ---- -title: 'Connect your database' -metaTitle: 'Connect your database' -metaDescription: 'Connect your database to your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Connecting your database - -To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" -``` - -You now need to adjust the connection URL to point to your own database. - -

Connection URL

- -The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For PostgreSQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA -``` - -> **Note**: In most cases, you can use the [`postgres://` and `postgresql:// URI scheme designators interchangeably`](https://www.postgresql.org/docs/10/libpq-connect.html#id-1.7.3.8.3.6) - however, depending on how your database is hosted, you might need to be specific. - -If you're unsure what to provide for the `schema` parameter for a PostgreSQL connection URL, you can probably omit it. In that case, the default schema name `public` will be used. - -As an example, for a PostgreSQL database hosted on Heroku, the connection URL might look similar to this: - -```bash file=.env -DATABASE_URL="postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma" -``` - -When running PostgreSQL locally on macOS, your user and password as well as the database name _typically_ correspond to the current _user_ of your OS, e.g. assuming the user is called `janedoe`: - -```bash file=.env -DATABASE_URL="postgresql://janedoe:janedoe@localhost:5432/janedoe?schema=hello-prisma" -``` - -
- - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL, so you first need to switch the `provider` to `mysql`: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - -In this case, the `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb" -``` - -You now need to adjust the connection URL to point to your own database. - -

Connection URL

- -The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. For MySQL, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -mysql://USER:PASSWORD@HOST:PORT/DATABASE -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running (typically `3306` for MySQL) -- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) - -As an example, for a MySQL database hosted on AWS RDS, the [connection URL](/orm/reference/connection-urls) might look similar to this: - -```bash file=.env -DATABASE_URL="mysql://johndoe:XXX@mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/mydb" -``` - -When running MySQL locally, your connection URL typically looks similar to this: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb" -``` - -
- - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For PlanetScale, you need to edit the `datasource` block to use the `mysql` provider instead: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} -``` - -You will also need to [set the relation mode type to `prisma`](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-with-the-prisma-relation-mode) in the `datasource` block: - -```prisma file=schema.prisma highlight=4;add -datasource db { - provider = "mysql" - url = env("DATABASE_URL") - relationMode = "prisma" -} -``` - -The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) which is defined in `.env`: - -```bash file=.env -DATABASE_URL="mysql://janedoe:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" -``` - -You now need to adjust the connection URL to point to your own database. - -

Connection URL

- -The [format of the connection URL](/orm/reference/connection-urls) for your database typically depends on the database you use. PlanetScale uses the MySQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -mysql://USER:PASSWORD@HOST:PORT/DATABASE -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running (typically `3306` for MySQL) -- `DATABASE`: The name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) - -For a database hosted with PlanetScale, the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="mysql://myusername:mypassword@server.us-east-2.psdb.cloud/mydb?sslaccept=strict" -``` - -The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' to get the Prisma format for the connection URL. - -
Alternative method: connecting using the PlanetScale CLI - -Alternatively, you can connect to your PlanetScale database server using the [PlanetScale CLI](https://docs.planetscale.com/reference/planetscale-environment-setup), and use a local connection URL. In this case the connection URL will look like this: - -```bash file=.env -DATABASE_URL="mysql://root@localhost:PORT/mydb" -``` - -To connect to your branch, use the following command: - -```terminal -pscale connect prisma-test branchname --port PORT -``` - -The `--port` flag can be omitted if you are using the default port `3306`. - -
- -
- - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "sqlserver" - url = env("DATABASE_URL") -} -``` - -The `url` is [set via an environment variable](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema), the following example connection URL [uses SQL authentication](/orm/overview/databases/sql-server), but there are [other ways to format your connection URL](/orm/overview/databases/sql-server) - -```bash file=.env -DATABASE_URL="sqlserver://localhost:1433;database=mydb;user=sa;password=r@ndomP@$$w0rd;trustServerCertificate=true" -``` - -Adjust the connection URL to match your setup - see [Microsoft SQL Server connection URL](/orm/overview/databases/sql-server) for more information. - -> Make sure TCP/IP connections are enabled via [SQL Server Configuration Manager](https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager) to avoid `No connection could be made because the target machine actively refused it. (os error 10061)` - - - - - -```prisma file=prisma/schema.prisma -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} -``` - -Note that the default schema created by `prisma init` uses PostgreSQL as the `provider`. For CockroachDB, you need to edit the `datasource` block to use the `cockroachdb` provider instead: - -```prisma file=prisma/schema.prisma highlight=2;edit -datasource db { - provider = "cockroachdb" - url = env("DATABASE_URL") -} -``` - -The `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`. You now need to adjust the connection URL to point to your own database. - -

Connection URL

- -The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. CockroachDB uses the PostgreSQL connection URL format, which has the following structure (the parts spelled all-uppercased are _placeholders_ for your specific connection details): - -```no-lines -postgresql://USER:PASSWORD@HOST:PORT/DATABASE?PARAMETERS -``` - -Here's a short explanation of each component: - -- `USER`: The name of your database user -- `PASSWORD`: The password for your database user -- `PORT`: The port where your database server is running. The default for CockroachDB is `26257`. -- `DATABASE`: The name of the database -- `PARAMETERS`: Any additional connection parameters. See the CockroachDB documentation [here](https://www.cockroachlabs.com/docs/stable/connection-parameters.html#additional-connection-parameters). - -For a [CockroachDB Serverless](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart.html) or [Cockroach Dedicated](https://www.cockroachlabs.com/docs/cockroachcloud/quickstart-trial-cluster) database hosted on [CockroachDB Cloud](https://www.cockroachlabs.com/get-started-cockroachdb/), the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="postgresql://:@..cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--" -``` - -To find your connection string on CockroachDB Cloud, click the 'Connect' button on the overview page for your database cluster, and select the 'Connection string' tab. - -For a [CockroachDB database hosted locally](https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html), the [connection URL](/orm/reference/connection-urls) looks similar to this: - -```bash file=.env -DATABASE_URL="postgresql://root@localhost:26257?sslmode=disable" -``` - -Your connection string is displayed as part of the welcome text when starting CockroachDB from the command line. - -
- - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-cockroachdb.mdx new file mode 100644 index 0000000000..e6161c32aa --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-cockroachdb.mdx @@ -0,0 +1,224 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-cockroachdb +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE "User" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + name STRING(255), + email STRING(255) UNIQUE NOT NULL +); + +CREATE TABLE "Post" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + title STRING(255) UNIQUE NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content STRING, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INT8 NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "User"(id) +); + +CREATE TABLE "Profile" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + bio STRING, + "userId" INT8 UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"(id) +); +``` + +> **Note**: Some fields are written in double quotes to ensure CockroachDB uses proper casing. If no double-quotes were used, CockroachDB would just read everything as _lowercase_ characters. + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `STRING(255)` | No | No | No | - | +| `email` | `STRING(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | +| `title` | `STRING(255)` | No | No | **✔️** | - | +| `content` | `STRING` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INT8` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `STRING` | No | No | No | - | +| `userId` | `INT8` | No | **✔️** | **✔️** | - | + +
+ + +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the environment variable used to define the `url` in your `schema.prisma`, `DATABASE_URL`, that in our case is set in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id BigInt @id @default(autoincrement()) + title String @unique @db.String(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId BigInt + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id BigInt @id @default(autoincrement()) + bio String? + userId BigInt @unique + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id BigInt @id @default(autoincrement()) + name String? @db.String(255) + email String @unique @db.String(255) + Post Post[] + Profile Profile? +} +``` + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit showLineNumbers +model Post { + id BigInt @id @default(autoincrement()) + title String @unique @db.String(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId BigInt + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id BigInt @id @default(autoincrement()) + bio String? + userId BigInt @unique + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id BigInt @id @default(autoincrement()) + name String? @db.String(255) + email String @unique @db.String(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(sequence()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(sequence()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
+ diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-mysql.mdx new file mode 100644 index 0000000000..9f87c12523 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-mysql.mdx @@ -0,0 +1,225 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-mysql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE User ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + name VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE Post ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + title VARCHAR(255) NOT NULL, + createdAt TIMESTAMP NOT NULL DEFAULT now(), + content TEXT, + published BOOLEAN NOT NULL DEFAULT false, + authorId INTEGER NOT NULL, + FOREIGN KEY (authorId) REFERENCES User(id) +); + +CREATE TABLE Profile ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + bio TEXT, + userId INTEGER UNIQUE NOT NULL, + FOREIGN KEY (userId) REFERENCES User(id) +); +``` + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `VARCHAR(255)` | No | No | No | - | +| `email` | `VARCHAR(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `DATETIME(3)` | No | No | **✔️** | `now()` | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `TEXT` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INTEGER` | No | **✔️** | **✔️** | `false` | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `TEXT` | No | No | No | - | +| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(0) + content String? @db.Text + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") + + @@index([authorId], map: "authorId") +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? @db.Text + userId Int @unique(map: "userId") + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique(map: "email") @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + + + +Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. + + + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,17,24,25;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(0) + content String? @db.Text + published Boolean @default(false) + authorId Int + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") + + @@index([authorId], map: "authorId") +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? @db.Text + userId Int @unique(map: "userId") + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique(map: "email") @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-planetscale.mdx new file mode 100644 index 0000000000..74c010018f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-planetscale.mdx @@ -0,0 +1,241 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgresql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE `Post` ( + `id` int NOT NULL AUTO_INCREMENT, + `createdAt` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` datetime(3) NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `content` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `published` tinyint(1) NOT NULL DEFAULT '0', + `authorId` int NOT NULL, + PRIMARY KEY (`id`), + KEY `Post_authorId_idx` (`authorId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `Profile` ( + `id` int NOT NULL AUTO_INCREMENT, + `bio` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `userId` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `Profile_userId_key` (`userId`), + KEY `Profile_userId_idx` (`userId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `User` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `User_email_key` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +``` + +
+Expand for a graphical overview of the tables + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `datetime(3)` | No | No | **✔️** | `now()` | +| `updatedAt` | `datetime(3)` | No | No | **✔️** | | +| `title` | `varchar(255)` | No | No | **✔️** | - | +| `content` | `varchar(191)` | No | No | No | - | +| `published` | `tinyint(1)` | No | No | **✔️** | `false` | +| `authorId` | `int` | No | No | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `varchar(191)` | No | No | No | - | +| `userId` | `int` | No | No | **✔️** | - | + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `varchar(191)` | No | No | No | - | +| `email` | `varchar(191)` | No | No | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime + title String @db.VarChar(255) + content String? + published Boolean @default(false) + authorId Int + + @@index([authorId]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + + @@index([userId]) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? +} +``` + + + +Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. + + + +Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +You will then need to add in any missing relations between your data using [relation fields](/orm/prisma-schema/data-model/relations#relation-fields): + +```prisma file=prisma/schema.prisma highlight=8,17,27,28;add showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime + title String @db.VarChar(255) + content String? + published Boolean @default(false) + //add-next-line + author User @relation(fields: [authorId], references: [id]) + authorId Int + + @@index([authorId]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + //add-next-line + user User @relation(fields: [userId], references: [id]) + userId Int @unique + + @@index([userId]) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + //add-start + posts Post[] + profile Profile? + //add-end +} +``` + +After this, run introspection on your database for a second time: + +```terminal copy +npx prisma db pull +``` + +Prisma Migrate will now keep the manually added relation fields. + +Because relation fields are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database. + +In this example, the database schema follows the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models. This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-postgresql.mdx new file mode 100644 index 0000000000..f1d4275edb --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-postgresql.mdx @@ -0,0 +1,222 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgresql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE "public"."User" ( + id SERIAL PRIMARY KEY NOT NULL, + name VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE "public"."Post" ( + id SERIAL PRIMARY KEY NOT NULL, + title VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content TEXT, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INTEGER NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "public"."User"(id) +); + +CREATE TABLE "public"."Profile" ( + id SERIAL PRIMARY KEY NOT NULL, + bio TEXT, + "userId" INTEGER UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "public"."User"(id) +); +``` + +> **Note**: Some fields are written in double-quotes to ensure PostgreSQL uses proper casing. If no double-quotes were used, PostgreSQL would just read everything as _lowercase_ characters. + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `VARCHAR(255)` | No | No | No | - | +| `email` | `VARCHAR(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `TEXT` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INTEGER` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `TEXT` | No | No | No | - | +| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a data model in your Prisma schema. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database with Prisma ORM](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-sqlserver.mdx new file mode 100644 index 0000000000..3fdf279487 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-node-sqlserver.mdx @@ -0,0 +1,229 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-sqlserver +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE [dbo].[Post] ( + [id] INT NOT NULL IDENTITY(1,1), + [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, + [updatedAt] DATETIME2 NOT NULL, + [title] VARCHAR(255) NOT NULL, + [content] NVARCHAR(1000), + [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, + [authorId] INT NOT NULL, + CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) +); + +CREATE TABLE [dbo].[Profile] ( + [id] INT NOT NULL IDENTITY(1,1), + [bio] NVARCHAR(1000), + [userId] INT NOT NULL, + CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), + CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) +); + +CREATE TABLE [dbo].[User] ( + [id] INT NOT NULL IDENTITY(1,1), + [email] NVARCHAR(1000) NOT NULL, + [name] NVARCHAR(1000), + CONSTRAINT [User_pkey] PRIMARY KEY ([id]), + CONSTRAINT [User_email_key] UNIQUE ([email]) +); + +ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; +``` + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `NVARCHAR(1000)` | No | No | No | - | +| `email` | `NVARCHAR(1000)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `DATETIME2` | No | No | **✔️** | `now()` | +| `updatedAt` | `DATETIME2` | No | No | **✔️** | | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `NVARCHAR(1000)` | No | No | No | - | +| `published` | `BIT` | No | No | **✔️** | `false` | +| `authorId` | `INT` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `NVARCHAR(1000)` | No | No | No | - | +| `userId` | `INT` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + User User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + +Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=7,14,22,23;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + //edit-next-line + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + //edit-next-line + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique @db.VarChar(255) + name String? @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..758d285636 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-cockroachdb.mdx @@ -0,0 +1,222 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-cockroachdb +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE "User" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + name STRING(255), + email STRING(255) UNIQUE NOT NULL +); + +CREATE TABLE "Post" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + title STRING(255) UNIQUE NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content STRING, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INT8 NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "User"(id) +); + +CREATE TABLE "Profile" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + bio STRING, + "userId" INT8 UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"(id) +); +``` + +> **Note**: Some fields are written in double quotes to ensure CockroachDB uses proper casing. If no double-quotes were used, CockroachDB would just read everything as _lowercase_ characters. + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `STRING(255)` | No | No | No | - | +| `email` | `STRING(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | +| `title` | `STRING(255)` | No | No | **✔️** | - | +| `content` | `STRING` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INT8` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `STRING` | No | No | No | - | +| `userId` | `INT8` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the environment variable used to define the `url` in your `schema.prisma`, `DATABASE_URL`, that in our case is set in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id BigInt @id @default(autoincrement()) + title String @unique @db.String(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId BigInt + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id BigInt @id @default(autoincrement()) + bio String? + userId BigInt @unique + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id BigInt @id @default(autoincrement()) + name String? @db.String(255) + email String @unique @db.String(255) + Post Post[] + Profile Profile? +} +``` + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit showLineNumbers +model Post { + id BigInt @id @default(autoincrement()) + title String @unique @db.String(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId BigInt + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id BigInt @id @default(autoincrement()) + bio String? + userId BigInt @unique + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id BigInt @id @default(autoincrement()) + name String? @db.String(255) + email String @unique @db.String(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(sequence()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(sequence()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-mysql.mdx new file mode 100644 index 0000000000..d7e792e5f3 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-mysql.mdx @@ -0,0 +1,225 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-mysql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE User ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + name VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE Post ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + title VARCHAR(255) NOT NULL, + createdAt TIMESTAMP NOT NULL DEFAULT now(), + content TEXT, + published BOOLEAN NOT NULL DEFAULT false, + authorId INTEGER NOT NULL, + FOREIGN KEY (authorId) REFERENCES User(id) +); + +CREATE TABLE Profile ( + id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + bio TEXT, + userId INTEGER UNIQUE NOT NULL, + FOREIGN KEY (userId) REFERENCES User(id) +); +``` + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `VARCHAR(255)` | No | No | No | - | +| `email` | `VARCHAR(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `DATETIME(3)` | No | No | **✔️** | `now()` | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `TEXT` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INTEGER` | No | **✔️** | **✔️** | `false` | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `TEXT` | No | No | No | - | +| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(0) + content String? @db.Text + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") + + @@index([authorId], map: "authorId") +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? @db.Text + userId Int @unique(map: "userId") + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique(map: "email") @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + + + +Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. + + + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,17,24,25;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(0) + content String? @db.Text + published Boolean @default(false) + authorId Int + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") + + @@index([authorId], map: "authorId") +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? @db.Text + userId Int @unique(map: "userId") + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique(map: "email") @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-planetscale.mdx new file mode 100644 index 0000000000..7f42f11781 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-planetscale.mdx @@ -0,0 +1,241 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgresql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE `Post` ( + `id` int NOT NULL AUTO_INCREMENT, + `createdAt` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` datetime(3) NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `content` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `published` tinyint(1) NOT NULL DEFAULT '0', + `authorId` int NOT NULL, + PRIMARY KEY (`id`), + KEY `Post_authorId_idx` (`authorId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `Profile` ( + `id` int NOT NULL AUTO_INCREMENT, + `bio` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `userId` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `Profile_userId_key` (`userId`), + KEY `Profile_userId_idx` (`userId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `User` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `User_email_key` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +``` + +
+Expand for a graphical overview of the tables + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `datetime(3)` | No | No | **✔️** | `now()` | +| `updatedAt` | `datetime(3)` | No | No | **✔️** | | +| `title` | `varchar(255)` | No | No | **✔️** | - | +| `content` | `varchar(191)` | No | No | No | - | +| `published` | `tinyint(1)` | No | No | **✔️** | `false` | +| `authorId` | `int` | No | No | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `varchar(191)` | No | No | No | - | +| `userId` | `int` | No | No | **✔️** | - | + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `varchar(191)` | No | No | No | - | +| `email` | `varchar(191)` | No | No | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this: + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime + title String @db.VarChar(255) + content String? + published Boolean @default(false) + authorId Int + + @@index([authorId]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + + @@index([userId]) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? +} +``` + + + +Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. + + + +Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +You will then need to add in any missing relations between your data using [relation fields](/orm/prisma-schema/data-model/relations#relation-fields): + +```prisma file=prisma/schema.prisma highlight=8,17,27,28;add showLineNumbers +model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime + title String @db.VarChar(255) + content String? + published Boolean @default(false) + //add-next-line + author User @relation(fields: [authorId], references: [id]) + authorId Int + + @@index([authorId]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + //add-next-line + user User @relation(fields: [userId], references: [id]) + userId Int @unique + + @@index([userId]) +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + //add-start + posts Post[] + profile Profile? + //add-end +} +``` + +After this, run introspection on your database for a second time: + +```terminal copy +npx prisma db pull +``` + +Prisma Migrate will now keep the manually added relation fields. + +Because relation fields are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database. + +In this example, the database schema follows the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models. This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-postgresql.mdx new file mode 100644 index 0000000000..0629d877e0 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-postgresql.mdx @@ -0,0 +1,221 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgresql +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE "public"."User" ( + id SERIAL PRIMARY KEY NOT NULL, + name VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE "public"."Post" ( + id SERIAL PRIMARY KEY NOT NULL, + title VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content TEXT, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INTEGER NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "public"."User"(id) +); + +CREATE TABLE "public"."Profile" ( + id SERIAL PRIMARY KEY NOT NULL, + bio TEXT, + "userId" INTEGER UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "public"."User"(id) +); +``` + +> **Note**: Some fields are written in double-quotes to ensure PostgreSQL uses proper casing. If no double-quotes were used, PostgreSQL would just read everything as _lowercase_ characters. + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `VARCHAR(255)` | No | No | No | - | +| `email` | `VARCHAR(255)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `TEXT` | No | No | No | - | +| `published` | `BOOLEAN` | No | No | **✔️** | `false` | +| `authorId` | `INTEGER` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `TEXT` | No | No | No | - | +| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a data model in your Prisma schema. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database with Prisma ORM](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + +Prisma ORM's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + //edit-next-line + author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + //edit-next-line + user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-sqlserver.mdx new file mode 100644 index 0000000000..517d770884 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection-typescript-sqlserver.mdx @@ -0,0 +1,229 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-sqlserver +--- + + + + +## Introspect your database with Prisma ORM + +For the purpose of this guide, we'll use a demo SQL schema with three tables: + +```sql no-lines +CREATE TABLE [dbo].[Post] ( + [id] INT NOT NULL IDENTITY(1,1), + [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, + [updatedAt] DATETIME2 NOT NULL, + [title] VARCHAR(255) NOT NULL, + [content] NVARCHAR(1000), + [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, + [authorId] INT NOT NULL, + CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) +); + +CREATE TABLE [dbo].[Profile] ( + [id] INT NOT NULL IDENTITY(1,1), + [bio] NVARCHAR(1000), + [userId] INT NOT NULL, + CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), + CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) +); + +CREATE TABLE [dbo].[User] ( + [id] INT NOT NULL IDENTITY(1,1), + [email] NVARCHAR(1000) NOT NULL, + [name] NVARCHAR(1000), + CONSTRAINT [User_pkey] PRIMARY KEY ([id]), + CONSTRAINT [User_email_key] UNIQUE ([email]) +); + +ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; +``` + +
+Expand for a graphical overview of the tables + +**User** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `name` | `NVARCHAR(1000)` | No | No | No | - | +| `email` | `NVARCHAR(1000)` | No | No | **✔️** | - | + +**Post** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `createdAt` | `DATETIME2` | No | No | **✔️** | `now()` | +| `updatedAt` | `DATETIME2` | No | No | **✔️** | | +| `title` | `VARCHAR(255)` | No | No | **✔️** | - | +| `content` | `NVARCHAR(1000)` | No | No | No | - | +| `published` | `BIT` | No | No | **✔️** | `false` | +| `authorId` | `INT` | No | **✔️** | **✔️** | - | + +**Profile** + +| Column name | Type | Primary key | Foreign key | Required | Default | +| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | +| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | +| `bio` | `NVARCHAR(1000)` | No | No | No | - | +| `userId` | `INT` | No | **✔️** | **✔️** | - | + +
+ +As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. + +Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. + +After the introspection is complete, your Prisma schema file was updated: + +![Introspect your database](/img/getting-started/prisma-db-pull-generate-schema.png) + +The data model now looks similar to this (note that the fields on the models have been reordered for better readability): + +```prisma file=prisma/schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + User User @relation(fields: [authorId], references: [id]) +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + User User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + Post Post[] + Profile Profile? +} +``` + +Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. + +Right now, there's a few minor "issues" with the data model: + +- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. +- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. +- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. + +These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). + +Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: + +```prisma file=prisma/schema.prisma highlight=7,14,22,23;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + //edit-next-line + author User @relation(fields: [authorId], references: [id]) + authorId Int +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + //edit-next-line + user User @relation(fields: [userId], references: [id]) + userId Int @unique +} + +model User { + id Int @id @default(autoincrement()) + email String @unique @db.VarChar(255) + name String? @db.VarChar(255) + //edit-start + posts Post[] + profile Profile? + //edit-end +} +``` + +In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma ORM models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. + +
+ Using custom model and field names + +Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. + +Assume you obtained the following model from introspection that's based on _snake_case_ notation: + +```prisma no-lines +model my_user { + user_id Int @id @default(autoincrement()) + first_name String? + last_name String @unique +} +``` + +If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: + +```ts no-lines +const user = await prisma.my_user.create({ + data: { + first_name: 'Alice', + last_name: 'Smith', + }, +}) +``` + +If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): + +```prisma no-lines +model MyUser { + userId Int @id @default(autoincrement()) @map("user_id") + firstName String? @map("first_name") + lastName String @unique @map("last_name") + + @@map("my_user") +} +``` + +With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: + +```ts no-lines +const user = await prisma.myUser.create({ + data: { + firstName: 'Alice', + lastName: 'Smith', + }, +}) +``` + +Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. + +
diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection.mdx deleted file mode 100644 index 860789a46b..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/150-introspection.mdx +++ /dev/null @@ -1,1324 +0,0 @@ ---- -title: 'Introspection' -metaTitle: 'Introspection' -metaDescription: 'Introspection your database with Prisma' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Introspect your database with Prisma - - - -For the purpose of this guide, we'll use a demo SQL schema with three tables: - -```sql no-lines -CREATE TABLE "public"."User" ( - id SERIAL PRIMARY KEY NOT NULL, - name VARCHAR(255), - email VARCHAR(255) UNIQUE NOT NULL -); - -CREATE TABLE "public"."Post" ( - id SERIAL PRIMARY KEY NOT NULL, - title VARCHAR(255) NOT NULL, - "createdAt" TIMESTAMP NOT NULL DEFAULT now(), - content TEXT, - published BOOLEAN NOT NULL DEFAULT false, - "authorId" INTEGER NOT NULL, - FOREIGN KEY ("authorId") REFERENCES "public"."User"(id) -); - -CREATE TABLE "public"."Profile" ( - id SERIAL PRIMARY KEY NOT NULL, - bio TEXT, - "userId" INTEGER UNIQUE NOT NULL, - FOREIGN KEY ("userId") REFERENCES "public"."User"(id) -); -``` - -> **Note**: Some fields are written in double-quotes to ensure PostgreSQL uses proper casing. If no double-quotes were used, PostgreSQL would just read everything as _lowercase_ characters. - -
Expand for a graphical overview of the tables - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `VARCHAR(255)` | No | No | No | - | -| `email` | `VARCHAR(255)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `TEXT` | No | No | No | - | -| `published` | `BOOLEAN` | No | No | **✔️** | `false` | -| `authorId` | `INTEGER` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `SERIAL` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `TEXT` | No | No | No | - | -| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | - -
- -
- - - -For the purpose of this guide, we'll use a demo SQL schema with three tables: - -```sql no-lines -CREATE TABLE User ( - id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, - name VARCHAR(255), - email VARCHAR(255) UNIQUE NOT NULL -); - -CREATE TABLE Post ( - id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, - title VARCHAR(255) NOT NULL, - createdAt TIMESTAMP NOT NULL DEFAULT now(), - content TEXT, - published BOOLEAN NOT NULL DEFAULT false, - authorId INTEGER NOT NULL, - FOREIGN KEY (authorId) REFERENCES User(id) -); - -CREATE TABLE Profile ( - id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, - bio TEXT, - userId INTEGER UNIQUE NOT NULL, - FOREIGN KEY (userId) REFERENCES User(id) -); -``` - -
Expand for a graphical overview of the tables - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `VARCHAR(255)` | No | No | No | - | -| `email` | `VARCHAR(255)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `DATETIME(3)` | No | No | **✔️** | `now()` | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `TEXT` | No | No | No | - | -| `published` | `BOOLEAN` | No | No | **✔️** | `false` | -| `authorId` | `INTEGER` | No | **✔️** | **✔️** | `false` | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :-------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INTEGER` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `TEXT` | No | No | No | - | -| `userId` | `INTEGER` | No | **✔️** | **✔️** | - | - -
- -
- - - -For the purpose of this guide, we'll use a demo SQL schema with three tables: - -```sql no-lines -CREATE TABLE `Post` ( - `id` int NOT NULL AUTO_INCREMENT, - `createdAt` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` datetime(3) NOT NULL, - `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `published` tinyint(1) NOT NULL DEFAULT '0', - `authorId` int NOT NULL, - PRIMARY KEY (`id`), - KEY `Post_authorId_idx` (`authorId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -CREATE TABLE `Profile` ( - `id` int NOT NULL AUTO_INCREMENT, - `bio` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `userId` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `Profile_userId_key` (`userId`), - KEY `Profile_userId_idx` (`userId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -CREATE TABLE `User` ( - `id` int NOT NULL AUTO_INCREMENT, - `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `User_email_key` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -``` - -
Expand for a graphical overview of the tables - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `datetime(3)` | No | No | **✔️** | `now()` | -| `updatedAt` | `datetime(3)` | No | No | **✔️** | | -| `title` | `varchar(255)` | No | No | **✔️** | - | -| `content` | `varchar(191)` | No | No | No | - | -| `published` | `tinyint(1)` | No | No | **✔️** | `false` | -| `authorId` | `int` | No | No | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `varchar(191)` | No | No | No | - | -| `userId` | `int` | No | No | **✔️** | - | - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `int` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `varchar(191)` | No | No | No | - | -| `email` | `varchar(191)` | No | No | **✔️** | - | - -
- -
- - - -For the purpose of this guide, we'll use a demo SQL schema with three tables: - -```sql no-lines -CREATE TABLE [dbo].[Post] ( - [id] INT NOT NULL IDENTITY(1,1), - [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, - [updatedAt] DATETIME2 NOT NULL, - [title] VARCHAR(255) NOT NULL, - [content] NVARCHAR(1000), - [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, - [authorId] INT NOT NULL, - CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) -); - -CREATE TABLE [dbo].[Profile] ( - [id] INT NOT NULL IDENTITY(1,1), - [bio] NVARCHAR(1000), - [userId] INT NOT NULL, - CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), - CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) -); - -CREATE TABLE [dbo].[User] ( - [id] INT NOT NULL IDENTITY(1,1), - [email] NVARCHAR(1000) NOT NULL, - [name] NVARCHAR(1000), - CONSTRAINT [User_pkey] PRIMARY KEY ([id]), - CONSTRAINT [User_email_key] UNIQUE ([email]) -); - -ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; - -ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; -``` - -
Expand for a graphical overview of the tables - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `NVARCHAR(1000)` | No | No | No | - | -| `email` | `NVARCHAR(1000)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `DATETIME2` | No | No | **✔️** | `now()` | -| `updatedAt` | `DATETIME2` | No | No | **✔️** | | -| `title` | `VARCHAR(255)` | No | No | **✔️** | - | -| `content` | `NVARCHAR(1000)` | No | No | No | - | -| `published` | `BIT` | No | No | **✔️** | `false` | -| `authorId` | `INT` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :--------------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `NVARCHAR(1000)` | No | No | No | - | -| `userId` | `INT` | No | **✔️** | **✔️** | - | - -
- -
- - - -For the purpose of this guide, we'll use a demo SQL schema with three tables: - -```sql no-lines -CREATE TABLE "User" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - name STRING(255), - email STRING(255) UNIQUE NOT NULL -); - -CREATE TABLE "Post" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - title STRING(255) UNIQUE NOT NULL, - "createdAt" TIMESTAMP NOT NULL DEFAULT now(), - content STRING, - published BOOLEAN NOT NULL DEFAULT false, - "authorId" INT8 NOT NULL, - FOREIGN KEY ("authorId") REFERENCES "User"(id) -); - -CREATE TABLE "Profile" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - bio STRING, - "userId" INT8 UNIQUE NOT NULL, - FOREIGN KEY ("userId") REFERENCES "User"(id) -); -``` - -> **Note**: Some fields are written in double quotes to ensure CockroachDB uses proper casing. If no double-quotes were used, CockroachDB would just read everything as _lowercase_ characters. - -
Expand for a graphical overview of the tables - -**User** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | -| `name` | `STRING(255)` | No | No | No | - | -| `email` | `STRING(255)` | No | No | **✔️** | - | - -**Post** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------------ | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | -| `createdAt` | `TIMESTAMP` | No | No | **✔️** | `now()` | -| `title` | `STRING(255)` | No | No | **✔️** | - | -| `content` | `STRING` | No | No | No | - | -| `published` | `BOOLEAN` | No | No | **✔️** | `false` | -| `authorId` | `INT8` | No | **✔️** | **✔️** | - | - -**Profile** - -| Column name | Type | Primary key | Foreign key | Required | Default | -| :---------- | :------- | :---------- | :---------- | :------- | :----------------- | -| `id` | `INT8` | **✔️** | No | **✔️** | _autoincrementing_ | -| `bio` | `STRING` | No | No | No | - | -| `userId` | `INT8` | No | **✔️** | **✔️** | - | - -
- -
- - - -As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. - -Run the following command to introspect your database: - -```terminal copy -npx prisma db pull -``` - -This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. - -After the introspection is complete, your Prisma schema file was updated: - -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) - -The data model now looks similar to this (note that the fields on the models have been reordered for better readability): - -```prisma file=prisma/schema.prisma -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId Int - User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - userId Int @unique - User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique @db.VarChar(255) - Post Post[] - Profile Profile? -} -``` - -Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. - -Right now, there's a few minor "issues" with the data model: - -- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. -- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. -- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. - -These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). - -Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: - -```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId Int - author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - userId Int @unique - user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique @db.VarChar(255) - posts Post[] - profile Profile? -} -``` - -In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. - -
- Using custom model and field names - -Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. - -Assume you obtained the following model from introspection that's based on _snake_case_ notation: - -```prisma no-lines -model my_user { - user_id Int @id @default(autoincrement()) - first_name String? - last_name String @unique -} -``` - -If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: - -```ts no-lines -const user = await prisma.my_user.create({ - data: { - first_name: 'Alice', - last_name: 'Smith', - }, -}) -``` - -If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): - -```prisma no-lines -model MyUser { - userId Int @id @default(autoincrement()) @map("user_id") - firstName String? @map("first_name") - lastName String @unique @map("last_name") - - @@map("my_user") -} -``` - -With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: - -```ts no-lines -const user = await prisma.myUser.create({ - data: { - firstName: 'Alice', - lastName: 'Smith', - }, -}) -``` - -Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. - -
- -
- - - -As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. - -Run the following command to introspect your database: - -```terminal copy -npx prisma db pull -``` - -This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. - -After the introspection is complete, your Prisma schema file was updated: - -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) - -The data model now looks similar to this (note that the fields on the models have been reordered for better readability): - -```prisma file=prisma/schema.prisma -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(0) - content String? @db.Text - published Boolean @default(false) - authorId Int - User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") - - @@index([authorId], map: "authorId") -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? @db.Text - userId Int @unique(map: "userId") - User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique(map: "email") @db.VarChar(255) - Post Post[] - Profile Profile? -} -``` - - - -Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. - - - -Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. - -Right now, there's a few minor "issues" with the data model: - -- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. -- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. -- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. - -These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). - -Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: - -```prisma file=prisma/schema.prisma highlight=8,17,24,25;edit -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(0) - content String? @db.Text - published Boolean @default(false) - authorId Int - author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Post_ibfk_1") - - @@index([authorId], map: "authorId") -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? @db.Text - userId Int @unique(map: "userId") - user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "Profile_ibfk_1") -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique(map: "email") @db.VarChar(255) - posts Post[] - profile Profile? -} -``` - -In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. - -Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. - -Assume you obtained the following model from introspection that's based on _snake_case_ notation: - -```prisma no-lines -model my_user { - user_id Int @id @default(autoincrement()) - first_name String? - last_name String @unique -} -``` - -If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: - -```ts no-lines -const user = await prisma.my_user.create({ - data: { - first_name: 'Alice', - last_name: 'Smith', - }, -}) -``` - -If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): - -```prisma no-lines -model MyUser { - userId Int @id @default(autoincrement()) @map("user_id") - firstName String? @map("first_name") - lastName String @unique @map("last_name") - - @@map("my_user") -} -``` - -With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: - -```ts no-lines -const user = await prisma.myUser.create({ - data: { - firstName: 'Alice', - lastName: 'Smith', - }, -}) -``` - -Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. - - - - - -As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. - -Run the following command to introspect your database: - -```terminal copy -npx prisma db pull -``` - -This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. - -After the introspection is complete, your Prisma schema file was updated: - -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) - -The data model now looks similar to this (note that the fields on the models have been reordered for better readability): - -```prisma file=prisma/schema.prisma -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId Int - User User @relation(fields: [authorId], references: [id]) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - userId Int @unique - User User @relation(fields: [userId], references: [id]) -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique @db.VarChar(255) - Post Post[] - Profile Profile? -} -``` - -Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. - -Right now, there's a few minor "issues" with the data model: - -- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. -- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. -- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. - -These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). - -Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: - -```prisma file=prisma/schema.prisma highlight=7,14,22,23;edit -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique -} - -model User { - id Int @id @default(autoincrement()) - email String @unique @db.VarChar(255) - name String? @db.VarChar(255) - posts Post[] - profile Profile? -} -``` - -In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. - -
- Using custom model and field names - -Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. - -Assume you obtained the following model from introspection that's based on _snake_case_ notation: - -```prisma no-lines -model my_user { - user_id Int @id @default(autoincrement()) - first_name String? - last_name String @unique -} -``` - -If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: - -```ts no-lines -const user = await prisma.my_user.create({ - data: { - first_name: 'Alice', - last_name: 'Smith', - }, -}) -``` - -If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): - -```prisma no-lines -model MyUser { - userId Int @id @default(autoincrement()) @map("user_id") - firstName String? @map("first_name") - lastName String @unique @map("last_name") - - @@map("my_user") -} -``` - -With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: - -```ts no-lines -const user = await prisma.myUser.create({ - data: { - firstName: 'Alice', - lastName: 'Smith', - }, -}) -``` - -Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. - -
- -
- - - -As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. - -Run the following command to introspect your database: - -```terminal copy -npx prisma db pull -``` - -This commands reads the `DATABASE_URL` environment variable that's defined in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. - -After the introspection is complete, your Prisma schema file was updated: - -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) - -The data model now looks similar to this: - -```prisma file=prisma/schema.prisma -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime - title String @db.VarChar(255) - content String? - published Boolean @default(false) - authorId Int - - @@index([authorId]) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - userId Int @unique - - @@index([userId]) -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? -} -``` - - - -Refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference) for detailed information about the schema definition. - - - -Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. - -You will then need to add in any missing relations between your data using [relation fields](/orm/prisma-schema/data-model/relations#relation-fields): - -```prisma file=prisma/schema.prisma highlight=8,17,27,28;add -model Post { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime - title String @db.VarChar(255) - content String? - published Boolean @default(false) - author User @relation(fields: [authorId], references: [id]) - authorId Int - - @@index([authorId]) -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - user User @relation(fields: [userId], references: [id]) - userId Int @unique - - @@index([userId]) -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] - profile Profile? -} -``` - -After this, run introspection on your database for a second time: - -```terminal copy -npx prisma db pull -``` - -Prisma Migrate will now keep the manually added relation fields. - -Because relation fields are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database. - -In this example, the database schema follows the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma models. This optimizes the ergonomics of the generated Prisma Client API. - -
- Using custom model and field names - -Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. - -Assume you obtained the following model from introspection that's based on _snake_case_ notation: - -```prisma no-lines -model my_user { - user_id Int @id @default(autoincrement()) - first_name String? - last_name String @unique -} -``` - -If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: - -```ts no-lines -const user = await prisma.my_user.create({ - data: { - first_name: 'Alice', - last_name: 'Smith', - }, -}) -``` - -If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): - -```prisma no-lines -model MyUser { - userId Int @id @default(autoincrement()) @map("user_id") - firstName String? @map("first_name") - lastName String @unique @map("last_name") - - @@map("my_user") -} -``` - -With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: - -```ts no-lines -const user = await prisma.myUser.create({ - data: { - firstName: 'Alice', - lastName: 'Smith', - }, -}) -``` - -Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. - -
- -
- - - -As a next step, you will introspect your database. The result of the introspection will be a [data model](/orm/prisma-schema/data-model/models) inside your Prisma schema. - -Run the following command to introspect your database: - -```terminal copy -npx prisma db pull -``` - -This commands reads the environment variable used to define the `url` in your `schema.prisma`, `DATABASE_URL`, that in our case is set in `.env` and connects to your database. Once the connection is established, it introspects the database (i.e. it _reads the database schema_). It then translates the database schema from SQL into a Prisma data model. - -After the introspection is complete, your Prisma schema file was updated: - -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) - -The data model now looks similar to this: - -```prisma file=prisma/schema.prisma -model Post { - id BigInt @id @default(autoincrement()) - title String @unique @db.String(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId BigInt - User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model Profile { - id BigInt @id @default(autoincrement()) - bio String? - userId BigInt @unique - User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model User { - id BigInt @id @default(autoincrement()) - name String? @db.String(255) - email String @unique @db.String(255) - Post Post[] - Profile Profile? -} -``` - -Prisma's data model is a declarative representation of your database schema and serves as the foundation for the generated Prisma Client library. Your Prisma Client instance will expose queries that are _tailored_ to these models. - -Right now, there's a few minor "issues" with the data model: - -- The `User` relation field is uppercased and therefore doesn't adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) . To express more "semantics", it would also be nice if this field was called `author` to _describe_ the relationship between `User` and `Post` better. -- The `Post` and `Profile` relation fields on `User` as well as the `User` relation field on `Profile` are all uppercased. To adhere to Prisma's [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions-1) , both fields should be lowercased to `post`, `profile` and `user`. -- Even after lowercasing, the `post` field on `User` is still slightly misnamed. That's because it actually refers to a [list](/orm/prisma-schema/data-model/models#type-modifiers) of posts – a better name therefore would be the plural form: `posts`. - -These changes are relevant for the generated Prisma Client API where using lowercased relation fields `author`, `posts`, `profile` and `user` will feel more natural and idiomatic to JavaScript/TypeScript developers. You can therefore [configure your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). - -Because [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are _virtual_ (i.e. they _do not directly manifest in the database_), you can manually rename them in your Prisma schema without touching the database: - -```prisma file=prisma/schema.prisma highlight=8,15,22,23;edit -model Post { - id BigInt @id @default(autoincrement()) - title String @unique @db.String(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId BigInt - author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model Profile { - id BigInt @id @default(autoincrement()) - bio String? - userId BigInt @unique - user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - -model User { - id BigInt @id @default(autoincrement()) - name String? @db.String(255) - email String @unique @db.String(255) - posts Post[] - profile Profile? -} -``` - -In this example, the database schema did follow the [naming conventions](/orm/reference/prisma-schema-reference#naming-conventions) for Prisma models (only the virtual relation fields that were generated from introspection did not adhere to them and needed adjustment). This optimizes the ergonomics of the generated Prisma Client API. - -
- Using custom model and field names - -Sometimes though, you may want to make additional changes to the names of the columns and tables that are exposed in the Prisma Client API. A common example is to translate _snake_case_ notation which is often used in database schemas into _PascalCase_ and _camelCase_ notations which feel more natural for JavaScript/TypeScript developers. - -Assume you obtained the following model from introspection that's based on _snake_case_ notation: - -```prisma no-lines -model my_user { - user_id Int @id @default(sequence()) - first_name String? - last_name String @unique -} -``` - -If you generated a Prisma Client API for this model, it would pick up the _snake_case_ notation in its API: - -```ts no-lines -const user = await prisma.my_user.create({ - data: { - first_name: 'Alice', - last_name: 'Smith', - }, -}) -``` - -If you don't want to use the table and column names from your database in your Prisma Client API, you can configure them with [`@map` and `@@map`](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections): - -```prisma no-lines -model MyUser { - userId Int @id @default(sequence()) @map("user_id") - firstName String? @map("first_name") - lastName String @unique @map("last_name") - - @@map("my_user") -} -``` - -With this approach, you can name your model and its fields whatever you like and use the `@map` (for field names) and `@@map` (for models names) to point to the underlying tables and columns. Your Prisma Client API now looks as follows: - -```ts no-lines -const user = await prisma.myUser.create({ - data: { - firstName: 'Alice', - lastName: 'Smith', - }, -}) -``` - -Learn more about this on the [Configuring your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) page. - -
- -
- - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Install Prisma Client - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - - - - - - - - Connect your database - - - - Baseline your database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-cockroachdb.mdx new file mode 100644 index 0000000000..3d2dd4ff78 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-cockroachdb.mdx @@ -0,0 +1,89 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-cockroachdb +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +CREATE TABLE "User" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + name STRING(255), + email STRING(255) UNIQUE NOT NULL +); + +CREATE TABLE "Post" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + title STRING(255) UNIQUE NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content STRING, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INT8 NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "User"(id) +); + +CREATE TABLE "Profile" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + bio STRING, + "userId" INT8 UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"(id) +); +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-mysql.mdx new file mode 100644 index 0000000000..5baabc6710 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-mysql.mdx @@ -0,0 +1,105 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-mysql +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +-- CreateTable +CREATE TABLE `Post` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `title` VARCHAR(255) NOT NULL, + `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + `content` TEXT NULL, + `published` BOOLEAN NOT NULL DEFAULT false, + `authorId` INTEGER NOT NULL, + + INDEX `authorId`(`authorId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Profile` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `bio` TEXT NULL, + `userId` INTEGER NOT NULL, + + UNIQUE INDEX `userId`(`userId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `User` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NULL, + `email` VARCHAR(255) NOT NULL, + + UNIQUE INDEX `email`(`email`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `Post` ADD CONSTRAINT `Post_ibfk_1` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `Profile` ADD CONSTRAINT `Profile_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-postgresql.mdx new file mode 100644 index 0000000000..cc1229209c --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-postgresql.mdx @@ -0,0 +1,108 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgresql +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +-- CreateTable +CREATE TABLE "Post" ( + "id" SERIAL NOT NULL, + "title" VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "content" TEXT, + "published" BOOLEAN NOT NULL DEFAULT false, + "authorId" INTEGER NOT NULL, + + CONSTRAINT "Post_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Profile" ( + "id" SERIAL NOT NULL, + "bio" TEXT, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Profile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255), + "email" VARCHAR(255) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- AddForeignKey +ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-sqlserver.mdx new file mode 100644 index 0000000000..2cb3be81c9 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-node-sqlserver.mdx @@ -0,0 +1,97 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-sqlserver +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +CREATE TABLE [dbo].[Post] ( + [id] INT NOT NULL IDENTITY(1,1), + [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, + [updatedAt] DATETIME2 NOT NULL, + [title] VARCHAR(255) NOT NULL, + [content] NVARCHAR(1000), + [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, + [authorId] INT NOT NULL, + CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) +); + +CREATE TABLE [dbo].[Profile] ( + [id] INT NOT NULL IDENTITY(1,1), + [bio] NVARCHAR(1000), + [userId] INT NOT NULL, + CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), + CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) +); + +CREATE TABLE [dbo].[User] ( + [id] INT NOT NULL IDENTITY(1,1), + [email] NVARCHAR(1000) NOT NULL, + [name] NVARCHAR(1000), + CONSTRAINT [User_pkey] PRIMARY KEY ([id]), + CONSTRAINT [User_email_key] UNIQUE ([email]) +); + +ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..61ad9fcf03 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-cockroachdb.mdx @@ -0,0 +1,78 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-cockroachdb +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + + +```sql file=prisma/migrations/0_init/migration.sql +CREATE TABLE "User" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + name STRING(255), + email STRING(255) UNIQUE NOT NULL +); + +CREATE TABLE "Post" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + title STRING(255) UNIQUE NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + content STRING, + published BOOLEAN NOT NULL DEFAULT false, + "authorId" INT8 NOT NULL, + FOREIGN KEY ("authorId") REFERENCES "User"(id) +); + +CREATE TABLE "Profile" ( + id INT8 PRIMARY KEY DEFAULT unique_rowid(), + bio STRING, + "userId" INT8 UNIQUE NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"(id) +); +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-mysql.mdx new file mode 100644 index 0000000000..054f999c57 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-mysql.mdx @@ -0,0 +1,106 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-mysql +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +-- CreateTable +CREATE TABLE `Post` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `title` VARCHAR(255) NOT NULL, + `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + `content` TEXT NULL, + `published` BOOLEAN NOT NULL DEFAULT false, + `authorId` INTEGER NOT NULL, + + INDEX `authorId`(`authorId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Profile` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `bio` TEXT NULL, + `userId` INTEGER NOT NULL, + + UNIQUE INDEX `userId`(`userId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `User` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NULL, + `email` VARCHAR(255) NOT NULL, + + UNIQUE INDEX `email`(`email`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `Post` ADD CONSTRAINT `Post_ibfk_1` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `Profile` ADD CONSTRAINT `Profile_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; +``` + + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-postgresql.mdx new file mode 100644 index 0000000000..3ce685c8de --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-postgresql.mdx @@ -0,0 +1,107 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgresql +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +-- CreateTable +CREATE TABLE "Post" ( + "id" SERIAL NOT NULL, + "title" VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "content" TEXT, + "published" BOOLEAN NOT NULL DEFAULT false, + "authorId" INTEGER NOT NULL, + + CONSTRAINT "Post_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Profile" ( + "id" SERIAL NOT NULL, + "bio" TEXT, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Profile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255), + "email" VARCHAR(255) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- AddForeignKey +ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-sqlserver.mdx new file mode 100644 index 0000000000..ae04629e9c --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database-typescript-sqlserver.mdx @@ -0,0 +1,97 @@ +--- +title: 'Baseline your database' +metaTitle: 'Baseline your database' +description: 'Baseline your database using Prisma Migrate in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-sqlserver +--- + + + + +## Create an initial migration + +To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). + +Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. + +To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. + +First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: + +```terminal +mkdir -p prisma/migrations/0_init +``` + + + +`-p` will recursively create any missing folders in the path you provide. + + + +Next, generate the migration file with `prisma migrate diff`. Use the following arguments: + +- `--from-empty`: assumes the data model you're migrating from is empty +- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block +- `--script`: output a SQL script + +```terminal wrap +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql +``` + +## Review the migration + +The command will generate a migration that should resemble the following script: + +```sql file=prisma/migrations/0_init/migration.sql +CREATE TABLE [dbo].[Post] ( + [id] INT NOT NULL IDENTITY(1,1), + [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, + [updatedAt] DATETIME2 NOT NULL, + [title] VARCHAR(255) NOT NULL, + [content] NVARCHAR(1000), + [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, + [authorId] INT NOT NULL, + CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) +); + +CREATE TABLE [dbo].[Profile] ( + [id] INT NOT NULL IDENTITY(1,1), + [bio] NVARCHAR(1000), + [userId] INT NOT NULL, + CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), + CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) +); + +CREATE TABLE [dbo].[User] ( + [id] INT NOT NULL IDENTITY(1,1), + [email] NVARCHAR(1000) NOT NULL, + [name] NVARCHAR(1000), + CONSTRAINT [User_pkey] PRIMARY KEY ([id]), + CONSTRAINT [User_email_key] UNIQUE ([email]) +); + +ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; +``` + +Review the SQL migration file to ensure everything is correct. + +Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. + +```terminal +npx prisma migrate resolve --applied 0_init +``` + +The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. + +You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database.mdx deleted file mode 100644 index 88f71c91ac..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/170-baseline-your-database.mdx +++ /dev/null @@ -1,421 +0,0 @@ ---- -title: 'Baseline your database' -metaTitle: 'Baseline your database' -metaDescription: 'Baseline your database using Prisma Migrate in your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] -toc: false ---- - -## Create an initial migration - -To use Prisma Migrate with the database you introspected in the last section, you will need to [baseline your database](/orm/prisma-migrate/getting-started). - -Baselining refers to initializing your migration history for a database that might already contain data and **cannot be reset**, such as your production database. Baselining tells Prisma Migrate to assume that one or more migrations have already been applied to your database. - -To baseline your database, use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to compare your schema and database, and save the output into a SQL file. - -First, create a `migrations` directory and add a directory inside with your preferred name for the migration. In this example, we will use `0_init` as the migration name: - -```terminal -mkdir -p prisma/migrations/0_init -``` - - - -`-p` will recursively create any missing folders in the path you provide. - - - -Next, generate the migration file with `prisma migrate diff`. Use the following arguments: - -- `--from-empty`: assumes the data model you're migrating from is empty -- `--to-schema-datamodel`: the current database state using the URL in the `datasource` block -- `--script`: output a SQL script - -```terminal wrap -npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql -``` - -## Review the migration - -The command will generate a migration that should resemble the following script: - - - -```sql file=prisma/migrations/0_init/migration.sql --- CreateTable -CREATE TABLE "Post" ( - "id" SERIAL NOT NULL, - "title" VARCHAR(255) NOT NULL, - "createdAt" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "content" TEXT, - "published" BOOLEAN NOT NULL DEFAULT false, - "authorId" INTEGER NOT NULL, - - CONSTRAINT "Post_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Profile" ( - "id" SERIAL NOT NULL, - "bio" TEXT, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Profile_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(255), - "email" VARCHAR(255) NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- AddForeignKey -ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; - --- AddForeignKey -ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION; -``` - - - - - -```sql file=prisma/migrations/0_init/migration.sql --- CreateTable -CREATE TABLE `Post` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `title` VARCHAR(255) NOT NULL, - `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), - `content` TEXT NULL, - `published` BOOLEAN NOT NULL DEFAULT false, - `authorId` INTEGER NOT NULL, - - INDEX `authorId`(`authorId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Profile` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `bio` TEXT NULL, - `userId` INTEGER NOT NULL, - - UNIQUE INDEX `userId`(`userId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `User` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(255) NULL, - `email` VARCHAR(255) NOT NULL, - - UNIQUE INDEX `email`(`email`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Post` ADD CONSTRAINT `Post_ibfk_1` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; - --- AddForeignKey -ALTER TABLE `Profile` ADD CONSTRAINT `Profile_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; -``` - - - - - -```sql file=prisma/migrations/0_init/migration.sql -CREATE TABLE [dbo].[Post] ( - [id] INT NOT NULL IDENTITY(1,1), - [createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP, - [updatedAt] DATETIME2 NOT NULL, - [title] VARCHAR(255) NOT NULL, - [content] NVARCHAR(1000), - [published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0, - [authorId] INT NOT NULL, - CONSTRAINT [Post_pkey] PRIMARY KEY ([id]) -); - -CREATE TABLE [dbo].[Profile] ( - [id] INT NOT NULL IDENTITY(1,1), - [bio] NVARCHAR(1000), - [userId] INT NOT NULL, - CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]), - CONSTRAINT [Profile_userId_key] UNIQUE ([userId]) -); - -CREATE TABLE [dbo].[User] ( - [id] INT NOT NULL IDENTITY(1,1), - [email] NVARCHAR(1000) NOT NULL, - [name] NVARCHAR(1000), - CONSTRAINT [User_pkey] PRIMARY KEY ([id]), - CONSTRAINT [User_email_key] UNIQUE ([email]) -); - -ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; - -ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; -``` - - - - - -```sql file=prisma/migrations/0_init/migration.sql -CREATE TABLE "User" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - name STRING(255), - email STRING(255) UNIQUE NOT NULL -); - -CREATE TABLE "Post" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - title STRING(255) UNIQUE NOT NULL, - "createdAt" TIMESTAMP NOT NULL DEFAULT now(), - content STRING, - published BOOLEAN NOT NULL DEFAULT false, - "authorId" INT8 NOT NULL, - FOREIGN KEY ("authorId") REFERENCES "User"(id) -); - -CREATE TABLE "Profile" ( - id INT8 PRIMARY KEY DEFAULT unique_rowid(), - bio STRING, - "userId" INT8 UNIQUE NOT NULL, - FOREIGN KEY ("userId") REFERENCES "User"(id) -); -``` - - - -Review the SQL migration file to ensure everything is correct. - -Next, mark the migration as applied using `prisma migrate resolve` with the `--applied` argument. - -```terminal -npx prisma migrate resolve --applied 0_init -``` - -The command will mark `0_init` as applied by adding it to the `_prisma_migrations` table. - -You now have a baseline for your current database schema. To make further changes to your database schema, you can update your Prisma schema and use `prisma migrate dev` to apply the changes to your database. - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - - - - - - - - Introspection - - - - Install Prisma Client - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx new file mode 100644 index 0000000000..e9f51b146d --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-cockroachdb.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-cockroachdb +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-mysql.mdx new file mode 100644 index 0000000000..08f9f12804 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-mysql.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-mysql +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-planetscale.mdx new file mode 100644 index 0000000000..08b1c68754 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-planetscale.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-planetscale +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-postgresql.mdx new file mode 100644 index 0000000000..31c1c3acf1 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-postgresql.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgresql +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx new file mode 100644 index 0000000000..35656b488a --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-node-sqlserver.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-sqlserver +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..fad7d008fa --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-cockroachdb.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-cockroachdb +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx new file mode 100644 index 0000000000..cfddd4e759 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-mysql.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-mysql +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx new file mode 100644 index 0000000000..6a5aa19879 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-planetscale.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-planetscale +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx new file mode 100644 index 0000000000..01235cd68b --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-postgresql.mdx @@ -0,0 +1,40 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgresql +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx new file mode 100644 index 0000000000..5fa0ffc1e4 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client-typescript-sqlserver.mdx @@ -0,0 +1,41 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-sqlserver +--- + + + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: + +```terminal copy +npx prisma generate +``` + +This command reads your Prisma schema and generates your Prisma Client library: + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: + +![The .prisma and @prisma folders](/img/getting-started/prisma-client-node-module.png) diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client.mdx deleted file mode 100644 index 841bf540d8..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/200-install-prisma-client.mdx +++ /dev/null @@ -1,290 +0,0 @@ ---- -title: 'Install Prisma Client' -metaTitle: 'Install Prisma Client' -metaDescription: 'Install and generate Prisma Client in your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Install and generate Prisma Client - -To get started with Prisma Client, you need to install the `@prisma/client` package: - -```terminal copy -npm install @prisma/client -``` - -Notice that the [`@prisma/client` node module](/orm/prisma-client/setup-and-configuration/generating-prisma-client#the-prismaclient-npm-package) references a folder named `.prisma/client`. The `.prisma/client` folder contains your generated Prisma Client, and is modified each time you change the schema and run the following command: - -```terminal copy -npx prisma generate -``` - -This command reads your Prisma schema and generates your Prisma Client library: - -![Install and generate Prisma Client](../../../images/prisma-client-install-and-generate.png) - -The `@prisma/client` node module references a folder named `.prisma/client`, which contains your unique, generated Prisma Client: - -![The .prisma and @prisma folders](./prisma-client-node-module.png) - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Introspection - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Introspection - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - - - - - - - - Baseline your database - - - - Querying the database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx new file mode 100644 index 0000000000..ca3cdecbb5 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-cockroachdb.mdx @@ -0,0 +1,127 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-cockroachdb +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +```js file=index.js +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { title: 'Hello World' }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-mysql.mdx new file mode 100644 index 0000000000..3cbca4220e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-mysql.mdx @@ -0,0 +1,129 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-mysql +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +```js file=index.js +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-planetscale.mdx new file mode 100644 index 0000000000..e992f442a9 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-planetscale.mdx @@ -0,0 +1,141 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgresql +--- + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-postgresql.mdx new file mode 100644 index 0000000000..73a081b8d8 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-postgresql.mdx @@ -0,0 +1,128 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgresql +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +```js file=index.js showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-sqlserver.mdx new file mode 100644 index 0000000000..92da788da4 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-node-sqlserver.mdx @@ -0,0 +1,136 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-sqlserver +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js showLineNumbers +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..f185172192 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-cockroachdb.mdx @@ -0,0 +1,143 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-cockroachdb +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.ts` and add the following code to it: + +```ts file=index.ts showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { title: 'Hello World' }, + data: { published: true }, + }) + console.log(post) +} +``` + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-mysql.mdx new file mode 100644 index 0000000000..b96b142aad --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-mysql.mdx @@ -0,0 +1,142 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-mysql +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.ts` and add the following code to it: + +```ts file=index.ts showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx new file mode 100644 index 0000000000..af02530633 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-planetscale.mdx @@ -0,0 +1,143 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgresql +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.ts` and add the following code to it: + +```ts file=index.ts showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx new file mode 100644 index 0000000000..d2e93e747e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-postgresql.mdx @@ -0,0 +1,141 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgresql +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.ts` and add the following code to it: + +```ts file=index.ts showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx new file mode 100644 index 0000000000..abe14a5059 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database-typescript-sqlserver.mdx @@ -0,0 +1,142 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-sqlserver +--- + + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.ts` and add the following code to it: + +```ts file=index.ts showLineNumbers +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). + +The following examples are all based on the models in the Prisma schema. + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```ts file=index.ts showLineNumbers +async function main() { + const allUsers = await prisma.user.findMany() + console.log(allUsers) +} +``` + +Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. + +```no-copy +[] +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. + +Adjust the `main` function to send a `create` query to the database: + +```ts file=index.ts showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: { title: 'Hello World' }, + }, + profile: { + create: { bio: 'I like turtles' }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + profile: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` + +Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```ts file=index.ts showLineNumbers +async function main() { + const post = await prisma.post.update({ + where: { id: 1 }, + data: { published: true }, + }) + console.log(post) +} +``` + +Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: + +```terminal copy +npx ts-node index.ts +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database.mdx deleted file mode 100644 index 96c378cdef..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/250-querying-the-database.mdx +++ /dev/null @@ -1,641 +0,0 @@ ---- -title: 'Querying the database' -metaTitle: 'Querying the database' -metaDescription: 'Write data to and query the database' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false ---- - -## Write your first query with Prisma Client - -Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. - -If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. - -For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). - - - -Create a new file named `index.ts` and add the following code to it: - -```ts file=index.ts -import { PrismaClient } from '@prisma/client' - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - - - -Create a new file named `index.js` and add the following code to it: - -```js file=index.js -const { PrismaClient } = require('@prisma/client') - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - -Here's a quick overview of the different parts of the code snippet: - -1. Import the `PrismaClient` constructor from the `@prisma/client` node module -1. Instantiate `PrismaClient` -1. Define an `async` function named `main` to send queries to the database -1. Call the `main` function -1. Close the database connections when the script terminates - -Depending on what your models look like, the Prisma Client API will look different as well. For example, if you have a `User` model, your `PrismaClient` instance exposes a property called `user` on which you can call [CRUD](/orm/prisma-client/queries/crud) methods like `findMany`, `create` or `update`. The property is named after the model, but the first letter is lowercased (so for the `Post` model it's called `post`, for `Profile` it's called `profile`). - -The following examples are all based on the models in the Prisma schema. - -Inside the `main` function, add the following query to read all `User` records from the database and print the result: - - - -```ts file=index.ts -async function main() { - const allUsers = await prisma.user.findMany() - console.log(allUsers) -} -``` - - - - - -```js file=index.js -async function main() { - const allUsers = await prisma.user.findMany() - console.log(allUsers) -} -``` - - - - - -Now run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: - -```terminal copy -npx ts-node index.ts -``` - - - - - -Now run the code with this command: - -```terminal copy -node index.js -``` - - - -If you created a database using the schema from the database introspection step, the query should print an empty array because there are no `User` records in the database yet. - -```no-copy -[] -``` - -If you introspected an existing database with records, the query should return an array of JavaScript objects. - -## Write data into the database - -The `findMany` query you used in the previous section only _reads_ data from the database. In this section, you'll learn how to write a query to _write_ new records into the `Post` and `User` tables. - -Adjust the `main` function to send a `create` query to the database: - - - -```ts file=index.ts -async function main() { - await prisma.user.create({ - data: { - name: 'Alice', - email: 'alice@prisma.io', - posts: { - create: { title: 'Hello World' }, - }, - profile: { - create: { bio: 'I like turtles' }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - profile: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - - - -```js file=index.js -async function main() { - await prisma.user.create({ - data: { - name: 'Alice', - email: 'alice@prisma.io', - posts: { - create: { title: 'Hello World' }, - }, - profile: { - create: { bio: 'I like turtles' }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - profile: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - -This code creates a new `User` record together with new `Post` and `Profile` records using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the two other ones via the `Post.author` ↔ `User.posts` and `Profile.user` ↔ `User.profile` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. - -Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` and `profile` relations on the returned `User` objects. - - - -Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: - -```terminal copy -npx ts-node index.ts -``` - - - - - -Run the code with this command: - -```terminal copy -node index.js -``` - - - -Before moving on to the next section, you'll "publish" the `Post` record you just created using an `update` query. Adjust the `main` function as follows: - - - -```ts file=index.ts -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```ts file=index.ts -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```ts file=index.ts -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```ts file=index.ts -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js -async function main() { - const post = await prisma.post.update({ - where: { id: 1 }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```ts file=index.ts -async function main() { - const post = await prisma.post.update({ - where: { title: 'Hello World' }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -```js file=index.js -async function main() { - const post = await prisma.post.update({ - where: { title: 'Hello World' }, - data: { published: true }, - }) - console.log(post) -} -``` - - - - - -Run the code with your current TypeScript setup. If you're using `ts-node`, you can run it like this: - -```terminal copy -npx ts-node index.ts -``` - - - - - -Now run the code using the same command as before: - -```terminal copy -node index.js -``` - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - - - - - - - - Install Prisma Client - - - - Evolve your schema - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-cockroachdb.mdx new file mode 100644 index 0000000000..9298ad294f --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-cockroachdb.mdx @@ -0,0 +1,110 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_PostToTag" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); + +-- CreateIndex +CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; +``` diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-mysql.mdx new file mode 100644 index 0000000000..e2698aab35 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-mysql.mdx @@ -0,0 +1,112 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers +-- CreateTable +CREATE TABLE Tag ( + id SERIAL NOT NULL, + name VARCHAR(255) NOT NULL, + + CONSTRAINT Tag_pkey PRIMARY KEY (id) +); + +-- CreateTable +CREATE TABLE _PostToTag ( + A INTEGER NOT NULL, + B INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX _PostToTag_AB_unique ON _PostToTag(A, B); + +-- CreateIndex +CREATE INDEX _PostToTag_B_index ON _PostToTag(B); + +-- AddForeignKey +ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_A_fkey FOREIGN KEY (A) REFERENCES Post(id) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_B_fkey FOREIGN KEY (B) REFERENCES Tag(id) ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations, you just evolved your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-postgresql.mdx new file mode 100644 index 0000000000..7f98fdf315 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-postgresql.mdx @@ -0,0 +1,111 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_PostToTag" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); + +-- CreateIndex +CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations, you just evolved your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-sqlserver.mdx new file mode 100644 index 0000000000..c654f5043e --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-node-sqlserver.mdx @@ -0,0 +1,112 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE [dbo].[Tag] ( + [id] SERIAL NOT NULL, + [name] VARCHAR(255) NOT NULL, + + CONSTRAINT [Tag_pkey] PRIMARY KEY ([id]) +); + +-- CreateTable +CREATE TABLE [dbo].[_PostToTag] ( + [A] INTEGER NOT NULL, + [B] INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX [_PostToTag_AB_unique] ON _PostToTag([A], [B]); + +-- CreateIndex +CREATE INDEX [_PostToTag_B_index] ON [_PostToTag]([B]); + +-- AddForeignKey +ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_A_fkey] FOREIGN KEY ([A]) REFERENCES [dbo].[Post]([id]) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_B_fkey] FOREIGN KEY ([B]) REFERENCES [dbo].[Tag]([id]) ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-cockroachdb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-cockroachdb.mdx new file mode 100644 index 0000000000..9e791541ab --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-cockroachdb.mdx @@ -0,0 +1,113 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_PostToTag" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); + +-- CreateIndex +CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations, you just evolved your database with Prisma Migrate 🚀 + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-mysql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-mysql.mdx new file mode 100644 index 0000000000..e2698aab35 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-mysql.mdx @@ -0,0 +1,112 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers +-- CreateTable +CREATE TABLE Tag ( + id SERIAL NOT NULL, + name VARCHAR(255) NOT NULL, + + CONSTRAINT Tag_pkey PRIMARY KEY (id) +); + +-- CreateTable +CREATE TABLE _PostToTag ( + A INTEGER NOT NULL, + B INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX _PostToTag_AB_unique ON _PostToTag(A, B); + +-- CreateIndex +CREATE INDEX _PostToTag_B_index ON _PostToTag(B); + +-- AddForeignKey +ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_A_fkey FOREIGN KEY (A) REFERENCES Post(id) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_B_fkey FOREIGN KEY (B) REFERENCES Tag(id) ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations, you just evolved your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-postgresql.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-postgresql.mdx new file mode 100644 index 0000000000..cdeb6c9659 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-postgresql.mdx @@ -0,0 +1,113 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(255) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_PostToTag" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); + +-- CreateIndex +CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; +``` + + + +Congratulations, you just evolved your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-sqlserver.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-sqlserver.mdx new file mode 100644 index 0000000000..5aabc5a974 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema-typescript-sqlserver.mdx @@ -0,0 +1,112 @@ +--- +title: 'Evolve your schema' +metaTitle: 'Evolve your Prisma schema with Prisma Migrate' +description: 'Evolve your Prisma schema with Prisma Migrate' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps +--- + + + +## Add a `Tag` model to your schema + +In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). + +For the purpose of this guide, we'll make the following changes to the Prisma schema: + +1. Create a new model called `Tag` with the following fields: + - `id`: an auto-incrementing integer that will be the primary key for the model + - `name`: a non-null `String` + - `posts`: an implicit many-to-many relation field that links to the `Post` model +2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model + +Once you've made the changes to your schema, your schema should resemble the one below: + +```prisma file=prisma/schema.prisma highlight=9,27-31;edit showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + createdAt DateTime @default(now()) @db.Timestamp(6) + content String? + published Boolean @default(false) + authorId Int + user User @relation(fields: [authorId], references: [id]) + //edit-next-line + tags Tag[] +} + +model Profile { + id Int @id @default(autoincrement()) + bio String? + userId Int @unique + user User @relation(fields: [userId], references: [id]) +} + +model User { + id Int @id @default(autoincrement()) + name String? @db.VarChar(255) + email String @unique @db.VarChar(255) + post Post[] + profile Profile? +} + +//edit-start +model Tag { + id Int @id @default(autoincrement()) + name String + posts Post[] +} +//edit-end +``` + +To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: + +```terminal copy +npx prisma migrate dev --name tags-model +``` + +This command will: + +1. Create a new SQL migration file for the migration +1. Apply the generated SQL migration to the database +1. Regenerate Prisma Client + +The following migration will be generated and saved in your `prisma/migrations` folder: + +```sql file=prisma/migrations/TIMESTAMP_tags_model.sql showLineNumbers + -- CreateTable +CREATE TABLE [dbo].[Tag] ( + [id] SERIAL NOT NULL, + [name] VARCHAR(255) NOT NULL, + + CONSTRAINT [Tag_pkey] PRIMARY KEY ([id]) +); + +-- CreateTable +CREATE TABLE [dbo].[_PostToTag] ( + [A] INTEGER NOT NULL, + [B] INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX [_PostToTag_AB_unique] ON _PostToTag([A], [B]); + +-- CreateIndex +CREATE INDEX [_PostToTag_B_index] ON [_PostToTag]([B]); + +-- AddForeignKey +ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_A_fkey] FOREIGN KEY ([A]) REFERENCES [dbo].[Post]([id]) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_B_fkey] FOREIGN KEY ([B]) REFERENCES [dbo].[Tag]([id]) ON DELETE CASCADE ON UPDATE CASCADE; +``` + +Congratulations, you just evolved your database with Prisma Migrate 🚀 diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema.mdx deleted file mode 100644 index 79d450cc4e..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/275-evolve-your-schema.mdx +++ /dev/null @@ -1,402 +0,0 @@ ---- -title: 'Evolve your schema' -metaTitle: 'Evolve your Prisma schema with Prisma Migrate' -metaDescription: 'Evolve your Prisma schema with Prisma Migrate' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'cockroachdb'] -toc: false ---- - -## Add a `Tag` model to your schema - -In this section, you will evolve your Prisma schema and then generate and apply the migration to your database with [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev). - -For the purpose of this guide, we'll make the following changes to the Prisma schema: - -1. Create a new model called `Tag` with the following fields: - - `id`: an auto-incrementing integer that will be the primary key for the model - - `name`: a non-null `String` - - `posts`: an implicit many-to-many relation field that links to the `Post` model -2. Update the `Post` model with a `tags` field with an implicit many-to-many relation field that links to the `Tag` model - -Once you've made the changes to your schema, your schema should resemble the one below: - -```prisma file=prisma/schema.prisma highlight=9,27-31;edit -model Post { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - createdAt DateTime @default(now()) @db.Timestamp(6) - content String? - published Boolean @default(false) - authorId Int - user User @relation(fields: [authorId], references: [id]) - tags Tag[] -} - -model Profile { - id Int @id @default(autoincrement()) - bio String? - userId Int @unique - user User @relation(fields: [userId], references: [id]) -} - -model User { - id Int @id @default(autoincrement()) - name String? @db.VarChar(255) - email String @unique @db.VarChar(255) - post Post[] - profile Profile? -} - -model Tag { - id Int @id @default(autoincrement()) - name String - posts Post[] -} -``` - -To apply your Prisma schema changes to your database, use the `prisma migrate dev` CLI command: - -```terminal copy -npx prisma migrate dev --name tags-model -``` - -This command will: - -1. Create a new SQL migration file for the migration -1. Apply the generated SQL migration to the database -1. Regenerate Prisma Client - -The following migration will be generated and saved in your `prisma/migrations` folder: - - - -```sql file=prisma/migrations/TIMESTAMP_tags_model.sql - -- CreateTable -CREATE TABLE "Tag" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(255) NOT NULL, - - CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_PostToTag" ( - "A" INTEGER NOT NULL, - "B" INTEGER NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); - --- CreateIndex -CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); - --- AddForeignKey -ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - - - -```sql file=prisma/migrations/TIMESTAMP_tags_model.sql - -- CreateTable -CREATE TABLE "Tag" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(255) NOT NULL, - - CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_PostToTag" ( - "A" INTEGER NOT NULL, - "B" INTEGER NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "_PostToTag_AB_unique" ON "_PostToTag"("A", "B"); - --- CreateIndex -CREATE INDEX "_PostToTag_B_index" ON "_PostToTag"("B"); - --- AddForeignKey -ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_PostToTag" ADD CONSTRAINT "_PostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - - - -```sql file=prisma/migrations/TIMESTAMP_tags_model.sql - -- CreateTable -CREATE TABLE [dbo].[Tag] ( - [id] SERIAL NOT NULL, - [name] VARCHAR(255) NOT NULL, - - CONSTRAINT [Tag_pkey] PRIMARY KEY ([id]) -); - --- CreateTable -CREATE TABLE [dbo].[_PostToTag] ( - [A] INTEGER NOT NULL, - [B] INTEGER NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX [_PostToTag_AB_unique] ON _PostToTag([A], [B]); - --- CreateIndex -CREATE INDEX [_PostToTag_B_index] ON [_PostToTag]([B]); - --- AddForeignKey -ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_A_fkey] FOREIGN KEY ([A]) REFERENCES [dbo].[Post]([id]) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE [dbo].[_PostToTag] ADD CONSTRAINT [_PostToTag_B_fkey] FOREIGN KEY ([B]) REFERENCES [dbo].[Tag]([id]) ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - - - -```sql file=prisma/migrations/TIMESTAMP_tags_model.sql --- CreateTable -CREATE TABLE Tag ( - id SERIAL NOT NULL, - name VARCHAR(255) NOT NULL, - - CONSTRAINT Tag_pkey PRIMARY KEY (id) -); - --- CreateTable -CREATE TABLE _PostToTag ( - A INTEGER NOT NULL, - B INTEGER NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX _PostToTag_AB_unique ON _PostToTag(A, B); - --- CreateIndex -CREATE INDEX _PostToTag_B_index ON _PostToTag(B); - --- AddForeignKey -ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_A_fkey FOREIGN KEY (A) REFERENCES Post(id) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE _PostToTag ADD CONSTRAINT _PostToTag_B_fkey FOREIGN KEY (B) REFERENCES Tag(id) ON DELETE CASCADE ON UPDATE CASCADE; -``` - - - -Congratulations, you just evolved your database with Prisma Migrate 🚀 - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - - - - - - - - Querying the database - - - - Next steps - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/300-next-steps.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/300-next-steps.mdx index 4a2c944b59..78ae6d8a59 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/300-next-steps.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/300-next-steps.mdx @@ -1,27 +1,26 @@ --- title: 'Next steps' metaTitle: 'Next steps' -metaDescription: 'Next steps to take now that you have successfully added Prisma to your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] -toc: false +description: 'Next steps to take now that you have successfully added Prisma to your project' +hide_table_of_contents: true --- ## Next steps -This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma. +This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma ORM. ### Continue exploring the Prisma Client API You can send a variety of queries with the Prisma Client API. Check out the [API reference](/orm/prisma-client) and use your existing database setup from this guide to try them out. - +:::tip You can use your editor's auto-completion feature to learn about the different API calls and the arguments it takes. Auto-completion is commonly invoked by hitting CTRL+SPACE on your keyboard. - +::: -
Expand for more Prisma Client API examples +
+Expand for more Prisma Client API examples Here are a few suggestions for a number of more queries you can send with Prisma Client: @@ -85,15 +84,15 @@ To evolve the app, you need to follow the same flow of the tutorial: 1. Optionally re-configure your Prisma Client API 1. Re-generate Prisma Client -![Introspect workflow](../../../images/prisma-evolve-app-workflow.png) +![Introspect workflow](/img/getting-started/prisma-evolve-app-workflow.png) -### Try a Prisma example +### Try a Prisma ORM example The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository contains a number of ready-to-run examples: -, ]}> + - + | Demo | Stack | Description | | :------------------------------------------------------------------------------------------------------------------ | :----------- | --------------------------------------------------------------------------------------------------- | @@ -103,9 +102,9 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/typescript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/typescript/grpc) | Backend only | Simple gRPC API | - + - + | Demo | Stack | Description | | :---------------------------------------------------------------------------------------------------------------- | :----------- | :-------------------------------------------------------------------------------------------------- | @@ -114,6 +113,6 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/javascript/grpc) | Backend only | Simple gRPC API | - + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/index.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/index.mdx deleted file mode 100644 index 7ab09823a1..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/index.mdx +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: 'Relational databases' -metaTitle: 'Add Prisma to an existing project that uses a relational database (15 min)' -metaDescription: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your relational database and generating a Prisma Client for database access.' -duration: '15 min' -toc: false -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] ---- - - - -Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). - - - - - -
- -If you're migrating to Prisma from another ORM, see our [Migrate from TypeORM](/orm/more/migrating-to-prisma/migrate-from-typeorm) or [Migrate from Sequelize](/orm/more/migrating-to-prisma/migrate-from-sequelize) migration guides. - -
-
- -## Prerequisites - -In order to successfully complete this guide, you need: - - - -- an existing Node.js project with a `package.json` -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [PostgreSQL](https://www.postgresql.org/) database server running and a database with at least one table - - - - - -- an existing Node.js project with a `package.json` -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [MySQL](https://www.mysql.com/) database server running and a database with at least one table - - - - - -- an existing Node.js project with a `package.json` -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [PlanetScale](https://www.planetscale.com/) database server running and a database with at least one table - - - - - -- [Node.js](https://nodejs.org/en/) installed on your machine -- A [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) database - - [Microsoft SQL Server on Linux for Docker](/orm/overview/databases/sql-server/sql-server-docker) - - [Microsoft SQL Server on Windows (local)](/orm/overview/databases/sql-server/sql-server-local) - - - - - -- an existing Node.js project with a `package.json` -- [Node.js](https://nodejs.org/en/) installed on your machine -- a [CockroachDB](https://www.cockroachlabs.com) database server running and a database with at least one table - - - -> See [System requirements](/orm/reference/system-requirements) for exact version requirements. - -Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma, check out the [Quickstart](/getting-started/quickstart). - -## Set up Prisma - -As a first step, navigate into your project directory that contains the `package.json` file. - -Next, add the Prisma CLI as a development dependency to your project: - -```terminal copy -npm install prisma --save-dev -``` - -You can now invoke the Prisma CLI by prefixing it with `npx`: - -```terminal -npx prisma -``` - - - -See [installation instructions](/orm/tools/prisma-cli#installation) to learn how to install Prisma using a different package manager. - - - -Next, set up your Prisma project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: - -```terminal copy -npx prisma init -``` - -This command does two things: - -- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models -- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/index.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-node-mongodb.mdx similarity index 55% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/index.mdx rename to content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-node-mongodb.mdx index d88211470b..ca412c5d0e 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/index.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-node-mongodb.mdx @@ -1,27 +1,31 @@ --- title: 'MongoDB' metaTitle: 'Add Prisma to an existing MongoDB project (15 min)' -metaDescription: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your MongoDB database and generating a Prisma Client for database access.' -duration: '15 min' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your MongoDB database and generating a Prisma Client for database access.' toc: false langSwitcher: ['typescript', 'node'] +hide_table_of_contents: true dbSwitcher: ['mongodb'] +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/connect-your-database-node-mongodb --- - + -Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). - - -
+ -If you're migrating to Prisma from Mongoose, see our [Migrate from Mongoose guide](/orm/more/migrating-to-prisma/migrate-from-mongoose). +If you're migrating to Prisma ORM from Mongoose, see our [Migrate from Mongoose guide](/orm/more/migrating-to-prisma/migrate-from-mongoose). -
-
+ ## Prerequisites @@ -36,11 +40,11 @@ In order to successfully complete this guide, you need: -Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma, check out the [Quickstart](/getting-started/quickstart). +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). > See [System requirements](/orm/reference/system-requirements) for exact version requirements. -## Set up Prisma +## Set up Prisma ORM As a first step, navigate into it your project directory that contains the `package.json` file. @@ -56,7 +60,7 @@ You can now invoke the Prisma CLI by prefixing it with `npx`: npx prisma ``` -Next, set up your Prisma project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: ```terminal copy npx prisma init @@ -66,37 +70,3 @@ This command does two things: - creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models - creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) - - - - - - - Connect your database - - - - - - - - - - - - Connect your database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-typescript-mongodb.mdx new file mode 100644 index 0000000000..d2626b6cdf --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb-typescript-mongodb.mdx @@ -0,0 +1,73 @@ +--- +title: 'MongoDB' +metaTitle: 'Add Prisma to an existing MongoDB project (15 min)' +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your MongoDB database and generating a Prisma Client for database access.' +hide_table_of_contents: true +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +sidebar_custom_props: { badge: '15 min' } +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/connect-your-database-typescript-mongodb +--- + + + +Learn how to add Prisma ORM to an existing Node.js or TypeScript project by connecting it to your database and generating a Prisma Client for database access. The following tutorial introduces you to [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Introspection](/orm/prisma-schema/introspection). + + + + + +If you're migrating to Prisma ORM from Mongoose, see our [Migrate from Mongoose guide](/orm/more/migrating-to-prisma/migrate-from-mongoose). + + + +## Prerequisites + +In order to successfully complete this guide, you need: + +- [Node.js](https://nodejs.org/en/) installed on your machine +- Access to a MongoDB 4.2+ server with a replica set deployment. We recommend using [MongoDB Atlas](https://www.mongodb.com/cloud/atlas). + + + + The MongoDB database connector uses transactions to support nested writes. Transactions **requires** a [replica set](https://docs.mongodb.com/manual/tutorial/deploy-replica-set/) deployment. The easiest way to deploy a replica set is with [Atlas](https://docs.atlas.mongodb.com/getting-started/). It's free to get started. + + + +Make sure you have your database [connection URL](/orm/reference/connection-urls) (that includes your authentication credentials) at hand! If you don't have a database server running and just want to explore Prisma ORM, check out the [Quickstart](/getting-started/quickstart). + +> See [System requirements](/orm/reference/system-requirements) for exact version requirements. + +## Set up Prisma ORM + +As a first step, navigate into it your project directory that contains the `package.json` file. + +Next, add the Prisma CLI as a development dependency to your project: + +```terminal copy +npm install prisma --save-dev +``` + +You can now invoke the Prisma CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +Next, set up your Prisma ORM project by creating your [Prisma schema](/orm/prisma-schema) file template with the following command: + +```terminal copy +npx prisma init +``` + +This command does two things: + +- creates a new directory called `prisma` that contains a file called `schema.prisma`, which contains the Prisma schema with your database connection variable and schema models +- creates the [`.env` file](/orm/more/development-environment/environment-variables/env-files) in the root directory of the project, which is used for defining environment variables (such as your database connection) + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-node-mongodb.mdx similarity index 64% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database.mdx rename to content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-node-mongodb.mdx index 5e976dcd74..b51a3193b0 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-node-mongodb.mdx @@ -1,17 +1,27 @@ --- -title: 'Connect your database' +title: 'Connect your database (MongoDB)' metaTitle: 'Connect your database' -metaDescription: 'Connect your database to your project' +description: 'Connect your database to your project' langSwitcher: ['typescript', 'node'] +sidebar_class_name: hidden-sidebar +hide_table_of_contents: true dbSwitcher: ['mongodb'] toc: false +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/introspection-node-mongodb --- + + ## Connecting your database To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -20,7 +30,7 @@ datasource db { In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: -```bash file=.env +```bash file=.env showLineNumbers DATABASE_URL="mongodb+srv://test:test@cluster0.ns1yp.mongodb.net/myFirstDatabase" ``` @@ -41,55 +51,3 @@ Here's a short explanation of each component: - `DATABASE`: The name of the database > If you see the following error: `Error in connector: SCRAM failure: Authentication failed.`, you can specify the source database for the authentication by [adding](https://github.com/prisma/prisma/discussions/9994#discussioncomment-1562283) `?authSource=admin` to the end of the connection string. - - - - - - - Installation - - - - Introspection - - - - - - - - - - - - Installation - - - - Introspection - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-typescript-mongodb.mdx new file mode 100644 index 0000000000..f0a59c5958 --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/100-connect-your-database-typescript-mongodb.mdx @@ -0,0 +1,52 @@ +--- +title: 'Connect your database (MongoDB)' +metaTitle: 'Connect your database' +description: 'Connect your database to your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/introspection-typescript-mongodb +--- + + + +## Connecting your database + +To connect your database, you need to set the `url` field of the `datasource` block in your Prisma schema to your database [connection URL](/orm/reference/connection-urls): + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} +``` + +In this case, the `url` is [set via an environment variable](/orm/more/development-environment/environment-variables) which is defined in `.env`: + +```bash file=.env showLineNumbers +DATABASE_URL="mongodb+srv://test:test@cluster0.ns1yp.mongodb.net/myFirstDatabase" +``` + +You now need to adjust the connection URL to point to your own database. + +The [format of the connection URL](/orm/reference/connection-urls) for your database depends on the database you use. For MongoDB, it looks as follows (the parts spelled all-uppercased are _placeholders_ for your specific connection details): + +```no-lines +mongodb://USERNAME:PASSWORD@HOST:PORT/DATABASE +``` + +Here's a short explanation of each component: + +- `USERNAME`: The name of your database user +- `PASSWORD`: The password for your database user +- `HOST`: The host where a [`mongod`](https://docs.mongodb.com/manual/reference/program/mongod/#mongodb-binary-bin.mongod) (or [`mongos`](https://docs.mongodb.com/manual/reference/program/mongos/#mongodb-binary-bin.mongos)) instance is running +- `PORT`: The port where your database server is running (typically `27017` for MongoDB) +- `DATABASE`: The name of the database + +> If you see the following error: `Error in connector: SCRAM failure: Authentication failed.`, you can specify the source database for the authentication by [adding](https://github.com/prisma/prisma/discussions/9994#discussioncomment-1562283) `?authSource=admin` to the end of the connection string. + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-node-mongodb.mdx similarity index 58% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection.mdx rename to content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-node-mongodb.mdx index 2b5d5fa1c9..64f8c9cac4 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-node-mongodb.mdx @@ -1,35 +1,44 @@ --- title: 'Introspection' metaTitle: 'Introspection' -metaDescription: 'Introspection your database with Prisma' +description: 'Introspection your database with Prisma' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/install-prisma-client-node-mongodb --- + + # Introspection -Prisma introspects a MongoDB schema by sampling the data stored in the given database and inferring the schema of that data. +Prisma ORM introspects a MongoDB schema by sampling the data stored in the given database and inferring the schema of that data. -For the purposes of illustrating introspection, this guide will help you setup a MongoDB from scratch. But if you have a MongoDB database already, feel free to jump to [Initializing Prisma](#initializing-prisma) in your project. +For the purposes of illustrating introspection, this guide will help you setup a MongoDB from scratch. But if you have a MongoDB database already, feel free to jump to [Initializing Prisma ORM](#initializing-prisma-orm) in your project. ## Setting up your Database To see this in action, first create a `blog` database with 2 collections: `User` and `Post`. We recommend [MongoDB Compass](https://www.mongodb.com/products/compass) for setting this up: -![Create a blog database using Compass](./1-create-database.jpg) +![Create a blog database using Compass](/img/getting-started/1-create-database.jpg) First, add a user to our `User` collection: -![Create a user within the User collection](./2-create-user.jpg) +![Create a user within the User collection](/img/getting-started/2-create-user.jpg) Next, add some posts to our `Post` collection. It's important that the ObjectID in `userId` matches the user you created above. -![Create some posts within the Post collection](./3-create-posts.jpg) +![Create some posts within the Post collection](/img/getting-started/3-create-posts.jpg) -## Initializing Prisma +## Initializing Prisma ORM -Now that you have a MongoDB database, the next step is to create a new project and initialize Prisma: +Now that you have a MongoDB database, the next step is to create a new project and initialize Prisma ORM: ```terminal copy mkdir blog @@ -39,9 +48,9 @@ npm install -D prisma npx prisma init ``` -Initializing Prisma will create a `prisma/schema.prisma` file. Edit this file to use MongoDB: +Initializing Prisma ORM will create a `prisma/schema.prisma` file. Edit this file to use MongoDB: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -54,7 +63,7 @@ generator client { Next you'll need to adjust your `.env` file to point the `DATABASE_URL` to your MongoDB database -## Introspecting MongoDB with Prisma +## Introspecting MongoDB with Prisma ORM You're now ready to introspect. Run the following command to introspect your database: @@ -64,7 +73,7 @@ npx prisma db pull This command introspects our database and writes the inferred schema into your `prisma/schema.prisma` file: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -90,7 +99,7 @@ model User { To be able to join data using Prisma Client, you can add the [`@relation`](/orm/reference/prisma-schema-reference#relation) attributes to our models: -```prisma file=prisma/schema.prisma highlight=14;add|20;add +```prisma file=prisma/schema.prisma highlight=14;add|20;add showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -104,72 +113,23 @@ model Post { id String @id @default(auto()) @map("_id") @db.ObjectId title String userId String @db.ObjectId + //add-next-line user User @relation(fields: [userId], references: [id]) } model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String + //add-next-line posts Post[] } ``` - +:::tip We're actively working on MongoDB introspection. Provide feedback for this feature in [this issue](https://github.com/prisma/prisma/issues/8241). - +::: And with that, you're ready to generate Prisma Client. - - - - - - Connect to your Database - - - - Install Prisma Client - - - - - - - - - - - - Connect to your Database - - - - Install Prisma Client - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-typescript-mongodb.mdx new file mode 100644 index 0000000000..ab8eb8a6cf --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/125-introspection-typescript-mongodb.mdx @@ -0,0 +1,133 @@ +--- +title: 'Introspection' +metaTitle: 'Introspection' +description: 'Introspection your database with Prisma' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/install-prisma-client-typescript-mongodb +--- + + + +# Introspection + +Prisma ORM introspects a MongoDB schema by sampling the data stored in the given database and inferring the schema of that data. + +For the purposes of illustrating introspection, this guide will help you setup a MongoDB from scratch. But if you have a MongoDB database already, feel free to jump to [Initializing Prisma ORM](#initializing-prisma-orm) in your project. + +## Setting up your Database + +To see this in action, first create a `blog` database with 2 collections: `User` and `Post`. We recommend [MongoDB Compass](https://www.mongodb.com/products/compass) for setting this up: + +![Create a blog database using Compass](/img/getting-started/1-create-database.jpg) + +First, add a user to our `User` collection: + +![Create a user within the User collection](/img/getting-started/2-create-user.jpg) + +Next, add some posts to our `Post` collection. It's important that the ObjectID in `userId` matches the user you created above. + +![Create some posts within the Post collection](/img/getting-started/3-create-posts.jpg) + +## Initializing Prisma ORM + +Now that you have a MongoDB database, the next step is to create a new project and initialize Prisma ORM: + +```terminal copy +mkdir blog +cd blog +npm init -y +npm install -D prisma +npx prisma init +``` + +Initializing Prisma ORM will create a `prisma/schema.prisma` file. Edit this file to use MongoDB: + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} +``` + +Next you'll need to adjust your `.env` file to point the `DATABASE_URL` to your MongoDB database + +## Introspecting MongoDB with Prisma ORM + +You're now ready to introspect. Run the following command to introspect your database: + +```terminal copy +npx prisma db pull +``` + +This command introspects our database and writes the inferred schema into your `prisma/schema.prisma` file: + +```prisma file=prisma/schema.prisma showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model Post { + id String @id @default(auto()) @map("_id") @db.ObjectId + title String + userId String @db.ObjectId +} + +model User { + id String @id @default(auto()) @map("_id") @db.ObjectId + email String +} +``` + +## Tweaking the Schema + +To be able to join data using Prisma Client, you can add the [`@relation`](/orm/reference/prisma-schema-reference#relation) attributes to our models: + +```prisma file=prisma/schema.prisma highlight=14;add|20;add showLineNumbers +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model Post { + id String @id @default(auto()) @map("_id") @db.ObjectId + title String + userId String @db.ObjectId + //add-next-line + user User @relation(fields: [userId], references: [id]) +} + +model User { + id String @id @default(auto()) @map("_id") @db.ObjectId + email String + //add-next-line + posts Post[] +} +``` + +:::tip + +We're actively working on MongoDB introspection. Provide feedback for this feature in [this issue](https://github.com/prisma/prisma/issues/8241). + +::: + +And with that, you're ready to generate Prisma Client. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-node-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-node-mongodb.mdx new file mode 100644 index 0000000000..cca6e608db --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-node-mongodb.mdx @@ -0,0 +1,32 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/querying-the-database-node-mongodb +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you make changes to your Prisma schema in the future, you manually need to invoke `prisma generate` in order to accommodate the changes in your Prisma Client API. + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx new file mode 100644 index 0000000000..8e9b0c97ce --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client-typescript-mongodb.mdx @@ -0,0 +1,30 @@ +--- +title: 'Install Prisma Client' +metaTitle: 'Install Prisma Client' +description: 'Install and generate Prisma Client in your project' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/querying-the-database-typescript-mongodb +--- + + + +## Install and generate Prisma Client + +To get started with Prisma Client, you need to install the `@prisma/client` package: + +```terminal copy +npm install @prisma/client +``` + +The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. + +![Install and generate Prisma Client](/img/getting-started/prisma-client-install-and-generate.png) + +Whenever you make changes to your Prisma schema in the future, you manually need to invoke `prisma generate` in order to accommodate the changes in your Prisma Client API. diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client.mdx deleted file mode 100644 index 71d7eed971..0000000000 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/200-install-prisma-client.mdx +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: 'Install Prisma Client' -metaTitle: 'Install Prisma Client' -metaDescription: 'Install and generate Prisma Client in your project' -langSwitcher: ['typescript', 'node'] -dbSwitcher: ['mongodb'] -toc: false ---- - -## Install and generate Prisma Client - -To get started with Prisma Client, you need to install the `@prisma/client` package: - -```terminal copy -npm install @prisma/client -``` - -The install command invokes `prisma generate` for you which reads your Prisma schema and generates a version of Prisma Client that is _tailored_ to your models. - -![Install and generate Prisma Client](../../../images/prisma-client-install-and-generate.png) - -Whenever you make changes to your Prisma schema in the future, you manually need to invoke `prisma generate` in order to accommodate the changes in your Prisma Client API. - - - - - - - Introspection - - - - Querying the database - - - - - - - - - - - - Introspection - - - - Querying the database - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-node-mongodb.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-node-mongodb.mdx new file mode 100644 index 0000000000..9bfec3701d --- /dev/null +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-node-mongodb.mdx @@ -0,0 +1,224 @@ +--- +title: 'Querying the database' +metaTitle: 'Querying the database' +description: 'Write data to and query the database' +langSwitcher: ['typescript', 'node'] +dbSwitcher: ['mongodb'] +hide_table_of_contents: true +sidebar_class_name: hidden-sidebar +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/next-steps +--- + + + +## Write your first query with Prisma Client + +Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. + +If you're building a REST API, you can use Prisma Client in your route handlers to read and write data in the database based on incoming HTTP requests. If you're building a GraphQL API, you can use Prisma Client in your resolvers to read and write data in the database based on incoming queries and mutations. + +For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). + +Create a new file named `index.js` and add the following code to it: + +```js file=index.js copy +const { PrismaClient } = require('@prisma/client') + +const prisma = new PrismaClient() + +async function main() { + // ... you will write your Prisma Client queries here +} + +main() + .then(async () => { + await prisma.$disconnect() + }) + .catch(async (e) => { + console.error(e) + await prisma.$disconnect() + process.exit(1) + }) +``` + +Here's a quick overview of the different parts of the code snippet: + +1. Import the `PrismaClient` constructor from the `@prisma/client` node module +1. Instantiate `PrismaClient` +1. Define an `async` function named `main` to send queries to the database +1. Connect to the database +1. Call the `main` function +1. Close the database connections when the script terminates + +Inside the `main` function, add the following query to read all `User` records from the database and print the result: + +```js file=index.js showLineNumbers +async function main() { +- // ... you will write your Prisma Client queries here +//add-start ++ const allUsers = await prisma.user.findMany() ++ console.log(allUsers) +//add-end +} +``` + +Now run the code with this command: + +```terminal copy +node index.js +``` + +If you introspected an existing database with records, the query should return an array of JavaScript objects. + +## Write data into the database + +The `findMany` query you used in the previous section only _reads_ data from the database (although it was still empty). In this section, you'll learn how to write a query to _write_ new records into the `Post`, `User` and `Comment` tables. + +Adjust the `main` function to send a `create` query to the database: + +```js file=index.js copy showLineNumbers +async function main() { + await prisma.user.create({ + data: { + name: 'Rich', + email: 'hello@prisma.com', + posts: { + create: { + title: 'My first post', + body: 'Lots of really interesting stuff', + slug: 'my-first-post', + }, + }, + }, + }) + + const allUsers = await prisma.user.findMany({ + include: { + posts: true, + }, + }) + console.dir(allUsers, { depth: null }) +} +``` + +This code creates a new `User` record together with a new `Post` using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the other one via the `Post.author` ↔ `User.posts` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. + +Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` relations on the returned `User` objects. + +Run the code with this command: + +```terminal copy +node index.js +``` + +The output should look similar to this: + +```json no-lines +[ + { + id: '60cc9b0e001e3bfd00a6eddf', + email: 'hello@prisma.com', + name: 'Rich', + posts: [ + { + id: '60cc9bad005059d6007f45dd', + slug: 'my-first-post', + title: 'My first post', + body: 'Lots of really interesting stuff', + userId: '60cc9b0e001e3bfd00a6eddf', + }, + ], + }, +] +``` + +The query added new records to the `User` and the `Post` collections: + + + +The `id` field in the Prisma schema maps to `_id` in the underlying MongoDB database. + + + +**User** collection + +| **\_id** | **email** | **name** | +| :------------------------- | :------------------- | :------- | +| `60cc9b0e001e3bfd00a6eddf` | `"hello@prisma.com"` | `"Rich"` | + +**Post** collection + +| **\_id** | **createdAt** | **title** | **content** | **published** | **authorId** | +| :------------------------- | :------------------------- | :---------------- | :--------------------------------- | :------------ | :------------------------- | +| `60cc9bad005059d6007f45dd` | `2020-03-21T16:45:01.246Z` | `"My first post"` | `Lots of really interesting stuff` | `false` | `60cc9b0e001e3bfd00a6eddf` | + +> **Note**: The unique identifier in the `authorId` document field on `Post` reference the `_id` document field in the `User` collection, meaning the `_id` value `60cc9b0e001e3bfd00a6eddf` column therefore refers to the first (and only) `User` record in the database. + +Before moving on to the next section, you'll add a couple of comments to the `Post` record you just created using an `update` query. Adjust the `main` function as follows: + +```js file=index.js copy +async function main() { + await prisma.post.update({ + where: { + slug: 'my-first-post', + }, + data: { + comments: { + createMany: { + data: [ + { comment: 'Great post!' }, + { comment: "Can't wait to read more!" }, + ], + }, + }, + }, + }) + const posts = await prisma.post.findMany({ + include: { + comments: true, + }, + }) + + console.dir(posts, { depth: Infinity }) +} +``` + +Now run the code using the same command as before: + +```terminal copy +node index.js +``` + +You will see the following output: + +```json no-lines +[ + { + id: '60cc9bad005059d6007f45dd', + slug: 'my-first-post', + title: 'My first post', + body: 'Lots of really interesting stuff', + userId: '60cc9b0e001e3bfd00a6eddf', + comments: [ + { + id: '60cca420008a21d800578793', + postId: '60cca40300af8bf000f6ca99', + comment: 'Great post!', + }, + { + id: '60cca420008a21d800578794', + postId: '60cca40300af8bf000f6ca99', + comment: "Can't wait to try this!", + }, + ], + }, +] +``` + +Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-typescript-mongodb.mdx similarity index 66% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database.mdx rename to content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-typescript-mongodb.mdx index 06769be5d7..279d03d7db 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/250-querying-the-database-typescript-mongodb.mdx @@ -1,12 +1,20 @@ --- title: 'Querying the database' metaTitle: 'Querying the database' -metaDescription: 'Write data to and query the database' +description: 'Write data to and query the database' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true +pagination_next: getting-started/setup-prisma/add-to-existing-project/mongodb/next-steps --- + + ## Write your first query with Prisma Client Now that you have generated Prisma Client, you can start writing queries to read and write data in your database. For the purpose of this guide, you'll use a plain Node.js script to explore some basic features of Prisma Client. @@ -15,8 +23,6 @@ If you're building a REST API, you can use Prisma Client in your route handlers For the purpose of this guide however, you'll just create a plain Node.js script to learn how to send queries to your database using Prisma Client. Once you have an understanding of how the API works, you can start integrating it into your actual application code (e.g. REST route handlers or GraphQL resolvers). - - Create a new file named `index.ts` and add the following code to it: ```js file=index.ts copy @@ -39,34 +45,6 @@ main() }) ``` - - - - -Create a new file named `index.js` and add the following code to it: - -```js file=index.js copy -const { PrismaClient } = require('@prisma/client') - -const prisma = new PrismaClient() - -async function main() { - // ... you will write your Prisma Client queries here -} - -main() - .then(async () => { - await prisma.$disconnect() - }) - .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) -``` - - - Here's a quick overview of the different parts of the code snippet: 1. Import the `PrismaClient` constructor from the `@prisma/client` node module @@ -78,48 +56,22 @@ Here's a quick overview of the different parts of the code snippet: Inside the `main` function, add the following query to read all `User` records from the database and print the result: - - -```ts file=index.ts +```ts file=index.ts showLineNumbers async function main() { // ... you will write your Prisma Client queries here +//add-start + const allUsers = await prisma.user.findMany() + console.log(allUsers) +//add-end } ``` - - - - -```js file=index.js -async function main() { -- // ... you will write your Prisma Client queries here -+ const allUsers = await prisma.user.findMany() -+ console.log(allUsers) -} -``` - - - Now run the code with this command: - - ```terminal copy npx ts-node index.ts ``` - - - - -```terminal copy -node index.js -``` - - - If you introspected an existing database with records, the query should return an array of JavaScript objects. ## Write data into the database @@ -128,9 +80,7 @@ The `findMany` query you used in the previous section only _reads_ data from the Adjust the `main` function to send a `create` query to the database: - - -```ts file=index.ts copy +```ts file=index.ts copy showLineNumbers async function main() { await prisma.user.create({ data: { @@ -155,62 +105,19 @@ async function main() { } ``` - - - - -```js file=index.js copy -async function main() { - await prisma.user.create({ - data: { - name: 'Rich', - email: 'hello@prisma.com', - posts: { - create: { - title: 'My first post', - body: 'Lots of really interesting stuff', - slug: 'my-first-post', - }, - }, - }, - }) - - const allUsers = await prisma.user.findMany({ - include: { - posts: true, - }, - }) - console.dir(allUsers, { depth: null }) -} -``` - - - This code creates a new `User` record together with a new `Post` using a [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) query. The `User` record is connected to the other one via the `Post.author` ↔ `User.posts` [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) respectively. Notice that you're passing the [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) option to `findMany` which tells Prisma Client to include the `posts` relations on the returned `User` objects. Run the code with this command: - - ```terminal copy npx ts-node index.ts ``` - - - - -```terminal copy -node index.js -``` - - - The output should look similar to this: -```json5 no-lines +```json no-lines [ { id: '60cc9b0e001e3bfd00a6eddf', @@ -229,11 +136,9 @@ The output should look similar to this: ] ``` - - Also note that `allUsers` is _statically typed_ thanks to [Prisma Client's generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types). You can observe the type by hovering over the `allUsers` variable in your editor. It should be typed as follows: -```ts no-lines +```ts no-lines showLineNumbers const allUsers: (User & { posts: Post[] })[] @@ -247,8 +152,6 @@ export type Post = { } ``` - - The query added new records to the `User` and the `Post` collections: @@ -273,40 +176,7 @@ The `id` field in the Prisma schema maps to `_id` in the underlying MongoDB data Before moving on to the next section, you'll add a couple of comments to the `Post` record you just created using an `update` query. Adjust the `main` function as follows: - - -```ts file=index.ts copy -async function main() { - await prisma.post.update({ - where: { - slug: 'my-first-post', - }, - data: { - comments: { - createMany: { - data: [ - { comment: 'Great post!' }, - { comment: "Can't wait to read more!" }, - ], - }, - }, - }, - }) - const posts = await prisma.post.findMany({ - include: { - comments: true, - }, - }) - - console.dir(posts, { depth: Infinity }) -} -``` - - - - - -```js file=index.js copy +```ts file=index.ts copy showLineNumbers async function main() { await prisma.post.update({ where: { @@ -333,31 +203,15 @@ async function main() { } ``` - - - - Now run the code using the same command as before: ```terminal copy npx ts-node index.ts ``` - - - - -Now run the code using the same command as before: - -```terminal copy -node index.js -``` - - - You will see the following output: -```json5 no-lines +```json no-lines [ { id: '60cc9bad005059d6007f45dd', @@ -382,50 +236,3 @@ You will see the following output: ``` Fantastic, you just wrote new data into your database for the first time using Prisma Client 🚀 - - - - - - - Install Prisma Client - - - - Next Steps - - - - - - - - - - - - Install Prisma Client - - - - Next Steps - - - - - diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/300-next-steps.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/300-next-steps.mdx index 628f0abc58..a340f28178 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/300-next-steps.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/300-next-steps.mdx @@ -1,27 +1,28 @@ --- title: 'Next steps' metaTitle: 'Next steps' -metaDescription: 'Next steps to take now that you have successfully added Prisma to your project' +description: 'Next steps to take now that you have successfully added Prisma to your project' langSwitcher: ['typescript', 'node'] dbSwitcher: ['mongodb'] -toc: false +hide_table_of_contents: true --- ## Next steps -This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma. +This section lists a number of potential next steps you can now take from here. Feel free to explore these or read the [Introduction](/orm/overview/introduction/what-is-prisma) page to get a high-level overview of Prisma ORM. ### Continue exploring the Prisma Client API You can send a variety of queries with the Prisma Client API. Check out the [API reference](/orm/prisma-client) and use your existing database setup from this guide to try them out. - +:::tip You can use your editor's auto-completion feature to learn about the different API calls and the arguments it takes. Auto-completion is commonly invoked by hitting CTRL+SPACE on your keyboard. - +::: -
Expand for more Prisma Client API examples +
+Expand for more Prisma Client API examples Here are a few suggestions for a number of more queries you can send with Prisma Client: @@ -75,13 +76,13 @@ const deletedUser = await prisma.user.delete({ Prisma Studio is a visual editor for the data in your database. Run `npx prisma studio` in your terminal. -### Try a Prisma example +### Try a Prisma ORM example The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository contains a number of ready-to-run examples: -, ]}> + - + | Demo | Stack | Description | | :------------------------------------------------------------------------------------------------------------------ | :----------- | --------------------------------------------------------------------------------------------------- | @@ -91,9 +92,9 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/typescript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/typescript/grpc) | Backend only | Simple gRPC API | - + - + | Demo | Stack | Description | | :---------------------------------------------------------------------------------------------------------------- | :----------- | :-------------------------------------------------------------------------------------------------- | @@ -102,6 +103,6 @@ The [`prisma-examples`](https://github.com/prisma/prisma-examples/) repository c | [`rest-express`](https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-express) | Backend only | Simple REST API with Express.JS | | [`grpc`](https://github.com/prisma/prisma-examples/tree/latest/javascript/grpc) | Backend only | Simple gRPC API | - + diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/prisma-client-node-module.png b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/prisma-client-node-module.png deleted file mode 100644 index 2fc66ee7f5..0000000000 Binary files a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/prisma-client-node-module.png and /dev/null differ diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/index.mdx b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/index.mdx index cd8dc40bca..0969ce0a1b 100644 --- a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/index.mdx +++ b/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/index.mdx @@ -1,13 +1,13 @@ --- title: 'Add to existing project' metaTitle: 'Add Prisma to an existing project' -metaDescription: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your database of choice and generating a Prisma Client for database access.' -toc: false +description: 'Learn how to add Prisma to an existing Node.js or TypeScript project by connecting it to your database of choice and generating a Prisma Client for database access.' +hide_table_of_contents: true --- -Include Prisma in an existing project with the following documentation, which explains some core concepts as it guides you through integrating Prisma into your workflow. +Include Prisma ORM in an existing project with the following documentation, which explains some core concepts as it guides you through integrating Prisma ORM into your workflow. diff --git a/content/100-getting-started/02-setup-prisma/index.mdx b/content/100-getting-started/02-setup-prisma/index.mdx index bd4d38e269..3592cee830 100644 --- a/content/100-getting-started/02-setup-prisma/index.mdx +++ b/content/100-getting-started/02-setup-prisma/index.mdx @@ -1,14 +1,14 @@ --- title: 'Set up Prisma ORM' metaTitle: 'Set up Prisma ORM' -metaDescription: 'Get started with Prisma ORM and your favorite database. Learn about data modeling, migrations and querying.' -toc: false +description: 'Get started with Prisma ORM and your favorite database. Learn about data modeling, migrations and querying.' +hide_table_of_contents: true staticLink: true --- -Start from scratch or add Prisma to an existing project. The following tutorials introduce you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). +Start from scratch or add Prisma ORM to an existing project. The following tutorials introduce you to the [Prisma CLI](/orm/tools/prisma-cli), [Prisma Client](/orm/prisma-client), and [Prisma Migrate](/orm/prisma-migrate). diff --git a/content/100-getting-started/index.mdx b/content/100-getting-started/index.mdx index 097a3cb937..c913b581d3 100644 --- a/content/100-getting-started/index.mdx +++ b/content/100-getting-started/index.mdx @@ -1,11 +1,26 @@ --- title: 'Get Started' metaTitle: 'Get started with Prisma' -metaDescription: 'Build data-driven applications with ease using Prisma ORM, add connection pooling or global caching with Prisma Accelerate or subscribe to database changes in real-time with Prisma Pulse.' -hideTitle: true +description: 'Build data-driven applications with ease using Prisma ORM, add connection pooling or global caching with Prisma Accelerate or subscribe to database changes in real-time with Prisma Pulse.' +hide_title: true tocDepth: 1 +sidebar_position: 0 +sidebar_class_name: firstTitle +pagination_next: 'getting-started/quickstart' --- +import { + Bolt, + BorderBox, + BoxTitle, + Database, + Grid, + LinkCard, + List, + SignalStream, + SquareLogo, +} from '@site/src/components/GettingStarted'; + @@ -39,7 +54,7 @@ _These options don't require you to have your own database running._ icon="fa-solid fa-rabbit-running" title="Quickstart" desc="Set up Prisma ORM from scratch with a SQLite database in 5 minutes." - link="/docs/getting-started/quickstart" + link="/getting-started/quickstart" /> - - -

- Set up Prisma ORM from scratch with your favorite database and - learn basic workflows like data modeling, querying, and migrations. -

- - } - tech="Postgres SQL" - /> - } - tech="MySQL" - /> - } - tech="SQLServer" - /> - } - tech="PlanetScale" - /> - } - tech="Cockroach DB" - /> - } - tech="Mongo DB" - /> - -
-
- - -

- Get started with Prisma ORM and your existing database by - introspecting your database schema and learn how to query your database. -

- - } - tech="Postgres SQL" - /> - } - tech="MySQL" - /> - } - tech="SQL Server" - /> - } - tech="PlanetScale" - /> - } - tech="Cockroach DB" - /> - } - tech="Mongo DB" - /> - -
-
+ + + Set up Prisma ORM **from scratch** with your favorite database and learn basic workflows like data modeling, querying, and migrations. + + + + + + + + + + +

+ Get started with Prisma ORM and your existing database by + introspecting your database schema and learn how to query your database. +

+ + + + + + + + +
## Prisma Accelerate @@ -145,7 +153,7 @@ Make your app faster by scaling your database connections and caching database r icon="fa-solid fa-arrow-right" title="Get started" desc="Add Accelerate to your app to use global database caching & connection pooling." - link="/docs/accelerate/getting-started" + link="/accelerate/getting-started" /> diff --git a/content/200-orm/050-overview/100-introduction/100-what-is-prisma.mdx b/content/200-orm/050-overview/100-introduction/100-what-is-prisma.mdx index 1ce8c749c4..c93256fb75 100644 --- a/content/200-orm/050-overview/100-introduction/100-what-is-prisma.mdx +++ b/content/200-orm/050-overview/100-introduction/100-what-is-prisma.mdx @@ -1,12 +1,12 @@ --- -title: 'What is Prisma?' -metaTitle: 'What is Prisma? (Overview)' -metaDescription: "This page gives a high-level overview of what Prisma is and how it works. It's a great starting point for Prisma newcomers!" +title: 'What is Prisma ORM?' +metaTitle: 'What is Prisma ORM? (Overview)' +description: "This page gives a high-level overview of what Prisma ORM is and how it works. It's a great starting point for Prisma newcomers!" --- -## What is Prisma? + -Prisma is an [open-source](https://github.com/prisma/prisma) next-generation ORM. It consists of the following parts: +Prisma ORM is an [open-source](https://github.com/prisma/prisma) next-generation ORM. It consists of the following parts: - **Prisma Client**: Auto-generated and type-safe query builder for Node.js & TypeScript - **Prisma Migrate**: Migration system @@ -20,7 +20,7 @@ Prisma is an [open-source](https://github.com/prisma/prisma) next-generation ORM Prisma Client can be used in _any_ Node.js (supported versions) or TypeScript backend application (including serverless applications and microservices). This can be a [REST API](/orm/overview/prisma-in-your-stack/rest), a [GraphQL API](/orm/overview/prisma-in-your-stack/graphql), a gRPC API, or anything else that needs a database. -
+
-## How does Prisma work? +## How does Prisma ORM work? ### The Prisma schema -Every project that uses a tool from the Prisma toolkit starts with a [Prisma schema file](/orm/prisma-schema). The Prisma schema allows developers to define their _application models_ in an intuitive data modeling language. It also contains the connection to a database and defines a _generator_: - -, ]}> - +Every project that uses a tool from the Prisma ORM toolkit starts with a [Prisma schema file](/orm/prisma-schema). The Prisma schema allows developers to define their _application models_ in an intuitive data modeling language. It also contains the connection to a database and defines a _generator_: + + ```prisma datasource db { provider = "postgresql" @@ -68,9 +67,8 @@ model User { } ``` - - - + + ```prisma datasource db { provider = "mongodb" @@ -98,7 +96,7 @@ model User { } ``` - + > **Note**: The Prisma schema has powerful data modeling features. For example, it allows you to define "Prisma-level" [relation fields](/orm/prisma-schema/data-model/relations) which will make it easier to work with [relations in the Prisma Client API](/orm/prisma-client/queries/relation-queries). In the case above, the `posts` field on `User` is defined only on "Prisma-level", meaning it does not manifest as a foreign key in the underlying database. @@ -109,11 +107,11 @@ In this schema, you configure three things: - **Generator**: Indicates that you want to generate Prisma Client - **Data model**: Defines your application models -### The Prisma data model +### The Prisma schema data model On this page, the focus is on the data model. You can learn more about [Data sources](/orm/prisma-schema/overview/data-sources) and [Generators](/orm/prisma-schema/overview/generators) on the respective docs pages. -#### Functions of Prisma models +#### Functions of Prisma schema data models The data model is a collection of [models](/orm/prisma-schema/data-model/models#defining-models). A model has two major functions: @@ -153,8 +151,8 @@ Once Prisma Client has been generated, you can import it in your code and send q ##### Import and instantiate Prisma Client -, ]}> - + + ```ts import { PrismaClient } from '@prisma/client' @@ -162,8 +160,8 @@ import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() ``` - - + + ```js const { PrismaClient } = require('@prisma/client') @@ -171,7 +169,7 @@ const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() ``` - + Now you can start sending queries via the generated Prisma Client API, here are a few sample queries. Note that all Prisma Client queries return _plain old JavaScript objects_. @@ -237,19 +235,19 @@ const post = await prisma.post.update({ Note that when using TypeScript, the result of this query will be _statically typed_ so that you can't accidentally access a property that doesn't exist (and any typos are caught at compile-time). Learn more about leveraging Prisma Client's generated types on the [Advanced usage of generated types](/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types) page in the docs. -## Typical Prisma workflows +## Typical Prisma ORM workflows -As mentioned above, there are two ways for "getting" your data model into the Prisma schema. Depending on which approach you choose, your main Prisma workflow might look different. +As mentioned above, there are two ways for "getting" your data model into the Prisma schema. Depending on which approach you choose, your main Prisma ORM workflow might look different. ### Prisma Migrate -With **Prisma Migrate**, Prisma's integrated database migration tool, the workflow looks as follows: +With **Prisma Migrate**, Prisma ORM's integrated database migration tool, the workflow looks as follows: -1. Manually adjust your [Prisma data model](/orm/prisma-schema/data-model/models) +1. Manually adjust your [Prisma schema data model](/orm/prisma-schema/data-model/models) 1. Migrate your development database using the `prisma migrate dev` CLI command 1. Use Prisma Client in your application code to access your database -![Typical workflow with Prisma Migrate](../../../doc-images/prisma-migrate-development-workflow.png) +![Typical workflow with Prisma Migrate](/img/orm/prisma-migrate-development-workflow.png) To learn more about the Prisma Migrate workflow, see: @@ -268,6 +266,6 @@ The typical workflow when using **SQL migrations and introspection** is slightly 1. (Re-)generate Prisma Client 1. Use Prisma Client in your application code to access your database -![Introspect workflow](../../../doc-images/prisma-evolve-app-workflow.png) +![Introspect workflow](/img/orm/prisma-evolve-app-workflow.png) To learn more about the introspection workflow, please refer the [introspection section](/orm/prisma-schema/introspection). diff --git a/content/200-orm/050-overview/100-introduction/200-why-prisma.mdx b/content/200-orm/050-overview/100-introduction/200-why-prisma.mdx index 2a895d874a..4f4f9c5041 100644 --- a/content/200-orm/050-overview/100-introduction/200-why-prisma.mdx +++ b/content/200-orm/050-overview/100-introduction/200-why-prisma.mdx @@ -1,22 +1,22 @@ --- -title: 'Why Prisma?' -metaTitle: 'Why Prisma? Comparison with SQL query builders & ORMs' -metaDescription: 'Learn about the motivation for Prisma and how it compares to other Node.js and TypeScript database tools like ORMs and SQL query builders.' +title: 'Why Prisma ORM?' +metaTitle: 'Why Prisma ORM? Comparison with SQL query builders & ORMs' +description: 'Learn about the motivation for Prisma ORM and how it compares to other Node.js and TypeScript database tools like ORMs and SQL query builders.' --- -On this page, you'll learn about the motivation for Prisma and how it compares to other database tools like ORMs and SQL query builders. +On this page, you'll learn about the motivation for Prisma ORM and how it compares to other database tools like traditional ORMs and SQL query builders. Working with relational databases is a major bottleneck in application development. Debugging SQL queries or complex ORM objects often consume hours of development time. -Prisma makes it easy for developers to reason about their database queries by providing a clean and type-safe API for submitting database queries which returns _plain old JavaScript objects_. +Prisma ORM makes it easy for developers to reason about their database queries by providing a clean and type-safe API for submitting database queries which returns _plain old JavaScript objects_. ## TLDR -Prisma's main goal is to make application developers more productive when working with databases. Here are a few examples of how Prisma achieves this: +Prisma ORM's main goal is to make application developers more productive when working with databases. Here are a few examples of how Prisma ORM achieves this: - **Thinking in objects** instead of mapping relational data - **Queries not classes** to avoid complex model objects @@ -27,13 +27,13 @@ Prisma's main goal is to make application developers more productive when workin - **Less boilerplate** so developers can focus on the important parts of their app - **Auto-completion in code editors** instead of needing to look up documentation -The remaining parts of this page discuss how Prisma compares to existing database tools. +The remaining parts of this page discuss how Prisma ORM compares to existing database tools. -## Problems with SQL, ORMs and other database tools +## Problems with SQL, traditional ORMs and other database tools The main problem with the database tools that currently exist in the Node.js and TypeScript ecosystem is that they require a major tradeoff between _productivity_ and _control_. -![Productivity vs Control in ORMs, SQL query builders, and SQL](node-js-db-tools-tradeoffs.png) +![Productivity vs Control in ORMs, SQL query builders, and SQL](./node-js-db-tools-tradeoffs.png) ### Raw SQL: Full control, low productivity @@ -49,9 +49,9 @@ A common solution that retains a high level of control and provides better produ The biggest drawback with SQL query builders is that application developers still need to think about their data in terms of SQL. This incurs a cognitive and practical cost of translating relational data into objects. Another issue is that it's too easy to shoot yourself in the foot if you don't know exactly what you're doing in your SQL queries. -### ORMs: Less control, better productivity +### Traditional ORMs: Less control, better productivity -ORMs abstract away from SQL by letting you _define your application models as classes_, these classes are mapped to tables in the database. +Traditional ORMs abstract away from SQL by letting you _define your application models as classes_, these classes are mapped to tables in the database. > "Object relational mappers" (ORMs) exist to bridge the gap between the programmers' friend (the object), and the database's primitive (the relation). The reasons for these differing models are as much cultural as functional: programmers like objects because they encapsulate the state of a single thing in a running program. Databases like relations because they better suit whole-dataset constraints and efficient access patterns for the entire dataset. > @@ -74,9 +74,9 @@ As an example, consider how data is organized and relationships are handled with - **Relational databases**: Data is typically normalized (flat) and uses foreign keys to link across entities. The entities then need to be JOINed to manifest the actual relationships. - **Object-oriented**: Objects can be deeply nested structures where you can traverse relationships simply by using dot notation. -This alludes to one of the major pitfalls with ORMs: While they make it _seem_ that you can simply traverse relationships using familiar dot notation, under the hood the ORM generates SQL JOINs which are expensive and have the potential to drastically slow down your application (one symptom of this is the [n+1 problem](https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping)). +This alludes to one of the major pitfalls with traditional ORMs: While they make it _seem_ that you can simply traverse relationships using familiar dot notation, under the hood the ORM generates SQL JOINs which are expensive and have the potential to drastically slow down your application (one symptom of this is the [n+1 problem](https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping)). -To conclude: The appeal of ORMs is the premise of abstracting away the relational model and thinking about your data purely in terms of objects. While the premise is great, it's based on the wrong assumption that relational data can easily be mapped to objects which leads to lots of complications and pitfalls. +To conclude: The appeal of traditional ORMs is the premise of abstracting away the relational model and thinking about your data purely in terms of objects. While the premise is great, it's based on the wrong assumption that relational data can easily be mapped to objects which leads to lots of complications and pitfalls. ## Application developers should care about data – not SQL @@ -88,8 +88,8 @@ There's another argument to be made against SQL in application development. The Developers should be able to ask for the data they need instead of having to worry about "doing the right thing" in their SQL queries. They should be using an abstraction that makes the right decisions for them. This can mean that the abstraction imposes certain "healthy" constraints that prevent developers from making mistakes. -## Prisma makes developers productive +## Prisma ORM makes developers productive -Prisma's main goal is to make application developers more productive when working with databases. Considering the tradeoff between productivity and control again, this is how Prisma fits in: +Prisma ORM's main goal is to make application developers more productive when working with databases. Considering the tradeoff between productivity and control again, this is how Prisma ORM fits in: -![Prisma makes developers productive](prisma-makes-devs-productive.png) +![Prisma ORM makes developers productive](./prisma-makes-devs-productive.png) diff --git a/content/200-orm/050-overview/100-introduction/250-should-you-use-prisma.mdx b/content/200-orm/050-overview/100-introduction/250-should-you-use-prisma.mdx index 060c5fbb2e..7276b45f5d 100644 --- a/content/200-orm/050-overview/100-introduction/250-should-you-use-prisma.mdx +++ b/content/200-orm/050-overview/100-introduction/250-should-you-use-prisma.mdx @@ -1,63 +1,34 @@ --- -title: 'Should you use Prisma?' -metaTitle: 'Should you use Prisma as a Node.js/TypeScript ORM?' -metaDescription: 'Prisma is a new kind of ORM. This page explains when Prisma would be a good fit, and provides alternatives for other scenarios.' +title: 'Should you use Prisma ORM?' +metaTitle: 'Should you use Prisma ORM as a Node.js/TypeScript ORM?' +description: 'Prisma ORM is a new kind of ORM. This page explains when Prisma ORM would be a good fit, and provides alternatives for other scenarios.' tocDepth: 3 toc: true --- -Prisma is a new kind of ORM that - like any other tool - comes with its own tradeoffs. This page explains when Prisma would be a good fit, and provides alternatives for other scenarios. +Prisma ORM is a new kind of ORM that - like any other tool - comes with its own tradeoffs. This page explains when Prisma ORM would be a good fit, and provides alternatives for other scenarios. - - -## Prisma likely _is_ a good fit for you if ... +## Prisma ORM likely _is_ a good fit for you if ... ### ... you are building a server-side application that talks to a database -This is the main use case for Prisma. Server-side applications typically are API servers that expose data operations via technologies like REST, GraphQL or gRPC. They are commonly built as microservices or monolithic apps and deployed via long-running servers or serverless functions. Prisma is a great fit for all of these application and deployment models. +This is the main use case for Prisma ORM. Server-side applications typically are API servers that expose data operations via technologies like REST, GraphQL or gRPC. They are commonly built as microservices or monolithic apps and deployed via long-running servers or serverless functions. Prisma ORM is a great fit for all of these application and deployment models. -Refer to the full list of databases (relational, NoSQL, and NewSQL) that Prisma [supports](/orm/reference/supported-databases). +Refer to the full list of databases (relational, NoSQL, and NewSQL) that Prisma ORM [supports](/orm/reference/supported-databases). ### ... you care about productivity and developer experience Productivity and developer experience are core to how we're building our tools. We're looking to build developer-friendly abstractions for tasks that are complex, error-prone and time-consuming when performed manually. -No matter if you're a SQL newcomer or veteran, Prisma will give you a significant productivity boost for the most common database workflows. +No matter if you're a SQL newcomer or veteran, Prisma ORM will give you a significant productivity boost for the most common database workflows. Here are a couple of the guiding principles and general practices we apply when designing and building our tools: -- [make the right thing easy](https://www.jason.af/right-thing-easy-thing/) +- [make the right thing easy](https://git.io/right-thing-easy-thing) - [pit of success](https://blog.codinghorror.com/falling-into-the-pit-of-success/) - offer intelligent autocompletion where possible - build powerful editor extensions (e.g. for [VS Code](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma)) @@ -65,7 +36,7 @@ Here are a couple of the guiding principles and general practices we apply when ### ... you are working in a team -Prisma shines especially when used in collaborative environments. +Prisma ORM shines especially when used in collaborative environments. The declarative [Prisma schema](/orm/prisma-schema) provides an overview of the current state of the database that's easy to understand for everyone. This is a major improvement to traditional workflows where developers have to dig through migration files to understand the current table structure. @@ -75,7 +46,7 @@ The [Prisma Migrate](/orm/prisma-migrate) workflows are designed in a way to cov ### ... you want a tool that holistically covers your database workflows -Prisma is a lot more than "just another ORM". We are building a database toolkit that covers the daily workflows of application developers that interact with databases. A few examples are: +Prisma ORM is a lot more than "just another ORM". We are building a database toolkit that covers the daily workflows of application developers that interact with databases. A few examples are: - querying (with [Prisma Client](/orm/prisma-client)) - data modeling (in the [Prisma schema](/orm/prisma-schema)) @@ -86,11 +57,11 @@ Prisma is a lot more than "just another ORM". We are building a database toolkit ### ... you value type-safety -Prisma is the only _fully_ type-safe ORM in the TypeScript ecosystem. The generated Prisma Client ensures typed query results even for partial queries and relations. You can learn more about this in the [type-safety comparison with TypeORM](/orm/more/comparisons/prisma-and-typeorm#type-safety). +Prisma ORM is the only _fully_ type-safe ORM in the TypeScript ecosystem. The generated Prisma Client ensures typed query results even for partial queries and relations. You can learn more about this in the [type-safety comparison with TypeORM](/orm/more/comparisons/prisma-and-typeorm#type-safety). ### ... you want an ORM with a transparent development process, proper maintenance & support -Development of Prisma's open source tools is happening in the open. Most of it happens directly on GitHub in the main [`prisma/prisma`](https://github.com/prisma/prisma) repo: +Development of Prisma ORM's open source tools is happening in the open. Most of it happens directly on GitHub in the main [`prisma/prisma`](https://github.com/prisma/prisma) repo: - issues and PRs in our repos are triaged and prioritized (usually within 1-2 days) - there is a public [roadmap](https://pris.ly/roadmap) that is kept up to date with our plans @@ -102,15 +73,15 @@ Development of Prisma's open source tools is happening in the open. Most of it h Prisma has a lively [community](https://www.prisma.io/community), which you can find on [Slack](https://slack.prisma.io) and [Discord](https://discord.gg/KQyTW2H5ca). We also regularly host Meetups, conferences and other developer-focused events. Join us! -## Prisma likely is _not_ a good fit for you if ... +## Prisma ORM likely is _not_ a good fit for you if ... ### ... you need _full_ control over all database queries -Prisma is an abstraction. As such, an inherent tradeoff of Prisma is a reduced amount of control in exchange for higher productivity. This means, the [Prisma Client API](/orm/prisma-client) might have less capabilities in some scenarios than you get with plain SQL. +Prisma ORM is an abstraction. As such, an inherent tradeoff of Prisma ORM is a reduced amount of control in exchange for higher productivity. This means, the [Prisma Client API](/orm/prisma-client) might have less capabilities in some scenarios than you get with plain SQL. -If your application has requirements for database queries that Prisma does not provide and the workarounds are too costly, you might be better off with a tool that allows you to exercise full control over your database operations using plain SQL. +If your application has requirements for database queries that Prisma ORM does not provide and the workarounds are too costly, you might be better off with a tool that allows you to exercise full control over your database operations using plain SQL. -> **Note**: If you can work around a certain limitation but still would like to see an improvement in the way how Prisma handles the situation, we encourage you to create a [feature request](https://github.com/prisma/prisma/issues/new?assignees=&labels=&template=feature_request.md&title=) on GitHub so that our Product and Engineering teams can look into it. +> **Note**: If you can work around a certain limitation but still would like to see an improvement in the way how Prisma ORM handles the situation, we encourage you to create a [feature request](https://github.com/prisma/prisma/issues/new?assignees=&labels=&template=feature_request.md&title=) on GitHub so that our Product and Engineering teams can look into it. _Alternatives_: SQL drivers (e.g. [`node-postgres`](https://node-postgres.com/), [`mysql`](https://github.com/mysqljs/mysql#readme), [`sqlite3`](https://github.com/mapbox/node-sqlite3#README), ...) @@ -120,13 +91,13 @@ If you don't want to write any code for your backend and just be able to generat With a BaaS, you can typically configure your data model via a high-level API (e.g. [GraphQL SDL](https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51)) or a visual editor. Based on this data model, the BaaS generates a CRUD API and provisions a database for you. With this setup, you typically don't have control over the infrastructure the API server and database are running on. -With Prisma, you are building the backend yourself using Node.js or TypeScript. This means you'll have to do a lot more coding work compared to using a BaaS. The benefit of this approach is that you have full flexibility for building, deploying, scaling and maintaining your backend and are not dependent on 3rd party software for a crucial part of your stack. +With Prisma ORM, you are building the backend yourself using Node.js or TypeScript. This means you'll have to do a lot more coding work compared to using a BaaS. The benefit of this approach is that you have full flexibility for building, deploying, scaling and maintaining your backend and are not dependent on 3rd party software for a crucial part of your stack. _Alternatives_: [AWS AppSync](https://aws.amazon.com/appsync/), [8base](https://www.8base.com/), [Nhost](https://nhost.io/), [Supabase](https://supabase.com/), [Firebase](https://firebase.google.com/), [Amplication](https://amplication.com/) ### ... you want a CRUD GraphQL API without writing any code -While tools like the [`nexus-plugin-prisma`](https://nexusjs.org/docs/plugins/prisma/overview) and [`typegraphql-prisma`](https://github.com/MichalLytek/typegraphql-prisma#readme) allow you to quickly generate CRUD operations for your Prisma models in a GraphQL API, these approaches still require you to set up your GraphQL server manually and do some work to expose GraphQL queries and mutations for the models defined in your Prisma schema. +While tools like the [`nexus-plugin-prisma`](https://nexusjs.org/docs/plugins/prisma/overview) and [`typegraphql-prisma`](https://github.com/MichalLytek/typegraphql-prisma#readme) allow you to quickly generate CRUD operations for your Prisma ORM models in a GraphQL API, these approaches still require you to set up your GraphQL server manually and do some work to expose GraphQL queries and mutations for the models defined in your Prisma schema. If you want to get a GraphQL endpoint for your database out-of-the box, other tools might be better suited for your use case. @@ -134,7 +105,7 @@ _Alternatives_: [Hasura](https://hasura.io/), [Postgraphile](https://www.graphil ### ... you want to use raw, type-safe SQL for querying your database -While Prisma does allow you to [send plain SQL queries](/orm/prisma-client/queries/raw-database-access/raw-queries) to your database, it might not be the best fit if you prefer to work with a SQL-based abstraction that you want to be type-safe. Prisma's main benefit is to provide an abstraction layer that makes you more productive compared to writing SQL. +While Prisma ORM does allow you to [send plain SQL queries](/orm/prisma-client/queries/raw-database-access/raw-queries) to your database, it might not be the best fit if you prefer to work with a SQL-based abstraction that you want to be type-safe. Prisma ORM's main benefit is to provide an abstraction layer that makes you more productive compared to writing SQL. If you're a solo developer that is very comfortable with SQL, and you just want to be sure that your database layer is type-safe, a lower-level TypeScript database library might be better for you. diff --git a/content/200-orm/050-overview/100-introduction/300-data-modeling.mdx b/content/200-orm/050-overview/100-introduction/300-data-modeling.mdx index ac5ff0e3a2..65df218525 100644 --- a/content/200-orm/050-overview/100-introduction/300-data-modeling.mdx +++ b/content/200-orm/050-overview/100-introduction/300-data-modeling.mdx @@ -1,9 +1,11 @@ --- title: 'Data modeling' metaTitle: 'Data modeling with Prisma' -metaDescription: 'Learn how data modeling with Prisma differs from data modeling with SQL or ORMs. Prisma uses a declarative data modeling language to describe a database schema.' +description: 'Learn how data modeling with Prisma differs from data modeling with SQL or ORMs. Prisma uses a declarative data modeling language to describe a database schema.' --- + + ## What is data modeling? The term _data modeling_ refers to the **process of defining the shape and structure of the objects in an application**, these objects are often called "application models". In relational databases (like PostgreSQL), they are stored in _tables_ . When using document databases (like MongoDB), they are stored in _collections_. @@ -17,7 +19,7 @@ When modeling data, you typically ask questions like: - What are their main characteristics/properties? - How can they be represented with my technology stack? -## Data modeling without Prisma +## Data modeling without Prisma ORM Data modeling typically needs to happen on (at least) two levels: @@ -175,11 +177,11 @@ The call to `findByPk` creates a SQL statement to retrieve the `User` record tha The resulting `user` object is an instance of Sequelize's `Model` class (because `User` inherits from `Model`). It's not a POJO, but an object that implements additional behavior from Sequelize. -## Data modeling with Prisma +## Data modeling with Prisma ORM -Depending on which parts of Prisma you want to use in your application, the data modeling flow looks slightly different. The following two sections explain the workflows for using [**only Prisma Client**](#using-only-prisma-client) and using [**Prisma Client and Prisma Migrate**](#using-prisma-client-and-prisma-migrate). +Depending on which parts of Prisma ORM you want to use in your application, the data modeling flow looks slightly different. The following two sections explain the workflows for using [**only Prisma Client**](#using-only-prisma-client) and using [**Prisma Client and Prisma Migrate**](#using-prisma-client-and-prisma-migrate). -No matter which approach though, with Prisma you never create application models in your programming language by manually defining classes, interfaces, or structs. Instead, the application models are defined in your [Prisma schema](/orm/prisma-schema): +No matter which approach though, with Prisma ORM you never create application models in your programming language by manually defining classes, interfaces, or structs. Instead, the application models are defined in your [Prisma schema](/orm/prisma-schema): - **Only Prisma Client**: Application models in the Prisma schema are _generated based on the introspection of your database schema_. Data modeling happens primarily on the database-level. - **Prisma Client and Prisma Migrate**: Data modeling happens in the Prisma schema by _manually adding application models_ to it. Prisma Migrate maps these application models to tables in the underlying database (currently only supported for relational databases). diff --git a/content/200-orm/050-overview/100-introduction/index.mdx b/content/200-orm/050-overview/100-introduction/index.mdx index 90a1c1af59..97550f003a 100644 --- a/content/200-orm/050-overview/100-introduction/index.mdx +++ b/content/200-orm/050-overview/100-introduction/index.mdx @@ -1,16 +1,17 @@ --- title: 'Introduction' metaTitle: 'Introduction (Overview)' -metaDescription: "This section gives a high-level overview of what Prisma is and how it works. It's a great starting point for Prisma newcomers!" +description: "This section gives a high-level overview of what Prisma is and how it works. It's a great starting point for Prisma newcomers!" +hide_table_of_contents: true --- -This page gives a high-level overview of what Prisma is and how it works. +This page gives a high-level overview of what Prisma ORM is and how it works. If you want to get started with a _practical introduction_ and learn about the Prisma Client API, head over to the [**Getting Started**](/getting-started) documentation. -To learn more about the _motivation_ for Prisma, check out the [**Why Prisma?**](/orm/overview/introduction/why-prisma) page. +To learn more about the _motivation_ for Prisma ORM, check out the [**Why Prisma ORM?**](/orm/overview/introduction/why-prisma) page. diff --git a/content/200-orm/050-overview/300-prisma-in-your-stack/01-rest.mdx b/content/200-orm/050-overview/300-prisma-in-your-stack/01-rest.mdx index cb65d49966..36f41e808a 100644 --- a/content/200-orm/050-overview/300-prisma-in-your-stack/01-rest.mdx +++ b/content/200-orm/050-overview/300-prisma-in-your-stack/01-rest.mdx @@ -1,7 +1,7 @@ --- title: 'REST' -metaTitle: 'Building REST APIs with Prisma' -metaDescription: 'This page gives an overview of the most important things when building REST APIs with Prisma. It shows practical examples and the supported libraries.' +metaTitle: 'Building REST APIs with Prisma ORM' +description: 'This page gives an overview of the most important things when building REST APIs with Prisma. It shows practical examples and the supported libraries.' --- @@ -16,7 +16,7 @@ When building REST APIs, Prisma Client can be used inside your _route controller As Prisma Client is "only" responsible for sending queries to your database, it can be combined with any HTTP server library or web framework of your choice. -Here's a non-exhaustive list of libraries and frameworks you can use with Prisma: +Here's a non-exhaustive list of libraries and frameworks you can use with Prisma ORM: - [Express](https://expressjs.com/) - [koa](https://koajs.com/) diff --git a/content/200-orm/050-overview/300-prisma-in-your-stack/02-graphql.mdx b/content/200-orm/050-overview/300-prisma-in-your-stack/02-graphql.mdx index 9482816f77..2819583fce 100644 --- a/content/200-orm/050-overview/300-prisma-in-your-stack/02-graphql.mdx +++ b/content/200-orm/050-overview/300-prisma-in-your-stack/02-graphql.mdx @@ -1,14 +1,14 @@ --- title: 'GraphQL' -metaTitle: 'Building GraphQL servers with Prisma' -metaDescription: 'This page gives explains how to build GraphQL servers with Prisma. It shows how Prisma fits into the GraphQL ecosystem and provides practical examples.' +metaTitle: 'Building GraphQL servers with Prisma ORM' +description: 'This page gives explains how to build GraphQL servers with Prisma ORM. It shows how Prisma ORM fits into the GraphQL ecosystem and provides practical examples.' --- [GraphQL](https://graphql.org/) is a query language for APIs. It is often used as an alternative to RESTful APIs, but can also be used as an additional "gateway" layer on top of existing RESTful services. -With Prisma, you can build GraphQL servers that connect to a database. Prisma is completely agnostic to the GraphQL tools you use. When building a GraphQL server, you can combine Prisma with tools like Apollo Server, GraphQL Yoga, TypeGraphQL, GraphQL.js, or pretty much any tool or library that you're using in your GraphQL server setup. +With Prisma ORM, you can build GraphQL servers that connect to a database. Prisma ORM is completely agnostic to the GraphQL tools you use. When building a GraphQL server, you can combine Prisma ORM with tools like Apollo Server, GraphQL Yoga, TypeGraphQL, GraphQL.js, or pretty much any tool or library that you're using in your GraphQL server setup. @@ -23,28 +23,28 @@ Note that a GraphQL schema can be written code-first or SDL-first. Check out thi The GraphQL schema and HTTP server are typically handled by separate libraries. Here is an overview of current GraphQL server tools and their purpose: -| Library (npm package) | Purpose | Compatible with Prisma | Prisma integration | -| :-------------------- | :-------------------------- | :--------------------- | :----------------------------------------------------------------------------- | -| `graphql` | GraphQL schema (code-first) | Yes | No | -| `graphql-tools` | GraphQL schema (SDL-first) | Yes | No | -| `type-graphql` | GraphQL schema (code-first) | Yes | [`typegraphql-prisma`](https://www.npmjs.com/package/typegraphql-prisma) | -| `nexus` | GraphQL schema (code-first) | Yes | [`nexus-prisma`](https://graphql-nexus.github.io/nexus-prisma) _Early Preview_ | -| `apollo-server` | HTTP server | Yes | n/a | -| `express-graphql` | HTTP server | Yes | n/a | -| `fastify-gql` | HTTP server | Yes | n/a | -| `graphql-yoga` | HTTP server | Yes | n/a | +| Library (npm package) | Purpose | Compatible with Prisma ORM | Prisma integration | +| :-------------------- | :-------------------------- | :------------------------- | :----------------------------------------------------------------------------- | +| `graphql` | GraphQL schema (code-first) | Yes | No | +| `graphql-tools` | GraphQL schema (SDL-first) | Yes | No | +| `type-graphql` | GraphQL schema (code-first) | Yes | [`typegraphql-prisma`](https://www.npmjs.com/package/typegraphql-prisma) | +| `nexus` | GraphQL schema (code-first) | Yes | [`nexus-prisma`](https://graphql-nexus.github.io/nexus-prisma) _Early Preview_ | +| `apollo-server` | HTTP server | Yes | n/a | +| `express-graphql` | HTTP server | Yes | n/a | +| `fastify-gql` | HTTP server | Yes | n/a | +| `graphql-yoga` | HTTP server | Yes | n/a | In addition to these standalone and single-purpose libraries, there are several projects building integrated _application frameworks_: -| Framework | Stack | Built by | Prisma | Description | -| :---------------------------------- | :-------- | :------------------------------------------------ | :--------------------- | :------------------------------------- | -| [Redwood.js](https://redwoodjs.com) | Fullstack | [Tom Preston-Werner](https://github.com/mojombo/) | Built on top of Prisma | _Bringing full-stack to the JAMstack._ | +| Framework | Stack | Built by | Prisma ORM | Description | +| :---------------------------------- | :-------- | :------------------------------------------------ | :------------------------- | :------------------------------------- | +| [Redwood.js](https://redwoodjs.com) | Fullstack | [Tom Preston-Werner](https://github.com/mojombo/) | Built on top of Prisma ORM | _Bringing full-stack to the JAMstack._ | > **Note**: If you notice any GraphQL libraries/frameworks missing from the list, please let us know. -## Prisma & GraphQL examples +## Prisma ORM & GraphQL examples -In the following section will find several ready-to-run examples that showcase how to use Prisma with different combinations of the tools mentioned in the table above. +In the following section will find several ready-to-run examples that showcase how to use Prisma ORM with different combinations of the tools mentioned in the table above. ### TypeScript @@ -74,11 +74,11 @@ In the following section will find several ready-to-run examples that showcase h ## FAQ -### What is Prisma's role in a GraphQL server? +### What is Prisma ORM's role in a GraphQL server? -No matter which of the above GraphQL tools/libraries you use, Prisma is used inside your GraphQL resolvers to connect to your database. It has the same role that any other ORM or SQL query builder would have inside your resolvers. +No matter which of the above GraphQL tools/libraries you use, Prisma ORM is used inside your GraphQL resolvers to connect to your database. It has the same role that any other ORM or SQL query builder would have inside your resolvers. -In the resolver of a GraphQL query, Prisma typically reads data from the database to return it in the GraphQL response. In the resolver of a GraphQL mutation, Prisma typically also writes data to the database (e.g. creating new or updating existing records). +In the resolver of a GraphQL query, Prisma ORM typically reads data from the database to return it in the GraphQL response. In the resolver of a GraphQL mutation, Prisma ORM typically also writes data to the database (e.g. creating new or updating existing records). ## Other GraphQL Resources diff --git a/content/200-orm/050-overview/300-prisma-in-your-stack/03-fullstack.mdx b/content/200-orm/050-overview/300-prisma-in-your-stack/03-fullstack.mdx index 85bd2fc921..4b8646cda7 100644 --- a/content/200-orm/050-overview/300-prisma-in-your-stack/03-fullstack.mdx +++ b/content/200-orm/050-overview/300-prisma-in-your-stack/03-fullstack.mdx @@ -1,7 +1,7 @@ --- title: 'Fullstack' -metaTitle: 'Building fullstack applications with Prisma' -metaDescription: 'This page gives explains how to build fullstack applications with Prisma. It shows how Prisma fits in with fullstack frameworks and provides practical examples' +metaTitle: 'Building fullstack applications with Prisma ORM' +description: 'This page gives explains how to build fullstack applications with Prisma. It shows how Prisma fits in with fullstack frameworks and provides practical examples' --- @@ -14,7 +14,7 @@ You can query your database using Prisma Client, using your framework of choice, ## Supported frameworks -Here's a non-exhaustive list of frameworks and libraries you can use with Prisma: +Here's a non-exhaustive list of frameworks and libraries you can use with Prisma ORM: - [Next.js](https://nextjs.org/) - [Remix](https://remix.run) @@ -57,7 +57,7 @@ model User { You can now implement the logic for querying your database using [Prisma Client API](/orm/prisma-client) inside `getServerSideProps`, `getStaticProps`, API routes, or using API libraries such as [tRPC](https://trpc.io/) and [GraphQL](https://graphql.org/). -### getServerSideProps +### `getServerSideProps` ```ts // (in /pages/index.tsx) @@ -92,7 +92,7 @@ export default async function handle(req, res) { } ``` -Note that you can use Prisma inside of Next.js API routes to send queries to your database – with REST, GraphQL, and tRPC. +Note that you can use Prisma ORM inside of Next.js API routes to send queries to your database – with REST, GraphQL, and tRPC. You can then fetch data and display it in your frontend. diff --git a/content/200-orm/050-overview/300-prisma-in-your-stack/04-is-prisma-an-orm.mdx b/content/200-orm/050-overview/300-prisma-in-your-stack/04-is-prisma-an-orm.mdx index 274decd080..6d16745de8 100644 --- a/content/200-orm/050-overview/300-prisma-in-your-stack/04-is-prisma-an-orm.mdx +++ b/content/200-orm/050-overview/300-prisma-in-your-stack/04-is-prisma-an-orm.mdx @@ -1,24 +1,24 @@ --- -title: 'Is Prisma an ORM?' -metaTitle: 'Is Prisma an ORM? | What is an ORM?' -metaDescription: 'Learn about how Prisma implements the Data Mapper ORM pattern and how it achieves the same goal as traditional ORMs without requiring you to map classes to tables as traditional ORMs do.' +title: 'Is Prisma ORM an ORM?' +metaTitle: 'Is Prisma ORM an ORM? | What is an ORM?' +description: 'Learn about how Prisma ORM implements the Data Mapper ORM pattern and how it achieves the same goal as traditional ORMs without requiring you to map classes to tables as traditional ORMs do.' --- -To answer the question briefly: _Yes, Prisma is a new kind of ORM that fundamentally differs from traditional ORMs and doesn't suffer from many of the problems commonly associated with these_. +To answer the question briefly: _Yes, Prisma ORM is a new kind of ORM that fundamentally differs from traditional ORMs and doesn't suffer from many of the problems commonly associated with these_. Traditional ORMs provide an object-oriented way for working with relational databases by mapping tables to _model classes_ in your programming language. This approach leads to many problems that are caused by the [object-relational impedance mismatch](https://en.wikipedia.org/wiki/Object%E2%80%93relational_impedance_mismatch). -Prisma works fundamentally different compared to that. With Prisma, you define your models in the declarative [Prisma schema](/orm/prisma-schema) which serves as the single source of truth for your database schema and the models in your programming language. In your application code, you can then use Prisma Client to read and write data in your database in a type-safe manner without the overhead of managing complex model instances. This makes the process of querying data a lot more natural as well as more predictable since Prisma Client always returns plain JavaScript objects. +Prisma ORM works fundamentally different compared to that. With Prisma ORM, you define your models in the declarative [Prisma schema](/orm/prisma-schema) which serves as the single source of truth for your database schema and the models in your programming language. In your application code, you can then use Prisma Client to read and write data in your database in a type-safe manner without the overhead of managing complex model instances. This makes the process of querying data a lot more natural as well as more predictable since Prisma Client always returns plain JavaScript objects. -In this article, you will learn in more detail about ORM patterns and workflows, how Prisma implements the Data Mapper pattern, and the benefits of Prisma's approach. +In this article, you will learn in more detail about ORM patterns and workflows, how Prisma ORM implements the Data Mapper pattern, and the benefits of Prisma ORM's approach. ## What are ORMs? -If you're already familiar with ORMs, feel free to jump to the [next section](#prisma) on Prisma. +If you're already familiar with ORMs, feel free to jump to the [next section](#prisma-orm) on Prisma ORM. ### ORM Patterns - Active Record and Data Mapper @@ -135,16 +135,18 @@ export class User { @Column({ unique: true }) email: string + //highlight-start @Column() salutation: string + //highlight-end } ``` Synchronizing such changes can be a challenge with ORMs because the changes are applied manually and are not easily verifiable programmatically. Renaming an existing column can be even more cumbersome and involve searching and replacing references to the column. -> **Note:** Django's [makemigrations](https://docs.djangoproject.com/en/3.1/ref/django-admin/#django-admin-makemigrations) CLI generates migrations by inspecting changes in models which, similar to Prisma, does away with the synchronization problem. +> **Note:** Django's [makemigrations](https://docs.djangoproject.com/en/3.1/ref/django-admin/#django-admin-makemigrations) CLI generates migrations by inspecting changes in models which, similar to Prisma ORM, does away with the synchronization problem. -In summary, evolving the schema is a key part of building applications. With ORMs, the workflow for updating the schema involves using a migration tool to create a migration followed by updating the corresponding entity and mapper classes (depending on the implementation). As you'll see, Prisma takes a different approach to this. +In summary, evolving the schema is a key part of building applications. With ORMs, the workflow for updating the schema involves using a migration tool to create a migration followed by updating the corresponding entity and mapper classes (depending on the implementation). As you'll see, Prisma ORM takes a different approach to this. Now that you've seen what migrations are and how they fit into the development workflows, you will learn more about the benefits and drawbacks of ORMs. @@ -168,11 +170,11 @@ The drawbacks of ORMs are not always apparent when you start using them. This se - ORMs tend to have a large API surface due to the complexity they encapsulate. The flip side of not having to write SQL is that you spend a lot of time learning how to use the ORM. This applies to most abstractions, however without understanding how the database works, improving slow queries can be difficult. - Some _complex queries_ aren't supported by ORMs due to the flexibility that SQL offers. This problem is alleviated by raw SQL querying functionality in which you pass the ORM a SQL statement string and the query is run for you. -Now that the costs and benefits of ORMs have been covered, you can better understand what Prisma is and how it fits in. +Now that the costs and benefits of ORMs have been covered, you can better understand what Prisma ORM is and how it fits in. -## Prisma +## Prisma ORM -Prisma is a **next-generation ORM** that makes working with databases easy for application developers and features the following tools: +Prisma ORM is a **next-generation ORM** that makes working with databases easy for application developers and features the following tools: - [**Prisma Client**](/orm/prisma-client): Auto-generated and type-safe database client for use in your application. - [**Prisma Migrate**](/orm/prisma-migrate): A declarative data modeling and migration tool. @@ -180,35 +182,35 @@ Prisma is a **next-generation ORM** that makes working with databases easy for a > **Note:** Since Prisma Client is the most prominent tool, we often refer to it as simply Prisma. -The three tools use the [Prisma schema](/orm/prisma-schema) as a single source of truth for the database schema, your application's object schema, and the mapping between the two. It's defined by you and is your main configuration file for Prisma. +The three tools use the [Prisma schema](/orm/prisma-schema) as a single source of truth for the database schema, your application's object schema, and the mapping between the two. It's defined by you and is your main configuration file for Prisma ORM. -Prisma makes you productive and confident in the software you're building with features such as _type safety_, rich auto-completion, and a natural API for fetching relations. +Prisma ORM makes you productive and confident in the software you're building with features such as _type safety_, rich auto-completion, and a natural API for fetching relations. -In the next section, you will learn about how Prisma implements the Data Mapper ORM pattern. +In the next section, you will learn about how Prisma ORM implements the Data Mapper ORM pattern. -### How Prisma implements the Data Mapper pattern +### How Prisma ORM implements the Data Mapper pattern As mentioned earlier in the article, the Data Mapper pattern aligns well with organizations where the database and application are owned by different teams. With the rise of modern cloud environments with managed database services and DevOps practices, more teams embrace a cross-functional approach, whereby teams own both the full development cycle including the database and operational concerns. -Prisma enables the evolution of the DB schema and object schema in tandem, thereby reducing the need for deviation in the first place, while still allowing you to keep your application and database somewhat decoupled using `@map` attributes. While this may seem like a limitation, it prevents the domain model's evolution (through the object schema) from getting imposed on the database as an afterthought. +Prisma ORM enables the evolution of the DB schema and object schema in tandem, thereby reducing the need for deviation in the first place, while still allowing you to keep your application and database somewhat decoupled using `@map` attributes. While this may seem like a limitation, it prevents the domain model's evolution (through the object schema) from getting imposed on the database as an afterthought. -To understand how Prisma's implementation of the Data Mapper pattern differs conceptually to traditional Data Mapper ORMs, here's a brief comparison of their concepts and building blocks: +To understand how Prisma ORM's implementation of the Data Mapper pattern differs conceptually to traditional Data Mapper ORMs, here's a brief comparison of their concepts and building blocks: -| Concept | Description | Building block in traditional ORMs | Building block in Prisma | Source of truth in Prisma | +| Concept | Description | Building block in traditional ORMs | Building block in Prisma ORM | Source of truth in Prisma ORM | | --------------- | -------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------ | ------------------------------------ | | Object schema | The in-memory data structures in your applications | Model classes | Generated TypeScript types | Models in the Prisma schema | | Data Mapper | The code which transforms between the object schema and the database | Mapper classes | Generated functions in Prisma Client | @map attributes in the Prisma schema | | Database schema | The structure of data in the database, e.g., tables and columns | SQL written by hand or with a programmatic API | SQL generated by Prisma Migrate | Prisma schema | -Prisma aligns with the Data Mapper pattern with the following added benefits: +Prisma ORM aligns with the Data Mapper pattern with the following added benefits: - Reducing the boilerplate of defining classes and mapping logic by generating a Prisma Client based on the Prisma schema. - Eliminating the synchronization challenges between application objects and the database schema. - Database migrations are a first-class citizen as they're derived from the Prisma schema. -Now that we've talked about the concepts behind Prisma's approach to Data Mapper, we can go through how the Prisma schema works in practice. +Now that we've talked about the concepts behind Prisma ORM's approach to Data Mapper, we can go through how the Prisma schema works in practice. ### Prisma schema @@ -219,7 +221,7 @@ At the heart of Prisma's implementation of the Data Mapper pattern is the _Prism - Creating and evolving the database schema with Prisma Migrate. - Defining the mapping between application objects and database columns. -Models in Prisma mean something slightly different to Active Record ORMs. With Prisma, models are defined in the Prisma schema as abstract entities which describe tables, relations, and the mappings between columns to properties in Prisma Client. +Models in Prisma ORM mean something slightly different to Active Record ORMs. With Prisma ORM, models are defined in the Prisma schema as abstract entities which describe tables, relations, and the mappings between columns to properties in Prisma Client. As an example, here's a Prisma schema for a blog: @@ -253,7 +255,7 @@ model User { Here's a break down of the example above: - The `datasource` block defines the connection to the database. -- The `generator` block tells Prisma to generate Prisma Client for TypeScript and Node.js. +- The `generator` block tells Prisma ORM to generate Prisma Client for TypeScript and Node.js. - The `Post` and `User` models map to database tables. - The two models have a _1-n_ relation where each `User` can have many related `Post`s. - Each field in the models has a type, e.g. the `id` has the type `Int`. @@ -267,27 +269,27 @@ The `User` / `Post` relation can be visualized with the following diagram: ![1-n relation between User and Post](../100-introduction/user-post-relation-1-n.png) -At a Prisma level, the `User` / `Post` relation is made up of: +At a Prisma ORM level, the `User` / `Post` relation is made up of: - The scalar `authorId` field, which is referenced by the `@relation` attribute. This field exists in the database table – it is the foreign key that connects Post and User. -- The two relation fields: `author` and `posts` **do not exist** in the database table. Relation fields define connections between models at the Prisma level and exist only in the Prisma schema and generated Prisma Client, where they are used to access the relations. +- The two relation fields: `author` and `posts` **do not exist** in the database table. Relation fields define connections between models at the Prisma ORM level and exist only in the Prisma schema and generated Prisma Client, where they are used to access the relations. The declarative nature of Prisma schema is concise and allows defining the database schema and corresponding representation in Prisma Client. -In the next section, you will learn about Prisma's supported workflows. +In the next section, you will learn about Prisma ORM's supported workflows. -### Prisma workflow +### Prisma ORM workflow -The workflow with Prisma is slightly different to traditional ORMs. You can use Prisma when building new applications from scratch or adopt it incrementally: +The workflow with Prisma ORM is slightly different to traditional ORMs. You can use Prisma ORM when building new applications from scratch or adopt it incrementally: - _New application_ (greenfield): Projects that have no database schema yet can use Prisma Migrate to create the database schema. -- _Existing application_ (brownfield): Projects that already have a database schema can be [introspected](/orm/prisma-schema/introspection) by Prisma to generate the Prisma schema and Prisma Client. This use-case works with any existing migration tool and is useful for incremental adoption. It's possible to switch to Prisma Migrate as the migration tool. However, this is optional. +- _Existing application_ (brownfield): Projects that already have a database schema can be [introspected](/orm/prisma-schema/introspection) by Prisma ORM to generate the Prisma schema and Prisma Client. This use-case works with any existing migration tool and is useful for incremental adoption. It's possible to switch to Prisma Migrate as the migration tool. However, this is optional. With both workflows, the Prisma schema is the main configuration file. #### Workflow for incremental adoption in projects with an existing database -Brownfield projects typically already have some database abstraction and schema. Prisma can integrate with such projects by introspecting the existing database to obtain a Prisma schema that reflects the existing database schema and to generate Prisma Client. This workflow is compatible with any migration tool and ORM which you may already be using. If you prefer to incrementally evaluate and adopt, this approach can be used as part of a [parallel adoption strategy](https://en.wikipedia.org/wiki/Parallel_adoption). +Brownfield projects typically already have some database abstraction and schema. Prisma ORM can integrate with such projects by introspecting the existing database to obtain a Prisma schema that reflects the existing database schema and to generate Prisma Client. This workflow is compatible with any migration tool and ORM which you may already be using. If you prefer to incrementally evaluate and adopt, this approach can be used as part of a [parallel adoption strategy](https://en.wikipedia.org/wiki/Parallel_adoption). A non-exhaustive list of setups compatible with this workflow: @@ -314,17 +316,17 @@ generator client { 3. (Optional) Customize [field and model mappings](/orm/prisma-schema/data-model/models#mapping-model-names-to-tables-or-collections) between Prisma Client and the database. 4. Run `prisma generate`. -Prisma will generate Prisma Client inside the `node_modules` folder, from which it can be imported in your application. For more extensive usage documentation, see the [Prisma Client API](/orm/prisma-client) docs. +Prisma ORM will generate Prisma Client inside the `node_modules` folder, from which it can be imported in your application. For more extensive usage documentation, see the [Prisma Client API](/orm/prisma-client) docs. To summarize, Prisma Client can be integrated into projects with an existing database and tooling as part of a parallel adoption strategy. New projects will use a different workflow detailed next. #### Workflow for new projects -Prisma is different from ORMs in terms of the workflows it supports. A closer look at the steps necessary to create and change a new database schema is useful for understanding Prisma Migrate. +Prisma ORM is different from ORMs in terms of the workflows it supports. A closer look at the steps necessary to create and change a new database schema is useful for understanding Prisma Migrate. Prisma Migrate is a CLI for declarative data modeling & migrations. Unlike most migration tools that come as part of an ORM, you only need to describe the current schema, instead of the operations to move from one state to another. Prisma Migrate infers the operations, generates the SQL and carries out the migration for you. -This example demonstrates using Prisma in a new project with a new database schema similar to the blog example above: +This example demonstrates using Prisma ORM in a new project with a new database schema similar to the blog example above: 1. Create the Prisma schema: @@ -373,7 +375,7 @@ It is possible to use Prisma Client in a new project with a third-party migratio ## Accessing data with Prisma Client -So far, the article covered the concepts behind Prisma, its implementation of the Data Mapper pattern, and the workflows it supports. In this last section, you will see how to access data in your application using Prisma Client. +So far, the article covered the concepts behind Prisma ORM, its implementation of the Data Mapper pattern, and the workflows it supports. In this last section, you will see how to access data in your application using Prisma Client. Accessing the database with Prisma Client happens through the query methods it exposes. All queries return plain old JavaScript objects. Given the blog schema from above, fetching a user looks as follows: @@ -389,9 +391,9 @@ const user = await prisma.user.findUnique({ }) ``` -In this query, the `findUnique` method is used to fetch a single row from the `User` table. By default, Prisma will return all the scalar fields in the `User` table. +In this query, the `findUnique` method is used to fetch a single row from the `User` table. By default, Prisma ORM will return all the scalar fields in the `User` table. -> **Note:** The example uses TypeScript to make full use of the type safety features offered by Prisma Client. However, Prisma also works with [JavaScript in Node.js](https://dev.to/prisma/productive-development-with-prisma-s-zero-cost-type-safety-4od2). +> **Note:** The example uses TypeScript to make full use of the type safety features offered by Prisma Client. However, Prisma ORM also works with [JavaScript in Node.js](https://dev.to/prisma/productive-development-with-prisma-s-zero-cost-type-safety-4od2). Prisma Client maps queries and results to [structural types](https://en.wikipedia.org/wiki/Structural_type_system) by generating code from the Prisma schema. This means that `user` has an associated type in the generated Prisma Client: @@ -434,12 +436,12 @@ The example only scratches the surface of Prisma Client's API for [CRUD operatio ## Conclusion -In summary, Prisma is a new kind of Data Mapper ORM that differs from traditional ORMs and doesn't suffer from the problems commonly associated with them. +In summary, Prisma ORM is a new kind of Data Mapper ORM that differs from traditional ORMs and doesn't suffer from the problems commonly associated with them. -Unlike traditional ORMs, with Prisma, you define the Prisma schema – a declarative single source of truth for the database schema and application models. All queries in Prisma Client return plain JavaScript objects which makes the process of interacting with the database a lot more natural as well as more predictable. +Unlike traditional ORMs, with Prisma ORM, you define the Prisma schema – a declarative single source of truth for the database schema and application models. All queries in Prisma Client return plain JavaScript objects which makes the process of interacting with the database a lot more natural as well as more predictable. -Prisma supports two main workflows for starting new projects and adopting in an existing project. For both workflows, the Prisma schema is the main configuration file. +Prisma ORM supports two main workflows for starting new projects and adopting in an existing project. For both workflows, the Prisma schema is the main configuration file. -Like all abstractions, both Prisma and other ORMs hide away some of the underlying details of the database with different assumptions. +Like all abstractions, both Prisma ORM and other ORMs hide away some of the underlying details of the database with different assumptions. These differences and your use case all affect the workflow and cost of adoption. Hopefully understanding how they differ can help you make an informed decision. diff --git a/content/200-orm/050-overview/300-prisma-in-your-stack/index.mdx b/content/200-orm/050-overview/300-prisma-in-your-stack/index.mdx index 3ba9ab5661..d9d54fd99e 100644 --- a/content/200-orm/050-overview/300-prisma-in-your-stack/index.mdx +++ b/content/200-orm/050-overview/300-prisma-in-your-stack/index.mdx @@ -1,13 +1,13 @@ --- -title: 'Prisma in your stack' -metaTitle: 'How Prisma fits into your stack' -metaDescription: 'How Prisma fits into your stack' -toc: false +title: 'Prisma ORM in your stack' +metaTitle: 'How Prisma ORM fits into your stack' +description: 'How Prisma ORM fits into your stack' +hide_table_of_contents: true --- -Prisma is an ORM that provides a fully type-safe API and simplified database access. You can use Prisma tools to build a GraphQL or REST API, or as part of a fullstack application - the extent to which you incorporate Prisma is up to you. +Prisma ORM provides a fully type-safe API and simplified database access. You can use Prisma ORM tools to build a GraphQL or REST API, or as part of a fullstack application - the extent to which you incorporate Prisma ORM is up to you. diff --git a/content/200-orm/050-overview/500-databases/200-database-drivers.mdx b/content/200-orm/050-overview/500-databases/200-database-drivers.mdx index 2308682bfd..cc84c9ec2d 100644 --- a/content/200-orm/050-overview/500-databases/200-database-drivers.mdx +++ b/content/200-orm/050-overview/500-databases/200-database-drivers.mdx @@ -1,13 +1,14 @@ --- title: 'Database drivers' metaTitle: 'Database drivers' -metaDescription: 'Learn how Prisma connects to your database using the built-in drivers and how you can use Prisma along with other JavaScript database drivers using driver adapters (Preview)' +description: 'Learn how Prisma connects to your database using the built-in drivers and how you can use Prisma along with other JavaScript database drivers using driver adapters (Preview)' tocDepth: 4 +toc_max_heading_level: 4 --- ## Default built-in drivers -One of Prisma Client's components is the [Query Engine](/orm/more/under-the-hood/engines) . The Query Engine is responsible for transforming Prisma Client queries to SQL statements. The Query Engine connects to your database using the included drivers that don't require additional setup. The built-in drivers use TCP connections to connect to the database. +One of Prisma Client's components is the [Query Engine](/orm/more/under-the-hood/engines). The Query Engine is responsible for transforming Prisma Client queries to SQL statements. The Query Engine connects to your database via TCP using built-in drivers that don't require additional setup. ![Query flow from the user application to the database with Prisma Client](./images/drivers/qe-query-execution-flow.png) @@ -15,15 +16,17 @@ One of Prisma Client's components is the [Query Engine](/orm/more/under-the-hood Prisma Client can connect and run queries against your database using JavaScript database drivers using **driver adapters**. Adapters act as _translators_ between Prisma Client and the JavaScript database driver. -Prisma will use the Query Engine to transform the Prisma Client query to SQL and run the generated SQL queries via the JavaScript database driver. +Prisma Client will use the Query Engine to transform the Prisma Client query to SQL and run the generated SQL queries via the JavaScript database driver. ![Query flow from the user application to the database using Prisma Client and driver adapters](./images/drivers/qe-query-engine-adapter.png) -There are 2 different types of driver adapters: +There are two different types of driver adapters: - [Database driver adapters](#database-driver-adapters) - [Serverless driver adapters](#serverless-driver-adapters) +> **Note**: Driver adapters enable [edge deployments](/orm/prisma-client/deployment/edge/overview) of applications that use Prisma ORM. + ### Database driver adapters You can connect to your database using a Node.js-based driver from Prisma Client using a database driver adapter. Prisma maintains the following database driver adapters: @@ -35,18 +38,18 @@ You can connect to your database using a Node.js-based driver from Prisma Client Database providers, such as Neon and PlanetScale, allow you to connect to your database using other protocols besides TCP, such as HTTP and WebSockets. These database drivers are optimized for connecting to your database in serverless and edge environments. -Prisma maintains the following serverless driver adapters: +Prisma ORM maintains the following serverless driver adapters: -- [Neon](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-preview) -- [PlanetScale](/orm/overview/databases/planetscale#how-to-use-the-planetscale-serverless-driver-with-prisma-preview) +- [Neon](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-orm-preview) +- [PlanetScale](/orm/overview/databases/planetscale#how-to-use-the-planetscale-serverless-driver-with-prisma-orm-preview) -## Community maintained database driver adapters +### Community-maintained database driver adapters You can also build your own driver adapter for the database you're using. The following is a list of community maintained driver adapters: - [TiDB](https://github.com/tidbcloud/prisma-adapter) -### How to use driver adapters +## How to use driver adapters To use this feature: @@ -61,16 +64,36 @@ To use this feature: 2. Generate Prisma Client: - ```sh + ```bash npx prisma generate ``` 3. Refer to the following pages to learn more how to use the specific driver adapters with the specific database providers: - - [Neon](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-preview) - - [PlanetScale](/orm/overview/databases/planetscale#how-to-use-the-planetscale-serverless-driver-with-prisma-preview) + - [Neon](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-orm-preview) + - [PlanetScale](/orm/overview/databases/planetscale#how-to-use-the-planetscale-serverless-driver-with-prisma-orm-preview) - [Turso](/orm/overview/databases/turso#how-to-connect-and-query-a-turso-database) +## Notes about using driver adapters + +### Driver adapters don't read the connection string from the Prisma schema + +When using Prisma ORM's built-in drivers, the connection string is read from the `url` field of the `datasource` block in your Prisma schema. + +On the other hand, when using a driver adapter, the connection string needs to be provided in your _application code_ when the driver adapter is set up initially. Here is how this is done for the `pg` driver and the `@prisma/adapter-pg` adapter: + +```ts highlight=5,normal +import { PrismaClient } from '@prisma/client' +import { PrismaPg } from '@prisma/adapter-pg' +import { Pool } from 'pg' + +const pool = new Pool({ connectionString: env.DATABASE_URL }) +const adapter = new PrismaPg(pool) +const prisma = new PrismaClient({ adapter }) +``` + +See the docs for the driver adapter you're using for concrete setup instructions. + ### Driver adapters and custom output paths Since Prisma 5.9.0, when using the driver adapters Preview feature along with a [custom output path for Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path), you cannot reference Prisma Client using a relative path. @@ -95,31 +118,31 @@ const client = new PrismaClient() Instead, you will need to use a linked dependency. -, , ]}> + - + ```terminal npm add db@./src/generated/client ``` - + - + ```terminal pnpm add db@link:./src/generated/client ``` - + - + ```terminal yarn add db@link:./src/generated/client ``` - + diff --git a/content/200-orm/050-overview/500-databases/300-postgresql.mdx b/content/200-orm/050-overview/500-databases/300-postgresql.mdx index 933c61054d..d3e281aaf4 100644 --- a/content/200-orm/050-overview/500-databases/300-postgresql.mdx +++ b/content/200-orm/050-overview/500-databases/300-postgresql.mdx @@ -1,13 +1,13 @@ --- title: 'PostgreSQL' metaTitle: 'PostgreSQL database connector' -metaDescription: 'This page explains how Prisma can connect to a PostgreSQL database using the PostgreSQL database connector.' +description: 'This page explains how Prisma can connect to a PostgreSQL database using the PostgreSQL database connector.' tocDepth: 3 --- -The PostgreSQL data source connector connects Prisma to a [PostgreSQL](https://www.postgresql.org/) database server. +The PostgreSQL data source connector connects Prisma ORM to a [PostgreSQL](https://www.postgresql.org/) database server. By default, the PostgreSQL connector contains a database driver responsible for connecting to your database. You can use a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) (Preview) to connect to your database using a JavaScript database driver from Prisma Client. @@ -17,7 +17,7 @@ By default, the PostgreSQL connector contains a database driver responsible for To connect to a PostgreSQL database server, you need to configure a [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [Prisma schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -29,7 +29,7 @@ The fields passed to the `datasource` block are: - `provider`: Specifies the `postgresql` data source connector. - `url`: Specifies the [connection URL](#connection-url) for the PostgreSQL database server. In this case, an [environment variable is used](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) to provide the connection URL. -## Using the node-postgres driver +## Using the `node-postgres` driver As of [`v5.4.0`](https://github.com/prisma/prisma/releases/tag/5.4.0), you can use Prisma ORM with database drivers from the JavaScript ecosystem (instead of using Prisma ORM's built-in drivers). You can do this by using a [driver adapter](/orm/overview/databases/database-drivers). @@ -37,7 +37,7 @@ For PostgreSQL, [`node-postgres`](https://node-postgres.com) (`pg`) is one of th This section explains how you can use it with Prisma ORM and the `@prisma/adapter-pg` driver adapter. -### 1. Enable the driverAdapters Preview feature flag +### 1. Enable the `driverAdapters` Preview feature flag Since driver adapters are currently in [Preview](/orm/more/releases#preview), you need to enable its feature flag on the `datasource` block in your Prisma schema: @@ -91,9 +91,9 @@ Notice that this code requires the `DATABASE_URL` environment variable to be set ### Connection URL -Prisma is based on the [official PostgreSQL format](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING) for connection URLs, but does not support all arguments and includes additional arguments such as `schema`. Here's an overview of the components needed for a PostgreSQL connection URL: +Prisma ORM follows the connection URL format specified by [PostgreSQL's official guidelines](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING), but does not support all arguments and includes additional arguments such as `schema`. Here's an overview of the components needed for a PostgreSQL connection URL: -![Structure of the PostgreSQL connection URL](postgresql-connection-string.png) +![Structure of the PostgreSQL connection URL](./postgresql-connection-string.png) #### Base URL and path @@ -189,15 +189,15 @@ Note that `localhost` is required, the value itself is ignored and can be anythi ## Type mapping between PostgreSQL and Prisma schema -These two tables show the type mapping between PostgreSQL and Prisma schema. First [how Prisma scalar types are translated into PostgreSQL database column types](#mapping-between-prisma-scalar-types-and-postgresql-database-column-types), and then [how PostgreSQL database column types relate to Prisma scalar and native types](#mapping-between-postgresql-database-column-types-to-prisma-scalar-and-native-types). +These two tables show the type mapping between PostgreSQL and Prisma schema. First [how Prisma ORM scalar types are translated into PostgreSQL database column types](#mapping-between-prisma-orm-scalar-types-and-postgresql-database-column-types), and then [how PostgreSQL database column types relate to Prisma ORM scalar and native types](#mapping-between-postgresql-database-column-types-to-prisma-orm-scalar-and-native-types). > Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma type. -### Mapping between Prisma scalar types and PostgreSQL database column types +### Mapping between Prisma ORM scalar types and PostgreSQL database column types -The PostgreSQL connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma [data model](/orm/prisma-schema/data-model/models) as follows to database column types: +The PostgreSQL connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma ORM [data model](/orm/prisma-schema/data-model/models) as follows to database column types: -| Prisma | PostgreSQL | +| Prisma ORM | PostgreSQL | | ---------- | ------------------ | | `String` | `text` | | `Boolean` | `boolean` | @@ -209,12 +209,12 @@ The PostgreSQL connector maps the [scalar types](/orm/prisma-schema/data-model/m | `Json` | `jsonb` | | `Bytes` | `bytea` | -### Mapping between PostgreSQL database column types to Prisma scalar and native types +### Mapping between PostgreSQL database column types to Prisma ORM scalar and native types -- When [introspecting](/orm/prisma-schema/introspection) a PostgreSQL database, the database types are mapped to Prisma types according to the following table. +- When [introspecting](/orm/prisma-schema/introspection) a PostgreSQL database, the database types are mapped to Prisma ORM types according to the following table. - When [creating a migration](/orm/prisma-migrate) or [prototyping your schema](/orm/prisma-migrate/workflows/prototyping-your-schema) the table is also used - in the other direction. -| PostgreSQL (Type \| Aliases) | Supported | Prisma | Native database type attribute | Notes | +| PostgreSQL (Type \| Aliases) | Supported | Prisma ORM | Native database type attribute | Notes | | ------------------------------------------- | :-------: | ------------- | :--------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `bigint` \| `int8` | ✔️ | `BigInt` | `@db.BigInt`\* | \*Default mapping for `BigInt` - no type attribute added to schema. | | `boolean` \| `bool` | ✔️ | `Bool` | `@db.Boolean`\* | \*Default mapping for `Bool` - no type attribute added to schema. | @@ -270,7 +270,7 @@ The PostgreSQL connector maps the [scalar types](/orm/prisma-schema/data-model/m [Introspection](/orm/prisma-schema/introspection) adds native database types that are **not yet supported** as [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) fields: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Device { id Int @id @default(autoincrement()) name String @@ -297,6 +297,6 @@ The two queries after parameterization will be the same, and the second query ca SELECT * FROM user WHERE name = $1 ``` -Every database connection maintained by Prisma has a separate cache for storing prepared statements. The size of this cache can be tweaked with the `statement_cache_size` parameter in the connection string. By default, Prisma Client caches 500 statements per connection. +Every database connection maintained by Prisma Client has a separate cache for storing prepared statements. The size of this cache can be tweaked with the `statement_cache_size` parameter in the connection string. By default, Prisma Client caches 500 statements per connection. Due to the nature of pgBouncer, if the `pgbouncer` parameter is set to `true`, the prepared statement cache is automatically disabled for that connection. diff --git a/content/200-orm/050-overview/500-databases/400-mysql.mdx b/content/200-orm/050-overview/500-databases/400-mysql.mdx index cabbaee1e0..796ce66770 100644 --- a/content/200-orm/050-overview/500-databases/400-mysql.mdx +++ b/content/200-orm/050-overview/500-databases/400-mysql.mdx @@ -1,13 +1,13 @@ --- -title: 'MySQL' +title: 'MySQL/MariaDB' metaTitle: 'MySQL database connector' -metaDescription: 'This page explains how Prisma can connect to a MySQL database using the MySQL database connector.' +description: 'This page explains how Prisma can connect to a MySQL or MariaDB database using the MySQL database connector.' tocDepth: 3 --- -The MySQL data source connector connects Prisma to a [MySQL](https://www.mysql.com/) database server. +The MySQL data source connector connects Prisma ORM to a [MySQL](https://www.mysql.com/) or [MariaDB](https://mariadb.org/) database server. By default, the MySQL connector contains a database driver responsible for connecting to your database. You can use a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) (Preview) to connect to your database using a JavaScript database driver from Prisma Client. @@ -17,7 +17,7 @@ By default, the MySQL connector contains a database driver responsible for conne To connect to a MySQL database server, you need to configure a [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [Prisma schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mysql" url = env("DATABASE_URL") @@ -35,7 +35,7 @@ The fields passed to the `datasource` block are: Here's an overview of the components needed for a MySQL connection URL: -![Structure of the MySQL connection URL](mysql-connection-string.png) +![Structure of the MySQL connection URL](./mysql-connection-string.png) #### Base URL and path @@ -50,7 +50,7 @@ The following components make up the _base URL_ of your database, they are alway | Name | Placeholder | Description | | :------- | :---------- | :------------------------------------------------------------------------------------------------------------------ | | Host | `HOST` | IP address/domain of your database server, e.g. `localhost` | -| Port | `PORT` | Port on which your database server is running, e.g. `5432` | +| Port | `PORT` | Port on which your database server is running, e.g. `5432` (default is `3306`, or no port when using Unix socket) | | User | `USER` | Name of your database user, e.g. `janedoe` | | Password | `PASSWORD` | Password for your database user | | Database | `DATABASE` | Name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) you want to use, e.g. `mydb` | @@ -112,8 +112,8 @@ mysql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpass ### Connecting via sockets -To connect to your MySQL database via sockets, you must add a `socket` field as a _query parameter_ to the connection URL (instead of setting it as the `host` part of the URI). -The value of this parameter then must point to the directory that contains the socket, e.g.: `mysql://USER:POST@localhost/database?socket=/var/run/mysql/` +To connect to your MySQL/MariaDB database via a socket, you must add a `socket` field as a _query parameter_ to the connection URL (instead of setting it as the `host` part of the URI). +The value of this parameter then must point to the directory that contains the socket, e.g. on a default installation of MySQL/MariaDB on Ubuntu or Debian use: `mysql://USER:POST@localhost/database?socket=/run/mysqld/mysqld.sock` Note that `localhost` is required, the value itself is ignored and can be anything. @@ -121,13 +121,13 @@ Note that `localhost` is required, the value itself is ignored and can be anythi ## Type mapping between MySQL to Prisma schema -The MySQL connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma [data model](/orm/prisma-schema/data-model/models) as follows to native column types: +The MySQL connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma ORM [data model](/orm/prisma-schema/data-model/models) as follows to native column types: -> Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma type. +> Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma ORM type. -### Native type mapping from Prisma to MySQL +### Native type mapping from Prisma ORM to MySQL -| Prisma | MySQL | Notes | +| Prisma ORM | MySQL | Notes | | ---------- | ---------------- | ------------------------------------------------ | | `String` | `VARCHAR(191)` | | | `Boolean` | `BOOLEAN` | In MySQL `BOOLEAN` is a synonym for `TINYINT(1)` | @@ -139,11 +139,25 @@ The MySQL connector maps the [scalar types](/orm/prisma-schema/data-model/models | `Json` | `JSON` | Supported in MySQL 5.7+ only | | `Bytes` | `LONGBLOB` | +### Native type mapping from Prisma ORM to MariaDB + +| Prisma ORM | MariaDB | Notes | +| ---------- | ---------------- | -------------------------------------------------- | +| `String` | `VARCHAR(191)` | | +| `Boolean` | `BOOLEAN` | In MariaDB `BOOLEAN` is a synonym for `TINYINT(1)` | +| `Int` | `INT` | | +| `BigInt` | `BIGINT` | | +| `Float` | `DOUBLE` | | +| `Decimal` | `DECIMAL(65,30)` | | +| `DateTime` | `DATETIME(3)` | | +| `Json` | `LONGTEXT` | See https://mariadb.com/kb/en/json-data-type/ | +| `Bytes` | `LONGBLOB` | | + ### Native type mappings -When introspecting a MySQL database, the database types are mapped to Prisma according to the following table: +When introspecting a MySQL database, the database types are mapped to Prisma ORM according to the following table: -| MySQL | Prisma | Supported | Native database type attribute | Notes | +| MySQL | Prisma ORM | Supported | Native database type attribute | Notes | | ------------------------- | ------------- | --------- | ---------------------------------------------- | ------------------------------------------------------------------ | | `serial` | `BigInt` | ✔️ | `@db.UnsignedBigInt @default(autoincrement())` | | `bigint` | `BigInt` | ✔️ | `@db.BigInt` | @@ -193,7 +207,7 @@ When introspecting a MySQL database, the database types are mapped to Prisma acc [Introspection](/orm/prisma-schema/introspection) adds native database types that are **not yet supported** as [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) fields: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Device { id Int @id @default(autoincrement()) name String @@ -204,3 +218,18 @@ model Device { ## Engine If you are using a version of MySQL where MyISAM is the default engine, you must specify `ENGINE = InnoDB;` when you create a table. If you introspect a database that uses a different engine, relations in the Prisma Schema are not created (or lost, if the relation already existed). + +## Permissions + +A fresh new installation of MySQL/MariaDB has by default only a `root` database user. Do not use `root` user in your Prisma configuration, but instead create a database and database user for each application. On most Linux hosts (e.g. Ubuntu) you can simply run this as the Linux `root` user (which automatically has database `root` access as well): + +``` +mysql -e "CREATE DATABASE IF NOT EXISTS $DB_PRISMA;" +mysql -e "GRANT ALL PRIVILEGES ON $DB_PRISMA.* TO $DB_USER@'%' IDENTIFIED BY '$DB_PASSWORD';" +``` + +The above is enough to run the `prisma db pull` and `prisma db push` commands. In order to also run `prisma migrate` commands these permissions need to be granted: + +``` +mysql -e "GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO $DB_USER@'%';" +``` diff --git a/content/200-orm/050-overview/500-databases/500-sqlite.mdx b/content/200-orm/050-overview/500-databases/500-sqlite.mdx index fc31ca5d47..b22190eefc 100644 --- a/content/200-orm/050-overview/500-databases/500-sqlite.mdx +++ b/content/200-orm/050-overview/500-databases/500-sqlite.mdx @@ -1,13 +1,13 @@ --- title: 'SQLite' metaTitle: 'SQLite database connector' -metaDescription: 'This page explains how Prisma can connect to a SQLite database using the SQLite database connector.' +description: 'This page explains how Prisma can connect to a SQLite database using the SQLite database connector.' tocDepth: 3 --- -The SQLite data source connector connects Prisma to a [SQLite](https://www.sqlite.org/) database file. These files always have the file ending `.db` (e.g.: `dev.db`). +The SQLite data source connector connects Prisma ORM to a [SQLite](https://www.sqlite.org/) database file. These files always have the file ending `.db` (e.g.: `dev.db`). By default, the SQLite connector contains a database driver responsible for connecting to your database. You can use a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) (Preview) to connect to your database using a JavaScript database driver from Prisma Client. @@ -17,7 +17,7 @@ By default, the SQLite connector contains a database driver responsible for conn To connect to a SQLite database file, you need to configure a [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = "file:./dev.db" @@ -33,11 +33,11 @@ The fields passed to the `datasource` block are: The SQLite connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the [data model](/orm/prisma-schema/data-model/models) to native column types as follows: -> Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma type. +> Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma ORM type. -### Native type mapping from Prisma to SQLite +### Native type mapping from Prisma ORM to SQLite -| Prisma | SQLite | +| Prisma ORM | SQLite | | ---------- | ------------- | | `String` | `TEXT` | | `Boolean` | `BOOLEAN` | @@ -51,9 +51,9 @@ The SQLite connector maps the [scalar types](/orm/prisma-schema/data-model/model ## Rounding errors on big numbers -SQLite is a loosely-typed database. If your Schema has a field of type `Int`, then Prisma prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. +SQLite is a loosely-typed database. If your Schema has a field of type `Int`, then Prisma ORM prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. -To avoid this problem, Prisma 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma throws a P2023 error, such as: +To avoid this problem, Prisma ORM 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma ORM throws a P2023 error, such as: ``` Inconsistent column data: Conversion failed: @@ -67,7 +67,7 @@ try migrating the 'int' column type to BIGINT The connection URL of a SQLite connector points to a file on your file system. For example, the following two paths are equivalent because the `.db` is in the same directory: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = "file:./dev.db" @@ -76,7 +76,7 @@ datasource db { is the same as: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = "file:dev.db" @@ -85,7 +85,7 @@ datasource db { You can also target files from the root or any other place in your file system: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = "file:/Users/janedoe/dev.db" diff --git a/content/200-orm/050-overview/500-databases/600-mongodb.mdx b/content/200-orm/050-overview/500-databases/600-mongodb.mdx index 8f1f9fee79..92dc23b1e5 100644 --- a/content/200-orm/050-overview/500-databases/600-mongodb.mdx +++ b/content/200-orm/050-overview/500-databases/600-mongodb.mdx @@ -1,7 +1,7 @@ --- title: 'MongoDB' metaTitle: 'MongoDB database connector' -metaDescription: 'How Prisma can connect to a MongoDB database using the MongoDB database connector.' +description: 'How Prisma can connect to a MongoDB database using the MongoDB database connector.' hidePage: false tocDepth: 3 codeStyle: false @@ -9,11 +9,11 @@ codeStyle: false -This guide discusses the concepts behind using Prisma and MongoDB, explains the commonalities and differences between MongoDB and other database providers, and leads you through the process for configuring your application to integrate with MongoDB using Prisma. +This guide discusses the concepts behind using Prisma ORM and MongoDB, explains the commonalities and differences between MongoDB and other database providers, and leads you through the process for configuring your application to integrate with MongoDB using Prisma ORM. -To connect Prisma with MongoDB, refer to our [Getting Started documentation](/getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb). +To connect Prisma ORM with MongoDB, refer to our [Getting Started documentation](/getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb). @@ -23,11 +23,11 @@ To connect Prisma with MongoDB, refer to our [Getting Started documentation](/ge [MongoDB](https://www.mongodb.com/) is a NoSQL database that stores data in [BSON](https://bsonspec.org/) format, a JSON-like document format designed for storing data in key-value pairs. It is commonly used in JavaScript application development because the document model maps easily to objects in application code, and there is built in support for high availability and horizontal scaling. -MongoDB stores data in collections that do not need a schema to be defined in advance, as you would need to do with tables in a relational database. The structure of each collection can also be changed over time. This flexibility can allow rapid iteration of your data model, but it does mean that there are a number of differences when using Prisma to work with your MongoDB database. +MongoDB stores data in collections that do not need a schema to be defined in advance, as you would need to do with tables in a relational database. The structure of each collection can also be changed over time. This flexibility can allow rapid iteration of your data model, but it does mean that there are a number of differences when using Prisma ORM to work with your MongoDB database. ## Commonalities with other database providers -Some aspects of using Prisma with MongoDB are the same as when using Prisma with a relational database. You can still: +Some aspects of using Prisma ORM with MongoDB are the same as when using Prisma ORM with a relational database. You can still: - model your database with the [Prisma Schema Language](/orm/prisma-schema) - connect to your database, using the [`mongodb` database connector](/orm/overview/databases) @@ -37,19 +37,19 @@ Some aspects of using Prisma with MongoDB are the same as when using Prisma with ## Differences to consider -MongoDB's document-based structure and flexible schemas means that using Prisma with MongoDB differs from using it with a relational database in a number of ways. These are some areas where there are differences that you need to be aware of: +MongoDB's document-based structure and flexible schemas means that using Prisma ORM with MongoDB differs from using it with a relational database in a number of ways. These are some areas where there are differences that you need to be aware of: -- **Defining IDs**: MongoDB documents have an `_id` field (that often contains an [ObjectID](https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid)). Prisma does not support fields starting with `_`, so this needs to be mapped to a Prisma field using the `@map` attribute. For more information, see [Defining IDs in MongoDB](/orm/prisma-schema/data-model/models#defining-ids-in-mongodb). +- **Defining IDs**: MongoDB documents have an `_id` field (that often contains an [ObjectID](https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid)). Prisma ORM does not support fields starting with `_`, so this needs to be mapped to a Prisma ORM field using the `@map` attribute. For more information, see [Defining IDs in MongoDB](/orm/prisma-schema/data-model/models#defining-ids-in-mongodb). - **Migrating existing data to match your Prisma schema**: In relational databases, all your data must match your schema. If you change the type of a particular field in your schema when you migrate, all the data must also be updated to match. In contrast, MongoDB does not enforce any particular schema, so you need to take care when migrating. For more information, see [How to migrate old data to new schemas](#how-to-migrate-existing-data-to-match-your-prisma-schema). -- **Introspection and Prisma relations**: When you introspect an existing MongoDB database, you will get a schema with no relations and will need to add the missing relations in manually. For more information, see [How to add in missing relations after Introspection](#how-to-add-in-missing-relations-after-introspection). +- **Introspection and Prisma ORM relations**: When you introspect an existing MongoDB database, you will get a schema with no relations and will need to add the missing relations in manually. For more information, see [How to add in missing relations after Introspection](#how-to-add-in-missing-relations-after-introspection). -- **Filtering for `null` and missing fields**: MongoDB makes a distinction between setting a field to `null` and not setting it at all, which is not present in relational databases. Prisma currently does not express this distinction, which means that you need to be careful when filtering for `null` and missing fields. For more information, see [How to filter for `null` and missing fields](#how-to-filter-for-null-and-missing-fields) +- **Filtering for `null` and missing fields**: MongoDB makes a distinction between setting a field to `null` and not setting it at all, which is not present in relational databases. Prisma ORM currently does not express this distinction, which means that you need to be careful when filtering for `null` and missing fields. For more information, see [How to filter for `null` and missing fields](#how-to-filter-for-null-and-missing-fields) -- **Enabling replication**: Prisma uses [MongoDB transactions](https://www.mongodb.com/docs/manual/core/transactions/) internally to avoid partial writes on nested queries. When using transactions, MongoDB requires replication of your data set to be enabled. To do this, you will need to configure a [replica set](https://www.mongodb.com/docs/manual/replication/) — this is a group of MongoDB processes that maintain the same data set. Note that it is still possible to use a single database, by creating a replica set with only one node in it. If you use MongoDB's [Atlas](https://www.mongodb.com/atlas/database) hosting service, the replica set is configured for you, but if you are running MongoDB locally you will need to set up a replica set yourself. For more information, see MongoDB's [guide to deploying a replica set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/). +- **Enabling replication**: Prisma ORM uses [MongoDB transactions](https://www.mongodb.com/docs/manual/core/transactions/) internally to avoid partial writes on nested queries. When using transactions, MongoDB requires replication of your data set to be enabled. To do this, you will need to configure a [replica set](https://www.mongodb.com/docs/manual/replication/) — this is a group of MongoDB processes that maintain the same data set. Note that it is still possible to use a single database, by creating a replica set with only one node in it. If you use MongoDB's [Atlas](https://www.mongodb.com/atlas/database) hosting service, the replica set is configured for you, but if you are running MongoDB locally you will need to set up a replica set yourself. For more information, see MongoDB's [guide to deploying a replica set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/). -## How to use Prisma with MongoDB +## How to use Prisma ORM with MongoDB This section provides instructions for how to carry out tasks that require steps specific to MongoDB. @@ -67,7 +67,7 @@ These iterative tasks of updating the schema and the database can result in inco **Scenario**: you need to include a phone number for users, as well as an email. You currently have the following `User` model in your `schema.prisma` file: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String @@ -80,10 +80,11 @@ There are a number of strategies you could use for migrating this schema: In our scenario above, you can add an optional `phoneNumber` field to the `User` model in your Prisma schema: - ```prisma file=prisma/schema.prisma highlight=4;add + ```prisma file=prisma/schema.prisma highlight=4;add showLineNumbers model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String + //add-next-line phoneNumber String? } ``` @@ -94,23 +95,24 @@ There are a number of strategies you could use for migrating this schema: Another option is to add a default value on a required field, for example: - ```prisma file=prisma/schema.prisma highlight=4;add + ```prisma file=prisma/schema.prisma highlight=4;add showLineNumbers model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String + //add-next-line phoneNumber String @default("000-000-0000") } ``` Then when you encounter a missing `phoneNumber`, the value will be coerced into `000-000-0000`. -- **"No breaking changes" updates**: this strategy builds on the first one, with further consensus amongst your team that you don't rename or delete fields, only add new fields, and always define the new fields as optional. This policy can be reenforced by adding checks in the CI/CD process to verify that there are no backwards-incompatible changes to the schema. +- **"No breaking changes" updates**: this strategy builds on the first one, with further consensus amongst your team that you don't rename or delete fields, only add new fields, and always define the new fields as optional. This policy can be reinforced by adding checks in the CI/CD process to verify that there are no backwards-incompatible changes to the schema. - **"All-at-once" updates**: this strategy is similar to traditional migrations in relational databases, where all data is updated to reflect the new schema. In the scenario above, you would create a script to add a value for the phone number field to all existing users in your database. You can then make the field a required field in the application because the schema and the data are consistent. ### How to add in missing relations after Introspection -After introspecting an existing MongoDB database, you will need to manually add in relations between models. MongoDB does not have the concept of defining relations via foreign keys, as you would in a relational database. However, if you have a collection in MongoDB with a "foreign-key-like" field that matches the ID field of another collection, Prisma will allow you to emulate relations between the collections. +After introspecting an existing MongoDB database, you will need to manually add in relations between models. MongoDB does not have the concept of defining relations via foreign keys, as you would in a relational database. However, if you have a collection in MongoDB with a "foreign-key-like" field that matches the ID field of another collection, Prisma ORM will allow you to emulate relations between the collections. As an example, take a MongoDB database with two collections, `User` and `Post`. The data in these collections has the following format, with a `userId` field linking users to posts: @@ -127,7 +129,7 @@ As an example, take a MongoDB database with two collections, `User` and `Post`. On introspection with `db pull`, this is pulled in to the Prisma schema file as follows: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model Post { id String @id @default(auto()) @map("_id") @db.ObjectId title String @@ -142,24 +144,26 @@ model User { This is missing the relation between the `User` and `Post` models. To fix this, manually add a `user` field to the `Post` model with a `@relation` attribute using `userId` as the `fields` value, linking it to the `User` model, and a `posts` field to the `User` model as the back relation: -```prisma file=prisma/schema.prisma highlight=5;add|11;add +```prisma file=prisma/schema.prisma highlight=5;add|11;add showLineNumbers model Post { id String @id @default(auto()) @map("_id") @db.ObjectId title String userId String @db.ObjectId + //add-next-line user User @relation(fields: [userId], references: [id]) } model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String + //add-next-line posts Post[] } ``` -For more information on how to use relations in Prisma, see [our documentation](/orm/prisma-schema/data-model/relations). +For more information on how to use relations in Prisma ORM, see [our documentation](/orm/prisma-schema/data-model/relations). -### How to filter for null and missing fields +### How to filter for `null` and missing fields To understand how MongoDB distinguishes between `null` and missing fields, consider the example of a `User` model with an optional `name` field: @@ -171,7 +175,7 @@ model User { } ``` -First, try creating a record with the `name` field explicitly set to `null`. Prisma will return `name: null` as expected: +First, try creating a record with the `name` field explicitly set to `null`. Prisma ORM will return `name: null` as expected: @@ -244,7 +248,7 @@ console.log(createMissing) -Prisma still returns `name: null`, but if you look in the database directly you will see that the record has no `name` field defined at all: +Prisma ORM still returns `name: null`, but if you look in the database directly you will see that the record has no `name` field defined at all: ```json { @@ -253,7 +257,7 @@ Prisma still returns `name: null`, but if you look in the database directly you } ``` -Prisma returns the same result in both cases, because we currently don't have a way to specify this difference in MongoDB between fields that are `null` in the underlying database, and fields that are not defined at all — see [this Github issue](https://github.com/prisma/prisma/issues/12555) for more information. +Prisma ORM returns the same result in both cases, because we currently don't have a way to specify this difference in MongoDB between fields that are `null` in the underlying database, and fields that are not defined at all — see [this Github issue](https://github.com/prisma/prisma/issues/12555) for more information. This means that you currently have to be careful when filtering for `null` and missing fields. Filtering for records with `name: null` will only return the first record, with the `name` explicitly set to `null`: @@ -337,9 +341,9 @@ console.log(findNullOrMissing) -## More on using MongoDB with Prisma +## More on using MongoDB with Prisma ORM -The fastest way to start using MongoDB with Prisma is to refer to our Getting Started documentation: +The fastest way to start using MongoDB with Prisma ORM is to refer to our Getting Started documentation: - [Start from scratch](/getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb) - [Add to existing project](/getting-started/setup-prisma/add-to-existing-project/mongodb-typescript-mongodb) @@ -354,7 +358,7 @@ For more information on how to set up and manage a MongoDB database, see the [Pr To connect to a MongoDB server, configure the [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [Prisma schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -416,9 +420,9 @@ A connection URL can also take arguments. The following example sets three argum mongodb://USERNAME:PASSWORD@HOST/DATABASE?ssl=true&connectTimeoutMS=5000&maxPoolSize=50 ``` -Refer to the [MongoDB connection string documentation](https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options) for a complete list of connection string arguments. There are no Prisma-specific arguments. +Refer to the [MongoDB connection string documentation](https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options) for a complete list of connection string arguments. There are no Prisma ORM-specific arguments. -## Using ObjectId +## Using `ObjectId` It is common practice for the `_id` field of a MongoDB document to contain an [ObjectId](https://docs.mongodb.com/manual/reference/bson-types/#std-label-objectid): @@ -474,19 +478,17 @@ const id = new ObjectId() ## Differences to connectors for relational databases -This section covers ways in which the MongoDB connector differs from Prisma connectors for relational databases. +This section covers ways in which the MongoDB connector differs from Prisma ORM connectors for relational databases. ### No support for Prisma Migrate Currently, there are no plans to add support for [Prisma Migrate](/orm/prisma-migrate) as MongoDB projects do not rely on internal schemas where changes need to be managed with an extra tool. Management of `@unique` indexes is realized through `db push`. -### No support for @@id and autoincrement() +### No support for `@@id` and `autoincrement()` The [`@@id`](/orm/reference/prisma-schema-reference#id-1) attribute (an ID for multiple fields) is not supported because primary keys in MongoDB are always on the `_id` field of a model. -The [`autoincrement()`](/orm/reference/prisma-schema-reference#generate-autoincrementing-integers-as-ids) function (which creates incrementing `@id` values) is not supported because `autoincrement()` does not work with the `ObjectID` type that the `_id` field has in MongoDB. - - +The [`autoincrement()`](/orm/reference/prisma-schema-reference#generate-autoincrementing-integers-as-ids-relational-databases-only) function (which creates incrementing `@id` values) is not supported because `autoincrement()` does not work with the `ObjectID` type that the `_id` field has in MongoDB. ### Cyclic references and referential actions @@ -496,9 +498,9 @@ See [Special rules for referential actions](/orm/prisma-schema/data-model/relati ### Replica set configuration -MongoDB only allows you to start a transaction on a replica set. Prisma uses transactions internally to avoid partial writes on nested queries. This means we inherit the requirement of needing a replica set configured. +MongoDB only allows you to start a transaction on a replica set. Prisma ORM uses transactions internally to avoid partial writes on nested queries. This means we inherit the requirement of needing a replica set configured. -When you try to use Prisma's MongoDB connector on a deployment that has no replica set configured, Prisma shows the message `Error: Transactions are not supported by this deployment`. The full text of the error message is the following: +When you try to use Prisma ORM's MongoDB connector on a deployment that has no replica set configured, Prisma ORM shows the message `Error: Transactions are not supported by this deployment`. The full text of the error message is the following: ``` PrismaClientUnknownRequestError2 [PrismaClientUnknownRequestError]: @@ -524,13 +526,13 @@ There's also an option to run the replica set locally with this guide: https://d ## Type mapping between MongoDB and the Prisma schema -The MongoDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma [data model](/orm/prisma-schema/data-model/models) to MongoDB's native column types as follows: +The MongoDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma ORM [data model](/orm/prisma-schema/data-model/models) to MongoDB's native column types as follows: > Alternatively, see [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma type. -### Native type mapping from Prisma to MongoDB +### Native type mapping from Prisma ORM to MongoDB -| Prisma | MongoDB | +| Prisma ORM | MongoDB | | ---------- | ---------------------------------------------------------------------- | | `String` | `string` | | `Boolean` | `bool` | @@ -556,17 +558,17 @@ MongoDB types that are currently unsupported: - `JavascriptWithScope` - `Regex` -### Mapping from MongoDB to Prisma types on Introspection +### Mapping from MongoDB to Prisma ORM types on Introspection -When introspecting a MongoDB database, Prisma uses the relevant [scalar types](/orm/prisma-schema/data-model/models#scalar-fields). Some special types also get additional native type annotations: +When introspecting a MongoDB database, Prisma ORM uses the relevant [scalar types](/orm/prisma-schema/data-model/models#scalar-fields). Some special types also get additional native type annotations: -| MongoDB (Type \| Aliases) | Prisma | Supported | Native database type attribute | Notes | -| ------------------------- | -------- | :-------: | :----------------------------- | :---- | -| `objectId` | `String` | ✔️ | `@db.ObjectId` | | +| MongoDB (Type \| Aliases) | Prisma ORM | Supported | Native database type attribute | Notes | +| ------------------------- | ---------- | :-------: | :----------------------------- | :---- | +| `objectId` | `String` | ✔️ | `@db.ObjectId` | | [Introspection](/orm/prisma-schema/introspection) adds native database types that are **not yet supported** as [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) fields: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id String @id @default(auto()) @map("_id") @db.ObjectId name String diff --git a/content/200-orm/050-overview/500-databases/800-sql-server/020-sql-server-local.mdx b/content/200-orm/050-overview/500-databases/800-sql-server/020-sql-server-local.mdx index fd7c5ebe4c..1c4fa8a4e3 100644 --- a/content/200-orm/050-overview/500-databases/800-sql-server/020-sql-server-local.mdx +++ b/content/200-orm/050-overview/500-databases/800-sql-server/020-sql-server-local.mdx @@ -1,7 +1,7 @@ --- title: 'SQL Server on Windows (local)' metaTitle: 'SQL Server on Windows' -metaDescription: 'Set up and configure SQL Server on Windows.' +description: 'Set up and configure SQL Server on Windows.' --- @@ -14,7 +14,7 @@ To run a Microsoft SQL Server locally on a Windows machine: 1. Use Windows Authentication to log in to Microsoft SQL Server Management Studio (expand the **Server Name** dropdown and click **<Browse for more...>** to find your database engine): -![The New Query button in SQL Server Management Studio](../../../../doc-images/connect-sql-server.png) +![The New Query button in SQL Server Management Studio](/img/orm/connect-sql-server.png) diff --git a/content/200-orm/050-overview/500-databases/800-sql-server/030-sql-server-docker.mdx b/content/200-orm/050-overview/500-databases/800-sql-server/030-sql-server-docker.mdx index a4179f25f2..776c056a7b 100644 --- a/content/200-orm/050-overview/500-databases/800-sql-server/030-sql-server-docker.mdx +++ b/content/200-orm/050-overview/500-databases/800-sql-server/030-sql-server-docker.mdx @@ -1,7 +1,7 @@ --- title: 'SQL Server on Docker' metaTitle: 'SQL Server on Docker' -metaDescription: 'Download and use the Microsoft SQL Server Docker image.' +description: 'Download and use the Microsoft SQL Server Docker image.' --- diff --git a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx index 79dcac9272..241172b161 100644 --- a/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx +++ b/content/200-orm/050-overview/500-databases/800-sql-server/index.mdx @@ -1,13 +1,14 @@ --- title: 'Microsoft SQL Server' metaTitle: 'Microsoft SQL Server' -metaDescription: 'This page explains how Prisma can connect to a Microsoft SQL Server database using the Microsoft SQL Server database connector.' +description: 'This page explains how Prisma can connect to a Microsoft SQL Server database using the Microsoft SQL Server database connector.' tocDepth: 4 +toc_max_heading_level: 4 --- -The Microsoft SQL Server data source connector connects Prisma to a [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver15) database server. +The Microsoft SQL Server data source connector connects Prisma ORM to a [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver15) database server. @@ -15,7 +16,7 @@ The Microsoft SQL Server data source connector connects Prisma to a [Microsoft S To connect to a Microsoft SQL Server database, you need to configure a [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [Prisma schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlserver" url = env("DATABASE_URL") @@ -97,7 +98,7 @@ sqlserver://mycomputer\sql2019;database=sample;integratedSecurity=true;trustServ ## Type mapping between Microsoft SQL Server to Prisma schema -For type mappings organized by Prisma type, refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) documentation. +For type mappings organized by Prisma ORM type, refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) documentation. ## Supported versions @@ -115,7 +116,7 @@ SQL Server does not have an equivalent to the PostgreSQL `SET search_path` comma #### Cyclic references -Circular references can occur between models when each model references another, creating a closed loop. When using a Microsoft SQL Server database, Prisma will show a validation error if the [referential action](/orm/prisma-schema/data-model/relations/referential-actions) on a relation is set to something other than [`NoAction`](/orm/prisma-schema/data-model/relations/referential-actions#noaction). +Circular references can occur between models when each model references another, creating a closed loop. When using a Microsoft SQL Server database, Prisma ORM will show a validation error if the [referential action](/orm/prisma-schema/data-model/relations/referential-actions) on a relation is set to something other than [`NoAction`](/orm/prisma-schema/data-model/relations/referential-actions#noaction). See [Special rules for referential actions in SQL Server](/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions) for more information. @@ -141,9 +142,9 @@ CREATE TABLE cats ( sp_bindefault 'catcat', 'dbo.cats.name'; ``` -Using the stored procedure `sp_bindefault`, the default value `catcat` can be used in more than one table. The way Prisma manages default values is per table: +Using the stored procedure `sp_bindefault`, the default value `catcat` can be used in more than one table. The way Prisma ORM manages default values is per table: -```sql file=default_per_table.sql +```sql file=default_per_table.sql showLineNumbers CREATE TABLE cats ( id INT IDENTITY PRIMARY KEY, name NVARCHAR(1000) CONSTRAINT DF_cat_name DEFAULT 'musti' @@ -152,7 +153,7 @@ CREATE TABLE cats ( The last example, when introspected, leads to the following model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model cats { id Int @id @default(autoincrement()) name String? @default("musti") @@ -161,7 +162,7 @@ model cats { And the first doesn't get the default value introspected: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model cats { id Int @id @default(autoincrement()) name String? diff --git a/content/200-orm/050-overview/500-databases/860-cockroachdb.mdx b/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx similarity index 68% rename from content/200-orm/050-overview/500-databases/860-cockroachdb.mdx rename to content/200-orm/050-overview/500-databases/840-cockroachdb.mdx index eda18fc474..52df32d4d4 100644 --- a/content/200-orm/050-overview/500-databases/860-cockroachdb.mdx +++ b/content/200-orm/050-overview/500-databases/840-cockroachdb.mdx @@ -1,14 +1,14 @@ --- title: 'CockroachDB' metaTitle: 'CockroachDB' -metaDescription: 'Guide to CockroachDB' +description: 'Guide to CockroachDB' tocDepth: 3 toc: true --- -This guide discusses the concepts behind using Prisma and CockroachDB, explains the commonalities and differences between CockroachDB and other database providers, and leads you through the process for configuring your application to integrate with CockroachDB. +This guide discusses the concepts behind using Prisma ORM and CockroachDB, explains the commonalities and differences between CockroachDB and other database providers, and leads you through the process for configuring your application to integrate with CockroachDB. @@ -22,35 +22,34 @@ The CockroachDB connector is generally available in versions `3.14.0` and later. CockroachDB is a distributed database that is designed for scalability and high availability. Features include: -- **Built-in scaling:** CockroachDB comes with automated replication, failover and repair capabilities to allow easy horizontal scaling of your application -- **Consistent transactions:** CockroachDB is a relational database that supports consistent transactions that maintain data integrity - **Compatibility with PostgreSQL:** CockroachDB is compatible with PostgreSQL, allowing interoperability with a large ecosystem of existing products +- **Built-in scaling:** CockroachDB comes with automated replication, failover and repair capabilities to allow easy horizontal scaling of your application ## Commonalities with other database providers -CockroachDB is largely compatible with PostgreSQL, and can mostly be used with Prisma in the same way. You can still: +CockroachDB is largely compatible with PostgreSQL, and can mostly be used with Prisma ORM in the same way. You can still: - model your database with the [Prisma Schema Language](/orm/prisma-schema) -- connect to your database, using Prisma's [`cockroachdb` database connector](/orm/overview/databases/cockroachdb) +- connect to your database, using Prisma ORM's [`cockroachdb` database connector](/orm/overview/databases/cockroachdb) - use [Introspection](/orm/prisma-schema/introspection) for existing projects if you already have a CockroachDB database - use [Prisma Migrate](/orm/prisma-migrate) to migrate your database schema to a new version - use [Prisma Client](/orm/prisma-client) in your application to query your database in a type safe way based on your Prisma Schema ## Differences to consider -There are some CockroachDB-specific differences to be aware of when working with Prisma's `cockroachdb` connector: +There are some CockroachDB-specific differences to be aware of when working with Prisma ORM's `cockroachdb` connector: -- **Cockroach-specific native types:** Prisma's `cockroachdb` database connector provides support for CockroachDB's native data types. To learn more, see [How to use CockroachDB's native types](#how-to-use-cockroachdbs-native-types). +- **Cockroach-specific native types:** Prisma ORM's `cockroachdb` database connector provides support for CockroachDB's native data types. To learn more, see [How to use CockroachDB's native types](#how-to-use-cockroachdbs-native-types). -- **Creating database keys:** Prisma allows you to generate a unique identifier for each record using the [`autoincrement()`](/orm/reference/prisma-schema-reference#autoincrement) function. For more information, see [How to use database keys with CockroachDB](#how-to-use-database-keys-with-cockroachdb). +- **Creating database keys:** Prisma ORM allows you to generate a unique identifier for each record using the [`autoincrement()`](/orm/reference/prisma-schema-reference#autoincrement) function. For more information, see [How to use database keys with CockroachDB](#how-to-use-database-keys-with-cockroachdb). -## How to use Prisma with CockroachDB +## How to use Prisma ORM with CockroachDB This section provides more details on how to use CockroachDB-specific features. ### How to use CockroachDB's native types -CockroachDB has its own set of native [data types](https://www.cockroachlabs.com/docs/stable/data-types.html) which are supported in Prisma. For example, CockroachDB uses the `STRING` data type instead of PostgreSQL's `VARCHAR`. +CockroachDB has its own set of native [data types](https://www.cockroachlabs.com/docs/stable/data-types.html) which are supported in Prisma ORM. For example, CockroachDB uses the `STRING` data type instead of PostgreSQL's `VARCHAR`. As a demonstration of this, say you create a `User` table in your CockroachDB database using the following SQL command: @@ -65,7 +64,7 @@ CREATE TABLE public."Post" ( After introspecting your database with `npx prisma db pull`, you will have a new `Post` model in your `schema.prisma` file: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id BigInt @id title String @db.String(200) @@ -80,16 +79,16 @@ For a full list of type mappings, see our [connector documentation](/orm/overvie When generating unique identifiers for records in a distributed database like CockroachDB, it is best to avoid using sequential IDs – for more information on this, see CockroachDB's [blog post on choosing index keys](https://cockroachlabs.com/blog/how-to-choose-db-index-keys). -Instead, Prisma provides the [`autoincrement()`](/orm/reference/prisma-schema-reference#autoincrement) attribute function, which uses CockroachDB's [`unique_rowid()` function](https://www.cockroachlabs.com/docs/stable/serial.html) for generating unique identifiers. For example, the following `User` model has an `id` primary key, generated using the `autoincrement()` function: +Instead, Prisma ORM provides the [`autoincrement()`](/orm/reference/prisma-schema-reference#autoincrement) attribute function, which uses CockroachDB's [`unique_rowid()` function](https://www.cockroachlabs.com/docs/stable/serial.html) for generating unique identifiers. For example, the following `User` model has an `id` primary key, generated using the `autoincrement()` function: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id BigInt @id @default(autoincrement()) name String } ``` -For compatibility with existing databases, you may sometimes still need to generate a fixed sequence of integer key values. In these cases, you can use Prisma's inbuilt [`sequence()`](/orm/reference/prisma-schema-reference#sequence) function for CockroachDB. For a list of available options for the `sequence()` function, see our [reference documentation](/orm/reference/prisma-schema-reference#sequence). +For compatibility with existing databases, you may sometimes still need to generate a fixed sequence of integer key values. In these cases, you can use Prisma ORM's inbuilt [`sequence()`](/orm/reference/prisma-schema-reference#sequence) function for CockroachDB. For a list of available options for the `sequence()` function, see our [reference documentation](/orm/reference/prisma-schema-reference#sequence). For more information on generating database keys, see CockroachDB's [Primary key best practices](https://www.cockroachlabs.com/docs/v21.2/schema-design-table#primary-key-best-practices) guide. @@ -97,7 +96,7 @@ For more information on generating database keys, see CockroachDB's [Primary key To connect to a CockroachDB database server, you need to configure a [`datasource`](/orm/prisma-schema/overview/data-sources) block in your [Prisma schema file](/orm/prisma-schema): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "cockroachdb" url = env("DATABASE_URL") @@ -125,43 +124,43 @@ The following table lists differences between CockroachDB and PostgreSQL: | Issue | Area | Notes | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| By default, the `INT` type is an alias for `INT8` in CockroachDB, whereas in PostgreSQL it is an alias for `INT4`. This means that Prisma will introspect an `INT` column in CockroachDB as `BigInt`, whereas in PostgreSQL Prisma will introspect it as `Int`. | Schema | For more information on the `INT` type, see the [CockroachDB documentation](https://www.cockroachlabs.com/docs/stable/int.html#considerations-for-64-bit-signed-integers) | +| By default, the `INT` type is an alias for `INT8` in CockroachDB, whereas in PostgreSQL it is an alias for `INT4`. This means that Prisma ORM will introspect an `INT` column in CockroachDB as `BigInt`, whereas in PostgreSQL Prisma ORM will introspect it as `Int`. | Schema | For more information on the `INT` type, see the [CockroachDB documentation](https://www.cockroachlabs.com/docs/stable/int.html#considerations-for-64-bit-signed-integers) | | When using `@default(autoincrement())` on a field, CockroachDB will automatically generate 64-bit integers for the row IDs. These integers will be increasing but not consecutive. This is in contrast to PostgreSQL, where generated row IDs are consecutive and start from 1. | Schema | For more information on generated values, see the [CockroachDB documentation](https://www.cockroachlabs.com/docs/stable/serial.html#generated-values-for-modes-rowid-and-virtual_sequence) | | The `@default(autoincrement())` attribute can only be used together with the `BigInt` field type. | Schema | For more information on generated values, see the [CockroachDB documentation](https://www.cockroachlabs.com/docs/stable/serial.html#generated-values-for-modes-rowid-and-virtual_sequence) | ## Type mapping limitations in CockroachDB -The CockroachDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma [data model](/orm/prisma-schema/data-model/models) to native column types. These native types are mostly the same as for PostgreSQL — see the [Native type mapping from Prisma to CockroachDB](#native-type-mapping-from-prisma-to-cockroachdb) for details. However, there are some limitations: +The CockroachDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma ORM [data model](/orm/prisma-schema/data-model/models) to native column types. These native types are mostly the same as for PostgreSQL — see the [Native type mapping from Prisma ORM to CockroachDB](#native-type-mapping-from-prisma-orm-to-cockroachdb) for details. However, there are some limitations: -| CockroachDB (Type \| Aliases) | Prisma | Supported | Native database type attribute | Notes | -| ----------------------------- | --------- | :-------: | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------- | -| `money` | `Decimal` | Not yet | `@db.Money` | Supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/41578) | -| `xml` | `String` | Not yet | `@db.Xml` | Supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/43355) | -| `jsonb` arrays | `Json[]` | Not yet | N/A | `Json[]` supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/23468) | +| CockroachDB (Type \| Aliases) | Prisma ORM | Supported | Native database type attribute | Notes | +| ----------------------------- | ---------- | :-------: | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------- | +| `money` | `Decimal` | Not yet | `@db.Money` | Supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/41578) | +| `xml` | `String` | Not yet | `@db.Xml` | Supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/43355) | +| `jsonb` arrays | `Json[]` | Not yet | N/A | `Json[]` supported in PostgreSQL but [not currently in CockroachDB](https://github.com/cockroachdb/cockroach/issues/23468) | ## Other limitations The following table lists any other current known limitations of CockroachDB compared to PostgreSQL: -| Issue | Area | Notes | -| ------------------------------------------------------------------------------------------------ | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Primary keys are named `primary` instead of `TABLE_pkey`, the Prisma default. | Introspection | This means that they are introspected as `@id(map: "primary")`. This will be [fixed in CockroachDB 22.1](https://github.com/cockroachdb/cockroach/pull/70604). | -| Foreign keys are named `fk_COLUMN_ref_TABLE` instead of `TABLE_COLUMN_fkey`, the Prisma default. | Introspection | This means that they are introspected as `@relation([...], map: "fk_COLUMN_ref_TABLE")`. This will be [fixed in CockroachDB 22.1](https://github.com/cockroachdb/cockroach/pull/70658) | -| Index types `Hash`, `Gist`, `SpGist` or `Brin` are not supported. | Schema | In PostgreSQL, Prisma allows [configuration of indexes](/orm/prisma-schema/data-model/indexes#configuring-the-access-type-of-indexes-with-type-postgresql) to use the different index access method. CockroachDB only currently supports `BTree` and `Gin`. | -| Pushing to `Enum` types not supported | Client | Pushing to `Enum` types (e.g. `data: { enum { push: "A" }, }`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/71388) | -| Searching on `String` fields without a full text index not supported | Client | Searching on `String` fields without a full text index (e.g. `where: { text: { search: "cat & dog", }, },`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/7821) | -| Integer division not supported | Client | Integer division (e.g. `data: { int: { divide: 10, }, }`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/41448) | -| Limited filtering on `Json` fields | Client | Currently CockroachDB [only supports](https://github.com/cockroachdb/cockroach/issues/49144) `equals` and `not` filtering on `Json` fields | +| Issue | Area | Notes | +| ---------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Primary keys are named `primary` instead of `TABLE_pkey`, the Prisma ORM default. | Introspection | This means that they are introspected as `@id(map: "primary")`. This will be [fixed in CockroachDB 22.1](https://github.com/cockroachdb/cockroach/pull/70604). | +| Foreign keys are named `fk_COLUMN_ref_TABLE` instead of `TABLE_COLUMN_fkey`, the Prisma ORM default. | Introspection | This means that they are introspected as `@relation([...], map: "fk_COLUMN_ref_TABLE")`. This will be [fixed in CockroachDB 22.1](https://github.com/cockroachdb/cockroach/pull/70658) | +| Index types `Hash`, `Gist`, `SpGist` or `Brin` are not supported. | Schema | In PostgreSQL, Prisma ORM allows [configuration of indexes](/orm/prisma-schema/data-model/indexes#configuring-the-access-type-of-indexes-with-type-postgresql) to use the different index access method. CockroachDB only currently supports `BTree` and `Gin`. | +| Pushing to `Enum` types not supported | Client | Pushing to `Enum` types (e.g. `data: { enum { push: "A" }, }`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/71388) | +| Searching on `String` fields without a full text index not supported | Client | Searching on `String` fields without a full text index (e.g. `where: { text: { search: "cat & dog", }, },`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/7821) | +| Integer division not supported | Client | Integer division (e.g. `data: { int: { divide: 10, }, }`) is currently [not supported in CockroachDB](https://github.com/cockroachdb/cockroach/issues/41448) | +| Limited filtering on `Json` fields | Client | Currently CockroachDB [only supports](https://github.com/cockroachdb/cockroach/issues/49144) `equals` and `not` filtering on `Json` fields | ## Type mapping between CockroachDB and the Prisma schema -The CockroachDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma [data model](/orm/prisma-schema/data-model/models) as follows to native column types: +The CockroachDB connector maps the [scalar types](/orm/prisma-schema/data-model/models#scalar-fields) from the Prisma ORM [data model](/orm/prisma-schema/data-model/models) as follows to native column types: -> Alternatively, see the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma type. +> Alternatively, see the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) for type mappings organized by Prisma ORM type. -### Native type mapping from Prisma to CockroachDB +### Native type mapping from Prisma ORM to CockroachDB -| Prisma | CockroachDB | +| Prisma ORM | CockroachDB | | ---------- | ---------------- | | `String` | `STRING` | | `Boolean` | `BOOL` | @@ -173,11 +172,11 @@ The CockroachDB connector maps the [scalar types](/orm/prisma-schema/data-model/ | `Json` | `JSONB` | | `Bytes` | `BYTES` | -### Mapping from CockroachDB to Prisma types on Introspection +### Mapping from CockroachDB to Prisma ORM types on Introspection -When introspecting a CockroachDB database, the database types are mapped to Prisma according to the following table: +When introspecting a CockroachDB database, the database types are mapped to Prisma ORM according to the following table: -| CockroachDB (Type \| Aliases) | Prisma | Supported | Native database type attribute | Notes | +| CockroachDB (Type \| Aliases) | Prisma ORM | Supported | Native database type attribute | Notes | | -------------------------------------------- | ---------- | :-------: | :----------------------------- | :--------------------------------------------------------------------- | | `INT` \| `BIGINT`, `INTEGER` | `BigInt` | ✔️ | `@db.Int8` | | | `BOOL` \| `BOOLEAN` | `Bool` | ✔️ | `@db.Bool`\* | | @@ -205,16 +204,16 @@ When introspecting a CockroachDB database, the database types are mapped to Pris [Introspection](/orm/prisma-schema/introspection) adds native database types that are **not yet supported** as [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) fields: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Device { id BigInt @id @default(autoincrement()) interval Unsupported("INTERVAL") } ``` -## More on using CockroachDB with Prisma +## More on using CockroachDB with Prisma ORM -The fastest way to start using CockroachDB with Prisma is to refer to our Getting Started documentation: +The fastest way to start using CockroachDB with Prisma ORM is to refer to our Getting Started documentation: - [Start from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-cockroachdb) - [Add to existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-cockroachdb) diff --git a/content/200-orm/050-overview/500-databases/850-planetscale.mdx b/content/200-orm/050-overview/500-databases/850-planetscale.mdx index 720823470a..6a040a17aa 100644 --- a/content/200-orm/050-overview/500-databases/850-planetscale.mdx +++ b/content/200-orm/050-overview/500-databases/850-planetscale.mdx @@ -1,7 +1,7 @@ --- title: 'PlanetScale' metaTitle: 'PlanetScale' -metaDescription: 'Guide to PlanetScale' +description: 'Guide to PlanetScale' tocDepth: 3 toc: true --- @@ -10,7 +10,7 @@ toc: true Prisma and [PlanetScale](https://planetscale.com/) together provide a development arena that optimizes rapid, type-safe development of data access applications, using Prisma's ORM and PlanetScale's highly scalable MySQL-based platform. -This document discusses the concepts behind using Prisma and PlanetScale, explains the commonalities and differences between PlanetScale and other database providers, and leads you through the process for configuring your application to integrate with PlanetScale. +This document discusses the concepts behind using Prisma ORM and PlanetScale, explains the commonalities and differences between PlanetScale and other database providers, and leads you through the process for configuring your application to integrate with PlanetScale. @@ -24,52 +24,54 @@ PlanetScale uses the [Vitess](https://vitess.io/) database clustering system to ## Commonalities with other database providers -Many aspects of using Prisma with PlanetScale are just like using Prisma with any other relational database. You can still: +Many aspects of using Prisma ORM with PlanetScale are just like using Prisma ORM with any other relational database. You can still: - model your database with the [Prisma Schema Language](/orm/prisma-schema) -- use Prisma's existing [`mysql` database connector](/orm/overview/databases/mysql) in your schema, along with the [connection string PlanetScale provides you](https://planetscale.com/docs/concepts/connection-strings) +- use Prisma ORM's existing [`mysql` database connector](/orm/overview/databases/mysql) in your schema, along with the [connection string PlanetScale provides you](https://planetscale.com/docs/concepts/connection-strings) - use [Introspection](/orm/prisma-schema/introspection) for existing projects if you already have a database schema in PlanetScale - use [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) to push changes in your schema to the database - use [Prisma Client](/orm/prisma-client) in your application to talk to the database server at PlanetScale ## Differences to consider -PlanetScale's branching model and design for scalability means that there are also a number of differences to consider. You should be aware of the following points when deciding to use PlanetScale with Prisma: +PlanetScale's branching model and design for scalability means that there are also a number of differences to consider. You should be aware of the following points when deciding to use PlanetScale with Prisma ORM: - **Branching and deploy requests.** PlanetScale provides two types of database branches: _development branches_, which allow you to test out schema changes, and _production branches_, which are protected from direct schema changes. Instead, changes must be first created on a development branch and then deployed to production using a deploy request. Production branches are highly available and include automated daily backups. To learn more, see [How to use branches and deploy requests](#how-to-use-branches-and-deploy-requests). - -- **Referential actions and integrity.** To support scaling across multiple database servers, PlanetScale [does not allow the use of foreign key constraints](https://planetscale.com/docs/learn/operating-without-foreign-key-constraints), which are normally used in relational databases to enforce relationships between data in different tables, and asks users to handle this manually in their applications. - With Prisma you can maintain these relationships in your data and allow the use of [referential actions](/orm/prisma-schema/data-model/relations/referential-actions) by using Prisma's ability to [emulate relations in Prisma Client](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-with-the-prisma-relation-mode) with the `prisma` relation mode. For more information, see [How to emulate relations in Prisma Client](#how-to-emulate-relations-in-prisma-client). - -- **Creating indexes on foreign keys.** When emulating relations in Prisma, you will need to create indexes on foreign keys. In a standard MySQL database, if a table has a column with a foreign key constraint, an index is automatically created on that column. Because PlanetScale does not support foreign keys, these indexes are [currently](https://github.com/prisma/prisma/issues/10611) not created when Prisma Client emulates relations, which can lead to issues with queries not being well optimised. To avoid this, you can create indexes in Prisma. For more information, see [How to create indexes on foreign keys](#how-to-create-indexes-on-foreign-keys). - -- **Making schema changes with `db push`.** When you merge a development branch into your production branch, PlanetScale will automatically compare the two schemas and generate its own schema diff. This means that Prisma's [`prisma migrate`](/orm/prisma-migrate) workflow, which generates its own history of migration files, is not a natural fit when working with PlanetScale. These migration files may not reflect the actual schema changes run by PlanetScale when the branch is merged. +- **Referential actions and integrity.** To support scaling across multiple database servers, PlanetScale [by default does not use foreign key constraints](https://planetscale.com/docs/learn/operating-without-foreign-key-constraints), which are normally used in relational databases to enforce relationships between data in different tables, and asks users to handle this manually in their applications. However, you can explicitly [enable them in the PlanetScale database settings](https://planetscale.com/docs/concepts/foreign-key-constraints). If you don't enable these explicitly, you can still maintain these relationships in your data and allow the use of [referential actions](/orm/prisma-schema/data-model/relations/referential-actions) by using Prisma ORM's ability to [emulate relations in Prisma Client](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode) with the `prisma` relation mode. For more information, see [How to emulate relations in Prisma Client](#option-1-emulate-relations-in-prisma-client). +- **Creating indexes on foreign keys.** When [emulating relations in Prisma ORM](#option-1-emulate-relations-in-prisma-client) (i.e. when _not_ using foreign key constraints on the database-level), you will need to create dedicated indexes on foreign keys. In a standard MySQL database, if a table has a column with a foreign key constraint, an index is automatically created on that column. When PlanetScale is configured to not use foreign key constraints, these indexes are [currently](https://github.com/prisma/prisma/issues/10611) not created when Prisma Client emulates relations, which can lead to issues with queries not being well optimised. To avoid this, you can create indexes in Prisma ORM. For more information, see [How to create indexes on foreign keys](#2-create-indexes-on-foreign-keys). +- **Making schema changes with `db push`.** When you merge a development branch into your production branch, PlanetScale will automatically compare the two schemas and generate its own schema diff. This means that Prisma ORM's [`prisma migrate`](/orm/prisma-migrate) workflow, which generates its own history of migration files, is not a natural fit when working with PlanetScale. These migration files may not reflect the actual schema changes run by PlanetScale when the branch is merged. - Prisma recommends not using `prisma migrate` when making schema changes with PlanetScale. Instead, we recommend that you use the `prisma db push` command. + We recommend not using `prisma migrate` when making schema changes with PlanetScale. Instead, we recommend that you use the `prisma db push` command. For an example of how this works, see [How to make schema changes with `db push`](#how-to-make-schema-changes-with-db-push) -- **Introspection**. When you introspect on an existing database, you will get a schema with no relations, as they are usually defined based on foreign keys that connect tables. Because PlanetScale does not support foreign keys, and you use Prisma to emulate relations, you will need to add the missing relations in manually. For more information, see [How to add in missing relations after Introspection](#how-to-add-in-missing-relations-after-introspection). +- **Introspection**. When you introspect on an existing database and you have _not_ enabled [foreign key constraints in your PlanetScale database](#option-2-enable-foreign-key-constraints-in-the-planetscale-database-settings), you will get a schema with no relations, as they are usually defined based on foreign keys that connect tables. In that case, you will need to add the missing relations in manually. For more information, see [How to add in missing relations after Introspection](#how-to-add-in-missing-relations-after-introspection). ## How to use branches and deploy requests -When connecting to PlanetScale with Prisma, you will need to use the correct connection string for your branch. The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' from the dropdown to get the Prisma format for the connection URL. See Prisma's [Getting Started guide](/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale) for more details of how to connect to a PlanetScale database. +When connecting to PlanetScale with Prisma ORM, you will need to use the correct connection string for your branch. The connection URL for a given database branch can be found from your PlanetScale account by going to the overview page for the branch and selecting the 'Connect' dropdown. In the 'Passwords' section, generate a new password and select 'Prisma' from the dropdown to get the Prisma format for the connection URL. See Prisma ORM's [Getting Started guide](/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale) for more details of how to connect to a PlanetScale database. Every PlanetScale database is created with a branch called `main`, which is initially a development branch that you can use to test schema changes on. Once you are happy with the changes you make there, you can [promote it](https://planetscale.com/docs/concepts/branching#promote-a-branch-to-production) to become a production branch. Note that you can only push new changes to a development branch, so further changes will need to be created on a separate development branch and then later deployed to production using a [deploy request](https://planetscale.com/docs/concepts/branching#2.-create-a-deploy-request). If you try to push to a production branch, you will get the [error message](/orm/reference/error-reference#p3022) `Direct execution of DDL (Data Definition Language) SQL statements is disabled on this database.` -## How to emulate relations in Prisma Client +## How to use relations (and enable referential integrity) with PlanetScale + +### Option 1: Emulate relations in Prisma Client -PlanetScale does not allow foreign keys in its database schema. By default, Prisma uses foreign keys in the underlying database to enforce relations between fields in your Prisma schema. In Prisma versions 3.1.1 and later, you can [emulate relations in Prisma Client with the `prisma` relation mode](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-with-the-prisma-relation-mode), which avoids the need for foreign keys in the database. +#### 1. Set `relationMode = "prisma"` + +PlanetScale does not use foreign key constraints in its database schema by default. However, Prisma ORM relies on foreign key constraints in the underlying database to enforce referential integrity between models in your Prisma schema. + +In Prisma ORM versions 3.1.1 and later, you can [emulate relations in Prisma Client with the `prisma` relation mode](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode), which avoids the need for foreign key constraints in the database. To enable emulation of relations in Prisma Client, set the `relationMode` field to `"prisma"` in the `datasource` block: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mysql" url = env("DATABASE_URL") @@ -79,17 +81,17 @@ datasource db { -The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma version 3.1.1, and is generally available in Prisma versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma version 4.5.0, and was previously named `referentialIntegrity`. +The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma ORM version 3.1.1, and is generally available in Prisma ORM versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma ORM version 4.5.0, and was previously named `referentialIntegrity`.
-If you use relations in your Prisma schema with the default `"foreignKeys"` option for the `referentialIntegrity` field, PlanetScale will error when Prisma tries to create foreign keys. In versions 2.27.0 and later, Prisma will output the [P3021 error message](/orm/reference/error-reference#p3021). +If you use relations in your Prisma schema with the default `"foreignKeys"` option for the `relationMode` field, PlanetScale will error and Prisma ORM output the [P3021 error message](/orm/reference/error-reference#p3021) when it tries to create foreign keys. (In versions before 2.27.0 it will output a raw database error.) -## How to create indexes on foreign keys +#### 2. Create indexes on foreign keys -When [you emulate relations in Prisma Client](#how-to-emulate-relations-in-prisma-client), you need to create your own indexes. As an example of a situation where you would want to add an index, take this schema for a blog with posts and comments: +When [you emulate relations in Prisma Client](#option-1-emulate-relations-in-prisma-client), you need to create your own indexes. As an example of a situation where you would want to add an index, take this schema for a blog with posts and comments: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) title String @@ -108,9 +110,9 @@ model Comment { The `postId` field in the `Comment` model refers to the corresponding `id` field in the `Post` model. However this is not implemented as a foreign key in PlanetScale, so the column doesn't have an automatic index. This means that some queries may not be well optimised. For example, if you query for all comments with a certain post `id`, PlanetScale may have to do a full table lookup. This could be slow, and also expensive because PlanetScale's billing model charges for the number of rows read. -To avoid this, you can define an index on the `postId` field using [Prisma's `@@index` argument](/orm/reference/prisma-schema-reference#index): +To avoid this, you can define an index on the `postId` field using [Prisma ORM's `@@index` argument](/orm/reference/prisma-schema-reference#index): -```prisma file=schema.prisma highlight=15;add +```prisma file=schema.prisma highlight=15;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String @@ -125,13 +127,14 @@ model Comment { postId Int post Post @relation(fields: [postId], references: [id], onDelete: Cascade) + //add-next-line @@index([postId]) } ``` You can then add this change to your schema [using `db push`](#how-to-make-schema-changes-with-db-push). -In Prisma versions 4.7.0 and later, Prisma warns you if you have a relation with no index on the relation scalar field. For more information, see [Index validation](/orm/prisma-schema/data-model/relations/relation-mode#index-validation). +In versions 4.7.0 and later, Prisma ORM warns you if you have a relation with no index on the relation scalar field. For more information, see [Index validation](/orm/prisma-schema/data-model/relations/relation-mode#index-validation). @@ -139,19 +142,52 @@ One issue to be aware of is that [implicit many-to-many relations](/orm/prisma-s -## How to make schema changes with db push +### Option 2: Enable foreign key constraints in the PlanetScale database settings + +Support for foreign key constraints in PlanetScale databases has been Generally Available since February 2024. Follow the instructions in the [PlanetScale documentation](https://planetscale.com/docs/concepts/foreign-key-constraints) to enable them in your database. + +You can then use Prisma ORM and define relations in your Prisma schema without the need for extra configuration. + +In that case, you can define a relation as with other database that supports foreign key constraints, for example: + +```prisma file=schema.prisma showLineNumbers +model Post { + id Int @id @default(autoincrement()) + title String + content String + likes Int @default(0) + comments Comment[] +} + +model Comment { + id Int @id @default(autoincrement()) + comment String + postId Int + post Post @relation(fields: [postId], references: [id], onDelete: Cascade) +} +``` + +With this approach, it is _not_ necessary to: + +- set `relationMode = "prisma"` in your Prisma schema +- define additional indexes on foreign keys + +Also, introspection will automatically create relation fields in your Prisma schema because it can detect the foreign key constraints in the database. -To use `db push` with PlanetScale, you will first need to [enable emulation of relations in Prisma Client](#how-to-emulate-relations-in-prisma-client). Pushing to your branch without referential emulation enabled will give the [error message](/orm/reference/error-reference#p3021) `Foreign keys cannot be created on this database.` +## How to make schema changes with `db push` + +To use `db push` with PlanetScale, you will first need to [enable emulation of relations in Prisma Client](#option-1-emulate-relations-in-prisma-client). Pushing to your branch without referential emulation enabled will give the [error message](/orm/reference/error-reference#p3021) `Foreign keys cannot be created on this database.` As an example, let's say you decide to decide to add a new `excerpt` field to the blog post schema above. You will first need to [create a new development branch and connect to it](#how-to-use-branches-and-deploy-requests). Next, add the following to your `schema.prisma` file: -```prisma file=schema.prisma highlight=5;edit +```prisma file=schema.prisma highlight=5;edit showLineNumbers model Post { id Int @id @default(autoincrement()) title String content String + //edit-next-line excerpt String? likes Int @default(0) comments Comment[] @@ -175,13 +211,15 @@ npx prisma db push Once you are happy with your changes on your development branch, you can open a deploy request to deploy these to your production branch. -For more examples, see PlanetScale's tutorial on [automatic migrations with Prisma](https://planetscale.com/docs/prisma/automatic-prisma-migrations) using `db push`. +For more examples, see PlanetScale's tutorial on [automatic migrations with Prisma ORM](https://planetscale.com/docs/prisma/automatic-prisma-migrations) using `db push`. ## How to add in missing relations after Introspection +> **Note**: This section is only relevant if you use `relationMode = "prisma"` to emulate foreign key constraints with Prisma ORM. If you enabled foreign key constraints in your PlanetScale database, you can ignore this section. + After introspecting with `npx prisma db pull`, the schema you get may be missing some relations. For example, the following schema is missing a relation between the `User` and `Post` models: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @@ -201,12 +239,13 @@ model User { In this case you need to add the relation in manually: -```prisma file=schema.prisma highlight=6,16;add +```prisma file=schema.prisma highlight=6,16;add showLineNumbers model Post { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) title String @db.VarChar(255) content String? + //add-next-line author User @relation(fields: [authorId], references: [id]) authorId Int @@ -217,21 +256,22 @@ model User { id Int @id @default(autoincrement()) email String @unique name String? + //add-next-line posts Post[] } ``` For a more detailed example, see the [Getting Started guide for PlanetScale](/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-planetscale). -## How to use the PlanetScale serverless driver with Prisma (Preview) +## How to use the PlanetScale serverless driver with Prisma ORM (Preview) The [PlanetScale serverless driver](https://planetscale.com/docs/tutorials/planetscale-serverless-driver) provides a way of communicating with your database and executing queries over HTTP. -You can use Prisma along with the PlanetScale serverless driver using the [`@prisma/adapter-planetscale`](https://www.npmjs.com/package/@prisma/adapter-planetscale) driver adapter. The driver adapter allows you to communicate with your database over HTTP. +You can use Prisma ORM along with the PlanetScale serverless driver using the [`@prisma/adapter-planetscale`](https://www.npmjs.com/package/@prisma/adapter-planetscale) driver adapter. The driver adapter allows you to communicate with your database over HTTP. -This feature is available in Preview from Prisma versions 5.4.2 and later. +This feature is available in Preview from Prisma ORM versions 5.4.2 and later. @@ -246,7 +286,7 @@ generator client { Generate Prisma Client: -```sh +```bash npx prisma generate ``` @@ -260,9 +300,9 @@ DATABASE_URL='mysql://johndoe:strongpassword@aws.connect.psdb.cloud/clear_nights -Install the Prisma adapter for PlanetScale, PlanetScale serverless driver and `undici` packages: +Install the Prisma ORM adapter for PlanetScale, PlanetScale serverless driver and `undici` packages: -```sh +```bash npm install @prisma/adapter-planetscale @planetscale/database undici ``` @@ -291,16 +331,16 @@ const prisma = new PrismaClient({ adapter }) You can then use Prisma Client as you normally would with full type-safety. Prisma Migrate, introspection, and Prisma Studio will continue working as before using the connection string defined in the Prisma schema. -## More on using PlanetScale with Prisma +## More on using PlanetScale with Prisma ORM -The fastest way to start using PlanetScale with Prisma is to refer to our Getting Started documentation: +The fastest way to start using PlanetScale with Prisma ORM is to refer to our Getting Started documentation: - [Start from scratch](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-planetscale) - [Add to existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-planetscale) These tutorials will take you through the process of connecting to PlanetScale, pushing schema changes, and using Prisma Client. -For further tips on best practices when using Prisma and PlanetScale together, watch our video: +For further tips on best practices when using Prisma ORM and PlanetScale together, watch our video:
diff --git a/content/200-orm/050-overview/500-databases/880-supabase.mdx b/content/200-orm/050-overview/500-databases/880-supabase.mdx index c00f56e344..52a93138df 100644 --- a/content/200-orm/050-overview/500-databases/880-supabase.mdx +++ b/content/200-orm/050-overview/500-databases/880-supabase.mdx @@ -1,29 +1,29 @@ --- title: 'Supabase' metaTitle: 'Supabase' -metaDescription: 'Guide to Supabase' +description: 'Guide to Supabase' tocDepth: 2 toc: true --- -This guide discusses the concepts behind using Prisma and Supabase, explains the commonalities and differences between Supabase and other database providers, and leads you through the process for configuring your application to integrate with Supabase. +This guide discusses the concepts behind using Prisma ORM and Supabase, explains the commonalities and differences between Supabase and other database providers, and leads you through the process for configuring your application to integrate with Supabase. ## What is Supabase? -[Supabase](https://supabase.com/) is a PostgreSQL hosting service and open source Firebase alternative providing all the backend features you need to build a product. Unlike Firebase, Supabase is backed by PostgreSQL which can be accessed directly using Prisma. +[Supabase](https://supabase.com/) is a PostgreSQL hosting service and open source Firebase alternative providing all the backend features you need to build a product. Unlike Firebase, Supabase is backed by PostgreSQL which can be accessed directly using Prisma ORM. To learn more about Supabase, you can check out their architecture [here](https://supabase.com/docs/guides/getting-started/architecture) and features [here](https://supabase.com/docs/guides/getting-started/features) ## Commonalities with other database providers -Many aspects of using Prisma with Supabase are just like using Prisma with any other relational database. You can still: +Many aspects of using Prisma ORM with Supabase are just like using Prisma ORM with any other relational database. You can still: - model your database with the [Prisma Schema Language](/orm/prisma-schema) -- use Prisma's existing [`postgresql` database connector](/orm/overview/databases/postgresql) in your schema, along with the [connection string Supabase provides you](https://supabase.com/docs/guides/database/connecting-to-postgres#finding-your-connection-string) +- use Prisma ORM's existing [`postgresql` database connector](/orm/overview/databases/postgresql) in your schema, along with the [connection string Supabase provides you](https://supabase.com/docs/guides/database/connecting-to-postgres#finding-your-connection-string) - use [Introspection](/orm/prisma-schema/introspection) for existing projects if you already have a database schema in Supabase - use [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) to push changes in your schema to Supabase - use [Prisma Client](/orm/prisma-client) in your application to talk to the database server at Supabase @@ -34,25 +34,28 @@ If you'd like to use the [connection pooling feature](https://supabase.com/docs/ ```env file=.env # Connect to Supabase via connection pooling with Supavisor. -DATABASE_URL="postgres://postgres.[your-supabase-project]:[password]@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?pgbouncer=true" +DATABASE_URL="postgres://postgres.[your-supabase-project]:[password]@aws-0-[aws-region].pooler.supabase.com:6543/postgres?pgbouncer=true" ``` If you would like to use the Prisma CLI in order to perform other actions on your database (e.g. migrations) you will need to add a `DIRECT_URL` environment variable to use in the `datasource.directUrl` property so that the CLI can bypass Supavisor: -```env file=.env highlight=4-5;add +```env file=.env highlight=4-5;add showLineNumbers # Connect to Supabase via connection pooling with Supavisor. -DATABASE_URL="postgres://postgres.[your-supabase-project]:[password]@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?pgbouncer=true" +DATABASE_URL="postgres://postgres.[your-supabase-project]:[password]@aws-0-[aws-region].pooler.supabase.com:6543/postgres?pgbouncer=true" +//add-start # Direct connection to the database. Used for migrations. -DIRECT_URL="postgres://postgres:[password]@db.[your-supabase-project].supabase.co:5432/postgres" +DIRECT_URL="postgres://postgres.[your-supabase-project]:[password]@aws-0-[aws-region].pooler.supabase.com:5432/postgres" +//add-end ``` You can then update your `schema.prisma` to use the new direct URL: -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line directUrl = env("DIRECT_URL") } ``` diff --git a/content/200-orm/050-overview/500-databases/890-neon.mdx b/content/200-orm/050-overview/500-databases/890-neon.mdx index 9f53f12d9c..1e51dc4bd9 100644 --- a/content/200-orm/050-overview/500-databases/890-neon.mdx +++ b/content/200-orm/050-overview/500-databases/890-neon.mdx @@ -1,7 +1,7 @@ --- title: 'Neon' metaTitle: 'Neon' -metaDescription: 'Guide to Neon' +description: 'Guide to Neon' tocDepth: 2 toc: true --- @@ -10,9 +10,9 @@ toc: true This guide explains how to: -- [Connect Prisma using Neon's connection pooling feature](#how-to-use-neons-connection-pooling) +- [Connect Prisma ORM using Neon's connection pooling feature](#how-to-use-neons-connection-pooling) - [Resolve connection timeout issues](#resolving-connection-timeouts) -- [Use Neon's serverless driver with Prisma](#how-to-use-neons-serverless-driver-with-prisma-preview) +- [Use Neon's serverless driver with Prisma ORM](#how-to-use-neons-serverless-driver-with-prisma-orm-preview) @@ -20,7 +20,15 @@ This guide explains how to: Neon's logo @@ -30,10 +38,10 @@ Learn more about Neon [here](https://neon.tech/docs). ## Commonalities with other database providers -Many aspects of using Prisma with Neon are just like using Prisma with any other PostgreSQL database. You can: +Many aspects of using Prisma ORM with Neon are just like using Prisma ORM with any other PostgreSQL database. You can: - model your database with the [Prisma Schema Language](/orm/prisma-schema) -- use Prisma's [`postgresql` database connector](/orm/overview/databases/postgresql) in your schema, along with the [connection string Neon provides you](https://neon.tech/docs/connect/connect-from-any-app) +- use Prisma ORM's [`postgresql` database connector](/orm/overview/databases/postgresql) in your schema, along with the [connection string Neon provides you](https://neon.tech/docs/connect/connect-from-any-app) - use [Introspection](/orm/prisma-schema/introspection) for existing projects if you already have a database schema on Neon - use [`prisma migrate dev`](/orm/prisma-migrate/workflows/development-and-production) to track schema migrations in your Neon database - use [`prisma db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) to push changes in your schema to Neon @@ -41,7 +49,7 @@ Many aspects of using Prisma with Neon are just like using Prisma with any other ## Differences to consider -There are a few differences between Neon and PostgreSQL you should be aware of the following when deciding to use Neon with Prisma: +There are a few differences between Neon and PostgreSQL you should be aware of the following when deciding to use Neon with Prisma ORM: - **Neon's serverless model** — By default, Neon scales a [compute](https://neon.tech/docs/introduction/compute-lifecycle) to zero after 5 minutes of inactivity. During this state, a compute instance is in _idle_ state. A characteristic of this feature is the concept of a "cold start". Activating a compute from an idle state takes from 500ms to a few seconds. Depending on how long it takes to connect to your database, your application may timeout. To learn more, see: [Connection latency and timeouts](https://neon.tech/docs/guides/prisma#connection-timeouts). - **Neon's connection pooler** — Neon offers connection pooling using PgBouncer, enabling up to 10,000 concurrent connections. To learn more, see: [Connection pooling](https://neon.tech/docs/connect/connection-pooling). @@ -58,20 +66,23 @@ DATABASE_URL=postgres://daniel:@ep-mute-rain-952417-pooler.us-east-2.a If you would like to use Prisma CLI in order to perform other actions on your database (e.g. for migrations) you will need to add a `DIRECT_URL` environment variable to use in the `directUrl` property of the `datasource` block of your Prisma schema so that the CLI will use a direct connection string (without PgBouncer): -```env file=.env highlight=4-5;add +```env file=.env highlight=4-5;add showLineNumbers # Connect to Neon with PgBouncer. DATABASE_URL=postgres://daniel:@ep-mute-rain-952417-pooler.us-east-2.aws.neon.tech/neondb?pgbouncer=true +//add-start # Direct connection to the database used by Prisma CLI for e.g. migrations. DIRECT_URL="postgres://daniel:@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb" +//add-end ``` You can then update your `schema.prisma` to use the new direct URL: -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line directUrl = env("DIRECT_URL") } ``` @@ -86,7 +97,7 @@ We strongly recommend using the pooled connection string in your `DATABASE_URL` ## Resolving connection timeouts -A connection timeout that occurs when connecting from Prisma to Neon causes an error similar to the following: +A connection timeout that occurs when connecting from Prisma ORM to Neon causes an error similar to the following: ```text no-copy Error: P1001: Can't reach database server at `ep-white-thunder-826300.us-east-2.aws.neon.tech`:`5432` @@ -97,7 +108,7 @@ This error most likely means that the connection created by Prisma Client timed A Neon compute has two main states: _Active_ and _Idle_. Active means that the compute is currently running. If there is no query activity for 5 minutes, Neon places a compute into an idle state by default. Refer to Neon's docs to [learn more](https://neon.tech/docs/introduction/compute-lifecycle). -When you connect to an idle compute from Prisma, Neon automatically activates it. Activation typically happens within a few seconds but added latency can result in a connection timeout. To address this issue, your can adjust your Neon connection string by adding a `connect_timeout` parameter. This parameter defines the maximum number of seconds to wait for a new connection to be opened. The default value is 5 seconds. A higher setting should provide the time required to avoid connection timeout issues. For example: +When you connect to an idle compute from Prisma ORM, Neon automatically activates it. Activation typically happens within a few seconds but added latency can result in a connection timeout. To address this issue, your can adjust your Neon connection string by adding a `connect_timeout` parameter. This parameter defines the maximum number of seconds to wait for a new connection to be opened. The default value is 5 seconds. A higher setting should provide the time required to avoid connection timeout issues. For example: ```text wrap DATABASE_URL=postgres://daniel:@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=10 @@ -109,21 +120,21 @@ A `connect_timeout` setting of 0 means no timeout. -Another possible cause of connection timeouts is Prisma's [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool), which has a default timeout of 10 seconds. This is typically enough time for Neon, but if you are still experiencing connection timeouts, you can try increasing this limit (in addition to the `connect_timeout` setting described above) by setting the `pool_timeout` parameter to a higher value. For example: +Another possible cause of connection timeouts is Prisma ORM's [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool), which has a default timeout of 10 seconds. This is typically enough time for Neon, but if you are still experiencing connection timeouts, you can try increasing this limit (in addition to the `connect_timeout` setting described above) by setting the `pool_timeout` parameter to a higher value. For example: ```text wrap DATABASE_URL=postgres://daniel:@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=15&pool_timeout=15 ``` -## How to use Neon's serverless driver with Prisma (Preview) +## How to use Neon's serverless driver with Prisma ORM (Preview) The [Neon serverless driver](https://github.com/neondatabase/serverless) is a low-latency Postgres driver for JavaScript and TypeScript that allows you to query data from serverless and edge environments over HTTP or WebSockets in place of TCP. -You can use Prisma along with the Neon serverless driver using a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) . A driver adapter allows you to use a different database driver from the default Prisma provides to communicate with your database. +You can use Prisma ORM along with the Neon serverless driver using a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) . A driver adapter allows you to use a different database driver from the default Prisma ORM provides to communicate with your database. -This feature is available in Preview from Prisma versions 5.4.2 and later. +This feature is available in Preview from Prisma ORM versions 5.4.2 and later. @@ -143,13 +154,13 @@ datasource db { Generate Prisma Client: -```sh +```bash npx prisma generate ``` -Install the Prisma adapter for Neon, Neon serverless driver and `ws` packages: +Install the Prisma ORM adapter for Neon, Neon serverless driver and `ws` packages: -```sh +```bash npm install @prisma/adapter-neon @neondatabase/serverless ws npm install --save-dev @types/ws ``` diff --git a/content/200-orm/050-overview/500-databases/900-turso.mdx b/content/200-orm/050-overview/500-databases/900-turso.mdx index 9b7527a6cd..d35793b9ed 100644 --- a/content/200-orm/050-overview/500-databases/900-turso.mdx +++ b/content/200-orm/050-overview/500-databases/900-turso.mdx @@ -1,15 +1,15 @@ --- title: 'Turso' metaTitle: 'Turso (Early Access)' -metaDescription: 'Guide to Turso' +description: 'Guide to Turso' tocDepth: 3 --- -This guide discusses the concepts behind using Prisma and Turso, explains the commonalities and differences between Turso and other database providers, and leads you through the process for configuring your application to integrate with Turso. +This guide discusses the concepts behind using Prisma ORM and Turso, explains the commonalities and differences between Turso and other database providers, and leads you through the process for configuring your application to integrate with Turso. -Prisma support for Turso is currently in [Early Access](/orm/more/releases#early-access). We would appreciate your feedback in this [GitHub discussion](https://github.com/prisma/prisma/discussions/21345). +Prisma ORM support for Turso is currently in [Early Access](/orm/more/releases#early-access). We would appreciate your feedback in this [GitHub discussion](https://github.com/prisma/prisma/discussions/21345). @@ -17,7 +17,15 @@ Prisma support for Turso is currently in [Early Access](/orm/more/releases#early Turso's logo @@ -25,7 +33,7 @@ Prisma support for Turso is currently in [Early Access](/orm/more/releases#early -Support for Turso is available in [Early Access](/orm/more/releases#early-access) from Prisma versions 5.4.2 and later. +Support for Turso is available in [Early Access](/orm/more/releases#early-access) from Prisma ORM versions 5.4.2 and later. @@ -41,15 +49,15 @@ libSQL is 100% compatible with SQLite. libSQL extends SQLite and adds the follow > To learn more about the differences between libSQL and how it is different from SQLite, see [libSQL Manifesto](https://turso.tech/libsql-manifesto). -Many aspects of using Prisma with Turso are just like using Prisma with any other relational database. You can still: +Many aspects of using Prisma ORM with Turso are just like using Prisma ORM with any other relational database. You can still: - model your database with the [Prisma Schema Language](/orm/prisma-schema) -- use Prisma's existing [`sqlite` database connector](/orm/overview/databases/sqlite) in your schema +- use Prisma ORM's existing [`sqlite` database connector](/orm/overview/databases/sqlite) in your schema - use [Prisma Client](/orm/prisma-client) in your application to talk to the database server at Turso ## Differences to consider -There are a number of differences between Turso and SQLite to consider. You should be aware of the following when deciding to use Turso and Prisma: +There are a number of differences between Turso and SQLite to consider. You should be aware of the following when deciding to use Turso and Prisma ORM: - **Remote and embedded SQLite databases**. libSQL uses HTTP to connect to the remote SQLite database. libSQL also supports remote database replicas and embedded replicas. Embedded replicas enable you to replicate your primary database inside your application. - **Making schema changes**. Since libSQL uses HTTP to connect to the remote database, this makes it incompatible with Prisma Migrate. However, you can use [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) to create a schema migration and then apply the changes to your database using [Turso's CLI](https://docs.turso.tech/reference/turso-cli). @@ -100,6 +108,7 @@ To get started, enable the `driverAdapters` Preview feature flag: ```prisma highlight=3;add generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["driverAdapters"] } @@ -115,7 +124,7 @@ Generate Prisma Client: npx prisma generate ``` -Install the libSQL database client and Prisma driver adapter for libSQL packages: +Install the libSQL database client and Prisma ORM driver adapter for libSQL packages: ```terminal npm install @libsql/client @prisma/adapter-libsql @@ -197,17 +206,19 @@ Your application's data needs will determine how often you should synchronize da ### How to synchronize data between your remote database and embedded replica -To get started using embedded replicas with Prisma, add the `sync()` method from libSQL in your application. The example below shows how you can synchronize data using Express middleware. +To get started using embedded replicas with Prisma ORM, add the `sync()` method from libSQL in your application. The example below shows how you can synchronize data using Express middleware. ```ts highlight=5-8;add; import express from 'express' const app = express() // ... the rest of your application code +//add-start app.use(async (req, res, next) => { await libsql.sync() next() }) +//add-end app.listen(3000, () => console.log(`Server ready at http://localhost:3000`)) ``` diff --git a/content/200-orm/050-overview/500-databases/index.mdx b/content/200-orm/050-overview/500-databases/index.mdx index 81680e00f6..4e03e292b6 100644 --- a/content/200-orm/050-overview/500-databases/index.mdx +++ b/content/200-orm/050-overview/500-databases/index.mdx @@ -1,13 +1,13 @@ --- title: 'Databases' metaTitle: 'Databases' -metaDescription: 'Databases' -toc: false +description: 'Databases' +hide_table_of_contents: true --- -Learn about the different databases Prisma supports. +Learn about the different databases Prisma ORM supports. diff --git a/content/200-orm/050-overview/_category_.json b/content/200-orm/050-overview/_category_.json new file mode 100644 index 0000000000..375c63862c --- /dev/null +++ b/content/200-orm/050-overview/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Overview", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/050-overview/index.mdx b/content/200-orm/050-overview/index.mdx index 89077e1d99..cc7d3e3e13 100644 --- a/content/200-orm/050-overview/index.mdx +++ b/content/200-orm/050-overview/index.mdx @@ -1,9 +1,9 @@ --- title: 'Overview' metaTitle: 'Overview' -metaDescription: 'Overview' +description: 'Overview' staticLink: true -toc: false +hide_table_of_contents: true --- diff --git a/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx b/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx index 7ff9a664d8..9ee5b2ae53 100644 --- a/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx +++ b/content/200-orm/100-prisma-schema/10-overview/02-data-sources.mdx @@ -1,12 +1,12 @@ --- title: 'Data sources' metaTitle: 'Data sources (Reference)' -metaDescription: 'Data sources enable Prisma to connect to your database. This page explains how to configure data sources in your Prisma schema.' +description: 'Data sources enable Prisma to connect to your database. This page explains how to configure data sources in your Prisma schema.' --- -A data source determines how Prisma connects your database, and is represented by the [`datasource`](/orm/reference/prisma-schema-reference#datasource) block in the Prisma schema. The following data source uses the `postgresql` provider and includes a connection URL: +A data source determines how Prisma ORM connects your database, and is represented by the [`datasource`](/orm/reference/prisma-schema-reference#datasource) block in the Prisma schema. The following data source uses the `postgresql` provider and includes a connection URL: ```prisma datasource db { @@ -32,7 +32,7 @@ Some data source `provider`s allow you to configure your connection with SSL/TLS - [Configuring an SSL connection with MySQL](/orm/overview/databases/mysql#configuring-an-ssl-connection) - [Configure a TLS connection with Microsoft SQL Server](/orm/overview/databases/sql-server#connection-details) -Prisma resolves SSL certificates relative to the `./prisma` directory. If your certificate files are located outside that directory, e.g. your project root directory, use relative paths for certificates: +Prisma ORM resolves SSL certificates relative to the `./prisma` directory. If your certificate files are located outside that directory, e.g. your project root directory, use relative paths for certificates: ```prisma datasource db { diff --git a/content/200-orm/100-prisma-schema/10-overview/03-generators.mdx b/content/200-orm/100-prisma-schema/10-overview/03-generators.mdx index c7190aef04..5092d34288 100644 --- a/content/200-orm/100-prisma-schema/10-overview/03-generators.mdx +++ b/content/200-orm/100-prisma-schema/10-overview/03-generators.mdx @@ -1,7 +1,7 @@ --- title: 'Generators' metaTitle: 'Generators (Reference)' -metaDescription: 'Generators in your Prisma schema specify what assets are generated when the `prisma generate` command is invoked. This page explains how to configure generators.' +description: 'Generators in your Prisma schema specify what assets are generated when the `prisma generate` command is invoked. This page explains how to configure generators.' --- @@ -36,13 +36,13 @@ generator client { ### Binary targets -Prisma Client JS (`prisma-client-js`) uses several [engines](https://github.com/prisma/prisma-engines). Engines are implemented in Rust and are used by Prisma in the form of executable, platform dependent engine files. Depending on which platform you are executing your code on, you need the correct file. "Binary targets" are used to define which files should be present for the target platform(s). +Prisma Client JS (`prisma-client-js`) uses several [engines](https://github.com/prisma/prisma-engines). Engines are implemented in Rust and are used by Prisma Client in the form of executable, platform dependent engine files. Depending on which platform you are executing your code on, you need the correct file. "Binary targets" are used to define which files should be present for the target platform(s). The correct file is particularly important when [deploying](/orm/prisma-client/deployment/deploy-prisma) your application to production, which often differs from your local development environment. #### The `native` binary target -The `native` binary target is special. It doesn't map to a concrete operating system. Instead, when `native` is specified in `binaryTargets`, Prisma detects the _current_ operating system and automatically specifies the correct binary target for it. +The `native` binary target is special. It doesn't map to a concrete operating system. Instead, when `native` is specified in `binaryTargets`, Prisma Client detects the _current_ operating system and automatically specifies the correct binary target for it. As an example, assume you're running **macOS** and you specify the following generator: @@ -53,7 +53,7 @@ generator client { } ``` -In that case, Prisma detects your operating system and finds the right binary file for it based on the [list of supported operating systems](/orm/reference/prisma-schema-reference#binarytargets-options) . +In that case, Prisma Client detects your operating system and finds the right binary file for it based on the [list of supported operating systems](/orm/reference/prisma-schema-reference#binarytargets-options) . If you use macOS Intel x86 (`darwin`), then the binary file that was compiled for `darwin` will be selected. If you use macOS ARM64 (`darwin-arm64`), then the binary file that was compiled for `darwin-arm64` will be selected. diff --git a/content/200-orm/100-prisma-schema/10-overview/index.mdx b/content/200-orm/100-prisma-schema/10-overview/index.mdx index 5fd18d05bb..498796d2d3 100644 --- a/content/200-orm/100-prisma-schema/10-overview/index.mdx +++ b/content/200-orm/100-prisma-schema/10-overview/index.mdx @@ -1,15 +1,15 @@ --- title: 'Overview' metaTitle: 'Prisma Schema Overview' -metaDescription: 'The Prisma schema is the main configuration file when using Prisma. It is typically called schema.prisma and contains your database connection and data model.' +description: 'The Prisma schema is the main configuration file when using Prisma. It is typically called schema.prisma and contains your database connection and data model.' --- -The Prisma schema file (short: _schema file_, _Prisma schema_ or _schema_) is the main configuration file for your Prisma setup. It is typically called `schema.prisma` and consists of the following parts: +The Prisma schema file (short: _schema file_, _Prisma schema_ or _schema_) is the main configuration file for your Prisma ORM setup. It is typically called `schema.prisma` and consists of the following parts: -- [**Data sources**](data-sources): Specify the details of the data sources Prisma should connect to (e.g. a PostgreSQL database) -- [**Generators**](generators): Specifies what clients should be generated based on the data model (e.g. Prisma Client) +- [**Data sources**](/orm/prisma-schema/overview/data-sources): Specify the details of the data sources Prisma ORM should connect to (e.g. a PostgreSQL database) +- [**Generators**](/orm/prisma-schema/overview/generators): Specifies what clients should be generated based on the data model (e.g. Prisma Client) - [**Data model definition**](/orm/prisma-schema/data-model): Specifies your application [models](/orm/prisma-schema/data-model/models#defining-models) (the shape of the data per data source) and their [relations](/orm/prisma-schema/data-model/relations) See the [Prisma schema API reference](/orm/reference/prisma-schema-reference) for detailed information about each section of the schema. @@ -32,8 +32,8 @@ The following is an example of a Prisma schema file that specifies: - A data model definition with two models (with one relation) and one `enum` - Several [native data type attributes](/orm/prisma-schema/data-model/models#native-types-mapping) (`@db.VarChar(255)`, `@db.ObjectId`) -, ]}> - + + ```prisma datasource db { @@ -70,8 +70,8 @@ enum Role { } ``` - - + + ```prisma datasource db { @@ -108,7 +108,7 @@ enum Role { } ``` - + ## Naming @@ -127,7 +127,7 @@ The schema file is written in Prisma Schema Language (PSL). ### VS Code -Syntax highlighting for PSL is available via a [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) (which also lets you auto-format the contents of your Prisma schema and indicates syntax errors with red squiggly lines). Learn more about [setting up Prisma in your editor](/orm/more/development-environment/editor-setup). +Syntax highlighting for PSL is available via a [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) (which also lets you auto-format the contents of your Prisma schema and indicates syntax errors with red squiggly lines). Learn more about [setting up Prisma ORM in your editor](/orm/more/development-environment/editor-setup). ### GitHub @@ -171,6 +171,7 @@ The Prisma CLI outputs the path of the schema file that will be used. The follow ```no-lines Environment variables loaded from .env +//highlight-next-line |Prisma Schema loaded from prisma/schema.prisma Introspecting based on datasource defined in prisma/schema.prisma … @@ -230,7 +231,7 @@ model Customer {} ## Auto formatting -Prisma supports formatting `.prisma` files automatically. There are two ways to format `.prisma` files: +Prisma ORM supports formatting `.prisma` files automatically. There are two ways to format `.prisma` files: - Run the [`prisma format`](/orm/reference/prisma-cli-reference#format) command. - Install the [Prisma VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) and invoke the [VS Code format action](https://code.visualstudio.com/docs/editor/codebasics#_formatting) - manually or on save. @@ -262,26 +263,6 @@ block _ { } ``` - - #### Field definitions are aligned into columns separated by 2 or more spaces ``` diff --git a/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx b/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx index 9f21cb3958..c98648a50a 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/10-models.mdx @@ -1,7 +1,7 @@ --- title: 'Models' metaTitle: 'Models' -metaDescription: 'Learn about the concepts for building your data model with Prisma: Models, scalar types, enums, attributes, functions, IDs, default values and more.' +description: 'Learn about the concepts for building your data model with Prisma: Models, scalar types, enums, attributes, functions, IDs, default values and more.' tocDepth: 3 --- @@ -16,8 +16,8 @@ The data model definition part of the [Prisma schema](/orm/prisma-schema) define The following schema describes a blogging platform - the data model definition is highlighted: -, ]}> - + + ```prisma highlight=10-46;normal datasource db { @@ -28,7 +28,7 @@ datasource db { generator client { provider = "prisma-client-js" } - +//highlight-start model User { id Int @id @default(autoincrement()) email String @unique @@ -66,12 +66,13 @@ enum Role { USER ADMIN } +//highlight-end ``` - - + + -```prisma highlight=10-45;normal +```prisma highlight=10-45;normal datasource db { provider = "mongodb" url = env("DATABASE_URL") @@ -81,6 +82,7 @@ generator client { provider = "prisma-client-js" } +//highlight-start model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String @unique @@ -117,11 +119,12 @@ model Category { enum Role { USER +//highlight-end ADMIN } ``` - + The data model definition is made up of: @@ -134,7 +137,9 @@ The corresponding database looks like this: ![](../prisma-schema/sample-database.png) -
A model maps to the underlying structures of the data source. +
+ +A model maps to the underlying structures of the data source. - In relational databases like PostgreSQL and MySQL, a `model` maps to a **table** - In MongoDB, a `model` maps to a **collection** @@ -149,9 +154,9 @@ The following query uses Prisma Client that's generated from this data model to - Two nested `Post` records - Three nested `Category` records - , ]}> + - + ```ts const user = await prisma.user.create({ @@ -180,9 +185,9 @@ const user = await prisma.user.create({ }) ``` - + - + ```ts import { PrismaClient } from '@prisma/client' @@ -237,7 +242,7 @@ async function main() { main() ``` - + @@ -291,7 +296,7 @@ model Comment { } ``` -With this model definition, Prisma automatically maps the `Comment` model to the `comments` table in the underlying database. +With this model definition, Prisma ORM automatically maps the `Comment` model to the `comments` table in the underlying database. > **Note**: You can also [`@map`](/orm/reference/prisma-schema-reference#map) a column name or enum value, and `@@map` an enum name. @@ -322,11 +327,13 @@ The properties of a model are called _fields_, which consist of: A field's type determines its _structure_, and fits into one of two categories: - [Scalar types](#scalar-fields) (includes [enums](#defining-enums)) that map to columns (relational databases) or document fields (MongoDB) in the database - for example, [`String`](/orm/reference/prisma-schema-reference#string) or [`Int`](/orm/reference/prisma-schema-reference#int) -- Model types (the field is then called [relation field](relations#relation-fields)) - for example `Post` or `Comment[]`. +- Model types (the field is then called [relation field](/orm/prisma-schema/data-model/relations#relation-fields)) - for example `Post` or `Comment[]`. The following table describes `User` model's fields from the sample schema: -
Expand to see table +
+ +Expand to see table | Name | Type | Scalar vs Relation | Type modifier | Attributes | | :-------- | :-------- | :---------------------------- | :------------ | :------------------------------------ | @@ -343,37 +350,43 @@ The following table describes `User` model's fields from the sample schema: The following example extends the `Comment` and `Tag` models with several scalar types. Some fields include [attributes](#defining-attributes): -, ]}> - + + ```prisma highlight=2-4,8;normal model Comment { + //highlight-start id Int @id @default(autoincrement()) title String content String + //highlight-end } model Tag { + //highlight-next-line name String @id } ``` - - + + ```prisma highlight=2-4,8;normal model Comment { + //highlight-start id String @id @default(auto()) @map("_id") @db.ObjectId title String content String + //highlight-end } model Tag { + //highlight-next-line name String @id @map("_id") } ``` - + See [complete list of scalar field types](/orm/reference/prisma-schema-reference#model-field-scalar-types) . @@ -382,46 +395,50 @@ See [complete list of scalar field types](/orm/reference/prisma-schema-reference A relation field's type is another model - for example, a post (`Post`) can have multiple comments (`Comment[]`): -, ]}> - + + ```prisma highlight=4,10;normal model Post { id Int @id @default(autoincrement()) // Other fields + //highlight-next-line comments Comment[] // A post can have many comments } model Comment { id Int // Other fields + //highlight-next-line Post Post? @relation(fields: [postId], references: [id]) // A comment can have one post postId Int? } ``` - - + + ```prisma highlight=4,10;normal model Post { id String @id @default(auto()) @map("_id") @db.Objectid // Other fields + //highlight-next-line comments Comment[] // A post can have many comments } model Comment { id String @id @default(auto()) @map("_id") @db.Objectid // Other fields + //highlight-next-line Post Post? @relation(fields: [postId], references: [id]) // A comment can have one post postId String? @db.ObjectId } ``` - + -Refer to the [relations documentation](relations) for more examples and information about relationships between models. +Refer to the [relations documentation](/orm/prisma-schema/data-model/relations) for more examples and information about relationships between models. ### Native types mapping @@ -430,6 +447,7 @@ Version [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later ```prisma highlight=3;normal model Post { id Int @id + //highlight-next-line title String @db.VarChar(200) content String } @@ -463,44 +481,49 @@ The type of a field can be modified by appending either of two modifiers: The following example includes a scalar list and a list of related models: -, ]}> - + + ```prisma highlight=4,5;normal model Post { id Int @id @default(autoincrement()) // Other fields + //highlight-start comments Comment[] // A list of comments keywords String[] // A scalar list + //highlight-end } ``` - - + + ```prisma highlight=4,5;normal model Post { id String @id @default(auto()) @map("_id") @db.ObjectId // Other fields + //highlight-start comments Comment[] // A list of comments keywords String[] // A scalar list + //highlight-end } ``` - + -> **Note**: Scalar lists are **only** supported if the database connector supports scalar lists, either natively or at a Prisma level. +> **Note**: Scalar lists are **only** supported if the database connector supports scalar lists, either natively or at a Prisma ORM level. #### Optional and mandatory fields -, ]}> - + + ```prisma highlight=4;normal model Comment { id Int @id @default(autoincrement()) title String + //highlight-next-line content String? } @@ -509,13 +532,14 @@ model Tag { } ``` - - + + ```prisma highlight=4;normal model Comment { id String @id @default(auto()) @map("_id") @db.ObjectId title String + //highlight-next-line content String? } @@ -524,7 +548,7 @@ model Tag { } ``` - + When **not** annotating a field with the `?` type modifier, the field will be _required_ on every record of the model. This has effects on two levels: @@ -544,9 +568,9 @@ When you introspect a relational database, unsupported data types are added as [ location Unsupported("POLYGON")? ``` -The `Unsupported` type allows you to define fields in the Prisma schema for database types that are not yet supported by Prisma. For example, MySQL's `POLYGON` type is not currently supported by Prisma, but can now be added to the Prisma schema using the `Unsupported("POLYGON")` type. +The `Unsupported` type allows you to define fields in the Prisma schema for database types that are not yet supported by Prisma ORM. For example, MySQL's `POLYGON` type is not currently supported by Prisma ORM, but can now be added to the Prisma schema using the `Unsupported("POLYGON")` type. -Fields of type `Unsupported` are not available in the generated Prisma Client API, but you can still use Prisma's [raw database access](/orm/prisma-client/queries/raw-database-access/raw-queries) feature to query these fields. +Fields of type `Unsupported` are not available in the generated Prisma Client API, but you can still use Prisma ORM's [raw database access](/orm/prisma-client/queries/raw-database-access/raw-queries) feature to query these fields. > **Note**: If a model has **mandatory `Unsupported` fields**, the generated client will not include `create` or `update` methods for that model. @@ -556,8 +580,8 @@ Fields of type `Unsupported` are not available in the generated Prisma Client AP Attributes modify the behavior of fields or model blocks. The following example includes three field attributes ([`@id`](/orm/reference/prisma-schema-reference#id) , [`@default`](/orm/reference/prisma-schema-reference#default) , and [`@unique`](/orm/reference/prisma-schema-reference#unique) ) and one block attribute ([`@@unique`](/orm/reference/prisma-schema-reference#unique-1) ): -, ]}> - + + ```prisma model User { @@ -571,8 +595,8 @@ model User { } ``` - - + + ```prisma model User { @@ -586,7 +610,7 @@ model User { } ``` - + Some attributes accept [arguments](/orm/reference/prisma-schema-reference#attribute-argument-types) - for example, `@default` accepts `true` or `false`: @@ -614,6 +638,7 @@ In the following example, the `User` ID is represented by the `id` integer field ```prisma highlight=2;normal model User { + //highlight-next-line id Int @id @default(autoincrement()) email String @unique name String? @@ -634,6 +659,7 @@ model User { email String @unique isAdmin Boolean @default(false) + //highlight-next-line @@id([firstName, lastName]) } ``` @@ -649,6 +675,7 @@ model User { email String @unique isAdmin Boolean @default(false) + //highlight-next-line @@id(name: "fullName", fields: [firstName, lastName]) } ``` @@ -661,12 +688,13 @@ Refer to the documentation on [working with composite IDs](/orm/prisma-client/sp -##### @unique fields as unique identifiers +##### `@unique` fields as unique identifiers -In the following example, users are uniquely identified by a `@unique` field. Because the `email` field functions as a unique identifier for the model (which is required by Prisma), it must be mandatory: +In the following example, users are uniquely identified by a `@unique` field. Because the `email` field functions as a unique identifier for the model (which is required), it must be mandatory: ```prisma highlight=2;normal model User { + //highlight-next-line email String @unique name String? role Role @default(USER) @@ -690,6 +718,7 @@ In the following example, the `User` ID is represented by the `id` string field ```prisma highlight=2;normal model User { + //highlight-next-line id String @id @default(auto()) @map("_id") @db.ObjectId email String @unique name String? @@ -703,6 +732,7 @@ In the following example, the `User` ID is represented by the `id` string field ```prisma highlight=2;normal model User { + //highlight-next-line id String @id @map("_id") email String @unique name String? @@ -723,14 +753,16 @@ MongoDB does not support composite IDs, which means you cannot identify a model You can define default values for scalar fields of your models using the [`@default`](/orm/reference/prisma-schema-reference#default) attribute: -, ]}> - + + ```prisma highlight=3,5;normal model Post { id Int @id @default(autoincrement()) + //highlight-next-line createdAt DateTime @default(now()) title String + //highlight-next-line published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int @@ -738,8 +770,8 @@ model Post { } ``` - - + + ```prisma highlight=3,5;normal model Post { @@ -753,18 +785,18 @@ model Post { } ``` - + `@default` attributes either: - Represent `DEFAULT` values in the underlying database (relational databases only) _or_ -- Use a Prisma-level function. For example, `cuid()` and `uuid()` are provided by Prisma's [query engine](/orm/more/under-the-hood/engines) for all connectors. +- Use a Prisma ORM-level function. For example, `cuid()` and `uuid()` are provided by Prisma Client's [query engine](/orm/more/under-the-hood/engines) for all connectors. Default values can be: - Static values that correspond to the field type, such as `5` (`Int`), `Hello` (`String`), or `false` (`Boolean`) -- [Lists](/orm/reference/prisma-schema-reference#-modifier) of static values, such as `[5, 6, 8]` (`Int[]`) or `["Hello", "Goodbye"]` (`String`[]). These are available in versions `4.0.0` and later, when using databases where Prisma supports them (PostgreSQL, CockroachDB and MongoDB) +- [Lists](/orm/reference/prisma-schema-reference#-modifier) of static values, such as `[5, 6, 8]` (`Int[]`) or `["Hello", "Goodbye"]` (`String`[]). These are available in Prisma ORM versions `4.0.0` and later, when using supported databases (PostgreSQL, CockroachDB and MongoDB) - [Functions](#using-functions), such as [`now()`](/orm/reference/prisma-schema-reference#now) or [`uuid()`](/orm/reference/prisma-schema-reference#uuid) @@ -779,8 +811,8 @@ You can add unique attributes to your models to be able to uniquely identify ind In the following example, the value of the `email` field must be unique: -, ]}> - + + ```prisma model User { @@ -790,8 +822,8 @@ model User { } ``` - - + + ```prisma model User { @@ -801,13 +833,13 @@ model User { } ``` - + In the following example, a combination of `authorId` and `title` must be unique: -, ]}> - + + ```prisma highlight=10;normal model Post { @@ -819,12 +851,13 @@ model Post { authorId Int categories Category[] @relation(references: [id]) + //highlight-next-line @@unique([authorId, title]) } ``` - - + + ```prisma highlight=10;normal model Post { @@ -836,11 +869,12 @@ model Post { authorId String @db.ObjectId categories Category[] @relation(references: [id]) + //highlight-next-line @@unique([authorId, title]) } ``` - + @@ -864,6 +898,7 @@ model Post { authorId String @db.ObjectId categories Category[] @relation(references: [id]) + //highlight-next-line @@unique(name: "authorTitle", [authorId, title]) } ``` @@ -882,7 +917,7 @@ When using the MongoDB provider in version `3.12.0` and later, you can define a The following example defines a multi-column unique constraint based on the `email` field of the `User` model and the `number` field of the `Address` composite type which is used in `User.address`: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers type Address { street String number Int @@ -899,7 +934,7 @@ model User { This notation can be chained if there is more than one nested composite type: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers type City { name String } @@ -944,7 +979,7 @@ When using the MongoDB provider in version `3.12.0` and later, you can define an The following example defines a multi-column index based on the `email` field of the `User` model and the `number` field of the `Address` composite type: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers type Address { street String number Int @@ -961,7 +996,7 @@ model User { This notation can be chained if there is more than one nested composite type: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers type City { name String } @@ -981,47 +1016,53 @@ model User { ## Defining enums -You can define enums in your data model [if enums are supported for your database connector](/orm/reference/database-features#misc), either natively or at Prisma level. +You can define enums in your data model [if enums are supported for your database connector](/orm/reference/database-features#misc), either natively or at Prisma ORM level. -Enums are considered [scalar](#scalar-fields) types in the Prisma data model. They're therefore [by default](/orm/prisma-client/queries/select-fields#return-the-default-selection-set) included as return values in [Prisma Client queries](/orm/prisma-client/queries/crud). +Enums are considered [scalar](#scalar-fields) types in the Prisma schema data model. They're therefore [by default](/orm/prisma-client/queries/select-fields#return-the-default-selection-set) included as return values in [Prisma Client queries](/orm/prisma-client/queries/crud). Enums are defined via the [`enum`](/orm/reference/prisma-schema-reference#enum) block. For example, a `User` has a `Role`: -, ]}> - + + ```prisma highlight=5,8-11;normal model User { id Int @id @default(autoincrement()) email String @unique name String? + //highlight-next-line role Role @default(USER) } +//highlight-start enum Role { USER ADMIN } +//highlight-end ``` - - + + ```prisma highlight=5,8-11;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String @unique name String? + //highlight-next-line role Role @default(USER) } +//highlight-start enum Role { USER ADMIN } +//highlight-end ``` - + ## Defining composite types @@ -1042,7 +1083,7 @@ Composite types (known as [embedded documents](https://docs.mongodb.com/manual/c To define a composite type, use the `type` block. As an example, take the following schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Product { id String @id @default(auto()) @map("_id") @db.ObjectId name String @@ -1084,8 +1125,8 @@ The Prisma schema supports a number of [functions](/orm/reference/prisma-schema- For example, the default value of `createdAt` is [`now()`](/orm/reference/prisma-schema-reference#now) : -, ]}> - + + ```prisma model Post { @@ -1094,8 +1135,8 @@ model Post { } ``` - - + + ```prisma model Post { @@ -1104,18 +1145,18 @@ model Post { } ``` - + -[`cuid()`](/orm/reference/prisma-schema-reference#cuid) and [`uuid()`](/orm/reference/prisma-schema-reference#uuid) are implemented by Prisma and therefore are not "visible" in the underlying database schema. You can still use them when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma's [query engine](/orm/more/under-the-hood/engines) +[`cuid()`](/orm/reference/prisma-schema-reference#cuid) and [`uuid()`](/orm/reference/prisma-schema-reference#uuid) are implemented by Prisma ORM and therefore are not "visible" in the underlying database schema. You can still use them when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma Client's [query engine](/orm/more/under-the-hood/engines) Support for [`autoincrement()`](/orm/reference/prisma-schema-reference#autoincrement) , [`now()`](/orm/reference/prisma-schema-reference#now) and [`dbgenerated()`](/orm/reference/prisma-schema-reference#dbgenerated) differ between databases. -**Relational database connectors** implement `autoincrement()`, `dbgenerated()`, and `now()` at database level. The **MongoDB connector** does not support `autoincrement()` or `dbgenerated()`, and `now()` is implemented at Prisma level. The [`auto()`](/orm/reference/prisma-schema-reference#auto) function is used to generate an `ObjectId`. +**Relational database connectors** implement `autoincrement()`, `dbgenerated()`, and `now()` at database level. The **MongoDB connector** does not support `autoincrement()` or `dbgenerated()`, and `now()` is implemented at Prisma ORM level. The [`auto()`](/orm/reference/prisma-schema-reference#auto) function is used to generate an `ObjectId`. ## Relations -Refer to the [relations documentation](relations) for more examples and information about relationships between models. +Refer to the [relations documentation](/orm/prisma-schema/data-model/relations) for more examples and information about relationships between models. ## Models in Prisma Client @@ -1176,7 +1217,7 @@ Note that the relation fields `posts` and `profile` are not included in the type ### Records must be uniquely identifiable -Prisma currently only supports models that have at least one unique field or combination of fields. In practice, this means that every Prisma model must have either at least one of the following attributes: +Prisma ORM currently only supports models that have at least one unique field or combination of fields. In practice, this means that every Prisma model must have either at least one of the following attributes: - `@id` or `@@id` for a single- or multi-field primary key constraint (max one per model) - `@unique` or `@@unique` for a single- or multi-field unique constraint diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx index 35ac1c56c5..f373d77592 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/100-one-to-one-relations.mdx @@ -1,6 +1,6 @@ --- title: One-to-one relations -metaDescription: How to define and work with one-to-one relations in Prisma. +description: How to define and work with one-to-one relations in Prisma. tocDepth: 3 --- @@ -14,8 +14,8 @@ This page introduces one-to-one relations and explains how to use them in your P One-to-one (1-1) relations refer to relations where at most **one** record can be connected on both sides of the relation. In the example below, there is a one-to-one relation between `User` and `Profile`: -, ]}> - + + ```prisma model User { @@ -30,8 +30,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -46,7 +46,7 @@ model Profile { } ``` - + The `userId` relation scalar is a direct representation of the foreign key in the underlying database. This one-to-one relation expresses the following: @@ -56,8 +56,8 @@ The `userId` relation scalar is a direct representation of the foreign key in th In the previous example, the `user` relation field of the `Profile` model references the `id` field of the `User` model. You can also reference a different field. In this case, you need to mark the field with the `@unique` attribute, to guarantee that there is only a single `User` connected to each `Profile`. In the following example, the `user` field references an `email` field in the `User` model, which is marked with the `@unique` attribute: -, ]}> - + + ```prisma model User { @@ -73,8 +73,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -90,12 +90,12 @@ model Profile { } ``` - + -In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. +In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma ORM versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. @@ -103,9 +103,6 @@ In MySQL, you can create a foreign key with only an index on the referenced side In **relational databases only**, you can also use [multi-field IDs](/orm/reference/prisma-schema-reference#id-1) to define a 1-1 relation: -]}> - - ```prisma model User { firstName String @@ -125,11 +122,6 @@ model Profile { } ``` - - - - - ## 1-1 relations in the database ### Relational databases @@ -147,7 +139,7 @@ CREATE TABLE "Profile" ( ); ``` -Notice that there is a `UNIQUE` constraint on the foreign key `userId`. If this `UNIQUE` constraint was missing, the relation would be considered a [1-n relation](one-to-many-relations). +Notice that there is a `UNIQUE` constraint on the foreign key `userId`. If this `UNIQUE` constraint was missing, the relation would be considered a [1-n relation](/orm/prisma-schema/data-model/relations/one-to-many-relations). The following example demonstrates how to create a 1-1 relation in SQL using a composite key (`firstName` and `lastName`): @@ -168,7 +160,7 @@ CREATE TABLE "Profile" ( ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following MongoDB document represents a `User`: @@ -193,6 +185,7 @@ In a one-to-one relation, the side of the relation _without_ a relation scalar ( ```prisma highlight=3;normal model User { id Int @id @default(autoincrement()) + //highlight-next-line profile Profile? // No relation scalar - must be optional } ``` @@ -241,8 +234,8 @@ In **1-1 relations**, you can decide yourself which side of the relation you wan In the following example, the relation field on the `Profile` model is annotated with the `@relation` attribute. `userId` is a direct representation of the foreign key in the underlying database: -, ]}> - + + ```prisma model User { @@ -257,8 +250,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -273,13 +266,13 @@ model Profile { } ``` - + You can also annotate the other side of the relation with the `@relation` attribute. The following example annotates the relation field on the `User` model. `profileId` is a direct representation of the foreign key in the underlying database: -, ]}> - + + ```prisma model User { @@ -294,8 +287,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -310,5 +303,5 @@ model Profile { } ``` - + diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx index 62b1169d76..993496467c 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/200-one-to-many-relations.mdx @@ -1,6 +1,6 @@ --- title: One-to-many relations -metaDescription: How to define and work with one-to-many relations in Prisma. +description: How to define and work with one-to-many relations in Prisma. tocDepth: 3 --- @@ -14,8 +14,8 @@ This page introduces one-to-many relations and explains how to use them in your One-to-many (1-n) relations refer to relations where one record on one side of the relation can be connected to zero or more records on the other side. In the following example, there is one one-to-many relation between the `User` and `Post` models: -, ]}> - + + ```prisma model User { @@ -30,8 +30,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -46,7 +46,7 @@ model Post { } ``` - + > **Note** The `posts` field does not "manifest" in the underlying database schema. On the other side of the relation, the [annotated relation field](/orm/prisma-schema/data-model/relations#relation-fields) `author` and its relation scalar `authorId` represent the side of the relation that stores the foreign key in the underlying database. @@ -58,8 +58,8 @@ This one-to-many relation expresses the following: In the previous example, the `author` relation field of the `Post` model references the `id` field of the `User` model. You can also reference a different field. In this case, you need to mark the field with the `@unique` attribute, to guarantee that there is only a single `User` connected to each `Post`. In the following example, the `author` field references an `email` field in the `User` model, which is marked with the `@unique` attribute: -, ]}> - + + ```prisma model User { @@ -75,8 +75,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -92,12 +92,12 @@ model Post { } ``` - + -In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. +In MySQL, you can create a foreign key with only an index on the referenced side, and not a unique constraint. In Prisma ORM versions 4.0.0 and later, if you introspect a relation of this type it will trigger a validation error. To fix this, you will need to add a `@unique` constraint to the referenced field. @@ -105,9 +105,6 @@ In MySQL, you can create a foreign key with only an index on the referenced side In **relational databases only**, you can also define this relation using [multi-field IDs](/orm/reference/prisma-schema-reference#id-1)/composite key: -]}> - - ```prisma model User { firstName String @@ -125,11 +122,6 @@ model Post { } ``` - - - - - ## 1-n relations in the database ### Relational databases @@ -171,7 +163,7 @@ In relational databases, the main difference between a 1-1 and a 1-n-relation is ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following MongoDB document represents a `User`: @@ -213,8 +205,8 @@ The annotated relation field and relation scalar of a 1-n relation can either _b In the following example, you can create a `Post` without assigning a `User`: -, ]}> - + + ```prisma model User { @@ -229,8 +221,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -245,15 +237,15 @@ model Post { } ``` - + ### Mandatory one-to-many relation In the following example, you must assign a `User` when you create a `Post`: -, ]}> - + + ```prisma model User { @@ -268,8 +260,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -284,5 +276,5 @@ model Post { } ``` - + diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/300-many-to-many-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/300-many-to-many-relations.mdx index 89499c2ab9..4fffa4c22d 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/300-many-to-many-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/300-many-to-many-relations.mdx @@ -1,6 +1,6 @@ --- title: Many-to-many relations -metaDescription: How to define and work with many-to-many relations in Prisma. +description: How to define and work with many-to-many relations in Prisma. tocDepth: 3 --- @@ -82,9 +82,9 @@ ALTER TABLE "CategoriesOnPosts" ADD CONSTRAINT "CategoriesOnPosts_postId_fkey" F ALTER TABLE "CategoriesOnPosts" ADD CONSTRAINT "CategoriesOnPosts_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ``` -Note that the same rules as for [1-n relations](one-to-many-relations) apply (because `Post`↔ `CategoriesOnPosts` and `Category` ↔ `CategoriesOnPosts` are both in fact 1-n relations), which means one side of the relation needs to be annotated with the `@relation` attribute. +Note that the same rules as for [1-n relations](/orm/prisma-schema/data-model/relations/one-to-many-relations) apply (because `Post`↔ `CategoriesOnPosts` and `Category` ↔ `CategoriesOnPosts` are both in fact 1-n relations), which means one side of the relation needs to be annotated with the `@relation` attribute. -When you don't need to attach additional information to the relation, you can model m-n-relations as [implicit m-n-relations](#implicit-many-to-many-relations). If you're not using Prisma Migrate but obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still make use of implicit m-n-relations by following Prisma's [conventions for relation tables](#conventions-for-relation-tables-in-implicit-m-n-relations). +When you don't need to attach additional information to the relation, you can model m-n-relations as [implicit m-n-relations](#implicit-many-to-many-relations). If you're not using Prisma Migrate but obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still make use of implicit m-n-relations by following Prisma ORM's [conventions for relation tables](#conventions-for-relation-tables-in-implicit-m-n-relations). #### Querying an explicit many-to-many @@ -238,14 +238,14 @@ const getAssignments = await prisma.categoriesOnPosts.findMany({ ### Implicit many-to-many relations -Implicit m-n relations define relation fields as lists on both sides of the relation. Although the relation table exists in the underlying database, **it is managed by Prisma and does not manifest in the Prisma schema**. Implicit relation tables follow a [specific convention](#conventions-for-relation-tables-in-implicit-m-n-relations). +Implicit m-n relations define relation fields as lists on both sides of the relation. Although the relation table exists in the underlying database, **it is managed by Prisma ORM and does not manifest in the Prisma schema**. Implicit relation tables follow a [specific convention](#conventions-for-relation-tables-in-implicit-m-n-relations). Implicit m-n-relations makes the [Prisma Client API](/orm/prisma-client) for m-n-relations a bit simpler (since you have one fewer level of nesting inside of [nested writes](/orm/prisma-client/queries/relation-queries#nested-writes)). In the example below, there's one _implicit_ m-n-relation between `Post` and `Category`: -, ]}> - + + ```prisma model Post { @@ -261,8 +261,8 @@ model Category { } ``` - - + + ```sql CREATE TABLE "Category" ( @@ -282,7 +282,7 @@ CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON "_CategoryToPost"("A" int4_op CREATE INDEX "_CategoryToPost_B_index" ON "_CategoryToPost"("B" int4_ops); ``` - + #### Querying an implicit many-to-many @@ -348,7 +348,7 @@ Implicit m-n relations: #### Conventions for relation tables in implicit m-n relations -If you obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still use implicit m-n-relations by following Prisma's [conventions for relation tables](#conventions-for-relation-tables-in-implicit-m-n-relations). The following example assumes you want to create a relation table to get an implicit m-n-relation for two models called `Post` and `Category`. +If you obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still use implicit m-n-relations by following Prisma ORM's [conventions for relation tables](#conventions-for-relation-tables-in-implicit-m-n-relations). The following example assumes you want to create a relation table to get an implicit m-n-relation for two models called `Post` and `Category`. ##### Relation table @@ -458,7 +458,7 @@ model Video { #### Configuring the name of the relation table in implicit many-to-many relations -When using Prisma Migrate, you can configure the name of the relation table that's managed by Prisma using the `@relation` attribute. For example, if you want the relation table to be called `_MyRelationTable` instead of the default name `_CategoryToPost`, you can specify it as follows: +When using Prisma Migrate, you can configure the name of the relation table that's managed by Prisma ORM using the `@relation` attribute. For example, if you want the relation table to be called `_MyRelationTable` instead of the default name `_CategoryToPost`, you can specify it as follows: ```prisma model Post { @@ -476,7 +476,7 @@ model Category { A relation table (also sometimes called a _JOIN_, _link_ or _pivot_ table) connects two or more other tables and therefore creates a _relation_ between them. Creating relation tables is a common data modelling practice in SQL to represent relationships between different entities. In essence it means that "one m-n relation is modeled as two 1-n relations in the database". -We recommend using [implicit](#implicit-many-to-many-relations) m-n-relations, where Prisma automatically generates the relation table in the underlying database. [Explicit](#explicit-many-to-many-relations) m-n-relations should be used when you need to store additional data in the relations, such as the date the relation was created. +We recommend using [implicit](#implicit-many-to-many-relations) m-n-relations, where Prisma ORM automatically generates the relation table in the underlying database. [Explicit](#explicit-many-to-many-relations) m-n-relations should be used when you need to store additional data in the relations, such as the date the relation was created. ## MongoDB @@ -502,7 +502,7 @@ model Category { } ``` -Prisma validates m-n-relations in MongoDB with the following rules: +Prisma ORM validates m-n-relations in MongoDB with the following rules: - The fields on both sides of the relation must have a list type (in the example above, `categories` have a type of `Category[]` and `posts` have a type of `Post[]`) - The `@relation` attribute must define `fields` and `references` arguments on both sides diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/400-self-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/400-self-relations.mdx index 158e941dc1..adf4c121ea 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/400-self-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/400-self-relations.mdx @@ -1,6 +1,6 @@ --- title: Self-relations -metaDescription: How to define and work with self-relations in Prisma. +description: How to define and work with self-relations in Prisma. --- @@ -15,8 +15,8 @@ Note that self-relations always require the `@relation` attribute. The following example models a one-to-one self-relation: -, ]}> - + + ```prisma model User { @@ -28,8 +28,8 @@ model User { } ``` - - + + ```prisma model User { @@ -41,7 +41,7 @@ model User { } ``` - + This relation expresses the following: @@ -61,64 +61,70 @@ To create a one-to-one self-relation: Either side of the relation can be backed by a foreign key. In the previous example, repeated below, `successor` is backed by `successorId`: -, ]}> - + + ```prisma highlight=4;normal model User { id Int @id @default(autoincrement()) name String? + //highlight-next-line successorId Int? @unique successor User? @relation("BlogOwnerHistory", fields: [successorId], references: [id]) predecessor User? @relation("BlogOwnerHistory") } ``` - - + + ```prisma highlight=4;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId name String? + //highlight-next-line successorId String? @unique @db.ObjectId successor User? @relation("BlogOwnerHistory", fields: [successorId], references: [id]) predecessor User? @relation("BlogOwnerHistory") } ``` - + Alternatively, you could rewrite this so that `predecessor` is backed by `predecessorId`: -]}> - + + ```prisma highlight=5,6;normal model User { id Int @id @default(autoincrement()) name String? successor User? @relation("BlogOwnerHistory") + //highlight-start predecessorId Int? @unique predecessor User? @relation("BlogOwnerHistory", fields: [predecessorId], references: [id]) + //highlight-end } ``` - - + + ```prisma highlight=5,6;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId name String? successor User? @relation("BlogOwnerHistory") + //highlight-start predecessorId String? @unique @db.ObjectId predecessor User? @relation("BlogOwnerHistory", fields: [predecessorId], references: [id]) + //highlight-end } ``` - + No matter which side is backed by a foreign key, Prisma Client surfaces both the `predecessor` and `successor` fields: @@ -145,10 +151,7 @@ const x = await prisma.user.create({ ### Relational databases -In relational databases, a one-to-one self-relation is represented by the following SQL: - -]}> - +In **relational databases only**, a one-to-one self-relation is represented by the following SQL: ```sql CREATE TABLE "User" ( @@ -162,14 +165,9 @@ ALTER TABLE "User" ADD CONSTRAINT fk_successor_user FOREIGN KEY ("successorId") ALTER TABLE "User" ADD CONSTRAINT successor_unique UNIQUE ("successorId"); ``` - - - - - ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following MongoDB documents represent a one-to-one self-relation between two users: @@ -189,8 +187,8 @@ The following MongoDB documents represent a one-to-one self-relation between two A one-to-many self-relation looks as follows: -, ]}> - + + ```prisma model User { @@ -202,8 +200,8 @@ model User { } ``` - - + + ```prisma model User { @@ -215,7 +213,7 @@ model User { } ``` - + This relation expresses the following: @@ -245,7 +243,7 @@ Notice the lack of `UNIQUE` constraint on `teacherId` - multiple students can ha ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following MongoDB documents represent a one-to-many self-relation between three users - one teacher and two students with the same `teacherId`: @@ -276,8 +274,8 @@ The following MongoDB documents represent a one-to-many self-relation between th A many-to-many self-relation looks as follows: -, ]}> - + + ```prisma model User { @@ -288,8 +286,8 @@ model User { } ``` - - + + ```prisma model User { @@ -302,7 +300,7 @@ model User { } ``` - + This relation expresses the following: @@ -310,12 +308,9 @@ This relation expresses the following: - "a user can be followed by zero or more users" - "a user can follow zero or more users" -Note that for relational databases, this many-to-many-relation is [implicit](many-to-many-relations#implicit-many-to-many-relations). This means Prisma maintains a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) for it in the underlying database. +Note that for relational databases, this many-to-many-relation is [implicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). This means Prisma ORM maintains a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) for it in the underlying database. -If you need the relation to hold other fields, you can create an [explicit](many-to-many-relations#explicit-many-to-many-relations) many-to-many self relation as well. The explicit version of the self relation shown previously is as follows: - -]}> - +If you need the relation to hold other fields, you can create an [explicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations) many-to-many self relation as well. The explicit version of the self relation shown previously is as follows: ```prisma model User { @@ -335,30 +330,6 @@ model Follows { } ``` - - - -```prisma -model User { - id Int @id @default(autoincrement()) - name String? - followedBy Follows[] @relation("following") - following Follows[] @relation("follower") -} - -model Follows { - follower User @relation("follower", fields: [followerId], references: [id]) - followerId Int - following User @relation("following", fields: [followingId], references: [id]) - followingId Int - - @@id([followerId, followingId]) -} -``` - - - - ### Many-to-many self-relations in the database ### Relational databases @@ -378,7 +349,7 @@ CREATE TABLE "_UserFollows" ( ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following MongoDB documents represent a many-to-many self-relation between five users - two users that follow `"Bob"`, and two users that follow him: @@ -433,8 +404,8 @@ The following MongoDB documents represent a many-to-many self-relation between f You can also define multiple self-relations on the same model at once. Taking all relations from the previous sections as example, you could define a `User` model as follows: -, ]}> - + + ```prisma model User { @@ -448,8 +419,8 @@ model User { } ``` - - + + ```prisma model User { @@ -465,5 +436,5 @@ model User { } ``` - + diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/100-special-rules-for-referential-actions.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/100-special-rules-for-referential-actions.mdx index 64174bd2c9..00d117e539 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/100-special-rules-for-referential-actions.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/100-special-rules-for-referential-actions.mdx @@ -1,7 +1,7 @@ --- title: 'Special rules for referential actions in SQL Server and MongoDB' metaTitle: 'Special rules for referential actions in SQL Server and MongoDB' -metaDescription: 'Circular references or multiple cascade paths can cause validation errors on Microsoft SQL Server and MongoDB. Since the database does not handle these situations out of the box, learn how to solve this problem.' +description: 'Circular references or multiple cascade paths can cause validation errors on Microsoft SQL Server and MongoDB. Since the database does not handle these situations out of the box, learn how to solve this problem.' tocDepth: 3 --- @@ -9,9 +9,9 @@ tocDepth: 3 Some databases have specific requirements that you should consider if you are using referential actions. -- Microsoft SQL Server doesn't allow cascading referential actions on a foreign key, if the relation chain causes a cycle or multiple cascade paths. If the referential actions on the foreign key are set to something other than `NO ACTION` (or `NoAction` if Prisma is managing referential integrity), the server will check for cycles or multiple cascade paths and return an error when executing the SQL. +- Microsoft SQL Server doesn't allow cascading referential actions on a foreign key, if the relation chain causes a cycle or multiple cascade paths. If the referential actions on the foreign key are set to something other than `NO ACTION` (or `NoAction` if Prisma ORM is managing referential integrity), the server will check for cycles or multiple cascade paths and return an error when executing the SQL. -- With MongoDB, using referential actions in Prisma requires that for any data model with self-referential relations or cycles between three models, you must set the referential action of `NoAction` to prevent the referential action emulations from looping infinitely. Be aware that by default, the `relationMode = "prisma"` mode is used for MongoDB, which means that Prisma manages [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode). +- With MongoDB, using referential actions in Prisma ORM requires that for any data model with self-referential relations or cycles between three models, you must set the referential action of `NoAction` to prevent the referential action emulations from looping infinitely. Be aware that by default, the `relationMode = "prisma"` mode is used for MongoDB, which means that Prisma ORM manages [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode). Given the SQL: @@ -34,7 +34,7 @@ When the SQL is run, the database would throw the following error: Introducing FOREIGN KEY constraint 'FK__Employee__managerId' on table 'Employee' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. ``` -In more complicated data models, finding the cascade paths can get complex. Therefore in Prisma, the data model is validated _before_ generating any SQL to be run during any migrations, highlighting relations that are part of the paths. This makes it much easier to find and break these action chains. +In more complicated data models, finding the cascade paths can get complex. Therefore in Prisma ORM, the data model is validated _before_ generating any SQL to be run during any migrations, highlighting relations that are part of the paths. This makes it much easier to find and break these action chains. @@ -57,7 +57,7 @@ This will result in the following error: Error parsing attribute "@relation": A self-relation must have `onDelete` and `onUpdate` referential actions set to `NoAction` in one of the @relation attributes. (Implicit default `onDelete`: `SetNull`, and `onUpdate`: `Cascade`) ``` -By not defining any actions, Prisma will use the following default values depending if the underlying [scalar fields](/orm/prisma-schema/data-model/models#scalar-fields) are set to be optional or required. +By not defining any actions, Prisma ORM will use the following default values depending if the underlying [scalar fields](/orm/prisma-schema/data-model/models#scalar-fields) are set to be optional or required. | Clause | All of the scalar fields are optional | At least one scalar field is required | | :--------- | :------------------------------------ | :------------------------------------ | @@ -69,7 +69,9 @@ Since the default referential action for `onUpdate` in the above relation would ```prisma highlight=3;delete|4;add model Employee { id Int @id @default(autoincrement()) + //delete-next-line manager Employee @relation(name: "management", fields: [managerId], references: [id]) + //add-next-line manager Employee @relation(name: "management", fields: [managerId], references: [id], onDelete: NoAction, onUpdate: NoAction) managees Employee[] @relation(name: "management") managerId Int @@ -128,7 +130,9 @@ As the relation fields are required, the default referential action for `onDelet ```prisma highlight=3;delete|4;add model Chicken { id Int @id @default(autoincrement()) + //delete-next-line egg Egg @relation(fields: [eggId], references: [id]) + //add-next-line egg Egg @relation(fields: [eggId], references: [id], onUpdate: NoAction) eggId Int predators Fox[] @@ -140,7 +144,9 @@ or ```prisma highlight=3;delete|4;add model Egg { id Int @id @default(autoincrement()) + //delete-next-line predator Fox @relation(fields: [predatorId], references: [id]) + //add-next-line predator Fox @relation(fields: [predatorId], references: [id], onUpdate: NoAction) predatorId Int parents Chicken[] @@ -152,7 +158,9 @@ or ```prisma highlight=3;delete|4;add model Fox { id Int @id @default(autoincrement()) + //delete-next-line meal Chicken @relation(fields: [mealId], references: [id]) + //add-next-line meal Chicken @relation(fields: [mealId], references: [id], onUpdate: NoAction) mealId Int foodStore Egg[] @@ -209,7 +217,9 @@ model Comment { id Int @id @default(autoincrement()) writtenById Int postId Int + //delete-next-line writtenBy User @relation(fields: [writtenById], references: [id]) + //add-next-line writtenBy User @relation(fields: [writtenById], references: [id], onUpdate: NoAction) post Post @relation(fields: [postId], references: [id]) } @@ -223,7 +233,9 @@ model Comment { writtenById Int postId Int writtenBy User @relation(fields: [writtenById], references: [id]) + //delete-next-line post Post @relation(fields: [postId], references: [id]) + //add-next-line post Post @relation(fields: [postId], references: [id], onUpdate: NoAction) } ``` @@ -234,7 +246,9 @@ or model Post { id Int @id @default(autoincrement()) authorId Int + //delete-next-line author User @relation(fields: [authorId], references: [id]) + //add-next-line author User @relation(fields: [authorId], references: [id], onUpdate: NoAction) comments Comment[] } diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx index df02fa24e0..5d73cf69c7 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/410-referential-actions/index.mdx @@ -1,7 +1,7 @@ --- title: 'Referential actions' metaTitle: 'Referential actions' -metaDescription: 'Referential actions let you define the update and delete behavior of related models on the database level' +description: 'Referential actions let you define the update and delete behavior of related models on the database level' tocDepth: 3 --- @@ -9,7 +9,7 @@ tocDepth: 3 Referential actions determine what happens to a record when your application deletes or updates a related record. -From version 2.26.0, you can define referential actions on the relation fields in your Prisma schema. This allows you to define referential actions like cascading deletes and cascading updates at a Prisma level. +From version 2.26.0, you can define referential actions on the relation fields in your Prisma schema. This allows you to define referential actions like cascading deletes and cascading updates at a Prisma ORM level. @@ -23,7 +23,7 @@ From version 2.26.0, you can define referential actions on the relation fields i In the following example, adding `onDelete: Cascade` to the `author` field on the `Post` model means that deleting the `User` record will also delete all related `Post` records. -```prisma file=schema.prisma highlight=4;normal +```prisma file=schema.prisma highlight=4;normal showLineNumbers model Post { id Int @id @default(autoincrement()) title String @@ -37,14 +37,14 @@ model User { } ``` -If you do not specify a referential action, Prisma [uses a default](#referential-action-defaults). +If you do not specify a referential action, Prisma ORM [uses a default](#referential-action-defaults). - + If you upgrade from a version earlier than 2.26.0: -It is extremely important that you check the [upgrade paths for referential actions](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions) section. Prisma support of referential actions **removes the safety net in Prisma Client that prevents cascading deletes at runtime**. If you use the feature _without upgrading your database_, the [old default action](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions#prisma-2x-default-referential-actions) - `ON DELETE CASCADE` - becomes active. This might result in cascading deletes that you did not expect. +It is extremely important that you check the [upgrade paths for referential actions](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions) section. Prisma ORM's support of referential actions **removes the safety net in Prisma Client that prevents cascading deletes at runtime**. If you use the feature _without upgrading your database_, the [old default action](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions#prisma-orm-2x-default-referential-actions) - `ON DELETE CASCADE` - becomes active. This might result in cascading deletes that you did not expect. @@ -52,7 +52,9 @@ It is extremely important that you check the [upgrade paths for referential acti Referential actions are policies that define how a referenced record is handled by the database when you run an [`update`](/orm/prisma-client/queries/crud#update) or [`delete`](/orm/prisma-client/queries/crud#delete) query. -
Referential actions on the database level +
+ +Referential actions on the database level Referential actions are features of foreign key constraints that exist to preserve referential integrity in your database. @@ -66,11 +68,11 @@ By default a database will reject any operation that violates the referential in ### How to use referential actions -Referential actions are defined in the [`@relation`](/orm/reference/prisma-schema-reference#relation) attribute and map to the actions on the **foreign key constraint** in the underlying database. If you do not specify a referential action, [Prisma falls back to a default](#referential-action-defaults). +Referential actions are defined in the [`@relation`](/orm/reference/prisma-schema-reference#relation) attribute and map to the actions on the **foreign key constraint** in the underlying database. If you do not specify a referential action, [Prisma ORM falls back to a default](#referential-action-defaults). The following model defines a one-to-many relation between `User` and `Post` and a many-to-many relation between `Post` and `Tag`, with explicitly defined referential actions: -```prisma file=schema.prisma highlight=10,16-17;normal +```prisma file=schema.prisma highlight=10,16-17;normal showLineNumbers model User { id Int @id @default(autoincrement()) posts Post[] @@ -104,7 +106,7 @@ This model explicitly defines the following referential actions: - If you delete a `Tag`, the corresponding tag assignment is also deleted in `TagOnPosts`, using the `Cascade` referential action - If you delete a `User`, the author is removed from all posts by setting the field value to `Null`, because of the `SetNull` referential action. To allow this, `User` and `userId` must be optional fields in `Post`. -Prisma supports the following referential actions: +Prisma ORM supports the following referential actions: - [`Cascade`](#cascade) - [`Restrict`](#restrict) @@ -114,7 +116,7 @@ Prisma supports the following referential actions: ### Referential action defaults -If you do not specify a referential action, Prisma uses the following defaults: +If you do not specify a referential action, Prisma ORM uses the following defaults: | Clause | Optional relations | Mandatory relations | | :--------- | :----------------- | :------------------ | @@ -127,6 +129,7 @@ For example, in the following schema all `Post` records must be connected to a ` model Post { id Int @id @default(autoincrement()) title String + //highlight-next-line author User @relation(fields: [authorId], references: [id]) authorId Int } @@ -162,42 +165,43 @@ The following table shows which referential action each database supports. - † See [special cases for MySQL](#mysql). - ⌘ See [special cases for PostgreSQL](#postgresql). - ‡ See [special cases for SQL Server](#sql-server). -- †† Referential actions for MongoDB are available in Prisma versions 3.7.0 and later. +- †† Referential actions for MongoDB are available in Prisma ORM versions 3.7.0 and later. ### Special cases for referential actions Referential actions are part of the ANSI SQL standard. However, there are special cases where some relational databases diverge from the standard. -#### MySQL +#### MySQL/MariaDB -MySQL, and the underlying InnoDB storage engine, does not support `SetDefault`. The exact behavior depends on the database version: +MySQL/MariaDB, and the underlying InnoDB storage engine, does not support `SetDefault`. The exact behavior depends on the database version: - In MySQL versions 8 and later, and MariaDB versions 10.5 and later, `SetDefault` effectively acts as an alias for `NoAction`. You can define tables using the `SET DEFAULT` referential action, but a foreign key constraint error is triggered at runtime. - In MySQL versions 5.6 and later, and MariaDB versions before 10.5, attempting to create a table definition with the `SET DEFAULT` referential action fails with a syntax error. -For this reason, when you set `mysql` as the database provider, Prisma warns users to replace `SetDefault` referential actions in the Prisma schema with another action. +For this reason, when you set `mysql` as the database provider, Prisma ORM warns users to replace `SetDefault` referential actions in the Prisma schema with another action. #### PostgreSQL -PostgreSQL is the only database supported by Prisma that allows you to define a `SetNull` referential action that refers to a non-nullable field. However, this raises a foreign key constraint error when the action is triggered at runtime. +PostgreSQL is the only database supported by Prisma ORM that allows you to define a `SetNull` referential action that refers to a non-nullable field. However, this raises a foreign key constraint error when the action is triggered at runtime. -For this reason, when you set `postgres` as the database provider in the (default) `foreignKeys` relation mode, Prisma warns users to mark as optional any fields that are included in a `@relation` attribute with a `SetNull` referential action. For all other database providers, Prisma rejects the schema with a validation error. +For this reason, when you set `postgres` as the database provider in the (default) `foreignKeys` relation mode, Prisma ORM warns users to mark as optional any fields that are included in a `@relation` attribute with a `SetNull` referential action. For all other database providers, Prisma ORM rejects the schema with a validation error. #### SQL Server [`Restrict`](#restrict) is not available for SQL Server databases, but you can use [`NoAction`](#noaction) instead. -### Cascade +### `Cascade` - `onDelete: Cascade` Deleting a referenced record will trigger the deletion of referencing record. - `onUpdate: Cascade` Updates the relation scalar fields if the referenced scalar fields of the dependent record are updated. #### Example usage -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User @relation(fields: [authorId], references: [id], onDelete: Cascade, onUpdate: Cascade) authorId Int } @@ -226,17 +230,18 @@ If a `User` record is deleted, then their posts are deleted too. If the user's ` >
-### Restrict +### `Restrict` - `onDelete: Restrict` Prevents the deletion if any referencing records exist. - `onUpdate: Restrict` Prevents the identifier of a referenced record from being changed. #### Example usage -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User @relation(fields: [authorId], references: [id], onDelete: Restrict, onUpdate: Restrict) authorId Int } @@ -257,7 +262,7 @@ The `Restrict` action is **not** available on [Microsoft SQL Server](/orm/overvi -### NoAction +### `NoAction` The `NoAction` action is similar to `Restrict`, the difference between the two is dependent on the database being used: @@ -269,16 +274,17 @@ The `NoAction` action is similar to `Restrict`, the difference between the two i -If you are [managing relations in Prisma Client](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-with-the-prisma-relation-mode) rather than using foreign keys in the database, you should be aware that currently Prisma only implements the referential actions. Foreign keys also create constraints, which make it impossible to manipulate data in a way that would violate these constraints: instead of executing the query, the database responds with an error. These constraints will not be created if you emulate referential integrity in Prisma Client, so if you set the referential action to `NoAction` there will be no checks to prevent you from breaking the referential integrity. +If you are [managing relations in Prisma Client](/orm/prisma-schema/data-model/relations/relation-mode#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode) rather than using foreign keys in the database, you should be aware that currently Prisma ORM only implements the referential actions. Foreign keys also create constraints, which make it impossible to manipulate data in a way that would violate these constraints: instead of executing the query, the database responds with an error. These constraints will not be created if you emulate referential integrity in Prisma Client, so if you set the referential action to `NoAction` there will be no checks to prevent you from breaking the referential integrity. #### Example usage -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction) authorId Int } @@ -293,7 +299,7 @@ model User { `User`'s with posts **cannot** be deleted. The `User`'s `id` **cannot** be changed. -### SetNull +### `SetNull` - `onDelete: SetNull` The scalar field of the referencing object will be set to `NULL`. @@ -301,10 +307,11 @@ model User { `SetNull` will only work on optional relations. On required relations, a runtime error will be thrown since the scalar fields cannot be null. -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User? @relation(fields: [authorId], references: [id], onDelete: SetNull, onUpdate: SetNull) authorId Int? } @@ -321,7 +328,7 @@ When deleting a `User`, the `authorId` will be set to `NULL` for all its authore When changing a `User`'s `id`, the `authorId` will be set to `NULL` for all its authored posts. -### SetDefault +### `SetDefault` - `onDelete: SetDefault` The scalar field of the referencing object will be set to the fields default value. @@ -329,12 +336,14 @@ When changing a `User`'s `id`, the `authorId` will be set to `NULL` for all its These require setting a default for the relation scalar field with [`@default`](/orm/reference/prisma-schema-reference#default). If no defaults are provided for any of the scalar fields, a runtime error will be thrown. -```prisma file=schema.prisma highlight=4,5;add +```prisma file=schema.prisma highlight=4,5;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-start authorUsername String? @default("anonymous") author User? @relation(fields: [authorUsername], references: [username], onDelete: SetDefault, onUpdate: SetDefault) + //add-end } model User { @@ -367,11 +376,11 @@ The following assumes you have upgraded to 2.26.0 or newer and enabled the previ If you [Introspect](/orm/prisma-schema/introspection) your database, the referential actions configured at the database level will be reflected in your Prisma Schema. If you have been using Prisma Migrate or `prisma db push` to manage the database schema, these are likely to be the [default values](#referential-action-defaults) from 2.25.0 and earlier. -When you run an Introspection, Prisma compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. +When you run an Introspection, Prisma ORM compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. After introspecting, you can review the non-default clauses in your schema. The most important clause to review is `onDelete`, which defaults to `Cascade` in 2.25.0 and earlier. - + If you are using either the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteMany()`](/orm/prisma-client/queries/crud#delete-all-records) methods, **[cascading deletes](#how-to-use-cascading-deletes) will now be performed** as the `referentialActions` preview feature **removed the safety net in Prisma Client that previously prevented cascading deletes at runtime**. Be sure to check your code and make any adjustments accordingly. @@ -389,10 +398,11 @@ The following example would result in a cascading delete, if the `User` is delet #### A blog schema example -```prisma highlight=4;add +```prisma highlight=4;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User @relation(fields: [authorId], references: [id], onDelete: Cascade) authorId Int } @@ -414,15 +424,15 @@ You will have to manually add them if you wish to use anything other than the ne -Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma uses the [new defaults](#referential-action-defaults). +Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma ORM uses the [new defaults](#referential-action-defaults). Note that referential actions can be added on a case by case basis. This means that you can add them to one single relation and leave the rest set to the defaults by not manually specifying anything. ### Checking for errors -**Before** upgrading to 2.26.0 and enabling the referential actions **preview feature**, Prisma prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. +**Before** upgrading to 2.26.0 and enabling the referential actions **preview feature**, Prisma ORM prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. -**After** upgrading and enabling the referential actions **preview feature**, Prisma no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. +**After** upgrading and enabling the referential actions **preview feature**, Prisma ORM no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. When you use [`NoAction`](#noaction) or [`Restrict`](#restrict) to prevent the deletion of records, the error messages will be different post 2.26.0 compared to pre 2.26.0. This is because they are now triggered by the database and **not** Prisma Client. The new error code that can be expected is `P2003`. @@ -434,7 +444,7 @@ The following example uses the below blog schema with a one-to-many relationship This means that if a user has a post, that user (and their posts) **cannot** be deleted. -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) title String @@ -450,7 +460,7 @@ model User { Prior to upgrading and enabling the referential actions **preview feature**, the error code you would receive when trying to delete a user which has posts would be `P2014` and it's message: -> "The change you are trying to make would violate the required relation '{relation_name}' between the {model_a_name} and {model_b_name} models." +> "The change you are trying to make would violate the required relation '\{relation_name}' between the \{model_a_name\} and \{model_b_name\} models." ```ts import { PrismaClient } from '@prisma/client' @@ -478,7 +488,7 @@ main() To make sure you are checking for the correct errors in your code, modify your check to look for `P2003`, which will deliver the message: -> "Foreign key constraint failed on the field: {field_name}" +> "Foreign key constraint failed on the field: \{field_name\}" ```ts highlight=14;delete|15;add import { PrismaClient } from '@prisma/client' diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx index 8ff4964b82..410e3d051d 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/420-relation-mode.mdx @@ -1,31 +1,34 @@ --- title: 'Relation mode' metaTitle: 'Manage relations between records with relation modes in Prisma' -metaDescription: 'Manage relations between records with relation modes in Prisma' +description: 'Manage relations between records with relation modes in Prisma' tocDepth: 3 --- -In Prisma, relations between records are defined with the [`@relation`](/orm/reference/prisma-schema-reference#relation) attribute. For example, in the following schema there is a one-to-many relation between the `User` and `Post` models: +In Prisma schema, relations between records are defined with the [`@relation`](/orm/reference/prisma-schema-reference#relation) attribute. For example, in the following schema there is a one-to-many relation between the `User` and `Post` models: -```prisma file=schema.prisma highlight=4,5,10;normal +```prisma file=schema.prisma highlight=4,5,10;normal showLineNumbers model Post { id Int @id @default(autoincrement()) title String + //highlight-start author User @relation(fields: [authorId], references: [id], onDelete: Cascade, onUpdate: Cascade) authorId Int + //highlight-end } model User { id Int @id @default(autoincrement()) + //highlight-next-line posts Post[] } ``` -Prisma has two _relation modes_, `foreignKeys` and `prisma`, that specify how relations between records are enforced. +Prisma ORM has two _relation modes_, `foreignKeys` and `prisma`, that specify how relations between records are enforced. -If you use Prisma with a relational database, then by default Prisma uses the [`foreignKeys` relation mode](#handle-relations-in-your-relational-database-with-the-foreignkeys-relation-mode), which enforces relations between records at the database level with foreign keys. A foreign key is a column or group of columns in one table that take values based on the primary key in another table. Foreign keys allow you to: +If you use Prisma ORM with a relational database, then by default Prisma ORM uses the [`foreignKeys` relation mode](#handle-relations-in-your-relational-database-with-the-foreignkeys-relation-mode), which enforces relations between records at the database level with foreign keys. A foreign key is a column or group of columns in one table that take values based on the primary key in another table. Foreign keys allow you to: - set constraints that prevent you from making changes that break references - set [referential actions](/orm/prisma-schema/data-model/relations/referential-actions) that define how changes to records are handled @@ -53,15 +56,17 @@ CREATE TABLE "User" ( ); -- AddForeignKey +//highlight-start ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +//highlight-end ``` In this case, the foreign key constraint on the `authorId` column of the `Post` table references the `id` column of the `User` table, and guarantees that a post must have an author that exists. If you update or delete a user then the `ON DELETE` and `ON UPDATE` referential actions specify the `CASCADE` option, which will also delete or update all posts belonging to the user. -Some databases, such as MongoDB or [PlanetScale](/orm/overview/databases/planetscale#differences-to-consider), do not support foreign keys. Additionally, in some cases developers may prefer not to use foreign keys in their relational database that usually does support foreign keys. For these situations, Prisma offers [the `prisma` relation mode](#emulate-relations-in-prisma-with-the-prisma-relation-mode), which emulates some properties of relations in relational databases. When you use Prisma Client with the `prisma` relation mode enabled, the behavior of queries is identical or similar, but referential actions and some constraints are handled by the Prisma engine rather than in the database. +Some databases, such as MongoDB or [PlanetScale](/orm/overview/databases/planetscale#differences-to-consider), do not support foreign keys. Additionally, in some cases developers may prefer not to use foreign keys in their relational database that usually does support foreign keys. For these situations, Prisma ORM offers [the `prisma` relation mode](#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode), which emulates some properties of relations in relational databases. When you use Prisma Client with the `prisma` relation mode enabled, the behavior of queries is identical or similar, but referential actions and some constraints are handled by the Prisma engine rather than in the database. There are performance implications to emulation of referential integrity and @@ -75,38 +80,39 @@ Some databases, such as MongoDB or [PlanetScale](/orm/overview/databases/planets To set the relation mode, add the `relationMode` field in the `datasource` block: -```prisma file=schema.prisma highlight=4,9;add +```prisma file=schema.prisma highlight=4,9;add showLineNumbers datasource db { provider = "mysql" url = env("DATABASE_URL") + //add-next-line relationMode = "prisma" } ``` -The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma version 3.1.1, and is generally available in Prisma versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma version 4.5.0, and was previously named `referentialIntegrity`. +The ability to set the relation mode was introduced as part of the `referentialIntegrity` preview feature in Prisma ORM version 3.1.1, and is generally available in Prisma ORM versions 4.8.0 and later.

The `relationMode` field was renamed in Prisma ORM version 4.5.0, and was previously named `referentialIntegrity`.
For relational databases, the available options are: - `foreignKeys`: this handles relations in the database with foreign keys. This is the default option for all relational database connectors and is active if no `relationMode` is explicitly set in the `datasource` block. -- `prisma`: this emulates relations in Prisma Client. You should also [enable this option](/orm/overview/databases/planetscale#how-to-emulate-relations-in-prisma-client) when you use the MySQL connector with a PlanetScale database. +- `prisma`: this emulates relations in Prisma Client. You should also [enable this option](/orm/overview/databases/planetscale#option-1-emulate-relations-in-prisma-client) when you use the MySQL connector with a PlanetScale database and don't have native foreign key constraints enabled in your PlanetScale database settings. For MongoDB, the only available option is the `prisma` relation mode. This mode is also active if no `relationMode` is explicitly set in the `datasource` block. -If you switch between relation modes, Prisma will add or remove foreign keys to your database next time you apply changes to your schema with Prisma Migrate or `db push`. See [Switch between relation modes](#switch-between-relation-modes) for more information. +If you switch between relation modes, Prisma ORM will add or remove foreign keys to your database next time you apply changes to your schema with Prisma Migrate or `db push`. See [Switch between relation modes](#switch-between-relation-modes) for more information. -## Handle relations in your relational database with the foreignKeys relation mode +## Handle relations in your relational database with the `foreignKeys` relation mode The `foreignKeys` relation mode handles relations in your relational database with foreign keys. This is the default option when you use a relational database connector (PostgreSQL, MySQL, SQLite, SQL Server, CockroachDB). -The `foreignKeys` relation mode is not available when you use the MongoDB connector. Some relational databases, [such as PlanetScale](/orm/overview/databases/planetscale#how-to-emulate-relations-in-prisma-client), also forbid the use of foreign keys. In these cases, you should instead [emulate relations in Prisma with the `prisma` relation mode](#emulate-relations-in-prisma-with-the-prisma-relation-mode). +The `foreignKeys` relation mode is not available when you use the MongoDB connector. Some relational databases, [such as PlanetScale](/orm/overview/databases/planetscale#option-1-emulate-relations-in-prisma-client), also forbid the use of foreign keys. In these cases, you should instead [emulate relations in Prisma ORM with the `prisma` relation mode](#emulate-relations-in-prisma-orm-with-the-prisma-relation-mode). ### Referential integrity @@ -126,15 +132,15 @@ For more information, see the [referential actions](/orm/prisma-schema/data-mode When you introspect a relational database with the `db pull` command with the `foreignKeys` relation mode enabled, a `@relation` attribute will be added to your Prisma schema for relations where foreign keys exist. -### Prisma Migrate and db push +### Prisma Migrate and `db push` When you apply changes to your Prisma schema with Prisma Migrate or `db push` with the `foreignKeys` relation mode enabled, foreign keys will be created in your database for all `@relation` attributes in your schema. -## Emulate relations in Prisma with the prisma relation mode +## Emulate relations in Prisma ORM with the `prisma` relation mode The `prisma` relation mode emulates some foreign key constraints and referential actions for each Prisma Client query to maintain referential integrity, using some additional database queries and logic. -The `prisma` relation mode is the default option for the MongoDB connector. It should also be set if you use a relational database that does not support foreign keys. For example, [if you use PlanetScale](/orm/overview/databases/planetscale#how-to-emulate-relations-in-prisma-client) you should use the `prisma` relation mode. +The `prisma` relation mode is the default option for the MongoDB connector. It should also be set if you use a relational database that does not support foreign keys. For example, [if you use PlanetScale](/orm/overview/databases/planetscale#option-1-emulate-relations-in-prisma-client) without foreign key constraints, you should use the `prisma` relation mode. There are performance implications to emulation of referential integrity in @@ -147,15 +153,13 @@ Emulation of relations is only available for Prisma Client queries and does not ### Which foreign key constraints are emulated? -When you _update_ a record, Prisma will emulate foreign key constraints. This means that when you update a record with a relation to another record, the related record needs to exist. If the record does not exist, Prisma Client will return an error message. +When you _update_ a record, Prisma ORM will emulate foreign key constraints. This means that when you update a record with a relation to another record, the related record needs to exist. If the record does not exist, Prisma Client will return an error message. -However, when you _create_ a record, Prisma does not emulate any foreign key constraints. You will be able to create invalid data. +However, when you _create_ a record, Prisma ORM does not emulate any foreign key constraints. You will be able to create invalid data. ### Which referential actions are emulated? -When you _update_ or _delete_ a record with related records, Prisma will emulate referential actions. - - +When you _update_ or _delete_ a record with related records, Prisma ORM will emulate referential actions. The following table shows which emulated referential actions are available for each database connector: @@ -185,11 +189,11 @@ Example: ### Introspection -When you introspect a database with the `db pull` command with the `prisma` relation mode enabled, relations will not be automatically added to your schema. You will instead need to add any relations manually with the `@relation` attribute. This only needs to be done once – next time you introspect your database, Prisma will keep your added `@relation` attributes. +When you introspect a database with the `db pull` command with the `prisma` relation mode enabled, relations will not be automatically added to your schema. You will instead need to add any relations manually with the `@relation` attribute. This only needs to be done once – next time you introspect your database, Prisma ORM will keep your added `@relation` attributes. -### Prisma Migrate and db push +### Prisma Migrate and `db push` -When you apply changes to your Prisma schema with Prisma Migrate or `db push` with the `prisma` relation mode enabled, Prisma will not use foreign keys in your database. +When you apply changes to your Prisma schema with Prisma Migrate or `db push` with the `prisma` relation mode enabled, Prisma ORM will not use foreign keys in your database. ### Indexes @@ -199,9 +203,9 @@ The `prisma` relation mode does not use foreign keys, so no indexes are created #### Index validation -If you do not add the index manually, queries might require full table scans. This can be slow, and also expensive on database providers that bill per accessed row. To help avoid this, Prisma warns you when your schema contains fields that are used in a `@relation` that does not have an index defined. For example, take the following schema with a relation between the `User` and `Post` models: +If you do not add the index manually, queries might require full table scans. This can be slow, and also expensive on database providers that bill per accessed row. To help avoid this, Prisma ORM warns you when your schema contains fields that are used in a `@relation` that does not have an index defined. For example, take the following schema with a relation between the `User` and `Post` models: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mysql" url = env("DATABASE_URL") @@ -220,7 +224,7 @@ model Post { } ``` -Prisma displays the following warning when you run `prisma format` or `prisma validate`: +Prisma ORM displays the following warning when you run `prisma format` or `prisma validate`: ```terminal wrap With `relationMode = "prisma"`, no foreign keys are used, so relation fields will not benefit from the index usually created by the relational database under the hood. This can lead to poor performance when querying these fields. We recommend adding an index manually. @@ -228,32 +232,33 @@ With `relationMode = "prisma"`, no foreign keys are used, so relation fields wil To fix this, add an index to your `Post` model: -```prisma file=schema.prisma highlight=6;add +```prisma file=schema.prisma highlight=6;add showLineNumbers model Post { id Int @id userId Int user User @relation(fields: [userId], references: [id]) + //add-next-line @@index([userId]) } ``` If you use the [Prisma VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) (or our [language server in another editor](/orm/more/development-environment/editor-setup)), the warning is augmented with a Quick Fix that adds the required index for you: -![The Quick Fix pop-up for adding an index on a relation scalar field in VS Code](quick-fix-index.png) +![The Quick Fix pop-up for adding an index on a relation scalar field in VS Code](./quick-fix-index.png) ## Switch between relation modes It is only possible to switch between relation modes when you use a relational database connector (PostgreSQL, MySQL, SQLite, SQL Server, CockroachDB). -### Switch from foreignKeys to prisma +### Switch from `foreignKeys` to `prisma` The default relation mode if you use a relational database and do not include the `relationMode` field in your `datasource` block is `foreignKeys`. To switch to the `prisma` relation mode, add the `relationMode` field with a value of `prisma`, or update the `relationMode` field value to `prisma` if it already exists. -When you switch the relation mode from `foreignKeys` to `prisma`, after you first apply changes to your schema with Prisma Migrate or `db push` Prisma will remove all previously created foreign keys in the next migration. +When you switch the relation mode from `foreignKeys` to `prisma`, after you first apply changes to your schema with Prisma Migrate or `db push` Prisma ORM will remove all previously created foreign keys in the next migration. If you keep the same database, you can then continue to work as normal. If you switch to a database that does not support foreign keys at all, your existing migration history contains SQL DDL that creates foreign keys, which might trigger errors if you ever have to rerun these migrations. In this case, we recommend that you delete the `migrations` directory. (If you use PlanetScale, which does not support foreign keys, we generally recommend that you [use `db push` rather than Prisma Migrate](/orm/overview/databases/planetscale#differences-to-consider).) -### Switch from prisma to foreignKeys +### Switch from `prisma` to `foreignKeys` -To switch from the `prisma` relation mode to the `foreignKeys` relation mode, update the `relationMode` field value from `prisma` to `foreignKeys`. To do this, the database must support foreign keys. When you apply changes to your schema with Prisma Migrate or `db push` for the first time after you switch relation modes, Prisma will create foreign keys for all relations in the next migration. +To switch from the `prisma` relation mode to the `foreignKeys` relation mode, update the `relationMode` field value from `prisma` to `foreignKeys`. To do this, the database must support foreign keys. When you apply changes to your schema with Prisma Migrate or `db push` for the first time after you switch relation modes, Prisma ORM will create foreign keys for all relations in the next migration. diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/500-troubleshooting-relations.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/500-troubleshooting-relations.mdx index 82ebbcc5e2..3cd92a414e 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/500-troubleshooting-relations.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/500-troubleshooting-relations.mdx @@ -1,6 +1,6 @@ --- title: Troubleshooting relations -metaDescriptions: Common problems and solutions when defining relations in the Prisma schema. +description: Common problems and solutions when defining relations in the Prisma schema. --- @@ -19,8 +19,10 @@ In the following implicit many-to-many self-relation, the lexicographic order of model Animal { id Int @id @default(autoincrement()) name String + //highlight-start a_eats Animal[] @relation(name: "FoodChain") b_eatenBy Animal[] @relation(name: "FoodChain") + //highlight-end } ``` @@ -79,8 +81,10 @@ Now change the order of the relation fields: model Animal { id Int @id @default(autoincrement()) name String + //highlight-start b_eats Animal[] @relation(name: "FoodChain") a_eatenBy Animal[] @relation(name: "FoodChain") + //highlight-end } ``` @@ -139,9 +143,9 @@ If you rename relation fields in an implicit many-to-many self-relations, make s ## How to use a relation table with a many-to-many relationship -There are a couple of ways to define a m-n relationship, implicitly or explicitly. Implicitly means letting Prisma handle the relation table (JOIN table) under the hood, all you have to do is define an array/list for the non scalar types on each model, see [implicit many-to-many relations](many-to-many-relations#implicit-many-to-many-relations). +There are a couple of ways to define a m-n relationship, implicitly or explicitly. Implicitly means letting Prisma ORM handle the relation table (JOIN table) under the hood, all you have to do is define an array/list for the non scalar types on each model, see [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). -Where you might run into trouble is when creating an [explicit m-n relationship](many-to-many-relations#explicit-many-to-many-relations), that is, to create and handle the relation table yourself. **It can be overlooked that Prisma requires both sides of the relation to be present**. +Where you might run into trouble is when creating an [explicit m-n relationship](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations), that is, to create and handle the relation table yourself. **It can be overlooked that Prisma ORM requires both sides of the relation to be present**. Take the following example, here a relation table is created to act as the JOIN between the `Post` and `Category` tables. This will not work however as the relation table (`PostCategories`) must form a 1-to-many relationship with the other two models respectively. @@ -181,7 +185,9 @@ This is because the relation model forms a 1-to-many relationship with the other model Post { id Int @id @default(autoincrement()) title String + //delete-next-line categories Category[] + //add-next-line postCategories PostCategories[] } @@ -197,12 +203,14 @@ model PostCategories { model Category { id Int @id @default(autoincrement()) name String + //delete-next-line posts Post[] + //add-next-line postCategories PostCategories[] } ``` -## Using the @relation attribute with a many-to-many relationship +## Using the `@relation` attribute with a many-to-many relationship It might seem logical to add a `@relation("Post")` annotation to a relation field on your model when composing an implicit many-to-many relationship. @@ -224,7 +232,7 @@ model Category { } ``` -This however tells Prisma to expect **two** separate one-to-many relationships. See [disambiguating relations](/orm/prisma-schema/data-model/relations#disambiguating-relations) for more information on using the `@relation` attribute. +This however tells Prisma ORM to expect **two** separate one-to-many relationships. See [disambiguating relations](/orm/prisma-schema/data-model/relations#disambiguating-relations) for more information on using the `@relation` attribute. The following example is the correct way to define an implicit many-to-many relationship. @@ -232,14 +240,18 @@ The following example is the correct way to define an implicit many-to-many rela model Post { id Int @id @default(autoincrement()) title String + //delete-next-line categories Category[] @relation("Category") + //add-next-line categories Category[] } model Category { id Int @id @default(autoincrement()) name String + //delete-next-line posts Post[] @relation("Post") + //add-next-line posts Post[] } ``` @@ -264,7 +276,7 @@ model Category { ### Problem -Some cloud providers enforce the existence of primary keys in all tables. However, any relation tables (JOIN tables) created by Prisma (expressed via `@relation`) for many-to-many relations using implicit syntax do not have primary keys. +Some cloud providers enforce the existence of primary keys in all tables. However, any relation tables (JOIN tables) created by Prisma ORM (expressed via `@relation`) for many-to-many relations using implicit syntax do not have primary keys. ### Solution diff --git a/content/200-orm/100-prisma-schema/20-data-model/20-relations/index.mdx b/content/200-orm/100-prisma-schema/20-data-model/20-relations/index.mdx index ad763bce79..f9cf66d9b3 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/20-relations/index.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/20-relations/index.mdx @@ -1,7 +1,7 @@ --- title: 'Relations' metaTitle: 'Relations (Reference)' -metaDescription: 'A relation is a connection between two models in the Prisma schema. This page explains how you can define one-to-one, one-to-many and many-to-many relations in Prisma.' +description: 'A relation is a connection between two models in the Prisma schema. This page explains how you can define one-to-one, one-to-many and many-to-many relations in Prisma.' tocDepth: 3 --- @@ -9,49 +9,57 @@ tocDepth: 3 A relation is a _connection_ between two models in the Prisma schema. For example, there is a one-to-many relation between `User` and `Post` because one user can have many blog posts. + + The following Prisma schema defines a one-to-many relation between the `User` and `Post` models. The fields involved in defining the relation are highlighted: -, ]}> - + + ```prisma highlight=3,8,9;normal model User { id Int @id @default(autoincrement()) + //highlight-next-line posts Post[] } model Post { id Int @id @default(autoincrement()) + //highlight-start author User @relation(fields: [authorId], references: [id]) authorId Int // relation scalar field (used in the `@relation` attribute above) + //highlight-end } ``` - - + + ```prisma highlight=3,8,9;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-next-line posts Post[] } model Post { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-start author User @relation(fields: [authorId], references: [id]) authorId String @db.ObjectId // relation scalar field (used in the `@relation` attribute above) + //highlight-end } ``` - + -At a Prisma level, the `User` / `Post` relation is made up of: +At a Prisma ORM level, the `User` / `Post` relation is made up of: -- Two [relation fields](#relation-fields): `author` and `posts`. Relation fields define connections between models at the Prisma level and **do not exist in the database**. These fields are used to generate Prisma Client. +- Two [relation fields](#relation-fields): `author` and `posts`. Relation fields define connections between models at the Prisma ORM level and **do not exist in the database**. These fields are used to generate Prisma Client. - The scalar `authorId` field, which is referenced by the `@relation` attribute. This field **does exist in the database** - it is the foreign key that connects `Post` and `User`. -At a Prisma level, a connection between two models is **always** represented by a [relation field](#relation-fields) on **each side** of the relation. +At a Prisma ORM level, a connection between two models is **always** represented by a [relation field](#relation-fields) on **each side** of the relation.
@@ -66,8 +74,6 @@ At a Prisma level, a connection between two models is **always** represented by
-
- ## Relations in the database ### Relational databases @@ -91,7 +97,7 @@ author User @relation(fields: [authorId], references: [id]) ### MongoDB -For MongoDB, Prisma currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. +For MongoDB, Prisma ORM currently uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. The following document represents a `User` (in the `User` collection): @@ -125,12 +131,14 @@ If your model's ID is an `ObjectId` (represented by a `String` field), you must ```prisma highlight=3,9;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-next-line posts Post[] } model Post { id String @id @default(auto()) @map("_id") @db.ObjectId author User @relation(fields: [authorId], references: [id]) + //highlight-next-line authorId String @db.ObjectId // relation scalar field (used in the `@relation` attribute above) } ``` @@ -171,6 +179,7 @@ const getAuthor = await prisma.user.findUnique({ id: "20", }, include: { + //highlight-next-line | posts: true, // All posts where authorId == 20 }, }); @@ -209,11 +218,11 @@ In this query, the current value of `authorID` does not matter. The query change ## Types of relations -There are three different types (or [cardinalities]()) of relations in Prisma: +There are three different types (or [cardinalities]()) of relations in Prisma ORM: -- [One-to-one](one-to-one-relations) (also called 1-1 relations) -- [One-to-many](one-to-many-relations) (also called 1-n relations) -- [Many-to-many](many-to-many-relations) (also called m-n relations) +- [One-to-one](/orm/prisma-schema/data-model/relations/one-to-one-relations) (also called 1-1 relations) +- [One-to-many](/orm/prisma-schema/data-model/relations/one-to-many-relations) (also called 1-n relations) +- [Many-to-many](/orm/prisma-schema/data-model/relations/many-to-many-relations) (also called m-n relations) The following Prisma schema includes every type of relation: @@ -221,8 +230,8 @@ The following Prisma schema includes every type of relation: - one-to-many: `User` ↔ `Post` - many-to-many: `Post` ↔ `Category` -, ]}> - + + ```prisma model User { @@ -250,8 +259,8 @@ model Category { } ``` - - + + ```prisma model User { @@ -281,7 +290,7 @@ model Category { } ``` - + @@ -296,20 +305,20 @@ This example uses [implicit many-to-many relations](/orm/prisma-schema/data-mode -Notice that the syntax is slightly different between relational databases and MongoDB - particularly for [many-to-many relations](many-to-many-relations). +Notice that the syntax is slightly different between relational databases and MongoDB - particularly for [many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations). For relational databases, the following entity relationship diagram represents the database that corresponds to the sample Prisma schema: -![The sample schema as an entity relationship diagram](sample-schema.png) +![The sample schema as an entity relationship diagram](./sample-schema.png) -For MongoDB, Prisma uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. See [the MongoDB section](#mongodb) for more details. +For MongoDB, Prisma ORM uses a [normalized data model design](https://docs.mongodb.com/manual/core/data-model-design/), which means that documents reference each other by ID in a similar way to relational databases. See [the MongoDB section](#mongodb) for more details. ### Implicit and explicit many-to-many relations Many-to-many relations in relational databases can be modelled in two ways: - [explicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations), where the relation table is represented as an explicit model in your Prisma schema -- [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations), where Prisma manages the relation table and it does not appear in the Prisma schema. +- [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations), where Prisma ORM manages the relation table and it does not appear in the Prisma schema. Implicit many-to-many relations require both models to have a single `@id`. Be aware of the following: @@ -318,20 +327,21 @@ Implicit many-to-many relations require both models to have a single `@id`. Be a To use either of these features, you must set up an explicit many-to-many instead. -The implicit many-to-many relation still manifests in a relation table in the underlying database. However, Prisma manages this relation table. +The implicit many-to-many relation still manifests in a relation table in the underlying database. However, Prisma ORM manages this relation table. If you use an implicit many-to-many relation instead of an explicit one, it makes the [Prisma Client API](/orm/prisma-client) simpler (because, for example, you have one fewer level of nesting inside of [nested writes](/orm/prisma-client/queries/relation-queries#nested-writes)). -If you're not using Prisma Migrate but obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still make use of implicit many-to-many relations by following Prisma's [conventions for relation tables](many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations). +If you're not using Prisma Migrate but obtain your data model from [introspection](/orm/prisma-schema/introspection), you can still make use of implicit many-to-many relations by following Prisma ORM's [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations). ## Relation fields -, ]}> Relation [fields](/orm/prisma-schema/data-model/models#defining-fields) are fields on a Prisma [model](/orm/prisma-schema/data-model/models#defining-models) that do _not_ have a [scalar type](/orm/prisma-schema/data-model/models#scalar-fields). Instead, their type is another model. Every relation must have exactly two relation fields, one on each model. In the case of one-to-one and one-to-many relations, an additional _relation scalar field_ is required which gets linked by one of the two relation fields in the `@relation` attribute. This relation scalar is the direct representation of the _foreign key_ in the underlying database. - + + + ```prisma model User { @@ -349,8 +359,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -368,47 +378,47 @@ model Post { } ``` - + These models have the following fields: -, ]}> - + + | Model | Field | Relational | Relation field | | :----- | :--------- | :--------- | :--------------------------- | | `User` | `id` | `Int` | No | | | `email` | `String` | No | | | `role` | `Role` | No | -| | `posts` | `Post[]` | **Yes** (Prisma-level) | +| | `posts` | `Post[]` | **Yes** (Prisma ORM-level) | | `Post` | `id` | `Int` | No | | | `title` | `String` | No | | | `authorId` | `Int` | No (_relation scalar field_) | | | `author` | `User` | **Yes** (_annotated_) | - - + + | Model | Field | Relational | Relation field | Notes | | :----- | :--------- | :--------- | :--------------------------- | -------------------------------------- | | `User` | `id` | `String` | No | Underlying database type is `ObjectId` | | | `email` | `String` | No | | | `role` | `Role` | No | -| | `posts` | `Post[]` | **Yes** (Prisma-level) | +| | `posts` | `Post[]` | **Yes** (Prisma ORM-level) | | `Post` | `id` | `String` | No | | | `title` | `String` | No | | | `authorId` | `String` | No (_relation scalar field_) | Underlying database type is `ObjectId` | | | `author` | `User` | **Yes** (_annotated_) | - + Both `posts` and `author` are relation fields because their types are not scalar types but other models. Also note that the annotated relation field `author` needs to link the relation scalar field `authorId` on the `Post` model inside the `@relation` attribute. The relation scalar represents the foreign key in the underlying database. -The other relation field called `posts` is defined purely on a Prisma-level, it doesn't manifest in the database. +The other relation field called `posts` is defined purely on a Prisma ORM-level, it doesn't manifest in the database. ### Annotated relation fields @@ -420,23 +430,23 @@ Relations that require one side of the relation to be _annotated_ with the `@rel The side of the relation which is annotated with the `@relation` attribute represents the side that **stores the foreign key in the underlying database**. The "actual" field that represents the foreign key is required on that side of the relation as well, it's called _relation scalar field_, and is referenced inside `@relation` attribute: -, ]}> - + + ```prisma author User @relation(fields: [authorId], references: [id]) authorId Int ``` - - + + ```prisma author User @relation(fields: [authorId], references: [id]) authorId String @db.ObjectId ``` - + A scalar field _becomes_ a relation scalar field when it's used in the `fields` of a `@relation` attribute. @@ -456,7 +466,7 @@ Because a relation scalar field always _belongs_ to a relation field, the follow - Relation field: `author` - Relation scalar field: `authorId` (relation field name + `Id`) -## The @relation attribute +## The `@relation` attribute The [`@relation`](/orm/reference/prisma-schema-reference#relation) attribute can only be applied to the [relation fields](#relation-fields), not to [scalar fields](/orm/prisma-schema/data-model/models#scalar-fields). @@ -464,20 +474,20 @@ The `@relation` attribute is required when: - you define a one-to-one or one-to-many relation, it is required on _one side_ of the relation (with the corresponding relation scalar field) - you need to disambiguate a relation (that's e.g. the case when you have two relations between the same models) -- you define a [self-relation](self-relations) -- you define [a many-to-many relation for MongoDB](many-to-many-relations#mongodb) +- you define a [self-relation](/orm/prisma-schema/data-model/relations/self-relations) +- you define [a many-to-many relation for MongoDB](/orm/prisma-schema/data-model/relations/many-to-many-relations#mongodb) - you need to control how the relation table is represented in the underlying database (e.g. use a specific name for a relation table) -> **Note**: [Implicit many-to-many relations](many-to-many-relations#implicit-many-to-many-relations) in relational databases do not require the `@relation` attribute. +> **Note**: [Implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) in relational databases do not require the `@relation` attribute. ## Disambiguating relations When you define two relations between the same two models, you need to add the `name` argument in the `@relation` attribute to disambiguate them. As an example for why that's needed, consider the following models: -, ]}> - + + -```prisma +```prisma no-copy // NOTE: This schema is intentionally incorrect. See below for a working solution. model User { @@ -497,10 +507,12 @@ model Post { } ``` - - + + + +```prisma no-copy +// NOTE: This schema is intentionally incorrect. See below for a working solution. -```prisma model User { id String @id @default(auto()) @map("_id") @db.ObjectId name String? @@ -518,7 +530,7 @@ model Post { } ``` - + In that case, the relations are ambiguous, there are four different ways to interpret them: @@ -530,8 +542,8 @@ In that case, the relations are ambiguous, there are four different ways to inte To disambiguate these relations, you need to annotate the relation fields with the `@relation` attribute and provide the `name` argument. You can set any `name` (except for the empty string `""`), but it must be the same on both sides of the relation: -, ]}> - + + ```prisma model User { @@ -551,8 +563,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -572,38 +584,5 @@ model Post { } ``` - + - - diff --git a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx index 9d2deaa9b2..7f5f814f1d 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/30-indexes.mdx @@ -1,13 +1,13 @@ --- title: 'Indexes' -metaDescription: 'How to configure index functionality and add full text indexes' +description: 'How to configure index functionality and add full text indexes' hidePage: false tocDepth: 3 --- -Prisma allows configuration of database indexes, unique constraints and primary key constraints. This is in General Availability in versions `4.0.0` and later. You can enable this with the `extendedIndexes` Preview feature in versions `3.5.0` and later. +Prisma ORM allows configuration of database indexes, unique constraints and primary key constraints. This is in General Availability in versions `4.0.0` and later. You can enable this with the `extendedIndexes` Preview feature in versions `3.5.0` and later. Version `3.6.0` also introduces support for introspection and migration of full text indexes in MySQL and MongoDB through a new `@@fulltext` attribute, available through the `fullTextIndex` Preview feature. @@ -44,7 +44,7 @@ You can configure indexes, unique constraints, and primary key constraints with See the linked sections for details of which version each feature was first introduced in. -### Configuring the length of indexes with length (MySQL) +### Configuring the length of indexes with `length` (MySQL) The `length` argument is specific to MySQL and allows you to define indexes and constraints on columns of `String` and `Byte` types. For these types, MySQL requires you to specify a maximum length for the subpart of the value to be indexed in cases where the full value would exceed MySQL's limits for index sizes. See [the MySQL documentation](https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html) for more details. @@ -52,13 +52,13 @@ The `length` argument is available on the `@id`, `@@id`, `@unique`, `@@unique` a As an example, the following data model declares an `id` field with a maximum length of 3000 characters: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Id { id String @id @db.VarChar(3000) } ``` -This is not valid in MySQL because it exceeds MySQL's index storage limit and therefore Prisma rejects the data model. The generated SQL would be rejected by the database. +This is not valid in MySQL because it exceeds MySQL's index storage limit and therefore Prisma ORM rejects the data model. The generated SQL would be rejected by the database. ```sql CREATE TABLE `Id` ( @@ -68,19 +68,19 @@ CREATE TABLE `Id` ( The `length` argument allows you to specify that only a subpart of the `id` value represents the primary key. In the example below, the first 100 characters are used: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Id { id String @id(length: 100) @db.VarChar(3000) } ``` -Prisma Migrate is able to create constraints and indexes with the `length` argument if specified in your data model. This means that you can create indexes and constraints on values of Prisma type `Byte` and `String`. If you don't specify the argument the index is treated as covering the full value as before. +Prisma Migrate is able to create constraints and indexes with the `length` argument if specified in your data model. This means that you can create indexes and constraints on values of Prisma schema type `Byte` and `String`. If you don't specify the argument the index is treated as covering the full value as before. -Introspection will fetch these limits where they are present in your existing database. This allows Prisma to support indexes and constraints that were previously suppressed and results in better support of existing MySQL databases that are making use of this feature. +Introspection will fetch these limits where they are present in your existing database. This allows Prisma ORM to support indexes and constraints that were previously suppressed and results in better support of MySQL databases utilizing this feature. The `length` argument can also be used on compound primary keys, using the `@@id` attribute, as in the example below: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model CompoundId { id_1 String @db.VarChar(3000) id_2 String @db.VarChar(3000) @@ -91,9 +91,9 @@ model CompoundId { A similar syntax can be used for the `@@unique` and `@@index` attributes. -### Configuring the index sort order with sort +### Configuring the index sort order with `sort` -The `sort` argument is available for all databases supported by Prisma. It allows you to specify the order that the entries of the index or constraint are stored in the database. This can have an effect on whether the database is able to use an index for specific queries. +The `sort` argument is available for all databases supported by Prisma ORM. It allows you to specify the order that the entries of the index or constraint are stored in the database. This can have an effect on whether the database is able to use an index for specific queries. The `sort` argument is available for all databases on `@unique`, `@@unique` and `@@index`. Additionally, SQL Server also allows it on `@id` and `@@id`. It is generally available in versions 4.0.0 and later, and available as part of the `extendedIndexes` preview feature in versions 3.5.0 and later. @@ -108,7 +108,7 @@ CREATE TABLE `Unique` ( is now introspected as -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Unique { unique Int @unique(sort: Desc) } @@ -116,7 +116,7 @@ model Unique { The `sort` argument can also be used on compound indexes: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model CompoundUnique { unique_1 Int unique_2 Int @@ -125,11 +125,11 @@ model CompoundUnique { } ``` -### Example: using sort and length together +### Example: using `sort` and `length` together The following example demonstrates the use of the `sort` and `length` arguments to configure indexes and constraints for a `Post` model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { title String @db.VarChar(300) abstract String @db.VarChar(3000) @@ -142,7 +142,7 @@ model Post { } ``` -### Configuring the access type of indexes with type (PostgreSQL) +### Configuring the access type of indexes with `type` (PostgreSQL) The `type` argument is available for configuring the index type in PostgreSQL with the `@@index` attribute. The index access methods available are `Hash`, `Gist`, `Gin`, `SpGist` and `Brin`, as well as the default `BTree` index access method. The `type` argument is generally available in versions 4.0.0 and later. The `Hash` index access method is available as part of the `extendedIndexes` preview feature in versions 3.6.0 and later, and the `Gist`, `Gin`, `SpGist` and `Brin` index access methods are available in preview in versions 3.14.0 and later. @@ -152,7 +152,7 @@ The `Hash` type will store the index data in a format that is much faster to sea As an example, the following model adds an index with a `type` of `Hash` to the `value` field: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id value Int @@ -180,13 +180,13 @@ An indexed field can define the operator class, which defines the operators hand -Indexes using a function (such as `to_tsvector`) to determine the indexed value are not yet supported by Prisma. Indexes defined in this way will not be visible with `prisma db pull`. +Indexes using a function (such as `to_tsvector`) to determine the indexed value are not yet supported by Prisma ORM. Indexes defined in this way will not be visible with `prisma db pull`. As an example, the following model adds a `Gin` index to the `value` field, with `JsonbPathOps` as the class of operators allowed to use the index: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id value Json @@ -212,7 +212,7 @@ As part of the `JsonbPathOps` the `@>` operator is handled by the index, speedin ##### Supported Operator Classes for GIN -Prisma generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. +Prisma ORM generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma ORM does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. The default operator class (marked with ✅) can be omitted from the index definition. @@ -227,7 +227,7 @@ Read more about built-in operator classes in the [official PostgreSQL documentat ##### CockroachDB -GIN and BTree are the only index types supported by CockroachDB. The operator classes marked to work with CockroachDB are the only ones allowed on that database and supported by Prisma. The operator class cannot be defined in the Prisma Schema Language: the `ops` argument is not necessary or allowed on CockroachDB. +GIN and BTree are the only index types supported by CockroachDB. The operator classes marked to work with CockroachDB are the only ones allowed on that database and supported by Prisma ORM. The operator class cannot be defined in the Prisma Schema Language: the `ops` argument is not necessary or allowed on CockroachDB. #### Generalized Search Tree (GiST) @@ -235,7 +235,7 @@ The GiST index type is used for implementing indexing schemes for user-defined t As an example, the following model adds a `Gist` index to the `value` field with `InetOps` as the operators that will be using the index: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id value String @db.Inet @@ -262,7 +262,7 @@ Queries comparing IP addresses, such as `value > '10.0.0.2'`, will use the index ##### Supported Operator Classes for GiST -Prisma generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. +Prisma ORM generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma ORM does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. | Operator class | Allowed field type (allowed native types) | | -------------- | ----------------------------------------- | @@ -280,7 +280,7 @@ As with GiST, SP-GiST is important as a building block for user-defined types, a As an example, the following model adds a `SpGist` index to the `value` field with `TextOps` as the operators using the index: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id value String @@ -308,7 +308,7 @@ Queries such as `value LIKE 'something%'` will be sped up by the index. ##### Supported Operator Classes for SP-GiST -Prisma generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. +Prisma ORM generally supports operator classes provided by PostgreSQL in versions 10 and later. If the operator class requires the field type to be of a type Prisma ORM does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. The default operator class (marked with ✅) can be omitted from the index definition. @@ -326,7 +326,7 @@ The BRIN index type is useful if you have lots of data that does not change afte As an example, the following model adds a `Brin` index to the `value` field with `Int4BloomOps` as the operators that will be using the index: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id value Int @@ -352,7 +352,7 @@ Queries like `value = 2` will now use the index, which uses a fraction of the sp ##### Supported Operator Classes for BRIN -Prisma generally supports operator classes provided by PostgreSQL in versions 10 and later, and some supported operators are only available from PostgreSQL versions 14 and later. If the operator class requires the field type to be of a type Prisma does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. +Prisma ORM generally supports operator classes provided by PostgreSQL in versions 10 and later, and some supported operators are only available from PostgreSQL versions 14 and later. If the operator class requires the field type to be of a type Prisma ORM does not yet support, using the `raw` function with a string input allows you to use these operator classes without validation. The default operator class (marked with ✅) can be omitted from the index definition. @@ -414,13 +414,13 @@ The default operator class (marked with ✅) can be omitted from the index defin Read more about built-in operator classes in the [official PostgreSQL documentation](https://www.postgresql.org/docs/14/brin-builtin-opclasses.html). -### Configuring if indexes are clustered or non-clustered with clustered (SQL Server) +### Configuring if indexes are clustered or non-clustered with `clustered` (SQL Server) The `clustered` argument is available to configure (non)clustered indexes in SQL Server. It can be used on the `@id`, `@@id`, `@unique`, `@@unique` and `@@index` attributes. It is generally available in versions 4.0.0 and later, and available as part of the `extendedIndexes` preview feature in versions 3.13.0 and later. As an example, the following model configures the `@id` to be non-clustered (instead of the clustered default): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Example { id Int @id(clustered: false) value Int @@ -459,10 +459,10 @@ These index configuration changes can be **breaking changes** when activating th A breaking change can occur in the following situations: -- **Existing sort constraints and indexes:** earlier versions of Prisma will assume that the desired sort order is _ascending_ if no order is specified explicitly. This means that this is a breaking change if you have existing constraints or indexes that are using descending sort order and migrate your database without first specifying this in your data model. -- **Existing length constraints and indexes:** in earlier versions of Prisma, indexes and constraints that were length constrained in MySQL could not be represented in the Prisma schema. Therefore `prisma db pull` was not fetching these and you could not manually specify them. When you ran `prisma db push` or `prisma migrate dev` they were ignored if already present in your database. Since you are now able to specify these, migrate commands will now drop them if they are missing from your data model but present in the database. -- **Existing indexes other than `BTree` (PostgreSQL):** earlier versions of Prisma only supported the default `BTree` index type. Other supported indexes (`Hash`, `Gist`, `Gin`, `SpGist` and `Brin`) need to be added before migrating your database. -- **Existing (non-)clustered indexes (SQL Server):** earlier versions of Prisma did not support configuring an index as clustered or non-clustered. For indexes that do not use the default, these need to be added before migrating your database. +- **Existing sort constraints and indexes:** earlier versions of Prisma ORM will assume that the desired sort order is _ascending_ if no order is specified explicitly. This means that this is a breaking change if you have existing constraints or indexes that are using descending sort order and migrate your database without first specifying this in your data model. +- **Existing length constraints and indexes:** in earlier versions of Prisma ORM, indexes and constraints that were length constrained in MySQL could not be represented in the Prisma schema. Therefore `prisma db pull` was not fetching these and you could not manually specify them. When you ran `prisma db push` or `prisma migrate dev` they were ignored if already present in your database. Since you are now able to specify these, migrate commands will now drop them if they are missing from your data model but present in the database. +- **Existing indexes other than `BTree` (PostgreSQL):** earlier versions of Prisma ORM only supported the default `BTree` index type. Other supported indexes (`Hash`, `Gist`, `Gin`, `SpGist` and `Brin`) need to be added before migrating your database. +- **Existing (non-)clustered indexes (SQL Server):** earlier versions of Prisma ORM did not support configuring an index as clustered or non-clustered. For indexes that do not use the default, these need to be added before migrating your database. In each of the cases above unwanted changes to your database can be prevented by properly specifying these properties in your data model where necessary. **The easiest way to do this is to use `prisma db pull` to retrieve any existing constraints or configuration.** Alternatively, you could also add these arguments manually. This should be done before using `prisma db push` or `prisma migrate dev` the first time after the upgrade. @@ -476,11 +476,11 @@ For now we do not enable the full text search commands in Prisma Client for Mong
-### Enabling the fullTextIndex preview feature +### Enabling the `fullTextIndex` preview feature To enable the `fullTextIndex` preview feature, add the `fullTextIndex` feature flag to the `generator` block of the `schema.prisma` file: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["fullTextIndex"] @@ -491,7 +491,7 @@ generator client { The following example demonstrates adding a `@@fulltext` index to the `title` and `content` fields of a `Post` model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id title String @db.VarChar(255) @@ -503,7 +503,7 @@ model Post { On MongoDB, you can use the `@@fulltext` index attribute (via the `fullTextIndex` preview feature) with the `sort` argument to add fields to your full-text index in ascending or descending order. The following example adds a `@@fulltext` index to the `title` and `content` fields of the `Post` model, and sorts the `title` field in descending order: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator js { provider = "prisma-client-js" previewFeatures = ["fullTextIndex"] @@ -531,4 +531,4 @@ This can be a **breaking change** when activating the functionality for certain, -Earlier versions of Prisma converted full text indexes using the `@@index` attribute rather than the `@@fulltext` attribute. After enabling the `fullTextIndex` preview feature, run `prisma db pull` to convert these indexes to `@@fulltext` before migrating again with Prisma Migrate. If you do not do this, the existing indexes will be dropped instead and normal indexes will be created in their place. +Earlier versions of Prisma ORM converted full text indexes using the `@@index` attribute rather than the `@@fulltext` attribute. After enabling the `fullTextIndex` preview feature, run `prisma db pull` to convert these indexes to `@@fulltext` before migrating again with Prisma Migrate. If you do not do this, the existing indexes will be dropped instead and normal indexes will be created in their place. diff --git a/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx b/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx index 14073f18af..3c892dabe6 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/40-views.mdx @@ -1,9 +1,9 @@ --- title: 'Views' metaTitle: 'How to include views in your Prisma schema' -metaDescription: 'How to include views in your Prisma schema' +description: 'How to include views in your Prisma schema' hidePage: false -preview: true +sidebar_class_name: preview-badge tocDepth: 3 --- @@ -17,7 +17,7 @@ Support for views is currently a very early [Preview](/orm/more/releases#preview Database views allow you to name and store queries. In relational databases, views are [stored SQL queries](https://www.postgresql.org/docs/current/sql-createview.html) that might include columns in multiple tables, or calculated values such as aggregates. In MongoDB, views are queryable objects where the contents are defined by an [aggregation pipeline](https://www.mongodb.com/docs/manual/core/aggregation-pipeline) on other collections. -The `views` preview feature allows you to represent views in your Prisma schema with the `view` keyword. To use views in Prisma, follow these steps: +The `views` preview feature allows you to represent views in your Prisma schema with the `view` keyword. To use views in Prisma ORM, follow these steps: - [Enable the `views` preview feature](#enable-the-views-preview-feature) - [Create a view in the underlying database](#create-a-view-in-the-underlying-database), either directly or as a [manual addition to a Prisma Migrate migration file](#use-views-with-prisma-migrate-and-db-push), or use an existing view @@ -26,13 +26,14 @@ The `views` preview feature allows you to represent views in your Prisma schema
-## Enable the views preview feature +## Enable the `views` preview feature Support for views is currently in an early preview. To enable the `views` preview feature, add the `views` feature flag to the `previewFeatures` field of the `generator` block in your Prisma schema file: -```prisma file=schema.prisma highlight=3;add +```prisma file=schema.prisma highlight=3;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["views"] } ``` @@ -45,8 +46,8 @@ Currently, you cannot apply views that you define in your Prisma schema to your For example, take the following Prisma schema with a `User` model and a related `Profile` model: -, ]}> - + + ```prisma model User { @@ -64,8 +65,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -83,7 +84,7 @@ model Profile { } ``` - + Next, take a `UserInfo` view in the underlying database that combines the `email` and `name` fields from the `User` model and the `bio` field from the `Profile` model. @@ -121,9 +122,9 @@ db.createView('UserInfo', 'User', [ ]) ``` -## Use views with Prisma Migrate and db push +## Use views with Prisma Migrate and `db push` -If you apply changes to your Prisma schema with Prisma Migrate or `db push`, Prisma does not create or run any SQL related to views. +If you apply changes to your Prisma schema with Prisma Migrate or `db push`, Prisma ORM does not create or run any SQL related to views. To include views in a migration, run `migrate dev --create-only` and then manually add the SQL for views to your migration file. Alternatively, you can create views manually in the database. @@ -135,8 +136,8 @@ You can represent the `UserInfo` view from the example above in your Prisma sche -, ]}> - + + ```prisma view UserInfo { @@ -147,8 +148,8 @@ view UserInfo { } ``` - - + + ```prisma view UserInfo { @@ -159,7 +160,7 @@ view UserInfo { } ``` - + @@ -184,8 +185,6 @@ view UserInfo { } ``` - - #### Define fields The properties of a view are called _fields_, which consist of: @@ -195,33 +194,37 @@ The properties of a view are called _fields_, which consist of: The fields of the `UserInfo` example view can be defined as follows: -, ]}> - + + ```prisma highlight=2-5;normal view UserInfo { + //highlight-start id Int @unique email String name String bio String + //highlight-end } ``` - - + + ```prisma highlight=2-5;normal view UserInfo { + //highlight-start id String @id @default(auto()) @map("_id") @db.ObjectId email String name String bio String + //highlight-end } ``` - + Each _field_ of a `view` block represents a column in the query results of the view in the underlying database. @@ -274,19 +277,24 @@ In order to make this `view` block valid you will need to: - Remove the _optional_ flag `?` from the `id` field - Add the `@unique` attribute to the `id` field - Remove the `@@ignore` attribute -- Remove the comment Prisma generated warning about an invalid view +- Remove the generated comment warning about an invalid view ```prisma highlight=4;add|1,3,8,9;delete +//delete-next-line /// The underlying view does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. view UserInfo { + //delete-next-line id Int? + //add-next-line id Int @unique email String? name String? bio String? + //delete-start @@ignore + //delete-end } ``` @@ -315,7 +323,7 @@ FROM #### Unique Identifier -Currently, Prisma treats views in the same way as models. This means that a view needs to have at least one _unique identifier_, which can be represented by any of the following: +Currently, Prisma ORM treats views in the same way as models. This means that a view needs to have at least one _unique identifier_, which can be represented by any of the following: - A unique constraint denoted with [`@unique`](/orm/prisma-schema/data-model/models#defining-a-unique-field) - A composite unique constraint denoted with [`@@unique`](/orm/prisma-schema/data-model/models#defining-a-unique-field) @@ -350,13 +358,13 @@ Currently, Prisma Client allows you to update a view if the underlying database ## Special types of views -This section describes how to use Prisma with updatable and materialized views in your database. +This section describes how to use Prisma ORM with updatable and materialized views in your database. ### Updatable views Some databases support updatable views (e.g. [PostgreSQL](https://www.postgresql.org/docs/current/sql-createview.html#SQL-CREATEVIEW-UPDATABLE-VIEWS), [MySQL](https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html) and [SQL Server](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver16#updatable-views)). Updatable views allow you to create, update or delete entries. -Currently Prisma treats all `view`s as updatable views. If the underlying database supports this functionality for the view, the operation should succeed. If the view is not marked as updatable, the database will return an error, and Prisma Client will then throw this error. +Currently Prisma ORM treats all `view`s as updatable views. If the underlying database supports this functionality for the view, the operation should succeed. If the view is not marked as updatable, the database will return an error, and Prisma Client will then throw this error. In the future, Prisma Client might support marking individual views as updatable or not updatable. Please comment on our [`views` feedback issue](https://github.com/prisma/prisma/issues/17335) with your use case. @@ -366,6 +374,6 @@ Some databases support materialized views, e.g. [PostgreSQL](https://www.postgre Materialized views persist the result of the view query for faster access and only update it on demand. -Currently Prisma has no understanding of materialized views, but when you [manually create a view](#create-a-view-in-the-underlying-database) you can also create a materialized view by using the corresponding command in the underlying database. You can then use Prisma's [raw query functionality](/orm/prisma-client/queries/raw-database-access) to execute the command to refresh the view manually. +Currently Prisma ORM has no understanding of materialized views, but when you [manually create a view](#create-a-view-in-the-underlying-database) you can also create a materialized view by using the corresponding command in the underlying database. You can then use Prisma Client's [raw query functionality](/orm/prisma-client/queries/raw-database-access) to execute the command to refresh the view manually. In the future Prisma Client might support marking individual views as materialized and add a Prisma Client method to refresh the materialized view. Please comment on our [`views` feedback issue](https://github.com/prisma/prisma/issues/17335) with your use case. diff --git a/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx b/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx index 7f7281dbf8..cff807fade 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/50-database-mapping.mdx @@ -1,7 +1,7 @@ --- title: 'Database mapping' metaTitle: 'Database mapping' -metaDescription: '' +description: '' tocDepth: 3 --- @@ -14,13 +14,11 @@ The [Prisma schema](/orm/prisma-schema) includes mechanisms that allow you to de
- - ## Mapping collection/table and field/column names Sometimes the names used to describe entities in your database might not match the names you would prefer in your generated API. Mapping names in the Prisma schema allows you to influence the naming in your Client API without having to change the underlying database names. -A common approach for naming tables/collections in databases for example is to use plural form and [snake_case](https://en.wikipedia.org/wiki/Snake_case) notation. Prisma on the other hand has recommended model [naming conventions (singular form, PascalCase)](/orm/reference/prisma-schema-reference#naming-conventions) which differ from that. +A common approach for naming tables/collections in databases for example is to use plural form and [snake_case](https://en.wikipedia.org/wiki/Snake_case) notation. However, we recommended a different [naming convention (singular form, PascalCase)](/orm/reference/prisma-schema-reference#naming-conventions). `@map` and `@@map` allow you to [tune the shape of your Prisma Client API](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) by decoupling model and field names from table and column names in the underlying database. @@ -40,11 +38,12 @@ However, you can still choose `Comment` as the name of the model (e.g. to follow model Comment { // Fields + //highlight-next-line @@map("comments") } ``` -With this modified model definition, Prisma automatically maps the `Comment` model to the `comments` table in the underlying database. +With this modified model definition, Prisma Client automatically maps the `Comment` model to the `comments` table in the underlying database. ### Map field / column names @@ -52,9 +51,11 @@ You can also [`@map`](/orm/reference/prisma-schema-reference#map) a column/field ```prisma highlight=2-4;normal model Comment { + //highlight-start content String @map("comment_text") email String @map("commenter_email") type Enum @map("comment_type") + //highlight-end @@map("comments") } @@ -69,21 +70,23 @@ You can also `@map` an enum value, or `@@map` an enum: ```prisma highlight=3,5;normal enum Type { Blog, + //highlight-next-line Twitter @map("comment_twitter") + //highlight-next-line @@map("comment_source_enum") } ``` ## Constraint and index names -In [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) and later, you can optionally use the `map` argument to define the **underlying constraint and index names** in the Prisma schema for the attributes [`@id`](/orm/reference/prisma-schema-reference#id), [`@@id`](/orm/reference/prisma-schema-reference#id-1), [`@unique`](/orm/reference/prisma-schema-reference#unique), [`@@unique`](/orm/reference/prisma-schema-reference#unique-1), [`@@index`](/orm/reference/prisma-schema-reference#index) and [`@relation`](/orm/reference/prisma-schema-reference#relation). +You can optionally use the `map` argument to explicitly define the **underlying constraint and index names** in the Prisma schema for the attributes [`@id`](/orm/reference/prisma-schema-reference#id), [`@@id`](/orm/reference/prisma-schema-reference#id-1), [`@unique`](/orm/reference/prisma-schema-reference#unique), [`@@unique`](/orm/reference/prisma-schema-reference#unique-1), [`@@index`](/orm/reference/prisma-schema-reference#index) and [`@relation`](/orm/reference/prisma-schema-reference#relation). (This is available in Prisma ORM version [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) and later.) -When introspecting a database, the `map` argument will _only_ be rendered in the schema if the name differs from Prisma's [default constraint naming convention for indexes and constraints](#prismas-default-naming-conventions-for-indexes-and-constraints). +When introspecting a database, the `map` argument will _only_ be rendered in the schema if the name _differs_ from Prisma ORM's [default constraint naming convention for indexes and constraints](#prisma-orms-default-naming-conventions-for-indexes-and-constraints). - + -If you use Prisma Migrate in a version earlier than 2.29.0 and want to maintain your existing constraint and index names after upgrading to a newer version, **do not** immediately run `prisma migrate` or `prisma db push`. This will **change any underlying constraint name that does not follow Prisma's convention**. Follow the [upgrade path that allows you to maintain existing constraint and index names](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints#option-1-i-want-to-maintain-my-existing-constraint-and-index-names). +If you use Prisma Migrate in a version earlier than 2.29.0 and want to maintain your existing constraint and index names after upgrading to a newer version, **do not** immediately run `prisma migrate` or `prisma db push`. This will **change any underlying constraint name that does not follow Prisma ORM's convention**. Follow the [upgrade path that allows you to maintain existing constraint and index names](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints#option-1-i-want-to-maintain-my-existing-constraint-and-index-names). @@ -94,57 +97,55 @@ Some use cases for explicitly named constraints include: - Company policy - Conventions of other tools -#### Prisma's default naming conventions for indexes and constraints +### Prisma ORM's default naming conventions for indexes and constraints -Prisma naming convention was chosen to align with PostgreSQL since it is deterministic. It also helps to maximize the amount of times where names do not need to be rendered because many databases out there they already align with the convention. +Prisma ORM naming convention was chosen to align with PostgreSQL since it is deterministic. It also helps to maximize the amount of times where names do not need to be rendered because many databases out there they already align with the convention. -We always use the database names of entities when generating the default names. So if a model is remapped to a different name in the data model, the default name generation will still take the name of the table in the database as input. The same is true for fields and columns. +Prisma ORM always uses the database names of entities when generating the default index and constraint names. If a model is remapped to a different name in the data model via `@@map` or `@map`, the default name generation will still take the name of the _table_ in the database as input. The same is true for fields and _columns_. | Entity | Convention | Example | | ----------------- | --------------------------------- | ------------------------------ | -| Primary Key | {tablename}\_pkey | `User_pkey` | -| Unique Constraint | {tablename}\_{column_names}\_key | `User_firstName_last_Name_key` | -| Non-Unique Index | {tablename}\_{column_names}\_idx | `User_age_idx` | -| Foreign Key | {tablename}\_{column_names}\_fkey | `User_childName_fkey` | +| Primary Key | \{tablename}\_pkey | `User_pkey` | +| Unique Constraint | \{tablename}\_\{column_names}\_key | `User_firstName_last_Name_key` | +| Non-Unique Index | \{tablename}\_\{column_names}\_idx | `User_age_idx` | +| Foreign Key | \{tablename}\_\{column_names}\_fkey | `User_childName_fkey` | Since most databases have a length limit for entity names, the names will be trimmed if necessary to not violate the database limits. We will shorten the part before the `_suffix` as necessary so that the full name is at most the maximum length permitted. ### Using default constraint names -When no explicit names are provided via `map` arguments Prisma will assume they follow the default naming convention. +When no explicit names are provided via `map` arguments Prisma ORM will generate index and constraint names following the [default naming convention](#prisma-orms-default-naming-conventions-for-indexes-and-constraints). -If you introspect a database the names for indexes and constraints will be added to your schema unless they follow Prisma's naming convention. If they do, the names are not rendered to keep the schema more readable. When you migrate such a schema Prisma will infer the default names and persist them in the database. +If you introspect a database the names for indexes and constraints will be added to your schema unless they follow Prisma ORM's naming convention. If they do, the names are not rendered to keep the schema more readable. When you migrate such a schema Prisma will infer the default names and persist them in the database. #### Example -The following schema defines three constraints (`@id`, `@unique`, and `@relation`) and one index (`@@index`) that will +The following schema defines three constraints (`@id`, `@unique`, and `@relation`) and one index (`@@index`): ```prisma highlight=2,8,11,13;normal model User { + //highlight-next-line id Int @id @default(autoincrement()) name String @unique posts Post[] } model Post { + //highlight-next-line id Int @id @default(autoincrement()) title String authorName String @default("Anonymous") + //highlight-next-line author User? @relation(fields: [authorName], references: [name]) + //highlight-next-line @@index([title, authorName]) } ``` Since no explicit names are provided via `map` arguments Prisma will assume they follow our default naming convention. -### Prisma's default naming conventions for indexes and constraints - -If you introspect a database the names for indexes and constraints will be added to your schema unless they follow Prisma's naming convention. If they do, the names are not rendered to keep the schema more readable. When you migrate such a schema Prisma will infer the default names and persist them in the database. - -We chose our naming convention to align with PostgreSQL since it is deterministic and helps us maximize the amount of times where we do not need -to render names because they already align with the convention. - +The following table lists the name of each constraint and index in the underlying database: | Constraint or index | Follows convention | Underlying constraint or index names | | ---------------------------------- | ------------------ | ------------------------------------ | | `@id` (on `User` > `id` field) | Yes | `User_pk` | @@ -162,17 +163,21 @@ The following example adds custom names to one `@id` and the `@@index`: ```prisma highlight=2,13;normal model User { + //highlight-next-line id Int @id(map: "Custom_Primary_Key_Constraint_Name") @default(autoincrement()) name String @unique posts Post[] } model Post { + //highlight-next-line id Int @id @default(autoincrement()) title String authorName String @default("Anonymous") + //highlight-next-line author User? @relation(fields: [authorName], references: [name]) + //highlight-next-line @@index([title, authorName], map: "My_Custom_Index_Name") } ``` @@ -219,6 +224,7 @@ Specifying `@@id([firstName, lastName], name: "fullName")` will change the Prism ```ts highlight=3;edit const user = await prisma.user.findUnique({ where: { + //edit-next-line fullName: { firstName: 'Paul', lastName: 'Panther', diff --git a/content/200-orm/100-prisma-schema/20-data-model/60-multi-schema.mdx b/content/200-orm/100-prisma-schema/20-data-model/60-multi-schema.mdx index 3ab4d0a631..6b8743c824 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/60-multi-schema.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/60-multi-schema.mdx @@ -1,7 +1,7 @@ --- -title: How to use Prisma with multiple database schemas -metaTitle: How to use Prisma with multiple database schemas -metaDescription: How to use Prisma with multiple database schemas +title: How to use Prisma ORM with multiple database schemas +metaTitle: How to use Prisma ORM with multiple database schemas +description: How to use Prisma ORM with multiple database schemas tocDepth: 3 --- @@ -15,7 +15,7 @@ Multiple database schema support is currently available with the PostgreSQL, Coc Many database providers allow you to organize database tables into named groups. You can use this to make the logical structure of the data model easier to understand, or to avoid naming collisions between tables. -In PostgreSQL, CockroachDB, and SQL Server, these groups are known as schemas. We will refer to them as _database schemas_ to distinguish them from Prisma's own schema file. +In PostgreSQL, CockroachDB, and SQL Server, these groups are known as schemas. We will refer to them as _database schemas_ to distinguish them from Prisma ORM's own schema file. This guide explains how to: @@ -26,13 +26,14 @@ This guide explains how to:
-## How to enable the multiSchema preview feature +## How to enable the `multiSchema` preview feature Multi-schema support is currently in preview. To enable the `multiSchema` preview feature, add the `multiSchema` feature flag to the `previewFeatures` field of the `generator` block in your Prisma schema file: -```prisma file=schema.prisma highlight=3;add +```prisma file=schema.prisma highlight=3;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["multiSchema"] } @@ -46,7 +47,7 @@ datasource db { To use multiple database schemas in your Prisma schema file, add the names of your database schemas to an array in the `schemas` field, in the `datasource` block. The following example adds a `"base"` and a `"transactional"` schema: -```prisma file=schema.prisma highlight=9;add +```prisma file=schema.prisma highlight=9;add showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["multiSchema"] @@ -55,6 +56,7 @@ generator client { datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line schemas = ["base", "transactional"] } ``` @@ -63,11 +65,12 @@ You do not need to change your connection string. The `schema` value of your con To designate that a model or enum belongs to a specific database schema, add the `@@schema` attribute with the name of the database schema as a parameter. In the following example, the `User` model is part of the `"base"` schema, and the `Order` model and `Size` enum are part of the `"transactional"` schema: -```prisma file=schema.prisma highlight=5,13;add +```prisma file=schema.prisma highlight=5,13;add showLineNumbers model User { id Int @id orders Order[] + //add-next-line @@schema("base") } @@ -76,6 +79,7 @@ model Order { user User @relation(fields: [id], references: [id]) user_id Int + //add-next-line @@schema("transactional") } @@ -94,7 +98,7 @@ If you have tables with the same name in different database schemas, you will ne For example, consider a situation where the `config` table in the `base` database schema has the same name as the `config` table in the `users` database schema. To avoid name conflicts, give the models in your Prisma schema unique names (`BaseConfig` and `UserConfig`) and use the `@@map` attribute to map each model to the corresponding table name: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model BaseConfig { id Int @id @@ -110,21 +114,23 @@ model UserConfig { } ``` -## How to apply your schema changes with Prisma Migrate and db push +## How to apply your schema changes with Prisma Migrate and `db push` You can use Prisma Migrate or `db push` to apply changes to a Prisma schema with multiple database schemas. As an example, add a `Profile` model to the `base` schema of the blog post model above: -```prisma file=schema.prisma highlight=4,9-16;add +```prisma file=schema.prisma highlight=4,9-16;add showLineNumbers model User { id Int @id orders Order[] + //add-next-line profile Profile? @@schema("base") } +//add-start model Profile { id Int @id @default(autoincrement()) bio String @@ -133,6 +139,7 @@ model Profile { @@schema("base") } +//add-end model Order { id Int @id @@ -157,7 +164,7 @@ You can then apply this schema change to your database. For example, you can use npx prisma migrate dev --name add_profile ``` -Note that if you move a model or enum from one schema to another, Prisma deletes the model or enum from the source schema and creates a new one in the target schema. +Note that if you move a model or enum from one schema to another, Prisma ORM deletes the model or enum from the source schema and creates a new one in the target schema. ## How to introspect an existing database with multiple database schemas @@ -169,7 +176,7 @@ npx prisma db pull This updates your Prisma schema to match the current state of the database. -If you have tables with the same name in different database schemas, Prisma shows a validation error pointing out the conflict. To fix this, [rename the introspected models with the `@map` attribute](#tables-with-the-same-name-in-different-database-schemas). +If you have tables with the same name in different database schemas, Prisma ORM shows a validation error pointing out the conflict. To fix this, [rename the introspected models with the `@map` attribute](#tables-with-the-same-name-in-different-database-schemas). ## How to query across multiple database schemas with Prisma Client @@ -185,6 +192,6 @@ const orders = await prisma.order.findMany({ }) ``` -## Learn more about the multiSchema preview feature +## Learn more about the `multiSchema` preview feature To learn more about future plans for the `multiSchema` preview feature, or to give feedback, refer to [our Github issue](https://github.com/prisma/prisma/issues/1122). diff --git a/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx b/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx index 8daa975dc6..4cf64cc887 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/70-unsupported-database-features.mdx @@ -1,18 +1,19 @@ --- title: 'Unsupported database features' -metaDescription: How to support database features that do not have an equivalent syntax in Prisma Schema Language. +description: How to support database features that do not have an equivalent syntax in Prisma Schema Language. tocDepth: 2 +toc_max_heading_level: 2 --- -Not all database functions and features of all of Prisma's supported databases have a Prisma Schema Language equivalent. Refer to the [database features matrix](/orm/reference/database-features) for a complete list of supported features. +Not all database functions and features of Prisma ORM's supported databases have a Prisma Schema Language equivalent. Refer to the [database features matrix](/orm/reference/database-features) for a complete list of supported features. ## Native database functions -Prisma Schema Language supports several [functions](/orm/reference/prisma-schema-reference#attribute-functions) that you can use to set the default value of a field. The following example uses the Prisma-level `uuid()` function to set the value of the `id` field: +Prisma Schema Language supports several [functions](/orm/reference/prisma-schema-reference#attribute-functions) that you can use to set the default value of a field. The following example uses the Prisma ORM-level `uuid()` function to set the value of the `id` field: ```prisma model Post { @@ -32,8 +33,8 @@ model User { There are two reasons to use a database-level function: -- There is no equivalent Prisma function (for example, `gen_random_bytes` in PostgreSQL). -- You cannot or do not want to rely on functions such `uuid()` and `cuid()`, which are only implemented at Prisma level and do not manifest in the database. +- There is no equivalent Prisma ORM function (for example, `gen_random_bytes` in PostgreSQL). +- You cannot or do not want to rely on functions such `uuid()` and `cuid()`, which are only implemented at a Prisma ORM level and do not manifest in the database. Consider the following example, which sets the `id` field to a randomly generated `UUID`: @@ -51,22 +52,24 @@ In PostgreSQL, some native database functions are part of an extension. For exam To use a PostgreSQL extension, you must first install it on the file system of your database server. -In Prisma versions 4.5.0 and later, you can then activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): +In Prisma ORM versions 4.5.0 and later, you can then activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): -```prisma file=schema.prisma highlight=3,9;add +```prisma file=schema.prisma highlight=3,9;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line extensions = [pgcrypto] } ``` -In earlier versions of Prisma, you must instead run a SQL command to activate the extension: +In earlier versions of Prisma ORM, you must instead run a SQL command to activate the extension: ```sql CREATE EXTENSION IF NOT EXISTS pgcrypto; @@ -88,6 +91,7 @@ Some database types of relational databases, such as `polygon` or `geometry`, do ```prisma highlight=3;normal model Star { id Int @id @default(autoincrement()) + //highlight-next-line position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle")) } ``` diff --git a/content/200-orm/100-prisma-schema/20-data-model/80-table-inheritance.mdx b/content/200-orm/100-prisma-schema/20-data-model/80-table-inheritance.mdx index 32170bbb82..f2d6038ce5 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/80-table-inheritance.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/80-table-inheritance.mdx @@ -1,10 +1,12 @@ --- title: Table inheritance metaTitle: Table inheritance -metaDescription: Learn about the use cases and patterns for table inheritance in Prisma ORM that enable usage of union types or polymorphic structures in your application. +description: Learn about the use cases and patterns for table inheritance in Prisma ORM that enable usage of union types or polymorphic structures in your application. tocDepth: 3 --- + + ## Overview Table inheritance is a software design pattern that allows the modeling of hierarchical relationships between entities. Using table inheritance on the database level can also enable the use of union types in your JavaScript/TypeScript application or share a set of common properties across multiple models. @@ -41,7 +43,7 @@ For example, if both the `Video` and `Article` models from above should have a s In a simple Prisma schema, this would look as follows. Note that we're adding a `User` model as well to illustrate how this can work with relations: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Video { id Int @id url String @unique @@ -254,7 +256,7 @@ const articles = await prisma.article.findMany({ Depending on your needs, you may also query the other way around by filtering on the `type` discriminator column: ```ts -// Query all articles +// Query all videos const videoActivities = await prisma.activity.findMany({ where: { type: 'Video' } include: { video: true } diff --git a/content/200-orm/100-prisma-schema/20-data-model/index.mdx b/content/200-orm/100-prisma-schema/20-data-model/index.mdx index 38f3f46a38..029e2de86d 100644 --- a/content/200-orm/100-prisma-schema/20-data-model/index.mdx +++ b/content/200-orm/100-prisma-schema/20-data-model/index.mdx @@ -1,10 +1,12 @@ --- title: 'Data model' metaTitle: 'Data model' -metaDescription: 'Learn everything you need about the Prisma data model.' -toc: false +description: 'Learn everything you need about the Prisma schema data model.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/100-prisma-schema/50-introspection.mdx b/content/200-orm/100-prisma-schema/50-introspection.mdx index a64066e986..d5d2b40f35 100644 --- a/content/200-orm/100-prisma-schema/50-introspection.mdx +++ b/content/200-orm/100-prisma-schema/50-introspection.mdx @@ -1,14 +1,14 @@ --- title: 'Introspection' metaTitle: 'What is introspection? (Reference)' -metaDescription: 'Learn how you can introspect your database to generate a data model into your Prisma schema.' +description: 'Learn how you can introspect your database to generate a data model into your Prisma schema.' --- You can introspect your database using the Prisma CLI in order to generate the [data model](/orm/prisma-schema/data-model) in your [Prisma schema](/orm/prisma-schema). The data model is needed to [generate Prisma Client](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names). -Introspection is often used to generate an _initial_ version of the data model when [adding Prisma to an existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql). +Introspection is often used to generate an _initial_ version of the data model when [adding Prisma ORM to an existing project](/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql). However, it can also be [used _repeatedly_ in an application](#introspection-with-an-existing-schema). This is most commonly the case when you're _not_ using [Prisma Migrate](/orm/prisma-migrate) but perform schema migrations using plain SQL or another migration tool. In that case, you also need to re-introspect your database and subsequently re-generate Prisma Client to reflect the schema changes in your [Prisma Client API](/orm/prisma-client). @@ -18,7 +18,7 @@ However, it can also be [used _repeatedly_ in an application](#introspection-wit Introspection has one main function: Populate your Prisma schema with a data model that reflects the current database schema. -![Introspect your database with Prisma](../../doc-images/prisma-db-pull-generate-schema.png) +![Introspect your database](/img/orm/prisma-db-pull-generate-schema.png) Here's an overview of its main functions on SQL databases: @@ -33,7 +33,7 @@ On MongoDB, the main functions are the following: - Map _documents_ in the collections to the [fields](/orm/prisma-schema/data-model/models#defining-fields) of Prisma models by _sampling them_ - Map _indexes_ in the database to [indexes](/orm/prisma-schema/data-model/models#defining-an-index) in the Prisma schema, if the collection contains at least one document contains a field included in the index -You can learn more about how Prisma maps types from the database to the types available in the Prisma schema on the respective docs page for the data source connector: +You can learn more about how Prisma ORM maps types from the database to the types available in the Prisma schema on the respective docs page for the data source connector: - [PostgreSQL](/orm/overview/databases/postgresql#type-mapping-between-postgresql-and-prisma-schema) - [MySQL](/orm/overview/databases/mysql#type-mapping-between-mysql-to-prisma-schema) @@ -49,7 +49,7 @@ Here's a high-level overview of the steps that `prisma db pull` performs interna 1. Read the [connection URL](/orm/reference/connection-urls) from the `datasource` configuration in the Prisma schema 1. Open a connection to the database 1. Introspect database schema (i.e. read tables, columns and other structures ...) -1. Transform database schema into Prisma data model +1. Transform database schema into Prisma schema data model 1. Write data model into Prisma schema or [update existing schema](#introspection-with-an-existing-schema) ## Introspection workflow @@ -63,11 +63,11 @@ The typical workflow for projects that are not using Prisma Migrate, but instead Note that as you evolve the application, [this process can be repeated for an indefinite number of times](#introspection-with-an-existing-schema). -![Introspect workflow](../../doc-images/prisma-evolve-app-workflow.png) +![Introspect workflow](/img/orm/prisma-evolve-app-workflow.png) ## Rules and conventions -Prisma employs a number of conventions for translating a database schema into a Prisma data model: +Prisma ORM employs a number of conventions for translating a database schema into a data model in the Prisma schema: ### Model, field and enum names @@ -102,7 +102,7 @@ CREATE TABLE "42User" ( ); ``` -Because the leading `42` in the table name as well as the leading underscores and the `$` on the columns are forbidden in Prisma, introspection adds the `@map` and `@@map` attributes so that these names adhere to Prisma's naming conventions: +Because the leading `42` in the table name as well as the leading underscores and the `$` on the columns are forbidden in Prisma ORM, introspection adds the `@map` and `@@map` attributes so that these names adhere to Prisma ORM's naming conventions: ```prisma model User { @@ -192,11 +192,11 @@ Introspection adds attributes in the following order (this order is mirrored by ### Relations -Prisma translates foreign keys that are defined on your database tables into [relations](/orm/prisma-schema/data-model/relations). +Prisma ORM translates foreign keys that are defined on your database tables into [relations](/orm/prisma-schema/data-model/relations). #### One-to-one relations -Prisma adds a [one-to-one](/orm/prisma-schema/data-model/relations/one-to-one-relations) relation to your data model when the foreign key on a table has a `UNIQUE` constraint, e.g.: +Prisma ORM adds a [one-to-one](/orm/prisma-schema/data-model/relations/one-to-one-relations) relation to your data model when the foreign key on a table has a `UNIQUE` constraint, e.g.: ```sql CREATE TABLE "User" ( @@ -209,7 +209,7 @@ CREATE TABLE "Profile" ( ); ``` -Prisma translates this into the following data model: +Prisma ORM translates this into the following data model: ```prisma model User { @@ -226,7 +226,7 @@ model Profile { #### One-to-many relations -By default, Prisma adds a [one-to-many](/orm/prisma-schema/data-model/relations/one-to-many-relations) relation to your data model for a foreign key it finds in your database schema: +By default, Prisma ORM adds a [one-to-many](/orm/prisma-schema/data-model/relations/one-to-many-relations) relation to your data model for a foreign key it finds in your database schema: ```sql CREATE TABLE "User" ( @@ -258,18 +258,18 @@ model Post { [Many-to-many](/orm/prisma-schema/data-model/relations/many-to-many-relations) relations are commonly represented as [relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) in relational databases. -Prisma supports two ways for defining many-to-many relations in the Prisma schema: +Prisma ORM supports two ways for defining many-to-many relations in the Prisma schema: -- [Implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) (Prisma manages the relation table under the hood) +- [Implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) (Prisma ORM manages the relation table under the hood) - [Explicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations) (the relation table is present as a [model](/orm/prisma-schema/data-model/models#defining-models)) -_Implicit_ many-to-many relations are recognized if they adhere to Prisma's [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations). Otherwise the relation table is rendered in the Prisma schema as a model (therefore making it an _explicit_ many-to-many relation). +_Implicit_ many-to-many relations are recognized if they adhere to Prisma ORM's [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations). Otherwise the relation table is rendered in the Prisma schema as a model (therefore making it an _explicit_ many-to-many relation). This topic is covered extensively on the docs page about [Relations](/orm/prisma-schema/data-model/relations). #### Disambiguating relations -Prisma generally omits the `name` argument on the [`@relation`](/orm/prisma-schema/data-model/relations#the-relation-attribute) attribute if it's not needed. Consider the `User` ↔ `Post` example from the previous section. The `@relation` attribute only has the `references` argument, `name` is omitted because it's not needed in this case: +Prisma ORM generally omits the `name` argument on the [`@relation`](/orm/prisma-schema/data-model/relations#the-relation-attribute) attribute if it's not needed. Consider the `User` ↔ `Post` example from the previous section. The `@relation` attribute only has the `references` argument, `name` is omitted because it's not needed in this case: ```prisma model Post { @@ -294,7 +294,7 @@ CREATE TABLE "Post" ( ); ``` -In this case, Prisma needs to [disambiguate the relation](/orm/prisma-schema/data-model/relations#disambiguating-relations) using a dedicated relation name: +In this case, Prisma ORM needs to [disambiguate the relation](/orm/prisma-schema/data-model/relations#disambiguating-relations) using a dedicated relation name: ```prisma model Post { @@ -312,7 +312,7 @@ model User { } ``` -Note that you can rename the [Prisma-level](/orm/prisma-schema/data-model/relations#relation-fields) relation field to anything you like so that it looks friendlier in the generated Prisma Client API. +Note that you can rename the [Prisma-ORM level](/orm/prisma-schema/data-model/relations#relation-fields) relation field to anything you like so that it looks friendlier in the generated Prisma Client API. ## Introspection with an existing schema @@ -325,8 +325,8 @@ Introspection for relational databases maintains the following manual changes: - Comments - `@map` and `@@map` attributes - `@updatedAt` -- `@default(cuid())` (`cuid()` is a Prisma-level function) -- `@default(uuid())` (`uuid()` is a Prisma-level function) +- `@default(cuid())` (`cuid()` is a Prisma-ORM level function) +- `@default(uuid())` (`uuid()` is a Prisma-ORM level function) - Custom `@relation` names > **Note**: Only relations between models on the database level will be picked up. This means that there **must be a foreign key set**. @@ -353,7 +353,7 @@ Use cases include: ## Introspecting only a subset of your database schema -Introspecting only a subset of your database schema is [not yet officially supported](https://github.com/prisma/prisma/issues/807) by Prisma. +Introspecting only a subset of your database schema is [not yet officially supported](https://github.com/prisma/prisma/issues/807) by Prisma ORM. However, you can achieve this by creating a new database user that only has access to the tables which you'd like to see represented in your Prisma schema, and then perform the introspection using that user. The introspection will then only include the tables the new user has access to. @@ -361,7 +361,7 @@ If your goal is to exclude certain models from the [Prisma Client generation](/o ## Introspection warnings for unsupported features -The Prisma Schema Language (PSL) can express a majority of the database features of the [target databases](/orm/reference/supported-databases) Prisma supports. However, there are features and functionality the Prisma Schema Language still needs to express. +The Prisma Schema Language (PSL) can express a majority of the database features of the [target databases](/orm/reference/supported-databases) Prisma ORM supports. However, there are features and functionality the Prisma Schema Language still needs to express. For these features, the Prisma CLI will surface detect usage of the feature in your database and return a warning. The Prisma CLI will also add a comment in the models and fields the features are in use in the Prisma schema. The warnings will also contain a workaround suggestion. diff --git a/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx b/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx index 60ecce7455..1319f35344 100644 --- a/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx +++ b/content/200-orm/100-prisma-schema/80-postgresql-extensions.mdx @@ -1,8 +1,8 @@ --- title: 'PostgreSQL extensions' metaTitle: 'How to represent PostgreSQL extensions in your Prisma schema' -metaDescription: 'How to represent PostgreSQL extensions in your Prisma scheme, introspect extensions in your database, and apply changes to extensions with Prisma Migrate' -preview: true +description: 'How to represent PostgreSQL extensions in your Prisma scheme, introspect extensions in your database, and apply changes to extensions with Prisma Migrate' +sidebar_class_name: preview-badge tocDepth: 3 --- @@ -32,13 +32,14 @@ Note that PostgreSQL's documentation uses the term 'install' to refer to what we Prisma's `postgresqlExtensions` preview feature allows you to represent PostgreSQL extensions in your Prisma schema. Note that specific extensions may add functionality that is not currently supported by Prisma. For example, an extension may add a type or index that is not supported by Prisma. This functionality must be implemented on a case-by-case basis and is not provided by this preview feature. -## How to enable the postgresqlExtensions preview feature +## How to enable the `postgresqlExtensions` preview feature Representing PostgreSQL extensions in your Prisma schema is currently a preview feature. To enable the `postgresqlExtensions` preview feature, you will need to add the `postgresqlExtensions` feature flag to the `previewFeatures` field of the `generator` block in your Prisma schema file: -```prisma file=schema.prisma highlight=3;add +```prisma file=schema.prisma highlight=3;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["postgresqlExtensions"] } @@ -52,7 +53,7 @@ datasource db { To represent PostgreSQL extensions in your Prisma schema, add the `extensions` field to the `datasource` block of your `schema.prisma` file with an array of the extensions that you require. For example, the following schema lists the `hstore`, `pg_trgm` and `postgis` extensions: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -70,7 +71,7 @@ In the example above, the `hstore` extension uses the `myHstoreSchema` schema, a The `map` argument is useful when the PostgreSQL extension that you want to activate has a name that is not a valid identifier in the Prisma schema. For example, the `uuid-ossp` PostgreSQL extension name is an invalid identifier because it contains a hyphen. In the following example, the extension is mapped to the valid name `uuidOssp` in the Prisma schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") diff --git a/content/200-orm/100-prisma-schema/_category_.json b/content/200-orm/100-prisma-schema/_category_.json new file mode 100644 index 0000000000..2cf70ba2bd --- /dev/null +++ b/content/200-orm/100-prisma-schema/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Prisma Schema", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/100-prisma-schema/index.mdx b/content/200-orm/100-prisma-schema/index.mdx index 4ab105016c..48497915df 100644 --- a/content/200-orm/100-prisma-schema/index.mdx +++ b/content/200-orm/100-prisma-schema/index.mdx @@ -1,9 +1,9 @@ --- title: 'Prisma schema' metaTitle: 'Prisma schema' -metaDescription: 'Learn everything you need to know about the Prisma schema.' +description: 'Learn everything you need to know about the Prisma schema.' staticLink: true -toc: false +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/005-introduction.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/005-introduction.mdx index e0eed289f7..2e8b92c3d9 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/005-introduction.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/005-introduction.mdx @@ -1,35 +1,41 @@ --- title: 'Introduction' metaTitle: 'Introduction to Prisma Client' -metaDescription: 'Learn how to set up Prisma Client.' +description: 'Learn how to set up Prisma Client.' --- + +import { + Icon +} from '@site/src/components/Icon'; + Prisma Client is an auto-generated and type-safe query builder that's _tailored_ to your data. The easiest way to get started with Prisma Client is by following the **[Quickstart](/getting-started/quickstart)**. - + + Quickstart (5 min) - + The setup instructions [below](#set-up) provide a high-level overview of the steps needed to set up Prisma Client. If you want to get started using Prisma Client with your own database, follow one of these guides: - + Set up a new project from scratch - +

- + Add Prisma to an existing project - +
@@ -39,7 +45,7 @@ The setup instructions [below](#set-up) provide a high-level overview of the ste In order to set up Prisma Client, you need a [Prisma schema file](/orm/prisma-schema) with your database connection, the Prisma Client generator, and at least one model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { url = env("DATABASE_URL") provider = "postgresql" @@ -78,9 +84,9 @@ This command also runs the `prisma generate` command, which generates Prisma Cli There are multiple ways to import Prisma Client in your project depending on your use case: -, ]}> + - + ```ts import { PrismaClient } from '@prisma/client' @@ -89,9 +95,9 @@ const prisma = new PrismaClient() // use `prisma` in your application to read and write data in your DB ``` - + - + ```js const { PrismaClient } = require('@prisma/client') @@ -100,15 +106,15 @@ const prisma = new PrismaClient() // use `prisma` in your application to read and write data in your DB ``` - + For edge environments, you can import Prisma Client as follows: -, ]}> + - + ```ts import { PrismaClient } from '@prisma/client/edge' @@ -117,9 +123,9 @@ const prisma = new PrismaClient() // use `prisma` in your application to read and write data in your DB ``` - + - + ```js const { PrismaClient } = require('@prisma/client/edge') @@ -128,7 +134,7 @@ const prisma = new PrismaClient() // use `prisma` in your application to read and write data in your DB ``` - + diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/010-generating-prisma-client.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/010-generating-prisma-client.mdx index 132de2750b..f0466ac4ba 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/010-generating-prisma-client.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/010-generating-prisma-client.mdx @@ -1,7 +1,7 @@ --- title: 'Generating Prisma Client' metaTitle: 'Generating Prisma Client' -metaDescription: 'This page explains how to generate Prisma Client. It also provides additional context on the generated client, typical workflows and Node.js configuration.' +description: 'This page explains how to generate Prisma Client. It also provides additional context on the generated client, typical workflows and Node.js configuration.' --- @@ -38,29 +38,29 @@ To generate and instantiate Prisma Client: prisma generate ``` -1. You can now [instantiate Prisma Client](instantiate-prisma-client) in your code: +1. You can now [instantiate Prisma Client](/orm/prisma-client/setup-and-configuration/instantiate-prisma-client) in your code: - , ]}> + - + - ```ts - import { PrismaClient } from '@prisma/client' - const prisma = new PrismaClient() - // use `prisma` in your application to read and write data in your DB - ``` + ```ts + import { PrismaClient } from '@prisma/client' + const prisma = new PrismaClient() + // use `prisma` in your application to read and write data in your DB + ``` - + - + - ```js - const { PrismaClient } = require('@prisma/client') - const prisma = new PrismaClient() - // use `prisma` in your application to read and write data in your DB - ``` + ```js + const { PrismaClient } = require('@prisma/client') + const prisma = new PrismaClient() + // use `prisma` in your application to read and write data in your DB + ``` - + @@ -68,7 +68,7 @@ To generate and instantiate Prisma Client: Here is a graphical illustration of the typical workflow for generation of Prisma Client: -![Graphical illustration of the typical workflow for generation of Prisma Client](prisma-client-generation-workflow.png) +![Graphical illustration of the typical workflow for generation of Prisma Client](./prisma-client-generation-workflow.png) Note also that `prisma generate` is _automatically_ invoked when you're installing the `@prisma/client` npm package. So, when you're initially setting up Prisma Client, you can typically save the third step from the list above. @@ -95,7 +95,7 @@ import { PrismaClient } from '@prisma/client' Prisma Client is generated from your Prisma schema and is unique to your project. Each time you change the schema (for example, by performing a [schema migration](/orm/prisma-migrate)) and run `prisma generate`, Prisma Client's code changes: -![The .prisma and @prisma folders](prisma-client-node-module.png) +![The .prisma and @prisma folders](./prisma-client-node-module.png) The `.prisma` folder is unaffected by [pruning](https://docs.npmjs.com/cli/prune.html) in Node.js package managers. diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/015-instantiate-prisma-client.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/015-instantiate-prisma-client.mdx index 8c5d3ef03c..8bff1b5853 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/015-instantiate-prisma-client.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/015-instantiate-prisma-client.mdx @@ -1,17 +1,19 @@ --- title: 'Instantiating Prisma Client' metaTitle: 'Instantiating Prisma Client' -metaDescription: 'How to create and use an instance of PrismaClient in your app.' +description: 'How to create and use an instance of PrismaClient in your app.' tocDepth: 3 --- -The following example demonstrates how to import and instantiate your [generated client](generating-prisma-client) from the [default path](generating-prisma-client#using-a-custom-output-path): +The following example demonstrates how to import and instantiate your [generated client](/orm/prisma-client/setup-and-configuration/generating-prisma-client) from the [default path](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path): -, ]}> + + + - + ```ts import { PrismaClient } from '@prisma/client' @@ -19,9 +21,9 @@ import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() ``` - + - + ```js const { PrismaClient } = require('@prisma/client') @@ -29,25 +31,23 @@ const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() ``` - + - +:::tip -You can further customize `PrismaClient` with [constructor parameters](/orm/reference/prisma-client-reference#prismaclient) - for example, set [logging levels](/orm/prisma-client/observability-and-logging/logging) or customize [error formatting](error-formatting). +You can further customize `PrismaClient` with [constructor parameters](/orm/reference/prisma-client-reference#prismaclient) - for example, set [logging levels](/orm/prisma-client/observability-and-logging/logging) or customize [error formatting](/orm/prisma-client/setup-and-configuration/error-formatting). - - - +::: ## The number of `PrismaClient` instances matters -Your application should generally only create **one instance** of `PrismaClient`. How to achieve this depends on whether you are using Prisma in a [long-running application](/orm/prisma-client/setup-and-configuration/databases-connections#prismaclient-in-long-running-applications) or in a [serverless environment](/orm/prisma-client/setup-and-configuration/databases-connections#prismaclient-in-serverless-environments) . +Your application should generally only create **one instance** of `PrismaClient`. How to achieve this depends on whether you are using Prisma ORM in a [long-running application](/orm/prisma-client/setup-and-configuration/databases-connections#prismaclient-in-long-running-applications) or in a [serverless environment](/orm/prisma-client/setup-and-configuration/databases-connections#prismaclient-in-serverless-environments) . The reason for this is that each instance of `PrismaClient` manages a connection pool, which means that a large number of clients can **exhaust the database connection limit**. This applies to all database connectors. -If you use the **MongoDB connector**, connections are managed by the MongoDB driver connection pool. If you use a **relational database connector**, connections are managed by Prisma's [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool). Each instance of `PrismaClient` creates its own pool. +If you use the **MongoDB connector**, connections are managed by the MongoDB driver connection pool. If you use a **relational database connector**, connections are managed by Prisma ORM's [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool). Each instance of `PrismaClient` creates its own pool. 1. Each client creates its own instance of the [query engine](/orm/more/under-the-hood/engines). 1. Each query engine creates a [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool) with a default pool size of: diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx index 1475529552..9c2ced198e 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/100-connection-management.mdx @@ -1,7 +1,7 @@ --- title: 'Connection management' metaTitle: 'Connection management' -metaDescription: 'This page explains how database connections are handled with Prisma Client and how to manually connect and disconnect your database.' +description: 'This page explains how database connections are handled with Prisma Client and how to manually connect and disconnect your database.' tocDepth: 3 --- @@ -12,17 +12,17 @@ tocDepth: 3 - [`$connect()`](/orm/reference/prisma-client-reference#connect-1) - [`$disconnect()`](/orm/reference/prisma-client-reference#disconnect-1) -In most cases, you **do not need to explicitly call these methods**. `PrismaClient` automatically connects when you run your first query, creates a [connection pool](connection-pool), and disconnects when the Node.js process ends. +In most cases, you **do not need to explicitly call these methods**. `PrismaClient` automatically connects when you run your first query, creates a [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool), and disconnects when the Node.js process ends. See the [connection management guide](/orm/prisma-client/setup-and-configuration/databases-connections) for information about managing connections for different deployment paradigms (long-running processes and serverless functions).
-## $connect() +## `$connect()` It is not necessary to call [`$connect()`](/orm/reference/prisma-client-reference#connect-1) thanks to the _lazy connect_ behavior: The `PrismaClient` instance connects lazily when the first request is made to the API (`$connect()` is called for you under the hood). -### Calling $connect() explicitly +### Calling `$connect()` explicitly If you need the first request to respond instantly and cannot wait for a lazy connection to be established, you can explicitly call `prisma.$connect()` to establish a connection to the data source: @@ -33,7 +33,7 @@ const prisma = new PrismaClient() await prisma.$connect() ``` -## $disconnect() +## `$disconnect()` When you call [`$disconnect()`](/orm/reference/prisma-client-reference#disconnect-1) , Prisma Client: @@ -42,13 +42,13 @@ When you call [`$disconnect()`](/orm/reference/prisma-client-reference#disconnec In a long-running application such as a GraphQL API, which constantly serves requests, it does not make sense to `$disconnect()` after each request - it takes time to establish a connection, and doing so as part of each request will slow down your application. - +:::tip To avoid too _many_ connections in a long-running application, we recommend that you [use a single instance of `PrismaClient` across your application](/orm/prisma-client/setup-and-configuration/instantiate-prisma-client#the-number-of-prismaclient-instances-matters). - +::: -### Calling $disconnect() explicitly +### Calling `$disconnect()` explicitly One scenario where you should call `$disconnect()` explicitly is where a script: @@ -87,11 +87,11 @@ If the above script runs multiple times in the context of a long-running applica -From Prisma 5.0.0, the `beforeExit` hook only applies to the [binary Query Engine](/orm/more/under-the-hood/engines#configuring-the-query-engine). +From Prisma ORM 5.0.0, the `beforeExit` hook only applies to the [binary Query Engine](/orm/more/under-the-hood/engines#configuring-the-query-engine). -The `beforeExit` hook runs when Prisma is triggered externally (e.g. via a `SIGINT` signal) to shut down, and allows you to run code _before_ Prisma Client disconnects - for example, to issue queries as part of a graceful shutdown of a service: +The `beforeExit` hook runs when Prisma ORM is triggered externally (e.g. via a `SIGINT` signal) to shut down, and allows you to run code _before_ Prisma Client disconnects - for example, to issue queries as part of a graceful shutdown of a service: ```ts const prisma = new PrismaClient() diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/115-connection-pool.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/115-connection-pool.mdx index 54e52841b6..3c2ce41ed9 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/115-connection-pool.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/115-connection-pool.mdx @@ -1,23 +1,24 @@ --- title: Connection pool -metaDescription: Prisma's query engine creates a connection pool to store and manage database connections. +description: Prisma ORM's query engine creates a connection pool to store and manage database connections. tocDepth: 4 +toc_max_heading_level: 4 --- The query engine manages a **connection pool** of database connections. The pool is created when Prisma Client opens the _first_ connection to the database, which can happen in one of two ways: -- By [explicitly calling `$connect()`](connection-management#connect) _or_ +- By [explicitly calling `$connect()`](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management#connect) _or_ - By running the first query, which calls `$connect()` under the hood -Relational database connectors use Prisma's own connection pool, and the MongoDB connectors uses the [MongoDB driver connection pool](https://github.com/mongodb/specifications/blob/master/source/connection-monitoring-and-pooling/connection-monitoring-and-pooling.rst). +Relational database connectors use Prisma ORM's own connection pool, and the MongoDB connectors uses the [MongoDB driver connection pool](https://github.com/mongodb/specifications/blob/master/source/connection-monitoring-and-pooling/connection-monitoring-and-pooling.rst). ## Relational databases -The relational database connectors use Prisma's connection pool. The connection pool has a **connection limit** and a **pool timeout**, which are controlled by connection URL parameters. +The relational database connectors use Prisma ORM's connection pool. The connection pool has a **connection limit** and a **pool timeout**, which are controlled by connection URL parameters. ### How the connection pool works @@ -204,7 +205,7 @@ You can choose to [disable the connection pool timeout if queries **must** remai ## MongoDB -The MongoDB connector does not use the Prisma connection pool. The connection pool is managed internally by the MongoDB driver and [configured via connection string parameters](https://docs.mongodb.com/manual/reference/connection-string/#connection-pool-options). +The MongoDB connector does not use the Prisma ORM connection pool. The connection pool is managed internally by the MongoDB driver and [configured via connection string parameters](https://docs.mongodb.com/manual/reference/connection-string/#connection-pool-options). ## External connection poolers @@ -214,4 +215,4 @@ Consider introducing [an external connection pooler like PgBouncer](/orm/prisma- ## Manual database connection handling -When using Prisma, the database connections are handled on an [engine](https://github.com/prisma/prisma-engines)-level. This means they're not exposed to the developer and it's not possible to manually access them. +When using Prisma ORM, the database connections are handled on an [engine](https://github.com/prisma/prisma-engines)-level. This means they're not exposed to the developer and it's not possible to manually access them. diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/200-pgbouncer.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/200-pgbouncer.mdx index f6f229587e..c9c3252ad6 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/200-pgbouncer.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/200-pgbouncer.mdx @@ -1,13 +1,14 @@ --- title: Configure Prisma Client with PgBouncer metaTitle: Configure Prisma Client with PgBouncer +toc_max_heading_level: 2 --- An external connection pooler like PgBouncer holds a connection pool to the database, and proxies incoming client connections by sitting between Prisma Client and the database. This reduces the number of processes a database has to handle at any given time. -Usually, this works transparently, but some connection poolers only support a limited set of functionality. One common feature that external connection poolers do not support are named prepared statements, which Prisma uses. For these cases, Prisma can be configured to behave differently. +Usually, this works transparently, but some connection poolers only support a limited set of functionality. One common feature that external connection poolers do not support are named prepared statements, which Prisma ORM uses. For these cases, Prisma ORM can be configured to behave differently. @@ -19,7 +20,7 @@ For Prisma Client to work reliably, PgBouncer must run in [**Transaction mode**] Transaction mode offers a connection for every transaction – a requirement for the Prisma Client to work with PgBouncer. -### Add pgbouncer=true to the connection URL +### Add `pgbouncer=true` to the connection URL To use Prisma Client with PgBouncer, add the `?pgbouncer=true` flag to the PostgreSQL connection URL: @@ -30,12 +31,12 @@ postgresql://USER:PASSWORD@HOST:PORT/DATABASE?pgbouncer=true > Note: `PORT` specified for PgBouncer pooling is sometimes different from the default `5432` port. Check your database provider docs for the correct port number.
- How `pgbouncer` mode works in Prisma + How `pgbouncer` mode works in Prisma ORM -- Prisma opens a transaction for every query – even when just reading data, allowing Prisma to use prepared statements. -- Prisma does not try to set the `search_path`, which is not supported by PgBouncer. -- Prisma cleans up already present prepared statements in the connection by running `DEALLOCATE ALL` before preparing and executing Prisma Client queries. -- Prisma also disables any prepared statement or type query caches. +- Prisma ORM opens a transaction for every query – even when just reading data, allowing Prisma to use prepared statements. +- Prisma ORM does not try to set the `search_path`, which is not supported by PgBouncer. +- Prisma ORM cleans up already present prepared statements in the connection by running `DEALLOCATE ALL` before preparing and executing Prisma Client queries. +- Prisma ORM also disables any prepared statement or type query caches.
@@ -79,4 +80,4 @@ Supabase's Supavisor behaves similarly to [PgBouncer](#pgbouncer). You can add ` ## Other external connection poolers -Although Prisma does not have explicit support for other connection poolers, if the limitations are similar to the ones of [PgBouncer](#pgbouncer) you can usually also use `pgbouncer=true` in your connection string to put Prisma in a mode that works with them as well. +Although Prisma ORM does not have explicit support for other connection poolers, if the limitations are similar to the ones of [PgBouncer](#pgbouncer) you can usually also use `pgbouncer=true` in your connection string to put Prisma ORM in a mode that works with them as well. diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/index.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/index.mdx index 07c4d3030d..01df2a5152 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/index.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/050-databases-connections/index.mdx @@ -1,7 +1,7 @@ --- title: Database connections metaTitle: Database connections -metaDescription: 'Databases connections' +description: 'Databases connections' tocDepth: 3 --- @@ -16,7 +16,7 @@ The way your application **manages connections** also impacts performance. This -This guide focuses on **relational databases** and how to configure and tune the Prisma connection pool (MongoDB uses the MongoDB driver connection pool). +This guide focuses on **relational databases** and how to configure and tune the Prisma ORM connection pool (MongoDB uses the MongoDB driver connection pool). @@ -49,14 +49,14 @@ If you have **multiple** application instances: - You must **manually** [set the `connection_limit` parameter](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool#setting-the-connection-pool-size) . For example, if your calculated pool size is _10_ and you have _2_ instances of your app, the `connection_limit` parameter should be **no more than _5_**. - You can optionally [tune the pool size](#optimizing-the-connection-pool). -### PrismaClient in long-running applications +### `PrismaClient` in long-running applications In **long-running** applications, we recommend that you: - ✔ Create **one** instance of `PrismaClient` and re-use it across your application - ✔ Assign `PrismaClient` to a global variable _in dev environments only_ to [prevent hot reloading from creating new instances](#prevent-hot-reloading-from-creating-new-instances-of-prismaclient) -#### Re-using a single PrismaClient instance +#### Re-using a single `PrismaClient` instance To re-use a single instance, create a module that exports a `PrismaClient` object: @@ -155,28 +155,28 @@ If you are **not** using an external connection pooler, _start_ by setting the p The following example demonstrates how to set the `connection_limit` to 1 in your connection URL: -, ]}> - + + ``` postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public&connection_limit=1 ``` - - + + ``` mysql://USER:PASSWORD@HOST:PORT/DATABASE?connection_limit=1 ``` - + - +:::tip If you are using AWS Lambda and _not_ configuring a `connection_limit`, refer to the following GitHub issue for information about the expected default pool size: https://github.com/prisma/docs/issues/667 - +::: #### With an external connection pooler @@ -201,7 +201,7 @@ If the `connection_limit` is 1, this function is forced to send queries **serial - Does not exhaust the database connection limit - Does not result in pool timeout errors -### PrismaClient in serverless environments +### `PrismaClient` in serverless environments #### Instantiate `PrismaClient` outside the handler @@ -217,7 +217,7 @@ export async function handler() { } ``` -#### Do not explicitly $disconnect() +#### Do not explicitly `$disconnect()` You [do not need to explicitly `$disconnect()`](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management#calling-disconnect-explicitly) at the end of a function, as there is a possibility that the container might be reused. Opening a new connection takes time and slows down your function's ability to process requests. @@ -233,7 +233,7 @@ Code should assume the container to be stateless and create a connection only if Containers that are marked "to be removed" and are not being reused still **keep a connection open** and can stay in that state for some time (unknown and not documented from AWS). This can lead to sub-optimal utilization of the database connections. -A potential solution is to **clean up idle connections** ([`serverless-mysql`](https://github.com/jeremydaly/serverless-mysql) implements this idea, but cannot be used with Prisma). +A potential solution is to **clean up idle connections** ([`serverless-mysql`](https://github.com/jeremydaly/serverless-mysql) implements this idea, but cannot be used with Prisma ORM). #### Concurrency limits @@ -302,20 +302,23 @@ Connection poolers like [Prisma Accelerate](/accelerate) and PgBouncer prevent y If you would like to use the Prisma CLI in order to perform other actions on your database ,e.g. migrations and introspection, you will need to add an environment variable that provides a direct connection to your database in the `datasource.directUrl` property in your Prisma schema: -```env file=.env highlight=4,5;add +```env file=.env highlight=4,5;add showLineNumbers # Connection URL to your database using PgBouncer. DATABASE_URL="postgres://root:password@127.0.0.1:54321/postgres?pgbouncer=true" +//add-start # Direct connection URL to the database used for migrations DIRECT_URL="postgres://root:password@127.0.0.1:5432/postgres" +//add-end ``` You can then update your `schema.prisma` to use the new direct URL: -```prisma file=schema.prisma highlight=4;add +```prisma file=schema.prisma highlight=4;add showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line directUrl = env("DIRECT_URL") } ``` diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/100-custom-model-and-field-names.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/100-custom-model-and-field-names.mdx index a60eb98ed9..7a58e8b5f0 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/100-custom-model-and-field-names.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/100-custom-model-and-field-names.mdx @@ -1,7 +1,7 @@ --- title: 'Custom model and field names' metaTitle: 'Custom model and field names' -metaDescription: 'Learn how you can decouple the naming of Prisma models from database tables to improve the ergonomics of the generated Prisma Client API.' +description: 'Learn how you can decouple the naming of Prisma models from database tables to improve the ergonomics of the generated Prisma Client API.' --- @@ -93,9 +93,9 @@ model users { There are a few "issues" with this Prisma schema when the Prisma Client API is generated: -**Adhering to Prisma's naming conventions** +**Adhering to Prisma ORM's naming conventions** -Prisma has a [naming convention](/orm/reference/prisma-schema-reference#naming-conventions) of **camelCasing** and using the **singular form** for Prisma models. If these naming conventions are not met, the Prisma schema can become harder to interpret and the generated Prisma Client API will feel less natural. Consider the following, generated model: +Prisma ORM has a [naming convention](/orm/reference/prisma-schema-reference#naming-conventions) of **camelCasing** and using the **singular form** for Prisma models. If these naming conventions are not met, the Prisma schema can become harder to interpret and the generated Prisma Client API will feel less natural. Consider the following, generated model: ```prisma model users { @@ -107,7 +107,7 @@ model users { } ``` -Although `profiles` refers to a 1:1 relation, its type is currently called `profiles` in plural, suggesting that there might be many `profiles` in this relation. With Prisma conventions, the models and fields were _ideally_ named as follows: +Although `profiles` refers to a 1:1 relation, its type is currently called `profiles` in plural, suggesting that there might be many `profiles` in this relation. With Prisma ORM conventions, the models and fields were _ideally_ named as follows: ```prisma model User { @@ -119,7 +119,7 @@ model User { } ``` -Because these fields are "Prisma-level" [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) that do not manifest you can manually rename them in your Prisma schema. +Because these fields are "Prisma ORM-level" [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) that do not manifest you can manually rename them in your Prisma schema. **Naming of annotated relation fields** @@ -224,7 +224,7 @@ model User { } ``` -With these changes, you're now adhering to Prisma's naming conventions and the generated Prisma Client API feels more "natural": +With these changes, you're now adhering to Prisma ORM's naming conventions and the generated Prisma Client API feels more "natural": ```ts // Nested writes @@ -250,7 +250,7 @@ const userByProfile = await prisma.profile ## Renaming relation fields -Prisma-level [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) (sometimes referred to as "virtual relation fields") only exist in the Prisma schema, but do not actually manifest in the underlying database. You can therefore name these fields whatever you want. +Prisma ORM-level [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) (sometimes referred to as "virtual relation fields") only exist in the Prisma schema, but do not actually manifest in the underlying database. You can therefore name these fields whatever you want. Consider the following example of an ambiguous relation in a SQL database: @@ -267,7 +267,7 @@ CREATE TABLE "Post" ( ); ``` -Prisma's introspection will output the following Prisma schema: +Prisma ORM's introspection will output the following Prisma schema: ```prisma model Post { @@ -298,8 +298,10 @@ model Post { model User { id Int @id @default(autoincrement()) + //edit-start writtenPosts Post[] @relation("Post_authorToUser") favoritedPosts Post[] @relation("Post_favoritedByToUser") + //edit-end } ``` diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/150-error-formatting.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/150-error-formatting.mdx index c880444b25..bf3c1a8ff2 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/150-error-formatting.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/150-error-formatting.mdx @@ -1,7 +1,7 @@ --- title: 'Configuring error formatting' metaTitle: 'Configuring error formatting (Concepts)' -metaDescription: 'This page explains how to configure the formatting of errors when using Prisma Client.' +description: 'This page explains how to configure the formatting of errors when using Prisma Client.' --- diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/200-read-replicas.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/200-read-replicas.mdx index 0d73fbb82b..04f56b946b 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/200-read-replicas.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/200-read-replicas.mdx @@ -1,7 +1,7 @@ --- title: 'Read replicas' metaTitle: 'Read replicas' -metaDescription: 'Learn how to set up and use read replicas with Prisma Client' +description: 'Learn how to set up and use read replicas with Prisma Client' tocDepth: 3 --- @@ -9,7 +9,7 @@ tocDepth: 3 Read replicas enable you to distribute workloads across database replicas for high-traffic workloads. The [read replicas extension](https://github.com/prisma/extension-read-replicas), `@prisma/extension-read-replicas`, adds support for read-only database replicas to Prisma Client. -The read replicas extension supports Prisma versions [5.2.0](https://github.com/prisma/prisma/releases/tag/5.2.0) and higher. If you run into a bug or have feedback, create a GitHub issue [here](https://github.com/prisma/extension-read-replicas/issues/new). +The read replicas extension supports Prisma ORM versions [5.2.0](https://github.com/prisma/prisma/releases/tag/5.2.0) and higher. If you run into a bug or have feedback, create a GitHub issue [here](https://github.com/prisma/extension-read-replicas/issues/new). diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/220-database-polyfills.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/220-database-polyfills.mdx index 9cfe6e692e..bfaacab01a 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/220-database-polyfills.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/220-database-polyfills.mdx @@ -1,7 +1,8 @@ --- title: 'Database polyfills' metaTitle: 'Database polyfills (Concepts)' -metaDescription: 'Prisma Client provides features that are not achievable with relational databases. These features are referred to as "polyfills" and explained on this page.' +description: 'Prisma Client provides features that are not achievable with relational databases. These features are referred to as "polyfills" and explained on this page.' +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/000-setup-and-configuration/index.mdx b/content/200-orm/200-prisma-client/000-setup-and-configuration/index.mdx index c1c3f53673..206fa6709e 100644 --- a/content/200-orm/200-prisma-client/000-setup-and-configuration/index.mdx +++ b/content/200-orm/200-prisma-client/000-setup-and-configuration/index.mdx @@ -1,7 +1,8 @@ --- title: 'Setup & configuration' metaTitle: 'Setup & configuration' -metaDescription: 'This section explains how to generate, configure, and instantiate Prisma Client, as well as when and how to manage database connections.' +description: 'This section explains how to generate, configure, and instantiate Prisma Client, as well as when and how to manage database connections.' +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx index 2a06472fb0..d415f6b502 100644 --- a/content/200-orm/200-prisma-client/100-queries/030-crud.mdx +++ b/content/200-orm/200-prisma-client/100-queries/030-crud.mdx @@ -1,8 +1,9 @@ --- title: 'CRUD' metaTitle: 'CRUD (Reference)' -metaDescription: 'How to perform CRUD with Prisma Client.' +description: 'How to perform CRUD with Prisma Client.' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -22,10 +23,12 @@ Refer to the [Prisma Client API reference documentation](/orm/reference/prisma-c All examples are based on the following schema: -
Expand for sample schema +
-, ]}> - +Expand for sample schema + + + ```prisma datasource db { @@ -79,8 +82,8 @@ enum Role { } ``` - - + + ```prisma datasource db { @@ -134,7 +137,7 @@ enum Role { } ``` - +
@@ -290,7 +293,7 @@ The following video demonstrates how to use `createMany` and [faker.js](https:// ### Create records and connect or create related records -See [Working with relations > Nested writes](relation-queries#nested-writes) for information about creating a record and one or more related records at the same time. +See [Working with relations > Nested writes](/orm/prisma-client/queries/relation-queries#nested-writes) for information about creating a record and one or more related records at the same time. ## Read @@ -333,7 +336,7 @@ The following [`findMany`](/orm/reference/prisma-client-reference#findmany) quer const users = await prisma.user.findMany() ``` -You can also [paginate your results](pagination). +You can also [paginate your results](/orm/prisma-client/queries/pagination). ### Get the first record that matches a specific criteria @@ -361,7 +364,7 @@ const findUser = await prisma.user.findFirst({ ### Get a filtered list of records -Prisma Client supports [filtering](filtering-and-sorting) on record fields and related record fields. +Prisma Client supports [filtering](/orm/prisma-client/queries/filtering-and-sorting) on record fields and related record fields. #### Filter by a single field value @@ -424,7 +427,7 @@ const users = await prisma.user.findMany({ }) ``` -See [Working with relations](relation-queries) for more examples of filtering on related field values. +See [Working with relations](/orm/prisma-client/queries/relation-queries) for more examples of filtering on related field values. ### Select a subset of fields @@ -457,8 +460,8 @@ const user = await prisma.user.findUnique({ For more information about including relations, refer to: -- [Select fields](select-fields) -- [Relation queries](relation-queries) +- [Select fields](/orm/prisma-client/queries/select-fields) +- [Relation queries](/orm/prisma-client/queries/relation-queries) #### Select a subset of related record fields @@ -496,11 +499,11 @@ const user = await prisma.user.findUnique({ -For more information about including relations, see [Select fields and include relations](select-fields). +For more information about including relations, see [Select fields and include relations](/orm/prisma-client/queries/select-fields). ### Select distinct field values -See [Select `distinct`](aggregation-grouping-summarizing#select-distinct) for information about selecting distinct field values. +See [Select `distinct`](/orm/prisma-client/queries/aggregation-grouping-summarizing#select-distinct) for information about selecting distinct field values. ### Include related records @@ -565,11 +568,11 @@ const users = await prisma.user.findMany({ -For more information about including relations, see [Select fields and include relations](select-fields). +For more information about including relations, see [Select fields and include relations](/orm/prisma-client/queries/select-fields). #### Include a filtered list of relations -See [Working with relations](relation-queries#filter-a-list-of-relations) to find out how to combine [`include`](/orm/reference/prisma-client-reference#include) and `where` for a filtered list of relations - for example, only include a user's published posts. +See [Working with relations](/orm/prisma-client/queries/relation-queries#filter-a-list-of-relations) to find out how to combine [`include`](/orm/reference/prisma-client-reference#include) and `where` for a filtered list of relations - for example, only include a user's published posts. ## Update @@ -681,11 +684,11 @@ const upsertUser = await prisma.user.upsert({ -From version 4.6.0, Prisma carries out upserts with database native SQL commands where possible. [Learn more](/orm/reference/prisma-client-reference#database-upserts). +From version 4.6.0, Prisma Client carries out upserts with database native SQL commands where possible. [Learn more](/orm/reference/prisma-client-reference#database-upserts). -Prisma does not have a `findOrCreate` query. You can use `upsert` as a workaround. To make `upsert` behave like a `findOrCreate` method, provide an empty `update` parameter to `upsert`. +Prisma Client does not have a `findOrCreate` query. You can use `upsert` as a workaround. To make `upsert` behave like a `findOrCreate` method, provide an empty `update` parameter to `upsert`. @@ -712,7 +715,7 @@ const updatePosts = await prisma.post.updateMany({ ### Connect and disconnect related records -Refer to [Working with relations](relation-queries) for information about disconnecting ([`disconnect`](/orm/reference/prisma-client-reference#disconnect) ) and connecting ([`connect`](/orm/reference/prisma-client-reference#connect) ) related records. +Refer to [Working with relations](/orm/prisma-client/queries/relation-queries) for information about disconnecting ([`disconnect`](/orm/reference/prisma-client-reference#disconnect) ) and connecting ([`connect`](/orm/reference/prisma-client-reference#connect) ) related records. ## Delete @@ -787,10 +790,14 @@ To resolve this error, you can: ```prisma highlight=3,4;add|5,6;delete model Post { id Int @id @default(autoincrement()) + //add-start author User? @relation(fields: [authorId], references: [id]) authorId Int? + //add-end + //delete-start author User @relation(fields: [authorId], references: [id]) authorId Int + //delete-end } ``` @@ -852,9 +859,9 @@ In the following examples, the first tab shows how to perform a `TRUNCATE` on a The second tab shows performing the same function but with a MySQL database. In this instance the constraints must be removed before the `TRUNCATE` can be executed, before being reinstated once finished. The whole process is run as a `$transaction` -, ]}> + - + ```ts const tablenames = await prisma.$queryRaw< @@ -874,9 +881,9 @@ try { } ``` - + - + ```ts const transactions: PrismaPromise[] = [] @@ -905,7 +912,7 @@ try { } ``` - + diff --git a/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx b/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx index 12f2455b89..d51ad1eb92 100644 --- a/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx +++ b/content/200-orm/200-prisma-client/100-queries/035-select-fields.mdx @@ -1,7 +1,7 @@ --- title: 'Select fields' metaTitle: 'Select fields (Concepts)' -metaDescription: 'This page explains how to select only a subset of a model''s fields and/or include relations ("eager loading") in a Prisma Client query.' +description: 'This page explains how to select only a subset of a model''s fields and/or include relations ("eager loading") in a Prisma Client query.' tocDepth: 3 --- @@ -14,12 +14,12 @@ By default, when a query returns records (as opposed to a count), the result inc To customize the result: -- Use [`select`](/orm/reference/prisma-client-reference#select) to return specific fields - [you can also use a nested `select` to include relation fields](relation-queries#select-specific-relation-fields) -- Use [`include`](/orm/reference/prisma-client-reference#include) to explicitly [include relations](relation-queries#nested-reads) +- Use [`select`](/orm/reference/prisma-client-reference#select) to return specific fields - [you can also use a nested `select` to include relation fields](/orm/prisma-client/queries/relation-queries#select-specific-relation-fields) +- Use [`include`](/orm/reference/prisma-client-reference#include) to explicitly [include relations](/orm/prisma-client/queries/relation-queries#nested-reads) Selecting only the fields and relations that you require rather than relying on the default selection set can ✔ reduce the size of the response and ✔ improve query speed. -Since version [5.9.0](https://github.com/prisma/prisma/releases/tag/5.9.0), when doing a relation query with `include` or by using `select` on a relation field, you can also specify the `relationLoadStrategy` to decide whether you want to use a database-level JOIN or perform multiple queries and merge the data on the application level. This feature is currently in [Preview](/orm/more/releases#preview), you can learn more about it [here](/orm/prisma-client/queries/relation-queries#relation-load-strategies-preview). +Since version [5.9.0](https://github.com/prisma/prisma/releases/tag/5.9.0), when doing a relation query with `include` or by using `select` on a relation field, you can also specify the `relationLoadStrategy` to decide whether you want to use a database-level join or perform multiple queries and merge the data on the application level. This feature is currently in [Preview](/orm/more/releases#preview), you can learn more about it [here](/orm/prisma-client/queries/relation-queries#relation-load-strategies-preview). @@ -27,10 +27,12 @@ Since version [5.9.0](https://github.com/prisma/prisma/releases/tag/5.9.0), when All examples are based on the following schema: -
Expand for sample schema +
-, ]}> - +Expand for sample schema + + + ```prisma generator client { @@ -84,8 +86,8 @@ enum Role { } ``` - - + + ```prisma datasource db { @@ -139,7 +141,7 @@ enum Role { } ``` - +
@@ -311,9 +313,9 @@ const users = await prisma.user.findMany({ For more information about querying relations, refer to the following documentation: -- [Include a relation (including all fields)](relation-queries#include-all-fields-for-a-specific-relation) -- [Select specific relation fields](relation-queries#select-specific-relation-fields) +- [Include a relation (including all fields)](/orm/prisma-client/queries/relation-queries#include-all-fields-for-a-specific-relation) +- [Select specific relation fields](/orm/prisma-client/queries/relation-queries#select-specific-relation-fields) ## Relation count -In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` or `select` a count of relations](aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. +In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` or `select` a count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. diff --git a/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx b/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx index 4bddafa2c5..765945bd85 100644 --- a/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx +++ b/content/200-orm/200-prisma-client/100-queries/037-relation-queries.mdx @@ -1,8 +1,9 @@ --- title: 'Relation queries' metaTitle: 'Relation queries (Concepts)' -metaDescription: 'Prisma Client provides convenient queries for working with relations, such as a fluent API, nested writes (transactions), nested reads and relation filters.' +description: 'Prisma Client provides convenient queries for working with relations, such as a fluent API, nested writes (transactions), nested reads and relation filters.' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -10,7 +11,7 @@ tocDepth: 4 A key feature of Prisma Client is the ability to query [relations](/orm/prisma-schema/data-model/relations) between two or more models. Relation queries include: - [Nested reads](#nested-reads) (sometimes referred to as _eager loading_) via [`select`](/orm/reference/prisma-client-reference#select) and [`include`](/orm/reference/prisma-client-reference#include) -- [Nested writes](#nested-writes) with [transactional](transactions) guarantees +- [Nested writes](#nested-writes) with [transactional](/orm/prisma-client/queries/transactions) guarantees - [Filtering on related records](#relation-filters) Prisma Client also has a [fluent API for traversing relations](#fluent-api). @@ -30,18 +31,18 @@ Since version [5.9.0](https://github.com/prisma/prisma/releases/tag/5.9.0), you Because the `relationLoadStrategy` option is currently in Preview, you need to enable it via the `relationJoins` preview feature flag in your Prisma schema file: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["relationJoins"] } ``` -After adding this flag, you need to run `prisma generate` again to re-generate Prisma Client. Also note that this feature is currently only available on PostgreSQL and CockroachDB for now. +After adding this flag, you need to run `prisma generate` again to re-generate Prisma Client. This feature is currently available on PostgreSQL, CockroachDB and MySQL. Prisma Client supports two load strategies for relations: -- `join` (default): Uses a database-level `LATERAL JOIN` and fetches all data with a single query to the database. +- `join` (default): Uses a database-level `LATERAL JOIN` (PostgreSQL) or correlated subqueries (MySQL) and fetches all data with a single query to the database. - `query`: Sends multiple queries to the database (one per table) and joins them on the application level. Another important difference between these two options is that the `join` strategy uses JSON aggregation on the database level. That means that it creates the JSON structures returned by Prisma Client already in the database which saves computation resources on the application level. @@ -76,10 +77,9 @@ const users = await prisma.user.findMany({ #### When to use which load strategy? -- The `join` strategy will be more effective in most scenarios. It uses a combination of `LATERAL JOINs` and JSON aggregation to reduce redundancy in result sets and delegate the work of transforming the query results into the expected JSON structures on the database server. +- The `join` strategy (default) will be more effective in most scenarios. On PostgreSQL, it uses a combination of `LATERAL JOINs` and JSON aggregation to reduce redundancy in result sets and delegate the work of transforming the query results into the expected JSON structures on the database server. On MySQL, it uses correlated subqueries to fetch the results with a single query. - There may be edge cases where `query` could be more performant depending on the characteristics of the dataset and query. We recommend that you profile your database queries to identify these situations. - Use `query` if you want to save resources on the database server and do heavy-lifting of merging and transforming data in the application server which might be easier to scale. -- Older database versions that don’t implement the `LATERAL` keyword may struggle require query complexity and data redundancy so that sending individual queries could be more performant. ### Include a relation @@ -319,9 +319,11 @@ Note that you **cannot** use `select` and `include` _on the same level_. This me ```ts highlight=3,6;delete // The following query returns an exception const user = await prisma.user.findFirst({ + //delete-next-line select: { // This won't work! email: true } + //delete-next-line include: { // This won't work! posts: { select: { @@ -381,7 +383,7 @@ const user = await prisma.user.findFirst({ ## Relation count -In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` or `select` a count of relations](aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. +In [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later, you can [`include` or `select` a count of relations](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) alongside fields - for example, a user's post count. @@ -473,12 +475,14 @@ const result = await prisma.user.create({ data: { email: 'elsa@prisma.io', name: 'Elsa Prisma', + //highlight-start posts: { create: [ { title: 'How to make an omelette' }, { title: 'How to eat an omelette' }, ], }, + //highlight-end }, include: { posts: true, // Include all posts in the returned object @@ -557,6 +561,7 @@ const result = await prisma.user.create({ data: { email: 'yvette@prisma.io', name: 'Yvette', + //highlight-start posts: { create: [ { @@ -570,6 +575,7 @@ const result = await prisma.user.create({ { title: 'How to eat an omelette' }, ], }, + //highlight-end }, include: { // Include posts @@ -643,11 +649,13 @@ The example uses a nested `include` to include all posts. const result = await prisma.user.create({ data: { email: 'saanvi@prisma.io', + //highlight-start posts: { createMany: { data: [{ title: 'My first post' }, { title: 'My second post' }], }, }, + //highlight-end }, include: { posts: true, @@ -711,16 +719,20 @@ const createMany = await prisma.user.createMany({ { name: 'Yewande', email: 'yewande@prisma.io', + //delete-start posts: { // Not possible to create posts! }, + //delete-end }, { name: 'Noor', email: 'noor@prisma.io', + //delete-start posts: { // Not possible to create posts! }, + //delete-end }, ], }) @@ -737,9 +749,11 @@ The following query creates ([`create`](/orm/reference/prisma-client-reference#c const result = await prisma.user.create({ data: { email: 'vlad@prisma.io', + //highlight-start posts: { connect: [{ id: 8 }, { id: 9 }, { id: 10 }], }, + //highlight-end }, include: { posts: true, // Include all posts in the returned object @@ -787,10 +801,12 @@ const result = await prisma.user.update({ id: 9, }, data: { + //highlight-start posts: { connect: { id: 11, }, + //highlight-end }, }, include: { @@ -813,6 +829,7 @@ If a related record may or may not already exist, use [`connectOrCreate`](/orm/r const result = await prisma.post.create({ data: { title: 'How to make croissants', + //highlight-start author: { connectOrCreate: { where: { @@ -824,6 +841,7 @@ const result = await prisma.post.create({ }, }, }, + //highlight-end }, include: { author: true, @@ -869,9 +887,11 @@ const result = await prisma.user.update({ id: 16, }, data: { + //highlight-start posts: { disconnect: [{ id: 12 }, { id: 19 }], }, + //highlight-end }, include: { posts: true, @@ -908,9 +928,11 @@ const result = await prisma.post.update({ id: 23, }, data: { + //highlight-start author: { disconnect: true, }, + //highlight-end }, include: { author: true, @@ -950,9 +972,11 @@ const result = await prisma.user.update({ id: 16, }, data: { + //highlight-start posts: { set: [], }, + //highlight-end }, include: { posts: true, @@ -988,9 +1012,11 @@ const result = await prisma.user.update({ id: 11, }, data: { + //highlight-start posts: { deleteMany: {}, }, + //highlight-end }, include: { posts: true, @@ -1008,11 +1034,13 @@ const result = await prisma.user.update({ id: 11, }, data: { + //highlight-start posts: { deleteMany: { published: false, }, }, + //highlight-end }, include: { posts: true, @@ -1028,9 +1056,11 @@ const result = await prisma.user.update({ id: 6, }, data: { + //highlight-start posts: { deleteMany: [{ id: 7 }], }, + //highlight-end }, include: { posts: true, @@ -1048,6 +1078,7 @@ const result = await prisma.user.update({ id: 6, }, data: { + //highlight-start posts: { updateMany: { where: { @@ -1058,6 +1089,7 @@ const result = await prisma.user.update({ }, }, }, + //highlight-end }, include: { posts: true, @@ -1073,6 +1105,7 @@ const result = await prisma.user.update({ id: 6, }, data: { + //highlight-start posts: { update: { where: { @@ -1083,6 +1116,7 @@ const result = await prisma.user.update({ }, }, }, + //highlight-end }, include: { posts: true, @@ -1100,6 +1134,7 @@ const result = await prisma.post.update({ id: 6, }, data: { + //highlight-start author: { upsert: { create: { @@ -1112,6 +1147,7 @@ const result = await prisma.post.update({ }, }, }, + //highlight-end }, include: { author: true, @@ -1129,11 +1165,13 @@ const result = await prisma.user.update({ id: 9, }, data: { + //highlight-start posts: { createMany: { data: [{ title: 'My first post' }, { title: 'My second post' }], }, }, + //highlight-end }, include: { posts: true, @@ -1163,6 +1201,7 @@ For example, the following query returns `User` that meet the following criteria ```ts highlight=3-14;normal const users = await prisma.user.findMany({ where: { + //highlight-start posts: { none: { views: { @@ -1175,6 +1214,7 @@ const users = await prisma.user.findMany({ }, }, }, + //highlight-end }, include: { posts: true, @@ -1194,6 +1234,7 @@ For example, the following query returns `Post` records that meet the following ```ts highlight=3-13;normal const users = await prisma.post.findMany({ where: { + //highlight-start author: { isNot: { name: 'Bob', @@ -1205,6 +1246,7 @@ const users = await prisma.post.findMany({ }, }, }, + //highlight-end include: { author: true, }, @@ -1218,9 +1260,11 @@ For example, the following query uses `none` to return all users that have zero ```ts highlight=3-5;normal const usersWithZeroPosts = await prisma.user.findMany({ where: { + //highlight-start posts: { none: {}, }, + //highlight-end }, include: { posts: true, @@ -1235,6 +1279,7 @@ The following query returns all posts that don't have an author relation: ```js highlight=3;normal const postsWithNoAuthor = await prisma.post.findMany({ where: { + //highlight-next-line author: null, // or author: { } }, include: { @@ -1250,9 +1295,11 @@ The following query returns all users with at least one post: ```ts highlight=3-5;normal const usersWithSomePosts = await prisma.user.findMany({ where: { + //highlight-start posts: { some: {}, }, + //highlight-end }, include: { posts: true, @@ -1286,7 +1333,7 @@ const postsByUser = await prisma.post.findMany({ The main difference between the queries is that the fluent API call is translated into two separate database queries while the other one only generates a single query (see this [GitHub issue](https://github.com/prisma/prisma/issues/1984)) -> **Note**: You can use the fact that `.findUnique({ where: { email: 'alice@prisma.io' } }).posts()` queries are automatically batched by the Prisma dataloader to [avoid the n+1 problem in GraphQL resolvers](/orm/prisma-client/queries/query-optimization-performance#solving-n1-in-graphql-with-findunique-and-prismas-dataloader). +> **Note**: You can use the fact that `.findUnique({ where: { email: 'alice@prisma.io' } }).posts()` queries are automatically batched by the Prisma dataloader in Prisma Client to [avoid the n+1 problem in GraphQL resolvers](/orm/prisma-client/queries/query-optimization-performance#solving-n1-in-graphql-with-findunique-and-prisma-clients-dataloader). This request returns all categories by a specific post: diff --git a/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx b/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx index b40960888b..8de188306e 100644 --- a/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx +++ b/content/200-orm/200-prisma-client/100-queries/050-filtering-and-sorting.mdx @@ -1,7 +1,7 @@ --- title: 'Filtering and Sorting' metaTitle: 'Filtering and Sorting (Concepts)' -metaDescription: 'Use Prisma Client API to filter records by any combination of fields or related record fields, and/or sort query results.' +description: 'Use Prisma Client API to filter records by any combination of fields or related record fields, and/or sort query results.' tocDepth: 3 --- @@ -57,7 +57,7 @@ const result = await prisma.user.findMany({ -```json5 no-copy +```json no-copy [ { id: 1, @@ -122,7 +122,7 @@ const result = await prisma.user.findMany({ -```json5 no-copy +```json no-copy [{ email: 'yewande@prisma.io' }, { email: `raheem@gmail.com` }] ``` @@ -155,13 +155,14 @@ const posts = await prisma.post.findMany({ ### Filter on relations -Prisma Client supports [filtering on related records](relation-queries#relation-filters). For example, in the following schema, a user can have many blog posts: +Prisma Client supports [filtering on related records](/orm/prisma-client/queries/relation-queries#relation-filters). For example, in the following schema, a user can have many blog posts: ```prisma highlight=5,12-13;normal model User { id Int @id @default(autoincrement()) name String? email String @unique + //highlight-next-line posts Post[] // User can have many posts } @@ -169,8 +170,10 @@ model Post { id Int @id @default(autoincrement()) title String published Boolean @default(true) + //highlight-start author User @relation(fields: [authorId], references: [id]) authorId Int + //highlight-end } ``` @@ -220,7 +223,7 @@ const posts = await client.post.findMany({ ### Case-insensitive filtering -Case-insensitive filtering [is available as a feature for the PostgreSQL and MongoDB providers](case-sensitivity#options-for-case-insensitive-filtering). MySQL, MariaDB and Microsoft SQL Server are case-insensitive by default, and do not require a Prisma Client feature to make case-insensitive filtering possible. +Case-insensitive filtering [is available as a feature for the PostgreSQL and MongoDB providers](/orm/prisma-client/queries/case-sensitivity#options-for-case-insensitive-filtering). MySQL, MariaDB and Microsoft SQL Server are case-insensitive by default, and do not require a Prisma Client feature to make case-insensitive filtering possible. To use case-insensitive filtering, add the `mode` property to a particular filter and specify `insensitive`: @@ -238,7 +241,7 @@ const users = await prisma.user.findMany({ }) ``` -See also: [Case sensitivity](case-sensitivity) +See also: [Case sensitivity](/orm/prisma-client/queries/case-sensitivity) ### Filtering FAQs @@ -349,7 +352,7 @@ const usersWithPosts = await prisma.user.findMany({ -> **Note**: You can also [sort lists of nested records](relation-queries#filter-a-list-of-relations) +> **Note**: You can also [sort lists of nested records](/orm/prisma-client/queries/relation-queries#filter-a-list-of-relations) > to retrieve a single record by ID. ### Sort by relation diff --git a/content/200-orm/200-prisma-client/100-queries/055-pagination.mdx b/content/200-orm/200-prisma-client/100-queries/055-pagination.mdx index 25627e6d40..e0218acf65 100644 --- a/content/200-orm/200-prisma-client/100-queries/055-pagination.mdx +++ b/content/200-orm/200-prisma-client/100-queries/055-pagination.mdx @@ -1,7 +1,7 @@ --- title: 'Pagination' metaTitle: 'Pagination (Reference)' -metaDescription: 'Prisma Client supports both offset pagination and cursor-based pagination. Learn more about the pros and cons of different pagination approaches and how to implement them.' +description: 'Prisma Client supports both offset pagination and cursor-based pagination. Learn more about the pros and cons of different pagination approaches and how to implement them.' --- @@ -21,7 +21,7 @@ const results = await prisma.post.findMany({ }) ``` -![](../../../doc-images/offset-skip-take.png) +![](/img/orm/offset-skip-take.png) To implement pages of results, you would just `skip` the number of pages multiplied by the number of results you show per page. @@ -103,7 +103,7 @@ const firstQueryResults = await prisma.post.findMany({ The following diagram shows the IDs of the first 4 results - or page 1. The cursor for the next query is **29**: -![](../../../doc-images/cursor-1.png) +![](/img/orm/cursor-1.png) The second query returns the first 4 `Post` records that contain the word `"Prisma"` **after the supplied cursor** (in other words - IDs that are larger than **29**): @@ -130,7 +130,7 @@ const myCursor = lastPostInResults.id // Example: 52 The following diagram shows the first 4 `Post` records **after** the record with ID **29**. In this example, the new cursor is **52**: -![](../../../doc-images/cursor-2.png) +![](/img/orm/cursor-2.png) ### FAQ @@ -138,15 +138,15 @@ The following diagram shows the first 4 `Post` records **after** the record with If you do not `skip: 1`, your result set will include your previous cursor. The first query returns four results and the cursor is **29**: -![](../../../doc-images/cursor-1.png) +![](/img/orm/cursor-1.png) Without `skip: 1`, the second query returns 4 results after (and _including_) the cursor: -![](../../../doc-images/cursor-3.png) +![](/img/orm/cursor-3.png) If you `skip: 1`, the cursor is not included: -![](../../../doc-images/cursor-2.png) +![](/img/orm/cursor-2.png) You can choose to `skip: 1` or not depending on the pagination behavior that you want. @@ -160,7 +160,7 @@ No, cursor pagination does not use cursors in the underlying database ([e.g. Pos #### What happens if the cursor value does not exist? -Using a nonexistent cursor returns `null`. Prisma does not try to locate adjacent values. +Using a nonexistent cursor returns `null`. Prisma Client does not try to locate adjacent values. ### ✔ Pros of cursor-based pagination diff --git a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx index 3011a2078d..6c6f1444bf 100644 --- a/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx +++ b/content/200-orm/200-prisma-client/100-queries/056-aggregation-grouping-summarizing.mdx @@ -1,8 +1,9 @@ --- title: 'Aggregation, grouping, and summarizing' metaTitle: 'Aggregation, grouping, and summarizing (Concepts)' -metaDescription: 'Use Prisma Client to aggregate, group by, count, and select distinct.' +description: 'Use Prisma Client to aggregate, group by, count, and select distinct.' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -148,7 +149,7 @@ const groupUsers = await prisma.user.groupBy({ }) ``` -### groupBy and filtering +### `groupBy` and filtering `groupBy` supports two levels of filtering: `where` and `having`. @@ -159,18 +160,20 @@ Use `where` to filter all records **before grouping**. The following example gro ```ts highlight=3-7;normal const groupUsers = await prisma.user.groupBy({ by: ['country'], + //highlight-start where: { email: { contains: 'prisma.io', }, }, + //highlight-end _sum: { profileViews: true, }, }) ``` -#### Filter groups with having +#### Filter groups with `having` Use `having` to filter **entire groups** by an aggregate value such as the sum or average of a field, not individual records - for example, only return groups where the _average_ `profileViews` is greater than 100: @@ -185,6 +188,7 @@ const groupUsers = await prisma.user.groupBy({ _sum: { profileViews: true, }, + //highlight-start having: { profileViews: { _avg: { @@ -192,10 +196,11 @@ const groupUsers = await prisma.user.groupBy({ }, }, }, + //highlight-end }) ``` -##### Use case for having +##### Use case for `having` The primary use case for `having` is to filter on aggregations. We recommend that you use `where` to reduce the size of your data set as far as possible _before_ grouping, because doing so ✔ reduces the number of records the database has to return and ✔ makes use of indices. @@ -205,9 +210,11 @@ For example, the following query groups all users that are _not_ from Sweden or const fd = await prisma.user.groupBy({ by: ['country'], where: { + //highlight-start country: { notIn: ['Sweden', 'Ghana'], }, + //highlight-end }, _sum: { profileViews: true, @@ -228,17 +235,21 @@ The following query technically achieves the same result, but excludes users fro const groupUsers = await prisma.user.groupBy({ by: ['country'], where: { + //highlight-start country: { not: 'Sweden', }, + //highlight-end }, _sum: { profileViews: true, }, having: { + //highlight-start country: { not: 'Ghana', }, + //highlight-end profileViews: { _min: { gte: 10, @@ -250,7 +261,7 @@ const groupUsers = await prisma.user.groupBy({ > **Note**: Within `having`, you can only filter on aggregate values _or_ fields available in `by`. -### groupBy and ordering +### `groupBy` and ordering The following constraints apply when you combine `groupBy` and `orderBy`: @@ -260,7 +271,7 @@ The following constraints apply when you combine `groupBy` and `orderBy`: #### Order by aggregate group -You can **order by aggregate group**. Prisma added support for using `orderBy with aggregated groups in relational databases in version [2.21.0](https://github.com/prisma/prisma/releases/2.21.0) and support for MongoDB in [3.4.0](https://github.com/prisma/prisma/releases/3.4.0). +You can **order by aggregate group**. Prisma ORM added support for using `orderBy` with aggregated groups in relational databases in version [2.21.0](https://github.com/prisma/prisma/releases/2.21.0) and support for MongoDB in [3.4.0](https://github.com/prisma/prisma/releases/3.4.0). The following example sorts each `city` group by the number of users in that group (largest group first): @@ -313,7 +324,7 @@ const groupBy = await prisma.user.groupBy({ }) ``` -### groupBy FAQ +### `groupBy` FAQ #### Can I use `select` with `groupBy`? @@ -329,7 +340,9 @@ Both `distinct` and `groupBy` group records by one or more unique field values. ## Count -Use [`count`](/orm/reference/prisma-client-reference#count) to count the number of records or non-`null` field values. The following example query counts all users: +### Count records + +Use [`count()`](/orm/reference/prisma-client-reference#count) to count the number of records or non-`null` field values. The following example query counts all users: ```ts const userCount = await prisma.user.count() @@ -337,12 +350,9 @@ const userCount = await prisma.user.count() ### Count relations -The ability to count relations is available in version [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later. - -**For versions before 3.0.1**
-You need to add the [preview feature](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `selectRelationCount` and then run `prisma generate`. +This feature is generally available in version [3.0.1](https://github.com/prisma/prisma/releases/3.0.1) and later. To use this feature in versions before 3.0.1 the [Preview feature](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature) `selectRelationCount` will need to be enabled.
@@ -380,9 +390,9 @@ The `_count` parameter: - Can be used inside a top-level `include` _or_ `select` - Can be used with any query that returns records (including `delete`, `update`, and `findFirst`) - Can return [multiple relation counts](#return-multiple-relation-counts) -- From version 4.3.0, can [filter relation counts](#filter-the-relation-count) +- Can [filter relation counts](#filter-the-relation-count) (from version 4.3.0) -#### Return a relations count with include +#### Return a relations count with `include` The following query includes each user's post count in the results: @@ -415,7 +425,7 @@ const usersWithCount = await prisma.user.findMany({ #### Return a relations count with `select` -The following query uses `select` to return each user's post count and no other fields: +The following query uses `select` to return each user's post count _and no other fields_: @@ -619,9 +629,9 @@ const distinctRoles = await prisma.user.findMany({ -### distinct under the hood +### `distinct` under the hood -Prisma's `distinct` option does not use SQL `SELECT DISTINCT`. Instead, `distinct` uses: +Prisma Client's `distinct` option does not use SQL `SELECT DISTINCT`. Instead, `distinct` uses: - A `SELECT` query - In-memory post-processing to select distinct @@ -634,7 +644,9 @@ The following example selects distinct on `gameId` and `playerId`, ordered by `s - Select related player name (relation between `Play` and `User`) - Select related game name (relation between `Play` and `Game`) -
Expand for sample schema +
+ +Expand for sample schema ```prisma model User { diff --git a/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx b/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx index 96667794b0..79233eaa08 100644 --- a/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx +++ b/content/200-orm/200-prisma-client/100-queries/058-transactions.mdx @@ -1,7 +1,7 @@ --- title: 'Transactions and batch queries' metaTitle: 'Transactions and batch queries (Reference)' -metaDescription: 'This page explains the transactions API of Prisma Client.' +description: 'This page explains the transactions API of Prisma Client.' tocDepth: 3 --- @@ -9,16 +9,13 @@ tocDepth: 3 A database transaction refers to a sequence of read/write operations that are _guaranteed_ to either succeed or fail as a whole. This section describes the ways in which the Prisma Client API supports transactions. -- For more in-depth examples and use cases, refer to the 📖 [transactions guide](/orm/prisma-client/queries/transactions). -- For information about transactions in general and the reasoning behind Prisma's current solutions, see [Blog: How Prisma supports transactions](https://www.prisma.io/blog/how-prisma-supports-transactions-x45s1d5l0ww1). - ## Transactions overview -Before Prisma version 4.4.0, you could not set isolation levels on transactions. The isolation level in your database configuration always applied. +Before Prisma ORM version 4.4.0, you could not set isolation levels on transactions. The isolation level in your database configuration always applied. @@ -45,9 +42,9 @@ The technique you choose depends on your particular use case. > **Note**: For the purposes of this guide, _writing_ to a database encompasses creating, updating, and deleting data. -## About transactions in Prisma +## About transactions in Prisma Client -Prisma provides the following options for using transactions: +Prisma Client provides the following options for using transactions: - [Nested writes](#nested-writes): use the Prisma Client API to process multiple operations on one or more related records inside the same transaction. - [Batch / bulk transactions](#batchbulk-operations): process one or more operations in bulk with `updateMany`, `deleteMany`, and `createMany`. @@ -57,7 +54,7 @@ Prisma provides the following options for using transactions: ## Nested writes -A [nested write](relation-queries#nested-writes) lets you perform a single Prisma Client API call with multiple _operations_ that touch multiple [_related_](/orm/prisma-schema/data-model/relations) records. For example, creating a _user_ together with a _post_ or updating an _order_ together with an _invoice_. Prisma Client ensures that all operations succeed or fail as a whole. +A [nested write](/orm/prisma-client/queries/relation-queries#nested-writes) lets you perform a single Prisma Client API call with multiple _operations_ that touch multiple [_related_](/orm/prisma-schema/data-model/relations) records. For example, creating a _user_ together with a _post_ or updating an _order_ together with an _invoice_. Prisma Client ensures that all operations succeed or fail as a whole. The following example demonstrates a nested write with `create`: @@ -91,8 +88,6 @@ const updatedPost: Post = await prisma.post.update({ }) ``` -> Refer to the 📖 [transactions guide](/orm/prisma-client/queries/transactions#nested-writes) for more examples. - ## Batch/bulk operations The following bulk operations run as transactions: @@ -101,9 +96,9 @@ The following bulk operations run as transactions: - `updateMany` - `createMany` -> Refer to the 📖 [transactions guide](/orm/prisma-client/queries/transactions#bulk-operations) for more examples. +> Refer to the section about [bulk operations](#bulk-operations) for more examples. -## The $transaction API +## The `$transaction` API The `$transaction` API can be used in two ways: @@ -128,9 +123,9 @@ const [posts, totalPosts] = await prisma.$transaction([ You can also use raw queries inside of a `$transaction`: -, ]}> + - + ```ts const [userList, updateUser] = await prisma.$transaction([ @@ -139,9 +134,9 @@ const [userList, updateUser] = await prisma.$transaction([ ]) ``` - + - + ```ts const [findRawData, aggregateRawData, commandRawData] = @@ -166,7 +161,7 @@ const [findRawData, aggregateRawData, commandRawData] = ]) ``` - + @@ -174,7 +169,7 @@ Instead of immediately awaiting the result of each operation when it's performed > **Note**: Operations are executed according to the order they are placed in the transaction. Using a query in a transaction does not influence the order of operations in the query itself. > -> Refer to the 📖 [transactions guide](/orm/prisma-client/queries/transactions#transaction-api) for more examples. +> Refer to the section about the [transactions API](#transaction-api) for more examples. From version 4.4.0, the sequential operations transaction API has a second parameter. You can use the following optional configuration option in this parameter: @@ -196,6 +191,8 @@ await prisma.$transaction( ### Interactive transactions +#### Overview + Sometimes you need more control over what queries execute within a transaction. Interactive transactions are meant to provide you with an escape hatch. @@ -206,9 +203,17 @@ If you use interactive transactions in preview from version 2.29.0 to 4.6.1 (inc -To use interactive transactions, you can pass an async function into [`$transaction`](/orm/prisma-client/queries/transactions#transaction-api). +To use interactive transactions, you can pass an async function into [`$transaction`](#transaction-api). -The first argument passed into this async function is an instance of Prisma Client. Below, we will call this instance `tx`. Any Prisma call invoked on this `tx` instance is encapsulated into the transaction. +The first argument passed into this async function is an instance of Prisma Client. Below, we will call this instance `tx`. Any Prisma Client call invoked on this `tx` instance is encapsulated into the transaction. + + + +**Use interactive transactions with caution**. Keeping transactions open for a long time hurts database performance and can even cause deadlocks. Try to avoid performing network requests and executing slow queries inside your transaction functions. We recommend you get in and out as quick as possible! + + + +#### Example Let's look at an example: @@ -290,6 +295,8 @@ try { } ``` +#### Transaction options + The transaction API has a second parameter. For interactive transactions, you can use the following optional configuration options in this parameter: - `maxWait`: The maximum amount of time Prisma Client will wait to acquire a transaction from the database. The default value is 2 seconds. @@ -298,7 +305,7 @@ The transaction API has a second parameter. For interactive transactions, you ca For example: -```jsx +```ts await prisma.$transaction( async (tx) => { // Code running in a transaction... @@ -311,14 +318,17 @@ await prisma.$transaction( ) ``` - - -**Use interactive transactions with caution**. Keeping transactions -open for a long time hurts database performance and can even cause deadlocks. -Try to avoid performing network requests and executing slow queries inside your -transaction functions. We recommend you get in and out as quick as possible! +You can also set these globally on the constructor-level: - +```ts +const prisma = new PrismaClient({ + transactionOptions: { + isolationLevel: Prisma.TransactionIsolationLevel.Serializable, + maxWait: 5000, // default: 2000 + timeout: 10000, // default: 5000 + }, +}) +``` ### Transaction isolation level @@ -332,9 +342,9 @@ You can set the transaction [isolation level](https://www.prisma.io/dataguide/in -This is available in the following Prisma versions for interactive transactions from version 4.2.0, for sequential operations from version 4.4.0. +This is available in the following Prisma ORM versions for interactive transactions from version 4.2.0, for sequential operations from version 4.4.0. -In versions before 4.2.0 (for interactive transactions), or 4.4.0 (for sequential operations), you cannot configure the transaction isolation level at a Prisma level. Prisma does not explicitly set the isolation level, so the [isolation level configured in your database](#database-specific-information-on-isolation-levels) is used. +In versions before 4.2.0 (for interactive transactions), or 4.4.0 (for sequential operations), you cannot configure the transaction isolation level at a Prisma ORM level. Prisma ORM does not explicitly set the isolation level, so the [isolation level configured in your database](#database-specific-information-on-isolation-levels) is used. @@ -493,7 +503,7 @@ Dependent writes must succeed together in order to maintain data consistency and ### Nested writes -Prisma's solution to dependent writes is the **nested writes** feature, which is supported by `create` and `update`. The following nested write creates one user and two blog posts: +Prisma Client's solution to dependent writes is the **nested writes** feature, which is supported by `create` and `update`. The following nested write creates one user and two blog posts: ```ts const nestedWrite = await prisma.user.create({ @@ -509,7 +519,7 @@ const nestedWrite = await prisma.user.create({ }) ``` -If any operation fails, Prisma rolls back the entire transaction. Nested writes are not currently supported by top-level bulk operations like `client.user.deleteMany` and `client.user.updateMany`. +If any operation fails, Prisma Client rolls back the entire transaction. Nested writes are not currently supported by top-level bulk operations like `client.user.deleteMany` and `client.user.updateMany`. #### When to use nested writes @@ -518,11 +528,11 @@ Consider using nested writes if: - ✔ You want to create two or more records related by ID at the same time (for example, create a blog post and a user) - ✔ You want to update and create records related by ID at the same time (for example, change a user's name and create a new blog post) - +:::tip If you [pre-compute your IDs, you can choose between a nested write or using the `$transaction([])` API](#scenario-pre-computed-ids-and-the-transaction-api). - +::: #### Scenario: Sign-up flow @@ -613,6 +623,7 @@ const createTeamOperation = prisma.team.create({ name: 'Aurora Adventures', members: { connect: { + //delete-next-line id: createUserOperation.id, // Not possible, ID not yet available }, }, @@ -681,8 +692,6 @@ const updateTeam = await prisma.team.update({ }) ``` - - ##### Can I perform multiple nested writes - for example, create two new teams and assign users? Yes, but this is a combination of scenarios and techniques: @@ -732,7 +741,7 @@ Depending on your requirements, Prisma Client has four options for handling inde ### Bulk operations -Bulk writes allow you to write multiple records of the same type in a single transaction - if any operation fails, Prisma rolls back the entire transaction. Prisma currently supports: +Bulk writes allow you to write multiple records of the same type in a single transaction - if any operation fails, Prisma Client rolls back the entire transaction. Prisma Client currently supports: - `updateMany` - `deleteMany` @@ -795,6 +804,7 @@ await prisma.team.deleteMany({ }, }, data: { + //delete-next-line members: {}, // Cannot access members here }, }) @@ -802,11 +812,11 @@ await prisma.team.deleteMany({ #### Can I use bulk operations with the `$transaction([])` API? -Yes - for example, you can include multiple `deleteMany` operations inside a `$transaction([])`. +Yes — for example, you can include multiple `deleteMany` operations inside a `$transaction([])`. -### $transaction([]) API +### `$transaction([])` API -The `$transaction([])` API is generic solution to independent writes that allows you to run multiple operations as a single, atomic operation - if any operation fails, Prisma rolls back the entire transaction. +The `$transaction([])` API is generic solution to independent writes that allows you to run multiple operations as a single, atomic operation - if any operation fails, Prisma Client rolls back the entire transaction. Its also worth noting that operations are executed according to the order they are placed in the transaction. @@ -899,14 +909,18 @@ Instead of auto-generating IDs, change the `id` fields of `Team` and `User` to a ```prisma highlight=2,9;delete|3,10;add model Team { + //delete-next-line id Int @id @default(autoincrement()) + //add-next-line id String @id @default(uuid()) name String members User[] } model User { + //delete-next-line id Int @id @default(autoincrement()) + //add-next-line id String @id @default(uuid()) email String @unique teams Team[] @@ -1002,6 +1016,7 @@ model Team { id Int @id @default(autoincrement()) name String User User[] + //highlight-next-line stripeCustomerId String? } ``` @@ -1072,6 +1087,7 @@ const numTeammates = await prisma.user.count({ }, }) +//highlight-start // Find customer in Stripe let customer = await stripe.customers.get({ externalId: teamID }) @@ -1081,6 +1097,7 @@ if (customer) { externalId: teamId, plan: 'plan_id', quantity: numTeammates, +//highlight-end }) } else { customer = await stripe.customers.create({ @@ -1201,6 +1218,7 @@ model Seat { claimedBy User? @relation(fields: [userId], references: [id]) movieId Int movie Movie @relation(fields: [movieId], references: [id]) + //highlight-next-line version Int } ``` @@ -1226,6 +1244,7 @@ if (!availableSeat) { throw new Error(`Oh no! ${movieName} is all booked.`) } +//highlight-start // Only mark the seat as claimed if the availableSeat.version // matches the version we're updating. Additionally, increment the // version when we perform this update so all other clients trying @@ -1246,6 +1265,7 @@ const seats = await client.seat.updateMany({ if (seats.count === 0) { throw new Error(`That seat is already booked! Please try again.`) } +//highlight-end ``` It is now impossible for two people to book the same seat: @@ -1261,7 +1281,7 @@ If you have an existing application, it can be a significant undertaking to refa To create an interactive transaction, pass an async function into [$transaction](#transaction-api). -The first argument passed into this async function is an instance of Prisma Client. Below, we will call this instance `tx`. Any Prisma call invoked on this `tx` instance is encapsulated into the transaction. +The first argument passed into this async function is an instance of Prisma Client. Below, we will call this instance `tx`. Any Prisma Client call invoked on this `tx` instance is encapsulated into the transaction. In the example below, Alice and Bob each have $100 in their account. If they try to send more money than they have, the transfer is rejected. @@ -1333,4 +1353,4 @@ transaction functions. We recommend you get in and out as quick as possible! ## Conclusion -Prisma supports multiple ways of handling transactions, either directly through the API or by supporting your ability to introduce optimistic concurrency control and idempotency into your application. If you feel like you have use cases in your application that are not covered by any of the suggested options, please open a [GitHub issue](https://github.com/prisma/prisma/issues/new/choose) to start a discussion. +Prisma Client supports multiple ways of handling transactions, either directly through the API or by supporting your ability to introduce optimistic concurrency control and idempotency into your application. If you feel like you have use cases in your application that are not covered by any of the suggested options, please open a [GitHub issue](https://github.com/prisma/prisma/issues/new/choose) to start a discussion. diff --git a/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx b/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx index 7e622911d7..107eed0535 100644 --- a/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx +++ b/content/200-orm/200-prisma-client/100-queries/060-full-text-search.mdx @@ -1,14 +1,16 @@ --- title: 'Full-text search' metaTitle: 'Full-text search (Preview)' -metaDescription: 'This page explains how to search for text within a field.' -preview: true +description: 'This page explains how to search for text within a field.' +sidebar_class_name: preview-badge --- Prisma Client supports full-text search for **PostgreSQL** databases in versions 2.30.0 and later, and **MySQL** databases in versions 3.8.0 and later. With full-text search enabled, you can add search functionality to your application by searching for text within a database column. +> **Note**: There currently is a [known issue](https://github.com/prisma/prisma/issues/23627) in the full-text search feature. If you observe slow search queries, you can [optimize your query with raw SQL](#full-text-search-with-raw-sql). + ## Enabling full-text search @@ -17,7 +19,7 @@ The full-text search API is currently a Preview feature. To enable this feature, 1. Update the [`previewFeatures`](/orm/reference/preview-features) block in your schema to include the `fullTextSearch` preview feature flag: - ```prisma file=schema.prisma + ```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["fullTextSearch"] @@ -26,9 +28,10 @@ The full-text search API is currently a Preview feature. To enable this feature, For MySQL, you will also need to include the `fullTextIndex` preview feature flag: - ```prisma file=schema.prisma highlight=3;add + ```prisma file=schema.prisma highlight=3;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["fullTextSearch", "fullTextIndex"] } ``` @@ -93,8 +96,8 @@ Here's how the following queries would match that text: | `dog & fox` | Yes | The text contains 'dog' and 'fox' | | `dog & cat` | No | The text contains 'dog' but not 'cat' | | `!cat` | Yes | 'cat' is not in the text | -| fox | cat | Yes | The text contains 'fox' or 'cat' | -| cat | pig | No | The text doesn't contain 'cat' or 'pig' | +| `fox | cat` | Yes | The text contains 'fox' or 'cat' | +| `cat | pig` | No | The text doesn't contain 'cat' or 'pig' | | `fox <-> dog` | Yes | 'dog' follows 'fox' in the text | | `dog <-> fox` | No | 'fox' doesn't follow 'dog' in the text | @@ -166,7 +169,7 @@ MySQL also has `>`, `<` and `~` operators for altering the ranking order of sear For the full range of supported operations, see the [MySQL full text search documentation](https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html). -## Sorting results by \_relevance +## Sorting results by `\_relevance` @@ -174,7 +177,7 @@ Sorting by relevance is only available for PostgreSQL and MySQL. -In addition to [Prisma's default `orderBy` behavior](/orm/reference/prisma-client-reference#orderby), full-text search also adds sorting by relevance to a given string or strings. As an example, if you wanted to order posts by their relevance to the term `'database'` in their title, you could use the following: +In addition to [Prisma Client's default `orderBy` behavior](/orm/reference/prisma-client-reference#orderby), full-text search also adds sorting by relevance to a given string or strings. As an example, if you wanted to order posts by their relevance to the term `'database'` in their title, you could use the following: ```ts const posts = await prisma.post.findMany({ @@ -199,7 +202,7 @@ For MySQL, it is necessary to add indexes to any columns you search using the `@ In the following example, one full text index is added to the `content` field of the `Blog` model, and another is added to both the `content` and `title` fields together: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["fullTextSearch", "fullTextIndex"] @@ -243,3 +246,37 @@ const result = await prisma.blogs.findMany({ ``` However, if you try to search on `title` alone, the search will fail with the error "Cannot find a fulltext index to use for the search" and the message code is `P2030`, because the index requires a search on both fields. + +## Full-text search with raw SQL + +Full-text search is currently in Preview and due to a [known issue](https://github.com/prisma/prisma/issues/23627), you may be seeing slow search queries. If that's the case, you can optimize your query using [raw SQL](/orm/prisma-client/queries/raw-database-access). + +### PostgreSQL + +In PostgreSQL, you can use `to_tsvector` and `to_tsquery` to express your search query: + +```ts +const term = `cat` +const result = + await prisma.$queryRaw`SELECT * FROM "Blog" WHERE to_tsvector('english', "Blog"."content") @@ to_tsquery('english', ${term});` +``` + +> **Note**: Depending on your language preferences, you may exchange `english` against another language in the SQL statement. + +If you want to include a wildcard in your search term, you can do this as follows: + +```ts +const term = `cat:*` +const result = + await prisma.$queryRaw`SELECT * FROM "Blog" WHERE to_tsvector('english', "Blog"."content") @@ to_tsquery('english', ${term});` +``` + +### MySQL + +In MySQL, you can express your search query as follows: + +```ts +const term = `cat` +const result = + await prisma.$queryRaw`SELECT * FROM Blog WHERE MATCH(content) AGAINST(${term} IN NATURAL LANGUAGE MODE);` +``` diff --git a/content/200-orm/200-prisma-client/100-queries/061-custom-validation.mdx b/content/200-orm/200-prisma-client/100-queries/061-custom-validation.mdx index 47534cc74c..92278ebf00 100644 --- a/content/200-orm/200-prisma-client/100-queries/061-custom-validation.mdx +++ b/content/200-orm/200-prisma-client/100-queries/061-custom-validation.mdx @@ -1,7 +1,7 @@ --- title: 'Custom validation' metaTitle: 'Custom validation' -metaDescription: 'This page explains how to add custom validation to Prisma Client' +description: 'This page explains how to add custom validation to Prisma Client' --- @@ -25,9 +25,9 @@ Query extensions do not currently work for nested operations. In this example, v -, ]}> + - + ```ts copy import { PrismaClient, Prisma } from '@prisma/client' @@ -107,9 +107,9 @@ async function main() { main() ``` - + - + ```prisma copy datasource db { @@ -139,7 +139,7 @@ model Review { } ``` - + diff --git a/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx b/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx index 694f98dbf1..cc35e1add3 100644 --- a/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx +++ b/content/200-orm/200-prisma-client/100-queries/062-computed-fields.mdx @@ -1,7 +1,7 @@ --- title: 'Computed fields' metaTitle: 'Computed fields' -metaDescription: 'This page explains how to add computed fields to Prisma Client' +description: 'This page explains how to add computed fields to Prisma Client' --- @@ -14,11 +14,11 @@ Computed fields allow you to derive a new field based on existing data. A common The following example illustrates how to create a [Prisma Client extension](/orm/prisma-client/client-extensions) that adds a `fullName` computed field at runtime to the `User` model in a Prisma schema. - ,]}> + - + - + @@ -65,9 +65,9 @@ main() - + - + ```prisma copy datasource db { @@ -97,7 +97,7 @@ model Post { } ``` - + @@ -107,9 +107,9 @@ The computed fields are type-safe and can return anything from a concatenated va Prisma Client does not yet natively support computed fields, but, you can define a function that accepts a generic type as an input then extend that generic to ensure it conforms to a specific structure. Finally, you can return that generic with additional computed fields. Let's see how that might look: -, ]}> + - + ```tsx // Define a type that needs a first and last name @@ -139,9 +139,9 @@ async function main() { } ``` - + - + ```js function computeFullName(user) { @@ -157,7 +157,7 @@ async function main() { } ``` - + diff --git a/content/200-orm/200-prisma-client/100-queries/063-excluding-fields.mdx b/content/200-orm/200-prisma-client/100-queries/063-excluding-fields.mdx index 3838008485..71b1065b87 100644 --- a/content/200-orm/200-prisma-client/100-queries/063-excluding-fields.mdx +++ b/content/200-orm/200-prisma-client/100-queries/063-excluding-fields.mdx @@ -1,7 +1,7 @@ --- title: 'Excluding fields' metaTitle: 'Excluding fields' -metaDescription: 'This page explains how to exclude sensitive fields from Prisma Client' +description: 'This page explains how to exclude sensitive fields from Prisma Client' --- @@ -16,9 +16,9 @@ Prisma Client doesn't have a native way of excluding fields yet, but it's easy t The following is a type-safe `exclude` function returns a user without the `password` field. -, ]}> + - + ```tsx // Exclude keys from user @@ -37,9 +37,9 @@ function main() { } ``` - + - + ```js // Exclude keys from user @@ -55,7 +55,7 @@ function main() { } ``` - + diff --git a/content/200-orm/200-prisma-client/100-queries/064-custom-models.mdx b/content/200-orm/200-prisma-client/100-queries/064-custom-models.mdx index 7e19a1e449..fd50f9e439 100644 --- a/content/200-orm/200-prisma-client/100-queries/064-custom-models.mdx +++ b/content/200-orm/200-prisma-client/100-queries/064-custom-models.mdx @@ -1,7 +1,7 @@ --- title: 'Custom models' metaTitle: 'Custom models' -metaDescription: 'This page explains how to wrap Prisma Client in custom models' +description: 'This page explains how to wrap Prisma Client in custom models' --- @@ -18,9 +18,9 @@ As your application grows, you may find the need to group related logic together The following example demonstrates how to create a Prisma Client extension that adds a `signUp` and `findManyByDomain` methods to a User model. -,]}> + - + ```tsx import bcrypt from 'bcryptjs' @@ -60,11 +60,11 @@ async function main() { } ``` - + - + -```prisma file="prisma/schema.prisma" copy +```prisma file="prisma/schema.prisma" copy datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -87,7 +87,7 @@ model Password { } ``` - + diff --git a/content/200-orm/200-prisma-client/100-queries/070-case-sensitivity.mdx b/content/200-orm/200-prisma-client/100-queries/070-case-sensitivity.mdx index d512cc35b3..dd24cf7576 100644 --- a/content/200-orm/200-prisma-client/100-queries/070-case-sensitivity.mdx +++ b/content/200-orm/200-prisma-client/100-queries/070-case-sensitivity.mdx @@ -1,7 +1,7 @@ --- title: 'Case sensitivity' metaTitle: 'Case sensitivity (Reference)' -metaDescription: 'How Prisma Client handles case sensitivity when filtering and sorting.' +description: 'How Prisma Client handles case sensitivity when filtering and sorting.' preview: false --- @@ -127,7 +127,7 @@ const users = await prisma.user.findMany({ }) ``` -See also: [Filtering (Case-insensitive filtering)](filtering-and-sorting#case-insensitive-filtering) +See also: [Filtering (Case-insensitive filtering)](/orm/prisma-client/queries/filtering-and-sorting#case-insensitive-filtering) #### Caveats diff --git a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/050-raw-queries.mdx b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/050-raw-queries.mdx index b836c79d1d..1435cf5313 100644 --- a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/050-raw-queries.mdx +++ b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/050-raw-queries.mdx @@ -1,7 +1,7 @@ --- title: 'Raw queries' metaTitle: 'Raw queries' -metaDescription: 'Learn how you can send raw SQL and MongoDB queries to your database using the raw() methods from the Prisma Client API.' +description: 'Learn how you can send raw SQL and MongoDB queries to your database using the raw() methods from the Prisma Client API.' tocDepth: 3 --- @@ -12,7 +12,7 @@ Prisma Client supports the option of sending raw queries to your database. You m - you want to run a heavily optimized query - you require a feature that Prisma Client does not yet support (please [consider raising an issue](https://github.com/prisma/prisma/issues/new/choose)) -Raw queries are available for all relational databases Prisma supports. In addition, from version `3.9.0` raw queries are supported in MongoDB. For more details, see the relevant sections: +Raw queries are available for all relational databases Prisma ORM supports. In addition, from version `3.9.0` raw queries are supported in MongoDB. For more details, see the relevant sections: - [Raw queries with relational databases](#raw-queries-with-relational-databases) - [Raw queries with MongoDB](#raw-queries-with-mongodb) @@ -23,12 +23,18 @@ Raw queries are available for all relational databases Prisma supports. In addit For relational databases, Prisma Client exposes four methods that allow you to send raw queries. You can use: -- `$queryRaw` to return actual records (for example, using `SELECT`) -- `$executeRaw` to return a count of affected rows (for example, after an `UPDATE` or `DELETE`) -- `$queryRawUnsafe` to return actual records (for example, using `SELECT`) using a raw string. **Potential SQL injection risk** -- `$executeRawUnsafe` to return a count of affected rows (for example, after an `UPDATE` or `DELETE`) using a raw string. **Potential SQL injection risk** +- `$queryRaw` to return actual records (for example, using `SELECT`). +- `$executeRaw` to return a count of affected rows (for example, after an `UPDATE` or `DELETE`). +- `$queryRawUnsafe` to return actual records (for example, using `SELECT`) using a raw string. +- `$executeRawUnsafe` to return a count of affected rows (for example, after an `UPDATE` or `DELETE`) using a raw string. -### $queryRaw +The methods with "Unsafe" in the name are a lot more flexible but are at **significant risk of making your code vulnerable to SQL injection**. + +The other two methods are safe to use with a simple template tag, no string building, and no concatenation. **However**, caution is required for more complex use cases as it is still possible to introduce SQL injection if these methods are used in certain ways. For more details, see the [SQL injection prevention](#sql-injection-prevention) section below. + +> **Note**: All methods in the above list can only run **one** query at a time. You cannot append a second query - for example, calling any of them with `select 1; select 2;` will not work. + +### `$queryRaw` `$queryRaw` returns actual database records. For example, the following `SELECT` query returns all fields for each record in the `User` table: @@ -36,7 +42,7 @@ For relational databases, Prisma Client exposes four methods that allow you to s const result = await prisma.$queryRaw`SELECT * FROM User` ``` -The method is implemented as a [tagged template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates), which allows you to pass a template literal where you can easily insert your [variables](#using-variables). In turn, Prisma creates prepared statements that are safe from SQL injections: +The method is implemented as a [tagged template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates), which allows you to pass a template literal where you can easily insert your [variables](#using-variables). In turn, Prisma Client creates prepared statements that are safe from SQL injections: ```ts no-lines const email = 'emelie@prisma.io' @@ -52,6 +58,12 @@ const result = await prisma.$queryRaw( ) ``` + + +If you use string building to incorporate untrusted input into queries passed to this method, then you open up the possibility for SQL injection attacks. SQL injection attacks can expose your data to modification or deletion. The prefered mechanism would be to include the text of the query at the point that you run this method. For more information on this risk and also examples of how to prevent it, see the [SQL injection prevention](#sql-injection-prevention) section below. + + + #### Considerations Be aware that: @@ -95,7 +107,7 @@ Be aware that: `$queryRaw` returns an array. Each object corresponds to a database record: -```json5 +```json [ { id: 1, email: 'emelie@prisma.io', name: 'Emelie' }, { id: 2, email: 'yin@prisma.io', name: 'Yin' }, @@ -124,8 +136,6 @@ const result = await prisma.$queryRaw`SELECT * FROM User` > **Note**: If you do not provide a type, `$queryRaw` defaults to `unknown`. - - If you are selecting **specific fields** of the model or want to include relations, refer to the documentation about [leveraging Prisma Client's generated types](/orm/prisma-client/type-safety) if you want to make sure that the results are properly typed. #### Type caveats when using raw SQL @@ -135,6 +145,7 @@ When you type the results of `$queryRaw`, the raw data might not always match th ```prisma highlight=3;normal model Post { id Int @id @default(autoincrement()) + //highlight-next-line published Boolean @default(false) title String content String? @@ -151,7 +162,7 @@ result.forEach((x) => { }) ``` -> **Note**: The Prisma Client query engine standardizes the return type for all databases. **Using the raw queries does not**. If the database provider is MySQL, the values are `1` or `0`. However, if the database provider is PostgreSQL, the values are `true`, `false`, or `NULL`. +For regular CRUD queries, the Prisma Client query engine standardizes the return type for all databases. **Using the raw queries does not**. If the database provider is MySQL, the returned values are `1` or `0`. However, if the database provider is PostgreSQL, the values are `true` or `false`. > **Note**: Prisma sends JavaScript integers to PostgreSQL as `INT8`. This might conflict with your user-defined functions that accept only `INT4` as input. If you use `$queryRaw` in conjunction with a PostgreSQL database, update the input types to `INT8`, or cast your query parameters to `INT4`. @@ -166,7 +177,7 @@ let result = await prisma.$queryRawUnsafe(`SELECT * FROM ${userTable}`) Note that if you use `$queryRawUnsafe` in conjunction with user inputs, you risk SQL injection attacks. [Learn more](#queryrawunsafe). -### $queryRawUnsafe +### `$queryRawUnsafe` The `$queryRawUnsafe` method allows you to pass a raw string (or template string) to the database. @@ -174,7 +185,7 @@ The `$queryRawUnsafe` method allows you to pass a raw string (or template string If you use this method with user inputs (in other words, `SELECT * FROM table WHERE columnx = ${userInput}`), then you open up the possibility for SQL injection attacks. SQL injection attacks can expose your data to modification or deletion.

-We strongly advise that you use the `$queryRaw` query instead. For more information on SQL injection attacks, see the [OWASP SQL Injection guide](https://www.owasp.org/index.php/SQL_Injection). +Wherever possible you should use the `$queryRaw` method instead. When used correctly `$queryRaw` method is significantly safer but note that the `$queryRaw` method can also be made vulnerable in certain circumstances. For more information, see the [SQL injection prevention](#sql-injection-prevention) section below. @@ -198,63 +209,15 @@ prisma.$queryRawUnsafe( > **Note**: Prisma sends JavaScript integers to PostgreSQL as `INT8`. This might conflict with your user-defined functions that accept only `INT4` as input. If you use a parameterized `$queryRawUnsafe` query in conjunction with a PostgreSQL database, update the input types to `INT8`, or cast your query parameters to `INT4`. +For more details on using parameterized queries, see the [parameterized queries](#parameterized-queries) section below. + #### Signature ```ts no-lines $queryRawUnsafe(query: string, ...values: any[]): PrismaPromise; ``` -#### Parameterized queries - -As an alternative to tagged templates, `$queryRawUnsafe` supports standard parameterized queries where each variable is represented by a symbol (`?` for mySQL, `$1`, `$2`, and so on for PostgreSQL). The following example uses a MySQL query: - -```ts -const userName = 'Sarah' -const email = 'sarah@prisma.io' -const result = await prisma.$queryRawUnsafe( - 'SELECT * FROM User WHERE (name = ? OR email = ?)', - userName, - email -) -``` - -> **Note**: MySQL variables are represented by `?` - -The following example uses a PostgreSQL query: - -```ts -const userName = 'Sarah' -const email = 'sarah@prisma.io' -const result = await prisma.$queryRawUnsafe( - 'SELECT * FROM User WHERE (name = $1 OR email = $2)', - userName, - email -) -``` - -> **Note**: PostgreSQL variables are represented by `$1` and `$2` - -As with tagged templates, Prisma Client escapes all variables. - -> **Note**: You cannot pass a table or column name as a variable into a parameterized query. For example, you cannot `SELECT ?` and pass in `*` or `id, name` based on some condition. - -##### Parameterized PostgreSQL `ILIKE` query - -When you use `ILIKE`, the `%` wildcard character(s) should be included in the variable itself, not the query (`string`): - -```ts -const userName = 'Sarah' -const emailFragment = 'prisma.io' -const result = await prisma.$queryRawUnsafe( - 'SELECT * FROM "User" WHERE (name = $1 OR email ILIKE $2)', - userName, - `%${emailFragment}` -) -``` - -> **Note**: Using `%$2` as an argument would not work - -### $executeRaw +### `$executeRaw` `$executeRaw` returns the _number of rows affected by a database operation_, such as `UPDATE` or `DELETE`. This function does **not** return database records. The following query updates records in the database and returns a count of the number of records that were updated: @@ -263,7 +226,7 @@ const result: number = await prisma.$executeRaw`UPDATE User SET active = true WHERE emailValidated = true` ``` -The method is implemented as a [tagged template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates), which allows you to pass a template literal where you can easily insert your [variables](#using-variables). In turn, Prisma creates prepared statements that are safe from SQL injections: +The method is implemented as a [tagged template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates), which allows you to pass a template literal where you can easily insert your [variables](#using-variables). In turn, Prisma Client creates prepared statements that are safe from SQL injections: ```ts const emailValidated = true @@ -273,6 +236,14 @@ const result: number = await prisma.$executeRaw`UPDATE User SET active = ${active} WHERE emailValidated = ${emailValidated};` ``` + + +If you use string building to incorporate untrusted input into queries passed to this method, then you open up the possibility for SQL injection attacks. SQL injection attacks can expose your data to modification or deletion. The prefered mechanism would be to include the text of the query at the point that you run this method. For more information on this risk and also examples of how to prevent it, see the [SQL injection prevention](#sql-injection-prevention) section below. + + + +#### Considerations + Be aware that: - `$executeRaw` does not support multiple queries in a single string (for example, `ALTER TABLE` and `CREATE TABLE` together). @@ -319,17 +290,15 @@ Be aware that: $executeRaw(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): PrismaPromise; ``` -### $executeRawUnsafe +### `$executeRawUnsafe` The `$executeRawUnsafe` method allows you to pass a raw string (or template string) to the database. Like `$executeRaw`, it does **not** return database records, but returns the number of rows affected. -> **Note**: `$executeRawUnsafe` can only run **one** query at a time. You cannot append a second query - for example, adding `DROP bobby_tables` to the end of an `ALTER`. - If you use this method with user inputs (in other words, `SELECT * FROM table WHERE columnx = ${userInput}`), then you open up the possibility for SQL injection attacks. SQL injection attacks can expose your data to modification or deletion.

-We strongly advise that you use the `$executeRaw` query instead. For more information on SQL injection attacks, see the [OWASP SQL Injection guide](https://www.owasp.org/index.php/SQL_Injection). +Wherever possible you should use the `$executeRaw` method instead. When used correctly `$executeRaw` method is significantly safer but note that the `$executeRaw` method can also be made vulnerable in certain circumstances. For more information, see the [SQL injection prevention](#sql-injection-prevention) section below.
@@ -354,6 +323,8 @@ const result = prisma.$executeRawUnsafe( ) ``` +For more details on using parameterized queries, see the [parameterized queries](#parameterized-queries) section below. + #### Signature ```ts no-lines @@ -422,7 +393,7 @@ Note that the exact name for each database type will vary between databases – ### PostgreSQL typecasting fixes -Prisma resolves a number of issues with typecasting in PostgreSQL. +Prisma ORM resolves a number of issues with typecasting in PostgreSQL. @@ -445,7 +416,7 @@ A consequence of this fix is that some subtle implicit casts are now handled mor await prisma.$queryRaw`SELECT LENGTH(${42});` ``` -Before version 4.0.0, Prisma silently coerces `42` to `text`. From version 4.0.0, the query returns an error: +Before version 4.0.0, Prisma ORM silently coerces `42` to `text`. From version 4.0.0, the query returns an error: ```terminal wrap // ERROR: function length(integer) does not exist @@ -505,7 +476,7 @@ const result = await prisma.$queryRaw`SELECT * FROM User ${ }` ``` -#### ALTER limitation (PostgreSQL) +#### `ALTER` limitation (PostgreSQL) PostgreSQL [does not support using `ALTER` in a prepared statement](https://www.postgresql.org/docs/current/sql-prepare.html), which means that the following queries **will not work**: @@ -524,7 +495,7 @@ await prisma.$executeRawUnsafe('ALTER USER prisma WITH PASSWORD "$1"', password} ### Unsupported types -[`Unsupported` types](/orm/reference/prisma-schema-reference#unsupported) need to be cast to Prisma supported types before using them in `$queryRaw` or `$queryRawUnsafe`. For example, take the following model, which has a `location` field with an `Unsupported` type: +[`Unsupported` types](/orm/reference/prisma-schema-reference#unsupported) need to be cast to Prisma Client supported types before using them in `$queryRaw` or `$queryRawUnsafe`. For example, take the following model, which has a `location` field with an `Unsupported` type: ```tsx model Country { @@ -538,7 +509,7 @@ The following query on the unsupported field will **not** work: await prisma.$queryRaw`SELECT location FROM Country;` ``` -Instead, cast `Unsupported` fields to any supported Prisma type, **if your `Unsupported` column supports the cast**. +Instead, cast `Unsupported` fields to any supported Prisma Client type, **if your `Unsupported` column supports the cast**. The most common type you may want to cast your `Unsupported` column to is `String`. For example, on PostgreSQL, this would map to the `text` type: @@ -546,26 +517,188 @@ The most common type you may want to cast your `Unsupported` column to is `Strin await prisma.$queryRaw`SELECT location::text FROM Country;` ``` -The database will thus provide a `String` representation of your data which Prisma supports. +The database will thus provide a `String` representation of your data which Prisma Client supports. -For details of supported Prisma types, see the [Prisma data connector](/orm/overview) for the relevant database. +For details of supported Prisma types, see the [Prisma connector overview](/orm/overview/databases) for the relevant database. -### SQL injection +## SQL injection prevention -Prisma Client mitigates the risk of SQL injection in the following ways: +The ideal way to avoid SQL injection in Prisma Client is to use the ORM models to perform queries wherever possible. -- Prisma Client escapes all variables when you use tagged templates and sends all queries as prepared statements. +Where this is not possible and raw queries are required, Prisma Client provides various raw methods, but it is important to use these methods safely. - ```ts - $queryRaw`...` // Tagged template - $executeRaw`...` // Tagged template - ``` +This section will provide various examples of using these methods safely and unsafely. You can test these examples in the [Prisma Playground](https://playground.prisma.io/examples). + +### In `$queryRaw` and `$executeRaw` + +#### Simple, safe use of `$queryRaw` and `$executeRaw` + +These methods can mitigate the risk of SQL injection by escaping all variables when you use tagged templates and sends all queries as prepared statements. + +```ts +$queryRaw`...` // Tagged template +$executeRaw`...` // Tagged template +``` + +The following example is safe ✅ from SQL Injection: + +```ts +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +const result = + await prisma.$queryRaw`SELECT id, name FROM "User" WHERE name = ${inputString}` + +console.log(result) +``` + +#### Unsafe use of `$queryRaw` and `$executeRaw` + +However, it is also possible to use these methods in unsafe ways. + +One way is by artificially generating a tagged template that unsafely concatenates user input. + +The following example is vulnerable ❌ to SQL Injection: + +```ts +// Unsafely generate query text +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` // SQL Injection +const query = `SELECT id, name FROM "User" WHERE name = ${inputString}` + +// Version for Typescript +const stringsArray: any = [...[query]] + +// Version for Javascript +const stringsArray = [...[query]] + +// Use the `raw` property to impersonate a tagged template +stringsArray.raw = [query] + +// Use queryRaw +const result = await prisma.$queryRaw(stringsArray) +console.log(result) +``` + +Another way to make these methods vulnerable is misuse of the `Prisma.raw` function. + +The following examples are all vulnerable ❌ to SQL Injection: -- `$executeRaw` can only run **one** query at a time. You cannot append a second query - for example, adding `DROP bobby_tables` to the end of an `ALTER`. +```ts +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +const result = + await prisma.$queryRaw`SELECT id, name FROM "User" WHERE name = ${Prisma.raw( + inputString + )}` +console.log(result) +``` + +```ts +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +const result = await prisma.$queryRaw( + Prisma.raw(`SELECT id, name FROM "User" WHERE name = ${inputString}`) +) +console.log(result) +``` + +```ts +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +const query = Prisma.raw( + `SELECT id, name FROM "User" WHERE name = ${inputString}` +) +const result = await prisma.$queryRaw(query) +console.log(result) +``` + +#### Safely using `$queryRaw` and `$executeRaw` in more complex scenarios + +##### Building raw queries separate to query execution + +If you want to build your raw queries elsewhere or separate to your parameters you will need to use one of the following methods. + +In this example, the `sql` helper method is used to build the query text by safely including the variable. It is safe ✅ from SQL Injection: + +```ts +// inputString can be untrusted input +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` + +// Safe if the text query below is completely trusted content +const query = Prisma.sql`SELECT id, name FROM "User" WHERE name = ${inputString}` + +const result = await prisma.$queryRaw(query) +console.log(result) +``` + +In this example which is safe ✅ from SQL Injection, the `sql` helper method is used to build the query text including a parameter marker for the input value. Each variable is represented by a marker symbol (`?` for mySQL, `$1`, `$2`, and so on for PostgreSQL). Note that the examples just show PostgreSQL queries. + +```ts +// Version for Typescript +const query: any + +// Version for Javascript +const query + +// Safe if the text query below is completely trusted content +query = Prisma.sql`SELECT id, name FROM "User" WHERE name = $1` + +// inputString can be untrusted input +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +query.values = [inputString] + +const result = await prisma.$queryRaw(query) +console.log(result) +``` + +> **Note**: PostgreSQL variables are represented by `$1`, etc + +##### Building raw queries elsewhere or in stages + +If you want to build your raw queries somewhere other than where the query is executed, the ideal way to do this is to create an `Sql` object from the segments of your query and pass it the parameter value. + +In the following example we have two variables to parameterize. The example is safe ✅ from SQL Injection as long as the query strings being passed to `Prisma.sql` only contain trusted content: + +```ts +// Example is safe if the text query below is completely trusted content +const query1 = `SELECT id, name FROM "User" WHERE name = ` // The first parameter would be inserted after this string +const query2 = ` OR name = ` // The second parameter would be inserted after this string + +const inputString1 = "Fred" +const inputString2 = `'Sarah' UNION SELECT id, title FROM "Post"` + +const query = Prisma.sql([query1, query2, ""], inputString1, inputString2) +const result = await prisma.$queryRaw(query); +console.log(result); +``` + +> Note: Notice that the string array being passed as the first parameter `Prisma.sql` needs to have an empty string at the end as the `sql` function expects one more query segment than the number of parameters. + +If you want to build your raw queries into one large string, this is still possible but requires some care as it is uses the potentially dangerous `Prisma.raw` method. You also need to build your query using the correct parameter markers for your database as Prisma won't be able to provide markers for the relevant database as it usually is. -If you cannot use tagged templates, you can instead use [`$queryRawUnsafe`](/orm/prisma-client/queries/raw-database-access/raw-queries#queryrawunsafe) or [`$executeRawUnsafe`](/orm/prisma-client/queries/raw-database-access/raw-queries#executerawunsafe) but **be aware that your code may be vulnerable to SQL injection**. +The following example is safe ✅ from SQL Injection as long as the query strings being passed to `Prisma.raw` only contain trusted content: -#### ⚠️ String concatenation +```ts +// Version for Typescript +const query: any + +// Version for Javascript +const query + +// Example is safe if the text query below is completely trusted content +const query1 = `SELECT id, name FROM "User" ` +const query2 = `WHERE name = $1 ` + +query = Prisma.raw(`${query1}${query2}`) + +// inputString can be untrusted input +const inputString = `'Sarah' UNION SELECT id, title FROM "Post"` +query.values = [inputString] + +const result = await prisma.$queryRaw(query) +console.log(result) +``` + +### In `$queryRawUnsafe` and `$executeRawUnsafe` + +#### Using `$queryRawUnsafe` and `$executeRawUnsafe` unsafely + +If you cannot use tagged templates, you can instead use [`$queryRawUnsafe`](/orm/prisma-client/queries/raw-database-access/raw-queries#queryrawunsafe) or [`$executeRawUnsafe`](/orm/prisma-client/queries/raw-database-access/raw-queries#executerawunsafe) but **be aware that your these functions make it much more likely that your code will be vulnerable to SQL injection**. The following example concatenates `query` and `inputString`. Prisma Client ❌ **cannot** escape `inputString` in this example, which makes it vulnerable to SQL injection: @@ -577,6 +710,44 @@ const result = await prisma.$queryRawUnsafe(query) console.log(result) ``` +#### Parameterized queries + +As an alternative to tagged templates, `$queryRawUnsafe` supports standard parameterized queries where each variable is represented by a symbol (`?` for mySQL, `$1`, `$2`, and so on for PostgreSQL). Note that the examples just show PostgreSQL queries. + +The following example is safe ✅ from SQL Injection: + +```ts +const userName = 'Sarah' +const email = 'sarah@prisma.io' +const result = await prisma.$queryRawUnsafe( + 'SELECT * FROM User WHERE (name = $1 OR email = $2)', + userName, + email +) +``` + +> **Note**: PostgreSQL variables are represented by `$1` and `$2` + +As with tagged templates, Prisma Client escapes all variables when they are provided in this way. + +> **Note**: You cannot pass a table or column name as a variable into a parameterized query. For example, you cannot `SELECT ?` and pass in `*` or `id, name` based on some condition. + +##### Parameterized PostgreSQL `ILIKE` query + +When you use `ILIKE`, the `%` wildcard character(s) should be included in the variable itself, not the query (`string`). This example is safe ✅ from SQL Injection. + +```ts +const userName = 'Sarah' +const emailFragment = 'prisma.io' +const result = await prisma.$queryRawUnsafe( + 'SELECT * FROM "User" WHERE (name = $1 OR email ILIKE $2)', + userName, + `%${emailFragment}` +) +``` + +> **Note**: Using `%$2` as an argument would not work + ## Raw queries with MongoDB For MongoDB in versions `3.9.0` and later, Prisma Client exposes three methods that allow you to send raw queries. You can use: @@ -585,7 +756,7 @@ For MongoDB in versions `3.9.0` and later, Prisma Client exposes three methods t - `.findRaw` to find zero or more documents that match the filter. - `.aggregateRaw` to perform aggregation operations on a collection. -### $runCommandRaw +### `$runCommandRaw` `$runCommandRaw` runs a raw MongoDB command against the database. As input, it accepts all [MongoDB database commands](https://www.mongodb.com/docs/manual/reference/command/), with the following exceptions: @@ -638,7 +809,7 @@ Do not use `$runCommandRaw` for queries which contain the `"find"` or `"aggregat $runCommandRaw(command: InputJsonObject): PrismaPromise; ``` -### findRaw +### `findRaw` `.findRaw` returns actual database records. It will find zero or more documents that match the filter on the `User` collection: @@ -663,7 +834,7 @@ const result = await prisma.user.findRaw({ - `options`: Additional options to pass to the [`find` command](https://docs.mongodb.com/manual/reference/command/find/#command-fields). -### aggregateRaw +### `aggregateRaw` `.aggregateRaw` returns aggregated database records. It will perform aggregation operations on the `User` collection: diff --git a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/100-custom-and-type-safe-queries.mdx b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/100-custom-and-type-safe-queries.mdx index eeba38fa7a..c915939611 100644 --- a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/100-custom-and-type-safe-queries.mdx +++ b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/100-custom-and-type-safe-queries.mdx @@ -1,7 +1,7 @@ --- title: 'Custom & type-safe queries' metaTitle: 'Custom & type-safe queries' -metaDescription: 'Learn how to use SafeQL and Prisma Client extensions to work around features not natively supported by Prisma, such as PostGIS.' +description: 'Learn how to use SafeQL and Prisma Client extensions to work around features not natively supported by Prisma, such as PostGIS.' --- ## Overview @@ -12,7 +12,7 @@ The example will be using [PostGIS](https://postgis.net/) and PostgreSQL, but is ## What is SafeQL? -[SafeQL](https://safeql.dev/) allows for advanced linting and type safety within raw SQL queries. After setup, SafeQL works with Prisma `$queryRaw` and `$executeRaw` to provide type safety when raw queries are required. +[SafeQL](https://safeql.dev/) allows for advanced linting and type safety within raw SQL queries. After setup, SafeQL works with Prisma Client `$queryRaw` and `$executeRaw` to provide type safety when raw queries are required. SafeQL runs as an [ESLint](https://eslint.org/) plugin and is configured using ESLint rules. This guide doesn't cover setting up ESLint and we will assume that you already having it running in your project. @@ -21,30 +21,32 @@ SafeQL runs as an [ESLint](https://eslint.org/) plugin and is configured using E To follow along, you will be expected to have: - A [PostgreSQL](https://www.postgresql.org/) database with PostGIS installed -- Prisma set up in your project +- Prisma ORM set up in your project - ESLint set up in your project -## Geographic data support in Prisma +## Geographic data support in Prisma ORM -At the time of writing, Prisma does not support working with geographic data, specifically using [PostGIS](https://github.com/prisma/prisma/issues/2789). +At the time of writing, Prisma ORM does not support working with geographic data, specifically using [PostGIS](https://github.com/prisma/prisma/issues/2789). A model that has geographic data columns will be stored using the [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) data type. Fields with `Unsupported` types are present in the generated Prisma Client and will be typed as `any`. A model with a required `Unsupported` type does not expose write operations such as `create`, and `update`. -Prisma supports write operations on models with a required `Unsupported` field using `$queryRaw` and `$executeRaw`. You can use Prisma Client extensions and SafeQL to improve the type-safety when working with geographical data in raw queries. +Prisma Client supports write operations on models with a required `Unsupported` field using `$queryRaw` and `$executeRaw`. You can use Prisma Client extensions and SafeQL to improve the type-safety when working with geographical data in raw queries. -## 1. Set up Prisma for use with PostGIS +## 1. Set up Prisma ORM for use with PostGIS If you haven't already, enable the `postgresqlExtensions` Preview feature and add the `postgis` PostgreSQL extension in your Prisma schema: ```prisma highlight=3,9;add generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line extensions = [postgis] } ``` @@ -99,7 +101,7 @@ model PointOfInterest { } ``` -You'll notice that the `location` field uses an [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) type. This means that we lose a lot of the benefits of Prisma when working with `PointOfInterest`. We'll be using [SafeQL](https://safeql.dev/) to fix this. +You'll notice that the `location` field uses an [`Unsupported`](/orm/reference/prisma-schema-reference#unsupported) type. This means that we lose a lot of the benefits of Prisma ORM when working with `PointOfInterest`. We'll be using [SafeQL](https://safeql.dev/) to fix this. Like before, create and execute a migration using the `prisma migrate dev` command to create the `PointOfInterest` table in your database: @@ -122,9 +124,9 @@ CREATE TABLE "PointOfInterest" ( ## 3. Integrate SafeQL -SafeQL is easily integrated with Prisma in order to lint `$queryRaw` and `$executeRaw` Prisma operations. You can reference [SafeQL's integration guide](https://safeql.dev/compatibility/prisma.html) or follow the steps below. +SafeQL is easily integrated with Prisma ORM in order to lint `$queryRaw` and `$executeRaw` Prisma operations. You can reference [SafeQL's integration guide](https://safeql.dev/compatibility/prisma.html) or follow the steps below. -### 3.1. Install the @ts-safeql/eslint-plugin npm package +### 3.1. Install the `@ts-safeql/eslint-plugin` npm package ```terminal npm install -D @ts-safeql/eslint-plugin @@ -132,7 +134,7 @@ npm install -D @ts-safeql/eslint-plugin This ESLint plugin is what will allow for queries to be linted. -### 3.2. Add @ts-safeql/eslint-plugin to your ESLint plugins +### 3.2. Add `@ts-safeql/eslint-plugin` to your ESLint plugins Next, add `@ts-safeql/eslint-plugin` to your list of ESLint plugins. In our example we are using an `.eslintrc.js` file, but this can be applied to any way that you [configure ESLint](https://eslint.org/docs/latest/use/configure/). @@ -144,7 +146,7 @@ module.exports = { } ``` -### 3.3 Add @ts-safeql/check-sql rules +### 3.3 Add `@ts-safeql/check-sql` rules Now, setup the rules that will enable SafeQL to mark invalid SQL queries as ESLint errors. @@ -152,6 +154,7 @@ Now, setup the rules that will enable SafeQL to mark invalid SQL queries as ESLi /** @type {import('eslint').Linter.Config} */ module.exports = { plugins: [..., '@ts-safeql/eslint-plugin'], + //add-start rules: { '@ts-safeql/check-sql': [ 'error', @@ -170,6 +173,7 @@ module.exports = { ], }, } +//add-end ``` > **Note**: If your `PrismaClient` instance is called something different than `prisma`, you need to adjust the value for `tag` accordingly. For example, if it is called `db`, the value for `tag` should be `'db.+($queryRaw|$executeRaw)'`. @@ -178,7 +182,7 @@ module.exports = { Finally, set up a `connectionUrl` for SafeQL so that it can introspect your database and retrieve the table and column names you use in your schema. SafeQL then uses this information for linting and highlighting problems in your raw SQL statements. -Our example relies on the [`dotenv`](https://github.com/motdotla/dotenv) package to get the same connection string that is used by Prisma. We recommend this in order to keep your database URL out of version control. +Our example relies on the [`dotenv`](https://github.com/motdotla/dotenv) package to get the same connection string that is used by Prisma ORM. We recommend this in order to keep your database URL out of version control. If you haven't installed `dotenv` yet, you can install it as follows: @@ -189,21 +193,25 @@ npm install dotenv Then update your ESLint config as follows: ```js file=.eslintrc.js highlight=1,6-9,16;add +//add-next-line require('dotenv').config() /** @type {import('eslint').Linter.Config} */ module.exports = { plugins: ['@ts-safeql/eslint-plugin'], + //add-start // exclude `parserOptions` if you are not using TypeScript parserOptions: { project: './tsconfig.json', }, + //add-end rules: { '@ts-safeql/check-sql': [ 'error', { connections: [ { + //add-next-line connectionUrl: process.env.DATABASE_URL, // The migrations path: migrationsDir: './prisma/migrations', @@ -364,6 +372,6 @@ error Invalid Query: function st_distancesphere(geography, geometry) does not e ## Conclusion -While you may sometimes need to drop down to raw SQL when using Prisma, you can use various techniques to make the experience of writing raw SQL queries with Prisma better. +While you may sometimes need to drop down to raw SQL when using Prisma ORM, you can use various techniques to make the experience of writing raw SQL queries with Prisma ORM better. In this article, you have used SafeQL and Prisma Client extensions to create custom, type-safe Prisma Client queries to abstract PostGIS operations which are currently not natively supported in Prisma ORM. diff --git a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/index.mdx b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/index.mdx index ca494a4828..9f00af192c 100644 --- a/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/index.mdx +++ b/content/200-orm/200-prisma-client/100-queries/090-raw-database-access/index.mdx @@ -1,9 +1,25 @@ --- title: 'Raw database access' metaTitle: 'Raw database access' -metaDescription: 'Raw database access with Prisma Client.' +description: 'Raw database access with Prisma Client.' +hide_table_of_contents: true --- + + +While Prisma ORM aims to make all your database queries intuitive, type-safe, and convenient, there may be situations where you need to drop down to raw queries. + +This may happen for several reasons, e.g., because you need to optimize the performance of a specific query or because your data requirements can't be expressed by Prisma Client's query API. + +In that case, you can use one of Prisma Client's escape hatches, such as `$queryRaw` or `$executeRaw`, to send raw queries to the database. + +When using relational databases, you can use **community tools** that can still vastly improve the developer experience writing raw SQL, e.g., by enabling type safety or providing auto-completion for your SQL queries: + +- [`prisma-extension-kysely`](https://github.com/eoin-obrien/prisma-extension-kysely): A Client extension that uses the [Kysely](https://kysely.dev/) SQL query builder API to compose SQL queries in TypeScript, with auto-completion and type safety, and submits them through Prisma Client's connection pool. +- [SafeQL](https://safeql.dev/compatibility/prisma.html): An ESLint plugin enabling syntax highlighting and type safety for SQL strings inside Prisma ORM's raw SQL escape hatches. For a tutorial on using SafeQL, visit this [page](/orm/prisma-client/queries/raw-database-access/custom-and-type-safe-queries). + + + ## In this section diff --git a/content/200-orm/200-prisma-client/100-queries/100-query-optimization-performance.mdx b/content/200-orm/200-prisma-client/100-queries/100-query-optimization-performance.mdx index b5063dfdf5..a9151fb796 100644 --- a/content/200-orm/200-prisma-client/100-queries/100-query-optimization-performance.mdx +++ b/content/200-orm/200-prisma-client/100-queries/100-query-optimization-performance.mdx @@ -1,7 +1,7 @@ --- title: 'Query optimization' metaTitle: 'Query optimization' -metaDescription: 'How Prisma optimizes queries under the hood' +description: 'How Prisma optimizes queries under the hood' tocDepth: 3 --- @@ -21,7 +21,7 @@ Alternatively, if you are only interested in the time taken to run a query, you The n+1 problem occurs when you loop through the results of a query and perform one additional query **per result**, resulting in `n` number of queries plus the original (n+1). This is a common problem with ORMs, particularly in combination with GraphQL, because it is not always immediately obvious that your code is generating inefficient queries. -### Solving n+1 in GraphQL with findUnique and Prisma's dataloader +### Solving n+1 in GraphQL with `findUnique` and Prisma Client's dataloader
@@ -150,7 +150,7 @@ const User = objectType({ -Instead, use `findUnique` in combination with [the fluent API](/orm/prisma-client/queries/relation-queries#fluent-api) (`.posts()`) as shown to return a user's posts. Even though the resolver is called once per user, the Prisma dataloader **✔ batches the `findUnique` queries**. +Instead, use `findUnique` in combination with [the fluent API](/orm/prisma-client/queries/relation-queries#fluent-api) (`.posts()`) as shown to return a user's posts. Even though the resolver is called once per user, the Prisma dataloader in Prisma Client **✔ batches the `findUnique` queries**. @@ -165,15 +165,19 @@ const User = objectType({ t.nonNull.list.nonNull.field('posts', { type: 'Post', resolve: (parent, _, context) => { + //delete-start return context.prisma.post.findMany({ where: { authorId: parent.id || undefined }, }) + //delete-end + //add-start return context.prisma.user .findUnique({ where: { id: parent.id || undefined }, }) .posts() }, + //add-end }) }, }) @@ -209,13 +213,13 @@ const User = objectType({ -If the `posts` resolver is invoked once per user, Prisma's dataloader groups `findUnique` queries with the same parameters and selection set. Each group is optimized into a single `findMany`. +If the `posts` resolver is invoked once per user, the dataloader in Prisma Client groups `findUnique` queries with the same parameters and selection set. Each group is optimized into a single `findMany`. #### Do I have to use the fluent API to enable batching of queries? It may seem counterintitive to use a `prisma.user.findUnique(...).posts()` query to return posts instead of `prisma.posts.findMany()` - particularly as the former results in two queries rather than one. -The **only** reason you need to use the fluent API (`user.findUnique(...).posts()`) to return posts is that Prisma's dataloader batches `findUnique` queries and does not currently [batch `findMany` queries](https://github.com/prisma/prisma/issues/1477). +The **only** reason you need to use the fluent API (`user.findUnique(...).posts()`) to return posts is that the dataloader in Prisma Client batches `findUnique` queries and does not currently [batch `findMany` queries](https://github.com/prisma/prisma/issues/1477). When the dataloader batches `findMany` queries, you no longer need to use `findUnique` with the fluent API in this way. @@ -264,7 +268,7 @@ This is not an efficient way to query. Instead, you can: - Use nested reads ([`include`](/orm/reference/prisma-client-reference#include) ) to return users and related posts - Use the [`in`](/orm/reference/prisma-client-reference#in) filter -#### Solving n+1 with include +#### Solving n+1 with `include` You can use `include` to return each user's posts. This only results in **two** SQL queries - one to get users, and one to get posts. This is known as a [nested read](/orm/prisma-client/queries/relation-queries#nested-reads). @@ -290,7 +294,7 @@ SELECT "public"."Post"."id", "public"."Post"."title", "public"."Post"."authorId" -#### Solving n+1 with in +#### Solving n+1 with `in` If you have a list of user IDs, you can use the `in` filter to return all posts where the `authorId` is `in` that list of IDs: @@ -331,7 +335,7 @@ It is generally more performant to read and write large amounts of data in bulk - [`updateMany`](/orm/reference/prisma-client-reference#updatemany) - [`findMany`](/orm/reference/prisma-client-reference#findmany) -## Using select to limit number of columns returned +## Using `select` to limit number of columns returned Using `select` to limit the number of columns that are returned is **unlikely to have an effect on performance** unless you have identified this as a performance bottleneck through testing. For example, reading all fields may negatively affect performance if you have: diff --git a/content/200-orm/200-prisma-client/100-queries/index.mdx b/content/200-orm/200-prisma-client/100-queries/index.mdx index 5f98e3590e..036c98478a 100644 --- a/content/200-orm/200-prisma-client/100-queries/index.mdx +++ b/content/200-orm/200-prisma-client/100-queries/index.mdx @@ -1,7 +1,8 @@ --- title: 'Queries' metaTitle: 'Prisma Client Queries' -metaDescription: 'Learn about the database queries you can send with Prisma Client.' +description: 'Learn about the database queries you can send with Prisma Client.' +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx index 0019e4779b..07e5a05836 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/057-composite-types.mdx @@ -1,11 +1,12 @@ --- title: 'Composite types' metaTitle: 'Composite types' -metaDescription: 'Composite types' +description: 'Composite types' tocDepth: 3 --- +
@@ -30,7 +31,7 @@ This page explains how to: We’ll use this schema for the examples that follow: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } @@ -116,6 +117,7 @@ In our example schema, suppose that you add a required field to `photo`. This fi ... type Photo { ... + //add-next-line bitDepth Int @default(8) } @@ -132,14 +134,14 @@ The `bitDepth` field has no content because you have only just added this field, ** Earlier versions ** -Before version 4.0.0, Prisma threw a P2032 error as follows: +Before version 4.0.0, Prisma ORM threw a P2032 error as follows: ``` Error converting field "bitDepth" of expected non-nullable type "int", found incompatible value of "null". ``` -## Finding records that contain composite types with find and findMany +## Finding records that contain composite types with `find` and `findMany` Records can be filtered by a composite type within the `where` operation. @@ -319,7 +321,7 @@ const product = prisma.product.findFirst({ }) ``` -## Creating records with composite types using create and createMany +## Creating records with composite types using `create` and `createMany` @@ -459,7 +461,7 @@ const product = await prisma.product.createMany({ }) ``` -## Changing composite types within update and updateMany +## Changing composite types within `update` and `updateMany` @@ -626,7 +628,7 @@ const product = prisma.product.update({ }) ``` -## Upserting composite types with upsert +## Upserting composite types with `upsert` @@ -661,7 +663,7 @@ const product = await prisma.product.upsert({ }) ``` -## Deleting records that contain composite types with delete and deleteMany +## Deleting records that contain composite types with `delete` and `deleteMany` To remove records which embed a composite type, use the `delete` or `deleteMany` methods. This will also remove the embedded composite type. @@ -717,7 +719,7 @@ Be careful when you carry out any of the following operations on a record with a If your schema has a composite type with a `@@unique` constraint, MongoDB prevents you from storing the same value for the constrained value in two or more of the records that contain this composite type. However, MongoDB does does not prevent you from storing multiple copies of the same field value in a single record. -Note that you can [use Prisma relations to work around this issue](#use-prisma-relations-to-enforce-unique-values-in-a-record). +Note that you can [use Prisma ORM relations to work around this issue](#use-prisma-orm-relations-to-enforce-unique-values-in-a-record). For example, in the following schema, `MailBox` has a composite type, `addresses`, which has a `@@unique` constraint on the `email` field. @@ -758,9 +760,9 @@ await prisma.MailBox.createMany({ Note: MongoDB throws an error if you try to store the same value in two separate records. In our example above, if you try to store the email address `alice@prisma.io` for the user Alice and for the user Bob, MongoDB does not store the data and throws an error. -### Use Prisma relations to enforce unique values in a record +### Use Prisma ORM relations to enforce unique values in a record -In the example above, MongoDB did not enforce the unique constraint on a nested address name. However, you can model your data differently to enforce unique values in a record. To do so, use Prisma [relations](/orm/prisma-schema/data-model/relations) to turn the composite type into a collection. Set a relationship to this collection and place a unique constraint on the field that you want to be unique. +In the example above, MongoDB did not enforce the unique constraint on a nested address name. However, you can model your data differently to enforce unique values in a record. To do so, use Prisma ORM [relations](/orm/prisma-schema/data-model/relations) to turn the composite type into a collection. Set a relationship to this collection and place a unique constraint on the field that you want to be unique. In the following example, MongoDB enforces unique values in a record. There is a relation between `Mailbox` and the `Address` model. Also, the `name` field in the `Address` model has a unique constraint. diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/080-null-and-undefined.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/080-null-and-undefined.mdx index cd0a91033b..dce8637a33 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/080-null-and-undefined.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/080-null-and-undefined.mdx @@ -1,7 +1,7 @@ --- title: 'Null and undefined' metaTitle: 'Null and undefined (Reference)' -metaDescription: 'How Prisma Client handles null and undefined, including a GraphQL use case.' +description: 'How Prisma Client handles null and undefined, including a GraphQL use case.' preview: false --- @@ -14,7 +14,7 @@ Prisma Client differentiates between `null` and `undefined`: -This is particularly important to account for in [a **Prisma with GraphQL context**, where `null` and `undefined` are interchangeable](#null-and-undefined-in-a-graphql-resolver). +This is particularly important to account for in [a **Prisma ORM with GraphQL context**, where `null` and `undefined` are interchangeable](#null-and-undefined-in-a-graphql-resolver). @@ -29,9 +29,7 @@ The data below represents a `User` table. This set of data will be used in all o
- - -## null and undefined in queries that affect _many_ records +## `null` and `undefined` in queries that affect _many_ records This section will cover how `undefined` and `null` values affect the behavior of queries that interact with or create multiple records in a database. @@ -130,13 +128,13 @@ This query will select every row from the `User` table. -**Note**: Using `undefined` as the value of any key in a Prisma Client query's parameter object will cause Prisma to act as if that key was not provided at all. +**Note**: Using `undefined` as the value of any key in a Prisma Client query's parameter object will cause Prisma ORM to act as if that key was not provided at all. Although this section's examples focused on the `findMany` function, the same concepts apply to any function that can affect multiple records, such as `updateMany` and `deleteMany`. -## null and undefined in queries that affect _one_ record +## `null` and `undefined` in queries that affect _one_ record This section will cover how `undefined` and `null` values affect the behavior of queries that interact with or create a single record in a database. @@ -228,7 +226,7 @@ const user = await prisma.user.findFirst() Although this section's examples focused on the `findFirst` function, the same concepts apply to any function that affects a single record. -## null and undefined in a GraphQL resolver +## `null` and `undefined` in a GraphQL resolver For this example, consider a database based on the following Prisma schema: @@ -249,18 +247,20 @@ type Mutation { } ``` -However, if you pass `null` values for `authorEmail` or `authorName` on to Prisma, the following will happen: +However, if you pass `null` values for `authorEmail` or `authorName` on to Prisma Client, the following will happen: - If `args.authorEmail` is `null`, the query will **fail**. `email` does not accept `null`. -- If `args.authorName` is `null`, Prisma changes the value of `name` to `null`. This is probably not how you want an update to work. +- If `args.authorName` is `null`, Prisma Client changes the value of `name` to `null`. This is probably not how you want an update to work. ```ts updateUser: (parent, args, ctx: Context) => { return ctx.prisma.user.update({ where: { id: Number(args.id) }, data: { + //highlight-start | email: args.authorEmail, // email cannot be null | name: args.authorName // name set to null - potentially unwanted behavior + //highlight-end }, }) }, @@ -273,16 +273,18 @@ updateUser: (parent, args, ctx: Context) => { return ctx.prisma.user.update({ where: { id: Number(args.id) }, data: { + //highlight-start | email: args.authorEmail != null ? args.authorEmail : undefined, // If null, do nothing | name: args.authorName != null ? args.authorName : undefined // If null, do nothing + //highlight-end }, }) }, ``` -## The effect of null and undefined on conditionals +## The effect of `null` and `undefined` on conditionals -There are some caveats to filtering with conditionals which might produce unexpected results. When filtering with conditionals you might expect one result but receive another given how Prisma treats nullable values. +There are some caveats to filtering with conditionals which might produce unexpected results. When filtering with conditionals you might expect one result but receive another given how Prisma Client treats nullable values. The following table provides a high-level overview of how the different operators handle 0, 1 and `n` filters. diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx index c6b0171a2b..a7cd21c10a 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/100-working-with-json-fields.mdx @@ -1,13 +1,13 @@ --- title: 'Working with Json fields' metaTitle: 'Working with Json fields (Concepts)' -metaDescription: 'How to read, write, and filter by Json fields.' +description: 'How to read, write, and filter by Json fields.' tocDepth: 3 --- -Use the [`Json`](/orm/reference/prisma-schema-reference#json) Prisma field type to read, write, and perform basic filtering on JSON types in the underlying database. In the following example, the `User` model has an optional `Json` field named `extendedPetsData`: +Use the [`Json`](/orm/reference/prisma-schema-reference#json) Prisma ORM field type to read, write, and perform basic filtering on JSON types in the underlying database. In the following example, the `User` model has an optional `Json` field named `extendedPetsData`: ```prisma highlight=6;normal model User { @@ -15,6 +15,7 @@ model User { email String @unique name String? posts Post[] + //highlight-next-line extendedPetsData Json? } ``` @@ -57,7 +58,7 @@ Reasons to store data as JSON rather than representing data as related models in - You need to store data that does not have a consistent structure - You are importing data from another system and do not want to map that data to Prisma models -## Reading a Json field +## Reading a `Json` field You can use the `Prisma.JsonArray` and `Prisma.JsonObject` utility classes to work with the contents of a `Json` field: @@ -86,7 +87,7 @@ if ( See also: [Advanced example: Update a nested JSON key value](#advanced-example-update-a-nested-json-key-value) -## Writing to a Json field +## Writing to a `Json` field The following example writes a JSON object to the `extendedPetsData` field: @@ -108,11 +109,11 @@ const createUser = await prisma.user.create({ See also: [Advanced example: Update a nested JSON key value](#advanced-example-update-a-nested-json-key-value) -## Filter on a Json field +## Filter on a `Json` field From v2.23.0, you can filter rows by the data inside a `Json` type. We call this **advanced `Json` filtering**. -The availability of advanced `Json` filtering depends on your Prisma version: +The availability of advanced `Json` filtering depends on your Prisma ORM version: - V4.0.0 or later: advanced `Json` filtering is [generally available](/orm/more/releases#generally-available-ga). - From v2.23.0, but before v4.0.0: advanced `Json` filtering is a [preview feature](/orm/reference/preview-features/client-preview-features). Add `previewFeatures = ["filterJson"]` to your schema. [Learn more](/orm/reference/preview-features/client-preview-features#enabling-a-prisma-client-preview-feature). @@ -188,8 +189,8 @@ In [2.23.0](https://github.com/prisma/prisma/releases/tag/2.23.0) and later, you The following query returns all users where the value of `petName` is `"Claudine"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -202,8 +203,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -216,14 +217,14 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following query returns all users where the value of `petType` _contains_ `"cat"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -236,8 +237,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -250,7 +251,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following string filters are available: @@ -282,8 +283,8 @@ You can filter on nested JSON properties. In the following examples, the value o The following query returns all users where `"pet2"` → `"petName"` is `"Sunny"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -296,8 +297,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -310,7 +311,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following query returns all users where: @@ -318,8 +319,8 @@ The following query returns all users where: - `"pet2"` → `"petName"` is `"Sunny"` - `"pet2"` → `"features"` → `"furColor"` contains `"black"` -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -342,8 +343,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -366,7 +367,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + @@ -380,8 +381,8 @@ You can filter on the presence of a specific value in a scalar array (strings, i The following query returns all users with a pet named `"Claudine"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -399,8 +400,8 @@ const getUsers = await prisma.user.findMany({ - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -412,7 +413,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + @@ -437,8 +438,8 @@ You can filter on the presence of a specific value in a scalar array (strings, i The following query returns all users that foster a cat named `"Fido"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -457,8 +458,8 @@ const getUsers = await prisma.user.findMany({ - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -471,13 +472,13 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following query returns all users that foster cats named `"Fido"` _and_ `"Bob"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -490,8 +491,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -504,13 +505,13 @@ const getUsers = await prisma.user.findMany({ }) ``` - + #### JSON object arrays -, ]}> - + + ```ts const json = [{ status: 'expired', insuranceID: 92 }] @@ -525,8 +526,8 @@ const checkJson = await prisma.user.findMany({ }) ``` - - + + ```ts const json = { status: 'expired', insuranceID: 92 } @@ -541,26 +542,26 @@ const checkJson = await prisma.user.findMany({ }) ``` - + - If you are using PostgreSQL, you must pass in an array of objects to match, even if that array only contains one object: - ```json5 + ```json [{ status: 'expired', insuranceID: 92 }] // PostgreSQL ``` If you are using MySQL, you must pass in a single object to match: - ```json5 + ```json { status: 'expired', insuranceID: 92 } // MySQL ``` - If your filter array contains multiple objects, PostgreSQL will only return results if _all_ objects are present - not if at least one object is present. -- You must set `array_contains` to a JSON object, not a string. If you use a string, Prisma escapes the quotation marks and the query will not return results. For example: +- You must set `array_contains` to a JSON object, not a string. If you use a string, Prisma Client escapes the quotation marks and the query will not return results. For example: ```ts array_contains: '[{"status": "expired", "insuranceID": 92}]' @@ -580,8 +581,8 @@ You can filter on the value of an element in a specific position. { "owned": ["Bob", "Sunny"], "fostering": ["Fido"] } ``` -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -594,9 +595,9 @@ const getUsers = await prisma.user.findMany({ }) ``` - + - + ```ts const getUsers = await prisma.user.findMany({ @@ -609,7 +610,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + @@ -652,10 +653,6 @@ In the following example, the value of `extendedPetsData` is an array of objects The following query returns all users where at least one pet is a moose: -]}> - - - ```ts const getUsers = await prisma.user.findMany({ where: { @@ -667,21 +664,11 @@ const getUsers = await prisma.user.findMany({ }) ``` - - - - - - - `$[*]` is the root array of pet objects - `petType` matches the `petType` key in any pet object The following query returns all users where at least one pet has an expired insurance: -]}> - - - ```ts const getUsers = await prisma.user.findMany({ where: { @@ -693,14 +680,6 @@ const getUsers = await prisma.user.findMany({ }) ``` - - - - - - - - - `$[*]` is the root array of pet objects - `insurances[*]` matches any `insurances` array inside any pet object - `status` matches any `status` key in any insurance object @@ -726,8 +705,8 @@ The following example: 1. Change the `"status"` of each insurance object to `"expired"` 1. Get all users that have an expired insurance where the ID is `92` -, ]}> - + + ```ts const userQueries: string | any[] = [] @@ -790,9 +769,9 @@ const checkJson = await prisma.user.findMany({ console.log(checkJson.length) ``` - + - + ```ts const userQueries: string | any[] = [] @@ -855,10 +834,10 @@ const checkJson = await prisma.user.findMany({ console.log(checkJson.length) ``` - + -## Using null Values +## Using `null` Values There are two types of `null` values possible for a `JSON` field in an SQL database. @@ -910,7 +889,7 @@ prisma.log.findMany({ }) ``` -### Inserting null Values +### Inserting `null` Values This also applies to `create`, `update` and `upsert`. To insert a `null` value into a `Json` field, you would write: @@ -937,7 +916,7 @@ prisma.log.create({ }) ``` -### Filtering by null Values +### Filtering by `null` Values To filter by `JsonNull` or `DbNull`, you would write: @@ -959,11 +938,11 @@ These _null enums_ do not apply to MongoDB because MongoDB does not differentiat -## Typed Json +## Typed `Json` By default, `Json` fields are not typed in Prisma models. To accomplish strong typing inside of these fields, you will need to use an external package like [prisma-json-types-generator](https://www.npmjs.com/package/prisma-json-types-generator) to accomplish this. -### Using prisma-json-types-generator +### Using `prisma-json-types-generator` First, install and configure `prisma-json-types-generator` [according to the package's instructions](https://www.npmjs.com/package/prisma-json-types-generator#using-it). @@ -976,12 +955,13 @@ model Log { } ``` -You can update it and type it by using [abstract syntax tree comments](https://www.prisma.io/docs/orm/prisma-schema/overview#comments) +You can update it and type it by using [abstract syntax tree comments](/orm/prisma-schema/overview#comments) -```prisma highlight=4;normal file=schema.prisma +```prisma highlight=4;normal file=schema.prisma showLineNumbers model Log { id Int @id + //highlight-next-line /// [LogMetaType] meta Json } @@ -989,7 +969,7 @@ model Log { Then, make sure you define the above type in a type declaration file included in your `tsconfig.json` -```ts file=types.ts +```ts file=types.ts showLineNumbers declare global { namespace PrismaJson { type LogMetaType = { timestamp: number; host: string } @@ -999,7 +979,7 @@ declare global { Now, when working with `Log.meta` it will be strongly typed! -## Json FAQs +## `Json` FAQs ### Can you select a subset of JSON key/values to return? diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx index 1af8fbac32..4b469fbd55 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/200-working-with-scalar-lists-arrays.mdx @@ -1,7 +1,7 @@ --- title: 'Working with scalar lists' metaTitle: 'Working with scalar lists/arrays (Concepts)' -metaDescription: 'How to read, write, and filter by scalar lists / arrays.' +description: 'How to read, write, and filter by scalar lists / arrays.' tocDepth: 3 --- @@ -9,34 +9,36 @@ tocDepth: 3 [Scalar lists](/orm/reference/prisma-schema-reference#-modifier) are represented by the `[]` modifier and are only available if the underlying database supports scalar lists. The following example has one scalar `String` list named `pets`: -, ]}> - + + ```prisma highlight=4;normal model User { id Int @id @default(autoincrement()) name String + //highlight-next-line pets String[] } ``` - - + + ```prisma highlight=4;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId name String + //highlight-next-line pets String[] } ``` - + Example field value: -```json5 +```json ['Fido', 'Snoopy', 'Brian'] ``` @@ -157,7 +159,7 @@ const posts = await prisma.post.findMany({ }) ``` -### NULL values in arrays +### `NULL` values in arrays diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/300-working-with-composite-ids-and-constraints.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/300-working-with-composite-ids-and-constraints.mdx index 127a4d0cf8..bf1735f6d9 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/300-working-with-composite-ids-and-constraints.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/300-working-with-composite-ids-and-constraints.mdx @@ -1,7 +1,7 @@ --- title: 'Working with compound IDs and unique constraints' metaTitle: 'Working with compound IDs and unique constraints (Concepts)' -metaDescription: 'How to read, write, and filter by compound IDs and unique constraints.' +description: 'How to read, write, and filter by compound IDs and unique constraints.' tocDepth: 2 --- @@ -40,6 +40,7 @@ model Like { User User @relation(fields: [userId], references: [id]) Post Post @relation(fields: [postId], references: [id]) + //highlight-next-line @@id([postId, userId]) } ``` @@ -64,6 +65,7 @@ model Like { User User @relation(fields: [userId], references: [id]) Post Post @relation(fields: [postId], references: [id]) + //highlight-next-line @@id(name: "likeId", [postId, userId]) } ``` diff --git a/content/200-orm/200-prisma-client/200-special-fields-and-types/index.mdx b/content/200-orm/200-prisma-client/200-special-fields-and-types/index.mdx index 8d5d232b72..ca0fd540a1 100644 --- a/content/200-orm/200-prisma-client/200-special-fields-and-types/index.mdx +++ b/content/200-orm/200-prisma-client/200-special-fields-and-types/index.mdx @@ -1,7 +1,7 @@ --- title: 'Fields & types' metaTitle: 'Fields & types' -metaDescription: 'Learn how to use about special fields and types with Prisma Client.' +description: 'Learn how to use about special fields and types with Prisma Client.' tocDepth: 3 --- @@ -11,7 +11,7 @@ This section covers various special fields and types you can use with Prisma Cli -## Working with Decimal +## Working with `Decimal` `Decimal` fields are represented by the [`Decimal.js` library](https://mikemcl.github.io/decimal.js/). The following example demonstrates how to import and use `Prisma.Decimal`: @@ -25,13 +25,15 @@ const newTypes = await prisma.sample.create({ }) ``` +
+ The use of the `Decimal` field [is not currently supported in MongoDB](https://github.com/prisma/prisma/issues/12637). -## Working with BigInt +## Working with `BigInt` `BigInt` fields are represented by the [`BigInt` type](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) (Node.js 10.4.0+ required). The following example demonstrates how to use the `BigInt` type: @@ -47,7 +49,7 @@ const newTypes = await prisma.sample.create({ ### Serializing BigInt -Prisma returns records as plain JavaScript objects. If you attempt to use `JSON.stringify` on an object that includes a `BigInt` field, you will see the following error: +Prisma Client returns records as plain JavaScript objects. If you attempt to use `JSON.stringify` on an object that includes a `BigInt` field, you will see the following error: ``` Do not know how to serialize a BigInt @@ -62,7 +64,7 @@ JSON.stringify( ) ``` -## Working with Bytes +## Working with `Bytes` `Bytes` fields are represented by the [`Buffer`](https://nodejs.org/api/buffer.html) type. The following example demonstrates how to use the `Buffer` type: @@ -76,14 +78,14 @@ const newTypes = await prisma.sample.create({ }) ``` -## Working with Json +## Working with `Json` -See: [Working with `Json` fields](working-with-json-fields) +See: [Working with `Json` fields](/orm/prisma-client/special-fields-and-types/working-with-json-fields) ## Working with scalar lists / scalar arrays -See: [Working with scalar lists / arrays](working-with-scalar-lists-arrays) +See: [Working with scalar lists / arrays](/orm/prisma-client/special-fields-and-types/working-with-scalar-lists-arrays) ## Working with composite IDs and compound unique constraints -See: [Working with composite IDs and compound unique constraints](working-with-composite-ids-and-constraints) +See: [Working with composite IDs and compound unique constraints](/orm/prisma-client/special-fields-and-types/working-with-composite-ids-and-constraints) diff --git a/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx b/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx index a74d1a62c2..98e9b3bb65 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/100-model.mdx @@ -1,8 +1,9 @@ --- title: '`model`: Add custom methods to your models' metaTitle: 'Prisma Client extensions: model component' -metaDescription: 'Extend the functionality of Prisma Client, model component' +description: 'Extend the functionality of Prisma Client, model component' tocDepth: 4 +toc_max_heading_level: 4 --- diff --git a/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx b/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx index 8475af3926..f456a7f8c8 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/110-client.mdx @@ -1,8 +1,9 @@ --- title: '`client`: Add methods to Prisma Client' metaTitle: 'Prisma Client extensions: client component' -metaDescription: 'Extend the functionality of Prisma Client, client component' +description: 'Extend the functionality of Prisma Client, client component' tocDepth: 4 +toc_max_heading_level: 4 --- diff --git a/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx b/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx index 919755381b..e21ed29e79 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/120-query.mdx @@ -1,8 +1,9 @@ --- title: '`query`: Create custom Prisma Client queries' metaTitle: 'Prisma Client extensions: query component' -metaDescription: 'Extend the functionality of Prisma Client, query component' +description: 'Extend the functionality of Prisma Client, query component' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -189,8 +190,8 @@ const prisma = new PrismaClient().$extends({ To apply custom behavior to a specific top-level raw query operation, use the name of a top-level raw query function instead of a model name: -, ]}> - + + ```ts copy const prisma = new PrismaClient().$extends({ @@ -215,8 +216,8 @@ const prisma = new PrismaClient().$extends({ }) ``` - - + + ```ts copy const prisma = new PrismaClient().$extends({ @@ -229,7 +230,7 @@ const prisma = new PrismaClient().$extends({ }) ``` - + ### Mutate the result of a query @@ -291,7 +292,7 @@ You can use query extensions or [middlewares](/orm/prisma-client/client-extensio You can use Prisma Client extensions in all scenarios where middlewares can be used. -### If you use the query extension component and middlewares +### If you use the `query` extension component and middlewares If you use the `query` extension component and middlewares in your project, then the following rules and priorities apply: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx b/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx index 14c7d6e9bc..773e67c480 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/130-result.mdx @@ -1,8 +1,9 @@ --- title: '`result`: Add custom fields and methods to query results' metaTitle: 'Prisma Client extensions: result component' -metaDescription: 'Extend the functionality of Prisma Client, result component' +description: 'Extend the functionality of Prisma Client, result component' tocDepth: 4 +toc_max_heading_level: 4 --- diff --git a/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx b/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx index cd27e58d20..b6baa5bcdf 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/140-shared-extensions.mdx @@ -1,8 +1,9 @@ --- title: 'Shared Prisma Client extensions' metaTitle: 'Shared Prisma Client extensions' -metaDescription: 'Share extensions or import shared extensions into your Prisma project' +description: 'Share extensions or import shared extensions into your Prisma project' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -40,7 +41,7 @@ When you call a method in an extension, use the constant name from your `$extend ## Create a shareable extension -When you want to create extensions other users can use, and that are not tailored just for your schema, Prisma provides utilities to allow you to create shareable extensions. +When you want to create extensions other users can use, and that are not tailored just for your schema, Prisma ORM provides utilities to allow you to create shareable extensions. To create a shareable extension: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/150-type-utilities.mdx b/content/200-orm/200-prisma-client/300-client-extensions/150-type-utilities.mdx index dbc0c53cef..70a0059fc6 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/150-type-utilities.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/150-type-utilities.mdx @@ -1,7 +1,7 @@ --- title: 'Type utilities' metaTitle: 'Prisma Client Extensions: Type utilities' -metaDescription: 'Advanced type safety: improve type safety in your custom model methods' +description: 'Advanced type safety: improve type safety in your custom model methods' --- diff --git a/content/200-orm/200-prisma-client/300-client-extensions/200-extension-examples.mdx b/content/200-orm/200-prisma-client/300-client-extensions/200-extension-examples.mdx index 2312713f0b..d8be1bcf60 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/200-extension-examples.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/200-extension-examples.mdx @@ -1,9 +1,11 @@ --- title: 'Shared packages & examples' metaTitle: 'Prisma Client extensions | Shared packages & examples' -metaDescription: 'Explore the Prisma Client extensions that have been built by Prisma and its community' +description: 'Explore the Prisma Client extensions that have been built by Prisma and its community' --- + + ## Extensions made by Prisma The following is a list of extensions we've built at Prisma: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/100-soft-delete-middleware.mdx b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/100-soft-delete-middleware.mdx index 4bf804a10e..0fe6486c98 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/100-soft-delete-middleware.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/100-soft-delete-middleware.mdx @@ -1,8 +1,9 @@ --- title: 'Middleware sample: soft delete' metaTitle: 'Middleware sample: soft delete (Reference)' -metaDescription: 'How to use middleware to intercept deletes and set a field value instead of deleting the record.' +description: 'How to use middleware to intercept deletes and set a field value instead of deleting the record.' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -48,6 +49,7 @@ model Post { userId Int? tags Tag[] views Int @default(0) + //highlight-next-line deleted Boolean @default(false) } @@ -76,6 +78,7 @@ Add a field named `deleted` to the `Post` model. You can choose between two fiel model Post { id Int @id @default(autoincrement()) ... + //highlight-next-line deleted Boolean @default(false) } ``` @@ -86,6 +89,7 @@ Add a field named `deleted` to the `Post` model. You can choose between two fiel model Post { id Int @id @default(autoincrement()) ... + //highlight-next-line deleted DateTime? } ``` @@ -246,11 +250,11 @@ Are the posts still available?: Yes! #################################### ``` - +:::tip Comment out the middleware to see the message change. - +::: ✔ Pros of this approach to soft delete include: @@ -261,11 +265,11 @@ Comment out the middleware to see the message change. - Content can still be read and updated unless you explicitly filter by `where: { deleted: false }` - in a large project with a lot of queries, there is a risk that soft deleted content will still be displayed - You can still use raw SQL to delete records - +:::tip You can create rules or triggers ([MySQL](https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html) and [PostgreSQL](https://www.postgresql.org/docs/8.1/rules-update.html)) at a database level to prevent records from being deleted. - +::: ## Step 3: Optionally prevent read/update of soft deleted records @@ -277,12 +281,12 @@ In step 2, we implemented middleware that prevents `Post` records from being del In this option: -- Prisma middleware is responsible for preventing records from being deleted +- Prisma Client middleware is responsible for preventing records from being deleted - Your own application code (which could be a GraphQL API, a REST API, a module) is responsible for filtering out deleted posts where necessary (`{ where: { deleted: false } }`) when reading and updating data - for example, the `getPost` GraphQL resolver never returns a deleted post ✔ Pros of this approach to soft delete include: -- No change to Prisma's create/update queries - you can easily request deleted records if you need them +- No change to Prisma Client's create/update queries - you can easily request deleted records if you need them - Modifying queries in middleware can have some unintended consequences, such as changing query return types (see option 2) ✘ Cons of this approach to soft delete include: @@ -292,7 +296,7 @@ In this option: ### Option 2: Use middleware to determine the behavior of read/update queries for deleted records -Option two uses Prisma middleware to prevent soft deleted records from being returned. The following table describes how the middleware affects each query: +Option two uses Prisma Client middleware to prevent soft deleted records from being returned. The following table describes how the middleware affects each query: | **Query** | **Middleware logic** | **Changes to return type** | | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------- | --- | @@ -656,7 +660,7 @@ Number of SOFT deleted posts: 95 ## FAQ -### Can I add a global includeDeleted to the Post model? +### Can I add a global `includeDeleted` to the `Post` model? You may be tempted to 'hack' your API by adding a `includeDeleted` property to the `Post` model and make the following query possible: diff --git a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/200-logging-middleware.mdx b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/200-logging-middleware.mdx index fbf2da4f85..7f1f689b15 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/200-logging-middleware.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/200-logging-middleware.mdx @@ -1,12 +1,12 @@ --- title: 'Middleware sample: logging' metaTitle: 'Middleware sample: logging (Reference)' -metaDescription: 'How to use middleware to log the time taken to perform any query.' +description: 'How to use middleware to log the time taken to perform any query.' --- -The following example logs the time taken for a Prisma Query to run: +The following example logs the time taken for a Prisma Client query to run: ```ts const prisma = new PrismaClient() diff --git a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/300-session-data-middleware.mdx b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/300-session-data-middleware.mdx index bd70ecdb2e..37be0dab46 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/300-session-data-middleware.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/300-session-data-middleware.mdx @@ -1,7 +1,8 @@ --- title: 'Middleware sample: session data' metaTitle: 'Middleware sample: session data (Reference)' -metaDescription: 'How to use middleware to set the value taken from session state.' +description: 'How to use middleware to set the value taken from session state.' +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx index d75f3f222c..0fe438c1b4 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/500-middleware/index.mdx @@ -1,7 +1,7 @@ --- title: 'Middleware' metaTitle: 'Middleware (Reference)' -metaDescription: 'Prisma Client middleware allows you to perform actions before or after any query on any model with the prisma.$use method.' +description: 'Prisma Client middleware allows you to perform actions before or after any query on any model with the prisma.$use method.' --- @@ -22,27 +22,31 @@ Middlewares act as query-level lifecycle hooks, which allow you to perform an ac const prisma = new PrismaClient() // Middleware 1 +//highlight-start prisma.$use(async (params, next) => { // Manipulate params here const result = await next(params) // See results here return result }) +//highlight-end // Middleware 2 +//highlight-start prisma.$use(async (params, next) => { // Manipulate params here const result = await next(params) // See results here return result }) +//highlight-end // Queries here ``` -Do not invoke next multiple times within a middleware when using [batch transactions](/orm/prisma-client/queries/transactions#sequential-prisma-client-operations). This will cause you to break out of the transaction and lead to unexpected results. +Do not invoke `next` multiple times within a middleware when using [batch transactions](/orm/prisma-client/queries/transactions#sequential-prisma-client-operations). This will cause you to break out of the transaction and lead to unexpected results. @@ -50,10 +54,10 @@ Do not invoke next multiple times within a middleware w Possible use cases for middleware include: -- Setting or overwriting a field value - for example, [setting the context language of a blog post comment](session-data-middleware) +- Setting or overwriting a field value - for example, [setting the context language of a blog post comment](/orm/prisma-client/client-extensions/middleware/session-data-middleware) - Validating input data - for example, check user input for inappropriate language via an external service -- Intercept a `delete` query and change it to an `update` in order to perform a [soft delete](soft-delete-middleware) -- [Log the time taken to perform a query](logging-middleware) +- Intercept a `delete` query and change it to an `update` in order to perform a [soft delete](/orm/prisma-client/client-extensions/middleware/soft-delete-middleware) +- [Log the time taken to perform a query](/orm/prisma-client/client-extensions/middleware/logging-middleware) There are many more use cases for middleware - this list serves as inspiration for the types of problems that middleware is designed to address. @@ -67,7 +71,7 @@ The following sample scenarios show how to use middleware in practice: ## Where to add middleware -Add Prisma middleware **outside the context of the request handler**, otherwise each request adds a new _instance_ of the middleware to the stack. The following example demonstrates where to add Prisma middleware in the context of an Express app: +Add Prisma Client middleware **outside the context of the request handler**, otherwise each request adds a new _instance_ of the middleware to the stack. The following example demonstrates where to add Prisma Client middleware in the context of an Express app: ```ts highlight=6-11;normal import express from 'express' @@ -75,12 +79,14 @@ import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() +//highlight-start prisma.$use(async (params, next) => { // Manipulate params here const result = await next(params) // See results here return result }) +//highlight-end const app = express() app.get('/feed', async (req, res) => { diff --git a/content/200-orm/200-prisma-client/300-client-extensions/index.mdx b/content/200-orm/200-prisma-client/300-client-extensions/index.mdx index ee8db883ce..4143231b4c 100644 --- a/content/200-orm/200-prisma-client/300-client-extensions/index.mdx +++ b/content/200-orm/200-prisma-client/300-client-extensions/index.mdx @@ -1,8 +1,9 @@ --- title: 'Extensions' metaTitle: 'Prisma Client extensions' -metaDescription: 'Extend the functionality of Prisma Client' +description: 'Extend the functionality of Prisma Client' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -32,7 +33,7 @@ When you use a Prisma Client extension, you create an _extended client_. An exte You can associate a single extension, or multiple extensions, with an extended client. [Learn more about multiple extensions](#multiple-extensions). -You can [share your Prisma Client extensions](/orm/prisma-client/client-extensions/shared-extensions) with other Prisma users, and [import Prisma Client extensions developed by other users](/orm/prisma-client/client-extensions/shared-extensions#install-a-shared-packaged-extension) into your Prisma project. +You can [share your Prisma Client extensions](/orm/prisma-client/client-extensions/shared-extensions) with other Prisma ORM users, and [import Prisma Client extensions developed by other users](/orm/prisma-client/client-extensions/shared-extensions#install-a-shared-packaged-extension) into your Prisma ORM project. ### Extended clients @@ -40,7 +41,7 @@ Extended clients interact with each other, and with the standard client, as foll - Each extended client operates independently in an isolated instance. - Extended clients cannot conflict with each other, or with the standard client. -- All extended clients and the standard client communicate with the same [Prisma query engine](/orm/more/under-the-hood/engines). +- All extended clients and the standard client communicate with the same [Prisma ORM query engine](/orm/more/under-the-hood/engines). - All extended clients and the standard client share the same connection pool. > **Note**: The author of an extension can modify this behavior since they're able to run arbitrary code as part of an extension. For example, an extension might actually create an entirely new `PrismaClient` instance (including its own query engine and connection pool). Be sure to check the documentation of the extension you're using to learn about any specific behavior it might implement. @@ -87,11 +88,11 @@ You can create an extension using two primary ways: const xprisma = prisma.$extends(myExtension) ``` - + :::tip This pattern is useful for when you would like to separate extensions into multiple files or directories within a project. - + ::: The above examples use the [`model` extension component](/orm/prisma-client/client-extensions/model) to extend the `User` model. diff --git a/content/200-orm/200-prisma-client/400-type-safety/050-prisma-validator.mdx b/content/200-orm/200-prisma-client/400-type-safety/050-prisma-validator.mdx index c88245b2ed..93c6376aec 100644 --- a/content/200-orm/200-prisma-client/400-type-safety/050-prisma-validator.mdx +++ b/content/200-orm/200-prisma-client/400-type-safety/050-prisma-validator.mdx @@ -1,7 +1,7 @@ --- title: 'Prisma validator' metaTitle: 'Prisma validator' -metaDescription: 'The Prisma validator is a utility function that takes a generated type and returns a type-safe object which adheres to the generated types model fields.' +description: 'The Prisma validator is a utility function that takes a generated type and returns a type-safe object which adheres to the generated types model fields.' --- @@ -12,7 +12,7 @@ This page introduces the `Prisma.validator` and offers some motivations behind w -> **Note**: If you have a use case for `Prisma.validator`, be sure to check out this [blog post](https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb) about improving your Prisma workflows with the new TypeScript `satisfies` keyword. It's likely that you can solve your use case natively using `satisfies` instead of using `Prisma.validator`. +> **Note**: If you have a use case for `Prisma.validator`, be sure to check out this [blog post](https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb) about improving your Prisma Client workflows with the new TypeScript `satisfies` keyword. It's likely that you can solve your use case natively using `satisfies` instead of using `Prisma.validator`. ## Creating a typed query statement @@ -48,20 +48,24 @@ The object `userEmail` has been created to select only the user's `email`, and y `Prisma` has a way to validate generated types to make sure they are type-safe, a utility function available on the namespace called `validator`. -## Using the Prisma.validator +## Using the `Prisma.validator` The following example passes the `UserSelect` generated type into the `Prisma.validator` utility function and defines the expected return type in much the same way as the previous example. ```ts highlight=3,4,5;delete|7-9;add import { Prisma } from '@prisma/client' +//delete-start const userEmail: Prisma.UserSelect = { email: true, } +//delete-end +//add-start const userEmail = Prisma.validator()({ email: true, }) +//add-end // Run inside async function const user = await prisma.user.findUnique({ @@ -92,7 +96,7 @@ The big difference is that the `userEmail` object is now type-safe. If you hover This functionality is handy when combined with user defined input, like form data. -## Combining Prisma.validator with form input +## Combining `Prisma.validator` with form input The following example creates a type-safe function from the `Prisma.validator` which can be used when interacting with user created data, such as form inputs. diff --git a/content/200-orm/200-prisma-client/400-type-safety/100-operating-against-partial-structures-of-model-types.mdx b/content/200-orm/200-prisma-client/400-type-safety/100-operating-against-partial-structures-of-model-types.mdx index 751a0ce83b..cdb032f03c 100644 --- a/content/200-orm/200-prisma-client/400-type-safety/100-operating-against-partial-structures-of-model-types.mdx +++ b/content/200-orm/200-prisma-client/400-type-safety/100-operating-against-partial-structures-of-model-types.mdx @@ -1,7 +1,7 @@ --- title: 'Operating against partial structures of your model types' metaTitle: 'Operating against partial structures of your model types' -metaDescription: 'This page documents various scenarios for using the generated types from the Prisma namespace' +description: 'This page documents various scenarios for using the generated types from the Prisma namespace' --- @@ -69,7 +69,7 @@ type UserPersonalData = { } ``` -While this is certainly feasible, this approach increases the maintenance burden upon changes to the Prisma schema as you need to manually maintain the types. A cleaner solution to this is to use the `UserGetPayload` type that is generated and exposed by Prisma Client under the `Prisma` namespace in combination with the [`validator`](prisma-validator). +While this is certainly feasible, this approach increases the maintenance burden upon changes to the Prisma schema as you need to manually maintain the types. A cleaner solution to this is to use the `UserGetPayload` type that is generated and exposed by Prisma Client under the `Prisma` namespace in combination with the [`validator`](/orm/prisma-client/type-safety/prisma-validator). The following example uses the `Prisma.validator` to create two type-safe objects and then uses the `Prisma.UserGetPayload` utility function to create a type that can be used to return all users and their posts. @@ -128,7 +128,7 @@ const usersWithPosts: UsersWithPosts = await getUsersWithPosts() ### Solution -With the `PromiseReturnType` that is exposed by the Prisma namespace, you can solve this more elegantly: +With the `PromiseReturnType` that is exposed by the `Prisma` namespace, you can solve this more elegantly: ```ts import { Prisma } from '@prisma/client' diff --git a/content/200-orm/200-prisma-client/400-type-safety/830-prisma-type-system.mdx b/content/200-orm/200-prisma-client/400-type-safety/830-prisma-type-system.mdx index e00397c0f8..6246503121 100644 --- a/content/200-orm/200-prisma-client/400-type-safety/830-prisma-type-system.mdx +++ b/content/200-orm/200-prisma-client/400-type-safety/830-prisma-type-system.mdx @@ -1,20 +1,20 @@ --- -title: How to use Prisma's type system -metaDescription: How to use Prisma's type system +title: How to use Prisma ORM's type system +description: How to use Prisma ORM's type system tocDepth: 3 --- -This guide introduces Prisma's type system and explains how to introspect existing native types in your database, and how to use types when you apply schema changes to your database with Prisma Migrate or `db push`. +This guide introduces Prisma ORM's type system and explains how to introspect existing native types in your database, and how to use types when you apply schema changes to your database with Prisma Migrate or `db push`. -## How does Prisma's type system work? +## How does Prisma ORM's type system work? -Prisma uses _types_ to define the kind of data that a field can hold. To make it easy to get started, Prisma provides a small number of core [scalar types](/orm/reference/prisma-schema-reference#model-field-scalar-types) that should cover most default use cases. For example, take the following blog post model: +Prisma ORM uses _types_ to define the kind of data that a field can hold. To make it easy to get started, Prisma ORM provides a small number of core [scalar types](/orm/reference/prisma-schema-reference#model-field-scalar-types) that should cover most default use cases. For example, take the following blog post model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -35,19 +35,19 @@ In the blog post example above, we are using the PostgreSQL connector. This is s ### Default type mappings -To allow you to get started with our core scalar types, Prisma provides _default type mappings_ that map each scalar type to a default type in the underlying database. For example: +To allow you to get started with our core scalar types, Prisma ORM provides _default type mappings_ that map each scalar type to a default type in the underlying database. For example: -- by default Prisma's `String` type gets mapped to PostgreSQL's `text` type and MySQL's `varchar` type -- by default Prisma's `DateTime` type gets mapped to PostgreSQL's `timestamp(3)` type and SQL Server's `datetime2` type +- by default Prisma ORM's `String` type gets mapped to PostgreSQL's `text` type and MySQL's `varchar` type +- by default Prisma ORM's `DateTime` type gets mapped to PostgreSQL's `timestamp(3)` type and SQL Server's `datetime2` type -See Prisma's [database connector pages](/orm/overview) for the default type mappings for a given database. For example, [this table](/orm/overview/databases/postgresql#type-mapping-between-postgresql-and-prisma-schema) gives the default type mappings for PostgreSQL. -To see the default type mappings for all databases for a specific given Prisma type, see the [model field scalar types section](/orm/reference/prisma-schema-reference#model-field-scalar-types) of the Prisma schema reference. For example, [this table](/orm/reference/prisma-schema-reference#float) gives the default type mappings for the `Float` scalar type. +See Prisma ORM's [database connector pages](/orm/overview/databases) for the default type mappings for a given database. For example, [this table](/orm/overview/databases/postgresql#type-mapping-between-postgresql-and-prisma-schema) gives the default type mappings for PostgreSQL. +To see the default type mappings for all databases for a specific given Prisma ORM type, see the [model field scalar types section](/orm/reference/prisma-schema-reference#model-field-scalar-types) of the Prisma schema reference. For example, [this table](/orm/reference/prisma-schema-reference#float) gives the default type mappings for the `Float` scalar type. ### Native type mappings -Sometimes you may need to use a more specific database type that is not one of the default type mappings for your Prisma type. For this purpose, Prisma provides [native type attributes](/orm/prisma-schema/data-model/models#native-types-mapping) to refine the core scalar types. For example, in the `createdAt` field of your `Post` model above you may want to use a date-only column in your underlying PostgreSQL database, by using the `date` type instead of the default type mapping of `timestamp(3)`. To do this, add a `@db.Date` native type attribute to the `createdAt` field: +Sometimes you may need to use a more specific database type that is not one of the default type mappings for your Prisma ORM type. For this purpose, Prisma ORM provides [native type attributes](/orm/prisma-schema/data-model/models#native-types-mapping) to refine the core scalar types. For example, in the `createdAt` field of your `Post` model above you may want to use a date-only column in your underlying PostgreSQL database, by using the `date` type instead of the default type mapping of `timestamp(3)`. To do this, add a `@db.Date` native type attribute to the `createdAt` field: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id title String @@ -55,11 +55,11 @@ model Post { } ``` -Native type mappings allow you to express all the types in your database. However, you do not need to use them if the Prisma defaults satisfy your needs. This leads to a shorter, more readable Prisma schema for common use cases. +Native type mappings allow you to express all the types in your database. However, you do not need to use them if the Prisma ORM defaults satisfy your needs. This leads to a shorter, more readable Prisma schema for common use cases. ## How to introspect database types -When you [introspect](/orm/prisma-schema/introspection) an existing database, Prisma will take the database type of each table column and represent it in your Prisma schema using the correct Prisma type for the corresponding model field. If the database type is not the default database type for that Prisma scalar type, Prisma will also add a native type attribute. +When you [introspect](/orm/prisma-schema/introspection) an existing database, Prisma ORM will take the database type of each table column and represent it in your Prisma schema using the correct Prisma ORM type for the corresponding model field. If the database type is not the default database type for that Prisma ORM scalar type, Prisma ORM will also add a native type attribute. As an example, take a `User` table in a PostgreSQL database, with: @@ -85,7 +85,7 @@ npx prisma db pull You will get the following Prisma schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id Int @id @default(autoincrement()) name String @@ -93,7 +93,7 @@ model User { } ``` -The `id`, `name` and `isActive` columns in the database are mapped respectively to the `Int`, `String` and `Boolean` Prisma types. The database types are the _default_ database types for these Prisma types, so Prisma does not add any native type attributes. +The `id`, `name` and `isActive` columns in the database are mapped respectively to the `Int`, `String` and `Boolean` Prisma ORM types. The database types are the _default_ database types for these Prisma ORM types, so Prisma ORM does not add any native type attributes. Now add a `createdAt` column to your database with a data type of `date` by running the following SQL command: @@ -108,24 +108,25 @@ Introspect your database again: npx prisma db pull ``` -Your Prisma schema now includes the new `createdAt` field with a Prisma type of `DateTime`. The `createdAt` field also has a `@db.Date` native type attribute, because PostgreSQL's `date` is not the default type for the `DateTime` type: +Your Prisma schema now includes the new `createdAt` field with a Prisma ORM type of `DateTime`. The `createdAt` field also has a `@db.Date` native type attribute, because PostgreSQL's `date` is not the default type for the `DateTime` type: -```prisma file=schema.prisma highlight=5;add +```prisma file=schema.prisma highlight=5;add showLineNumbers model User { id Int @id @default(autoincrement()) name String isActive Boolean + //add-next-line createdAt DateTime @db.Date } ``` ## How to use types when you apply schema changes to your database -When you apply schema changes to your database using Prisma Migrate or `db push`, Prisma will use both the Prisma scalar type of each field and any native attribute it has to determine the correct database type for the corresponding column in the database. +When you apply schema changes to your database using Prisma Migrate or `db push`, Prisma ORM will use both the Prisma ORM scalar type of each field and any native attribute it has to determine the correct database type for the corresponding column in the database. As an example, create a Prisma schema with the following `Post` model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id title String @@ -136,10 +137,10 @@ model Post { This `Post` model has: -- an `id` field with a Prisma type of `Int` -- a `title` field with a Prisma type of `String` -- a `createdAt` field with a Prisma type of `DateTime` -- an `updatedAt` field with a Prisma type of `DateTime` and a `@db.Date` native type attribute +- an `id` field with a Prisma ORM type of `Int` +- a `title` field with a Prisma ORM type of `String` +- a `createdAt` field with a Prisma ORM type of `DateTime` +- an `updatedAt` field with a Prisma ORM type of `DateTime` and a `@db.Date` native type attribute Now apply these changes to an empty PostgreSQL database with the following command, run from the root directory of your project: @@ -156,9 +157,9 @@ You will see that the database has a newly created `Post` table, with: Notice that the `@db.Date` native type attribute modifies the database type of the `updatedAt` column to `date`, rather than the default of `timestamp(3)`. -## More on using Prisma's type system +## More on using Prisma ORM's type system -For further reference information on using Prisma's type system, see the following resources: +For further reference information on using Prisma ORM's type system, see the following resources: -- The [database connector](/orm/overview) page for each database provider has a type mapping section with a table of default type mappings between Prisma types and database types, and a table of database types with their corresponding native type attribute in Prisma. For example, the type mapping section for PostgreSQL is [here](/orm/overview/databases/postgresql#type-mapping-between-postgresql-and-prisma-schema). -- The [model field scalar types](/orm/reference/prisma-schema-reference#model-field-scalar-types) section of the Prisma schema reference has a subsection for each Prisma scalar type. This includes a table of default mappings for that Prisma type in each database, and a table for each database listing the corresponding database types and their native type attributes in Prisma. For example, the entry for the `String` Prisma type is [here](/orm/reference/prisma-schema-reference#string). +- The [database connector](/orm/overview) page for each database provider has a type mapping section with a table of default type mappings between Prisma ORM types and database types, and a table of database types with their corresponding native type attribute in Prisma ORM. For example, the type mapping section for PostgreSQL is [here](/orm/overview/databases/postgresql#type-mapping-between-postgresql-and-prisma-schema). +- The [model field scalar types](/orm/reference/prisma-schema-reference#model-field-scalar-types) section of the Prisma schema reference has a subsection for each Prisma ORM scalar type. This includes a table of default mappings for that Prisma ORM type in each database, and a table for each database listing the corresponding database types and their native type attributes in Prisma ORM. For example, the entry for the `String` Prisma ORM type is [here](/orm/reference/prisma-schema-reference#string). diff --git a/content/200-orm/200-prisma-client/400-type-safety/index.mdx b/content/200-orm/200-prisma-client/400-type-safety/index.mdx index ce9e159278..48fd135bf3 100644 --- a/content/200-orm/200-prisma-client/400-type-safety/index.mdx +++ b/content/200-orm/200-prisma-client/400-type-safety/index.mdx @@ -1,7 +1,7 @@ --- title: 'Type safety' metaTitle: 'Type safety' -metaDescription: 'Prisma Client provides full type safety for queries, even for partial queries or included relations. This page explains how to leverage the generated types and utilities.' +description: 'Prisma Client provides full type safety for queries, even for partial queries or included relations. This page explains how to leverage the generated types and utilities.' tocDepth: 3 --- @@ -9,7 +9,7 @@ tocDepth: 3 The generated code for Prisma Client contains several helpful types and utilities that you can use to make your application more type-safe. This page describes patterns for leveraging them. -> **Note**: If you're interested in advanced type safety topics with Prisma, be sure to check out this [blog post](https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb) about improving your Prisma workflows with the new TypeScript `satisfies` keyword. +> **Note**: If you're interested in advanced type safety topics with Prisma ORM, be sure to check out this [blog post](https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb) about improving your Prisma Client workflows with the new TypeScript `satisfies` keyword. @@ -44,9 +44,9 @@ For example, `select` accepts an object of type `UserSelect`. Its object propert The first tab below shows the `UserSelect` generated type and how each property on the object has a type annotation. The second tab shows the resulting schema model. -, ]}> + - + ```ts type Prisma.UserSelect = { @@ -58,9 +58,9 @@ type Prisma.UserSelect = { } ``` - + - + ```prisma model User { @@ -72,7 +72,7 @@ model User { } ``` - + @@ -128,7 +128,7 @@ userPosts.profile > See the [model query options](/orm/reference/prisma-client-reference#model-query-options) reference for more information about the different types available. -### Generated UncheckedInput types +### Generated `UncheckedInput` types The `UncheckedInput` types are a special set of generated types that allow you to perform some operations that Prisma Client considers "unsafe", like directly writing [relation scalar fields](/orm/prisma-schema/data-model/relations). You can choose either the "safe" `Input` types or the "unsafe" `UncheckedInput` type when doing operations like `create`, `update`, or `upsert`. @@ -153,9 +153,9 @@ model User { The first tab shows the `PostUncheckedCreateInput` generated type. It contains the `authorId` property, which is a relation scalar field. The second tab shows an example query that uses the `PostUncheckedCreateInput` type. This query will result in an error if a user with an `id` of `1` does not exist. -, ]}> + - + ```ts type PostUncheckedCreateInput = { @@ -166,8 +166,8 @@ type PostUncheckedCreateInput = { } ``` - - + + ```ts prisma.post.create({ @@ -179,15 +179,15 @@ prisma.post.create({ }) ``` - + The same query can be rewritten using the "safer" `PostCreateInput` type. This type does not contain the `authorId` field but instead contains the `author` relation field. -, ]}> + - + ```ts type PostCreateInput = { @@ -206,8 +206,8 @@ type UserCreateNestedOneWithoutPostsInput = { } ``` - - + + ```ts prisma.post.create({ @@ -223,7 +223,7 @@ prisma.post.create({ }) ``` - + @@ -235,7 +235,7 @@ We recommend using the "safe" `Input` types whenever possible. -This feature is available from Prisma version 4.9.0 upwards. +This feature is available from Prisma ORM version 4.9.0 upwards. diff --git a/content/200-orm/200-prisma-client/450-testing/100-unit-testing.mdx b/content/200-orm/200-prisma-client/450-testing/100-unit-testing.mdx index 23a3473d3c..d565e3eb53 100644 --- a/content/200-orm/200-prisma-client/450-testing/100-unit-testing.mdx +++ b/content/200-orm/200-prisma-client/450-testing/100-unit-testing.mdx @@ -1,7 +1,7 @@ --- title: 'Unit testing' -metaTitle: 'Unit testing with Prisma' -metaDescription: 'Learn how to setup and run unit tests with Prisma Client' +metaTitle: 'Unit testing with Prisma ORM' +description: 'Learn how to setup and run unit tests with Prisma Client' tocDepth: 3 --- @@ -13,7 +13,7 @@ Unit testing aims to isolate a small portion (unit) of code and test it for logi - Provides documentation for each module of code by way of indicating what certain code blocks should be doing. - A helpful gauge that a refactor has gone well. The tests should still pass after code has been refactored. -In the context of Prisma, this generally means testing a function which makes database calls using Prisma Client. +In the context of Prisma ORM, this generally means testing a function which makes database calls using Prisma Client. A single test should focus on how your function logic handles different inputs (such as a null value or an empty list). @@ -21,7 +21,7 @@ This means that you should aim to remove as many dependencies as possible, such -> **Note**: This [blog post](https://www.prisma.io/blog/testing-series-2-xPhjjmIEsM) provides a comprehensive guide to implementing unit testing in your Express project with Prisma. If you're looking to delve into this topic, be sure to give it a read! +> **Note**: This [blog post](https://www.prisma.io/blog/testing-series-2-xPhjjmIEsM) provides a comprehensive guide to implementing unit testing in your Express project with Prisma ORM. If you're looking to delve into this topic, be sure to give it a read! ## Prerequisites @@ -37,7 +37,7 @@ This guide will cover two approaches to mocking Prisma Client, a singleton insta npm install jest-mock-extended@2.0.4 --save-dev ``` - + At the time of writing, this guide uses `jest-mock-extended` version `^2.0.4`. @@ -80,11 +80,12 @@ The singleton file tells Jest to mock a default export (the Prisma Client instan Next, add the `setupFilesAfterEnv` property to your `jest.config.js` file with the path to your `singleton.ts` file. -```js file=jest.config.js highlight=5;add +```js file=jest.config.js highlight=5;add showLineNumbers module.exports = { clearMocks: true, preset: 'ts-jest', testEnvironment: 'node', + //add-next-line setupFilesAfterEnv: ['/singleton.ts'], } ``` @@ -114,12 +115,12 @@ Another popular pattern that can be used is dependency injection. } ``` - +:::tip If you find that you're seeing a circular dependency error highlighted through mocking Prisma Client, try adding `"strictNullChecks": true` to your `tsconfig.json`. - +::: 2. To use the context, you would do the following in your test file: @@ -135,15 +136,15 @@ to your `tsconfig.json`. }) ``` -This will create a new context before each test is run via the `createMockContext` function. This (`mockCtx`) context will be used to make a mock call to Prisma and run a query to test. The `ctx` context will be used to run a scenario query that is tested against. +This will create a new context before each test is run via the `createMockContext` function. This (`mockCtx`) context will be used to make a mock call to Prisma Client and run a query to test. The `ctx` context will be used to run a scenario query that is tested against. ## Example unit tests -A real world use case for unit testing Prisma might be a signup form. Your user fills in a form which calls a function, which in turn uses Prisma to make a call to your database. +A real world use case for unit testing Prisma ORM might be a signup form. Your user fills in a form which calls a function, which in turn uses Prisma Client to make a call to your database. All of the examples that follow use the following schema model: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id Int @id @default(autoincrement()) email String @unique @@ -160,11 +161,7 @@ The following unit tests will mock the process of The functions that use the dependency injection pattern will have the context injected (passed in as a parameter) into them, whereas the functions that use the singleton pattern will use the singleton instance of Prisma Client. -, ]}> - - - -```ts +```ts file=functions-with-context.ts import { Context } from './context' interface CreateUser { @@ -197,11 +194,7 @@ export async function updateUsername(user: UpdateUser, ctx: Context) { } ``` - - - - -```ts +```ts file=functions-without-context.ts import prisma from './client' interface CreateUser { @@ -234,21 +227,13 @@ export async function updateUsername(user: UpdateUser) { } ``` - - - - The tests for each methodology are fairly similar, the difference is how the mocked Prisma Client is used. The **_dependency injection_** example passes the context through to the function that is being tested as well as using it to call the mock implementation. The **_singleton_** example uses the singleton client instance to call the mock implementation. -, ]}> - - - -```ts +```ts file=__tests__/with-singleton.ts import { createUser, updateUsername } from '../functions-without-context' import { prismaMock } from '../singleton' @@ -304,11 +289,7 @@ test('should fail if user does not accept terms', async () => { }) ``` - - - - -```ts +```ts file=__tests__/with-dependency-injection.ts import { MockContext, Context, createMockContext } from '../context' import { createUser, updateUsername } from '../functions-with-context' @@ -369,7 +350,3 @@ test('should fail if user does not accept terms', async () => { ) }) ``` - - - - diff --git a/content/200-orm/200-prisma-client/450-testing/150-integration-testing.mdx b/content/200-orm/200-prisma-client/450-testing/150-integration-testing.mdx index 28e5d43e16..06031816bf 100644 --- a/content/200-orm/200-prisma-client/450-testing/150-integration-testing.mdx +++ b/content/200-orm/200-prisma-client/450-testing/150-integration-testing.mdx @@ -1,7 +1,7 @@ --- title: 'Integration testing' metaTitle: 'Integration testing with Prisma' -metaDescription: 'Learn how to setup and run integration tests with Prisma and Docker' +description: 'Learn how to setup and run integration tests with Prisma and Docker' tocDepth: 3 --- @@ -21,9 +21,11 @@ This guide assumes you have [Docker](https://docs.docker.com/get-docker/) and [D The following ecommerce schema will be used throughout the guide. This varies from the traditional `User` and `Post` models used in other parts of the docs, mainly because it is unlikely you will be running integration tests against your blog. -
Ecommerce schema +
-```prisma file=schema.prisma +Ecommerce schema + +```prisma file=schema.prisma showLineNumbers // Can have 1 customer // Can have many order details model CustomerOrder { @@ -293,13 +295,13 @@ The following tests will check if the `createOrder` function works as it should Before the test suite is run the database is seeded with data. After the test suite has finished a [`deleteMany`](/orm/reference/prisma-client-reference#deletemany) is used to clear the database of its data. - +:::tip Using `deleteMany` may suffice in situations where you know ahead of time how your schema is structured. This is because the operations need to be executed in the correct order according to how the model relations are setup. However, this doesn't scale as well as having a more generic solution that maps over your models and performs a truncate on them. For those scenarios and examples of using raw SQL queries see [Deleting all data with raw SQL / `TRUNCATE`](/orm/prisma-client/queries/crud#deleting-all-data-with-raw-sql--truncate) - +::: ```ts file=__tests__/create-order.ts import prisma from '../src/client' diff --git a/content/200-orm/200-prisma-client/450-testing/index.mdx b/content/200-orm/200-prisma-client/450-testing/index.mdx index 9523cc79c8..7d3f06ed64 100644 --- a/content/200-orm/200-prisma-client/450-testing/index.mdx +++ b/content/200-orm/200-prisma-client/450-testing/index.mdx @@ -1,8 +1,9 @@ --- title: 'Testing' -navTitle: Testing -metaTitle: 'Testing with Prisma' -metaDescription: 'How to implement unit and integration testing with Prisma' +sidebar_label: Testing +metaTitle: 'Testing with Prisma ORM' +description: 'How to implement unit and integration testing with Prisma ORM' +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/500-deployment/001-deploy-prisma.mdx b/content/200-orm/200-prisma-client/500-deployment/001-deploy-prisma.mdx index b733f5c803..9a0bbbb039 100644 --- a/content/200-orm/200-prisma-client/500-deployment/001-deploy-prisma.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/001-deploy-prisma.mdx @@ -1,7 +1,7 @@ --- -title: 'Deploy Prisma' -metaTitle: 'Deploying Prisma-based projects' -metaDescription: 'Learn more about the different deployment paradigms for Node.js applications and how they affect deploying an application using Prisma Client.' +title: 'Deploy Prisma ORM' +metaTitle: 'Deploying Prisma ORM-based projects' +description: 'Learn more about the different deployment paradigms for Node.js applications and how they affect deploying an application using Prisma Client.' tocDepth: 2 --- diff --git a/content/200-orm/200-prisma-client/500-deployment/101-traditional/200-deploy-to-heroku.mdx b/content/200-orm/200-prisma-client/500-deployment/101-traditional/200-deploy-to-heroku.mdx index 4242c91b81..9fd3cb95b5 100644 --- a/content/200-orm/200-prisma-client/500-deployment/101-traditional/200-deploy-to-heroku.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/101-traditional/200-deploy-to-heroku.mdx @@ -1,12 +1,12 @@ --- title: 'Deploy to Heroku' metaTitle: 'Deploy a Prisma app to Heroku' -metaDescription: 'Learn how to deploy a Node.js server that uses Prisma to Heroku.' +description: 'Learn how to deploy a Node.js server that uses Prisma ORM to Heroku.' --- -In this guide, you will set up and deploy a Node.js server that uses Prisma with PostgreSQL to [Heroku](https://www.heroku.com). The application exposes a REST API and uses Prisma Client to handle fetching, creating, and deleting records from a database. +In this guide, you will set up and deploy a Node.js server that uses Prisma ORM with PostgreSQL to [Heroku](https://www.heroku.com). The application exposes a REST API and uses Prisma Client to handle fetching, creating, and deleting records from a database. Heroku is a cloud platform as a service (PaaS). In contrast to the popular serverless deployment model, with Heroku, your application is constantly running even if no requests are made to it. This has several benefits due to the connection limits of a PostgreSQL database. For more information, check out the [general deployment documentation](/orm/prisma-client/deployment/deploy-prisma) @@ -19,7 +19,7 @@ The application has the following components: ![architecture diagram](./images/heroku-architecture.png) -The focus of this guide is showing how to deploy projects using Prisma to Heroku. The starting point will be the [Prisma Heroku example](https://github.com/prisma/prisma-examples/tree/latest/deployment-platforms/heroku), which contains an Express.js server with a couple of preconfigured REST endpoints and a simple frontend. +The focus of this guide is showing how to deploy projects using Prisma ORM to Heroku. The starting point will be the [Prisma Heroku example](https://github.com/prisma/prisma-examples/tree/latest/deployment-platforms/heroku), which contains an Express.js server with a couple of preconfigured REST endpoints and a simple frontend. > **Note:** The various **checkpoints** throughout the guide allowing you to validate whether you performed the steps correctly. @@ -38,9 +38,9 @@ While the example uses REST, the same principles apply to a GraphQL server, with > **Note:** Heroku doesn't provide a free plan, so billing information is required. -## Prisma workflow +## Prisma ORM workflow -At the core of Prisma is the [Prisma schema](/orm/prisma-schema) – a declarative configuration where you define your data model and other Prisma-related configuration. The Prisma schema is also a single source of truth for both Prisma Client and Prisma Migrate. +At the core of Prisma ORM is the [Prisma schema](/orm/prisma-schema) – a declarative configuration where you define your data model and other Prisma ORM-related configuration. The Prisma schema is also a single source of truth for both Prisma Client and Prisma Migrate. In this guide, you will use [Prisma Migrate](/orm/prisma-migrate) to create the database schema. Prisma Migrate is based on the Prisma schema and works by generating `.sql` migration files that are executed against the database. @@ -188,7 +188,7 @@ Database has been created and is available Created postgresql-parallel-73780 as DATABASE_URL ``` -> **Note:** Heroku automatically sets the `DATABASE_URL` environment variable when the app is running on Heroku. Prisma uses this environment variable because it's declared in the _datasource_ block of the Prisma schema (`prisma/schema.prisma`) with `env("DATABASE_URL")`. +> **Note:** Heroku automatically sets the `DATABASE_URL` environment variable when the app is running on Heroku. Prisma ORM uses this environment variable because it's declared in the _datasource_ block of the Prisma schema (`prisma/schema.prisma`) with `env("DATABASE_URL")`. ## 6. Push to deploy @@ -273,7 +273,7 @@ const server = app.listen(PORT, () => { ## Summary -Congratulations! You have successfully deployed a Node.js app with Prisma to Heroku. +Congratulations! You have successfully deployed a Node.js app with Prisma ORM to Heroku. You can find the source code for the example in [this GitHub repository](https://github.com/prisma/prisma-examples/tree/latest/deployment-platforms/heroku). diff --git a/content/200-orm/200-prisma-client/500-deployment/101-traditional/250-deploy-to-koyeb.mdx b/content/200-orm/200-prisma-client/500-deployment/101-traditional/250-deploy-to-koyeb.mdx index 6205ffddfb..c787cef06e 100644 --- a/content/200-orm/200-prisma-client/500-deployment/101-traditional/250-deploy-to-koyeb.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/101-traditional/250-deploy-to-koyeb.mdx @@ -1,12 +1,12 @@ --- title: 'Deploy to Koyeb' -metaTitle: 'Deploy a Prisma app to Koyeb' -metaDescription: 'Learn how to deploy a Node.js server that uses Prisma to Koyeb Serverless Platform.' +metaTitle: 'Deploy a Prisma ORM app to Koyeb' +description: 'Learn how to deploy a Node.js server that uses Prisma ORM to Koyeb Serverless Platform.' --- -In this guide, you will set up and deploy a Node.js server that uses Prisma with PostgreSQL to [Koyeb](https://www.koyeb.com). The application exposes a REST API and uses Prisma Client to handle fetching, creating, and deleting records from a database. +In this guide, you will set up and deploy a Node.js server that uses Prisma ORM with PostgreSQL to [Koyeb](https://www.koyeb.com). The application exposes a REST API and uses Prisma Client to handle fetching, creating, and deleting records from a database. Koyeb is a developer-friendly serverless platform to deploy apps globally. The platform lets you seamlessly run Docker containers, web apps, and APIs with git-based deployment, TLS encryption, native autoscaling, a global edge network, and built-in service mesh & discovery. @@ -20,7 +20,7 @@ The application has the following components: ![architecture diagram](./images/koyeb-architecture.png) -The focus of this guide is showing how to deploy projects using Prisma to Koyeb. The starting point will be the [Prisma Koyeb example](https://github.com/koyeb/example-prisma), which contains an Express.js server with a couple of preconfigured REST endpoints and a simple frontend. +The focus of this guide is showing how to deploy projects using Prisma ORM to Koyeb. The starting point will be the [Prisma Koyeb example](https://github.com/koyeb/example-prisma), which contains an Express.js server with a couple of preconfigured REST endpoints and a simple frontend. > **Note:** The various **checkpoints** throughout the guide allow you to validate whether you performed the steps correctly. @@ -33,9 +33,9 @@ The focus of this guide is showing how to deploy projects using Prisma to Koyeb. - [Koyeb](https://koyeb.com) account. - Node.js installed. -## Prisma workflow +## Prisma ORM workflow -At the core of Prisma is the [Prisma schema](/orm/prisma-schema) – a declarative configuration where you define your data model and other Prisma-related configuration. The Prisma schema is also a single source of truth for both Prisma Client and Prisma Migrate. +At the core of Prisma ORM is the [Prisma schema](/orm/prisma-schema) – a declarative configuration where you define your data model and other Prisma ORM-related configuration. The Prisma schema is also a single source of truth for both Prisma Client and Prisma Migrate. In this guide, you will create the database schema with [Prisma Migrate](/orm/prisma-migrate) to create the database schema. Prisma Migrate is based on the Prisma schema and works by generating `.sql` migration files that are executed against the database. @@ -195,7 +195,7 @@ In this guide, we kept pre-set values for the region, instance size, and horizon ## Summary -Congratulations! You have successfully deployed a Node.js app with Prisma to Koyeb. +Congratulations! You have successfully deployed a Node.js app with Prisma ORM to Koyeb. You can find the source code for the example in [this GitHub repository](https://github.com/koyeb/example-prisma). diff --git a/content/200-orm/200-prisma-client/500-deployment/101-traditional/index.mdx b/content/200-orm/200-prisma-client/500-deployment/101-traditional/index.mdx index 145b8aa5a9..add242f2a7 100644 --- a/content/200-orm/200-prisma-client/500-deployment/101-traditional/index.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/101-traditional/index.mdx @@ -1,7 +1,7 @@ --- title: 'Traditional servers' -metaTitle: 'Deploy Prisma apps to traditional (PaaS) servers' -metaDescription: 'Learn how to deploy your Prisma-backed apps to PaaS providers like Heroku, Koyeb, or AWS EC2' +metaTitle: 'Deploy Prisma ORM apps to traditional (PaaS) servers' +description: 'Learn how to deploy your Prisma-backed apps to PaaS providers like Heroku, Koyeb, or AWS EC2' tocDepth: 2 --- diff --git a/content/200-orm/200-prisma-client/500-deployment/201-serverless/150-deploy-to-azure-functions.mdx b/content/200-orm/200-prisma-client/500-deployment/201-serverless/150-deploy-to-azure-functions.mdx index 5e0120f978..6ff7e7ded7 100644 --- a/content/200-orm/200-prisma-client/500-deployment/201-serverless/150-deploy-to-azure-functions.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/201-serverless/150-deploy-to-azure-functions.mdx @@ -1,7 +1,7 @@ --- title: 'Deploy to Azure Functions' -metaTitle: 'How to deploy an app using Prisma to Azure Functions' -metaDescription: 'Learn how to deploy a Prisma based REST API to Azure Functions and connect to an Azure SQL database' +metaTitle: 'How to deploy an app using Prisma ORM to Azure Functions' +description: 'Learn how to deploy a Prisma Client based REST API to Azure Functions and connect to an Azure SQL database' --- @@ -14,19 +14,20 @@ Azure Functions is a serverless deployment platform. You do not need to maintain ## Prerequisites -- An existing function app project with Prisma +- An existing function app project with Prisma ORM ## Things to know -While Prisma works well with Azure functions, there are a few things to take note of before deploying your application. +While Prisma ORM works well with Azure functions, there are a few things to take note of before deploying your application. ### Define multiple binary targets When deploying a function app, the operating system that Azure functions runs a remote build is different from the one used to host your functions. Therefore, we recommend specifying the following [`binaryTargets` options](/orm/reference/prisma-schema-reference#binarytargets-options) in your Prisma schema: -```prisma file=schema.prisma highlight=3;normal +```prisma file=schema.prisma highlight=3;normal showLineNumbers generator client { provider = "prisma-client-js" + //highlight-next-line binaryTargets = ["native", "debian-openssl-1.1.x"] } ``` diff --git a/content/200-orm/200-prisma-client/500-deployment/201-serverless/300-deploy-to-vercel.mdx b/content/200-orm/200-prisma-client/500-deployment/201-serverless/300-deploy-to-vercel.mdx index f62f86db43..0b55c7ae55 100644 --- a/content/200-orm/200-prisma-client/500-deployment/201-serverless/300-deploy-to-vercel.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/201-serverless/300-deploy-to-vercel.mdx @@ -1,7 +1,7 @@ --- title: 'Deploy to Vercel' metaTitle: 'Deploy to Vercel' -metaDescription: 'Learn how to deploy a Next.js application based on Prisma Client to Vercel.' +description: 'Learn how to deploy a Next.js application based on Prisma Client to Vercel.' --- @@ -16,14 +16,15 @@ While our examples use Next.js, you can deploy other applications to Vercel. See -## Generate Prisma during build +## Generate Prisma ORM during build -Vercel will automatically cache dependencies on deployment. For most applications, this will not cause any issues. However, for Prisma, it may result in an outdated version of Prisma Client on a change in your Prisma schema. To avoid this issue, add `prisma generate` to the `postinstall` script of your application: +Vercel will automatically cache dependencies on deployment. For most applications, this will not cause any issues. However, for Prisma ORM, it may result in an outdated version of Prisma Client on a change in your Prisma schema. To avoid this issue, add `prisma generate` to the `postinstall` script of your application: -```json file=package.json highlight=4;add +```json file=package.json highlight=4;add showLineNumbers { ... "scripts" { + //add-next-line "postinstall": "prisma generate" } ... @@ -40,9 +41,10 @@ If you see `prisma: command not found` errors during your deployment to Vercel, Another option to avoid an outdated Prisma Client is to use [a custom output path](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path) and check your client into version control. This way each deployment is guaranteed to include the correct Prisma Client. -```prisma file=schema.prisma highlight=3;add +```prisma file=schema.prisma highlight=3;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line output = "./generated/client" } ``` diff --git a/content/200-orm/200-prisma-client/500-deployment/201-serverless/400-deploy-to-aws-lambda.mdx b/content/200-orm/200-prisma-client/500-deployment/201-serverless/400-deploy-to-aws-lambda.mdx index 471160e825..d748b6676d 100644 --- a/content/200-orm/200-prisma-client/500-deployment/201-serverless/400-deploy-to-aws-lambda.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/201-serverless/400-deploy-to-aws-lambda.mdx @@ -1,19 +1,19 @@ --- title: 'Deploy to AWS Lambda' -metaTitle: 'Deploy your application using Prisma to AWS Lambda' -metaDescription: 'Learn how to deploy your Prisma-backed applications to AWS Lambda with AWS SAM, Serverless Framework, or SST' +metaTitle: 'Deploy your application using Prisma ORM to AWS Lambda' +description: 'Learn how to deploy your Prisma ORM-backed applications to AWS Lambda with AWS SAM, Serverless Framework, or SST' tocDepth: 3 --- -This guide explains how to avoid common issues when deploying a project using Prisma to [AWS Lambda](https://aws.amazon.com/lambda/). +This guide explains how to avoid common issues when deploying a project using Prisma ORM to [AWS Lambda](https://aws.amazon.com/lambda/). While a deployment framework is not required to deploy to AWS Lambda, this guide covers deploying with: - [AWS Serverless Application Model (SAM)](https://aws.amazon.com/serverless/sam/) is an open-source framework from AWS that can be used in the creation of serverless applications. AWS SAM includes the [AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-reference.html#serverless-sam-cli), which you can use to build, test, and deploy your application. -- [Serverless Framework](https://www.serverless.com/framework/) provides a CLI that helps with workflow automation and AWS resource provisioning. While Prisma works well with the Serverless Framework "out of the box", there are a few improvements that can be made within your project to ensure a smooth deployment and performance. There is also additional configuration that is needed if you are using the [`serverless-webpack`](https://www.npmjs.com/package/serverless-webpack) or [`serverless-bundle`](https://www.npmjs.com/package/serverless-bundle) libraries. -- [SST](https://sst.dev/) provides tools that make it easy for developers to define, test, debug, and deploy their applications. Prisma works well with SST but must be configured so that your schema is correctly packaged by SST. +- [Serverless Framework](https://www.serverless.com/framework/) provides a CLI that helps with workflow automation and AWS resource provisioning. While Prisma ORM works well with the Serverless Framework "out of the box", there are a few improvements that can be made within your project to ensure a smooth deployment and performance. There is also additional configuration that is needed if you are using the [`serverless-webpack`](https://www.npmjs.com/package/serverless-webpack) or [`serverless-bundle`](https://www.npmjs.com/package/serverless-bundle) libraries. +- [SST](https://sst.dev/) provides tools that make it easy for developers to define, test, debug, and deploy their applications. Prisma ORM works well with SST but must be configured so that your schema is correctly packaged by SST. @@ -27,13 +27,28 @@ This section covers changes you will need to make to your application, regardles ### Define binary targets in Prisma Schema -The Prisma schema should contain the following in the `generator` block: +Depending on the version of Node.js, your Prisma schema should contain either `rhel-openssl-1.0.x` or `rhel-openssl-3.0.x` in the `generator` block: + + + + ```prisma binaryTargets = ["native", "rhel-openssl-1.0.x"] ``` -This is necessary because the runtimes used in development and deployment differ. Add the [`binaryTarget`](/orm/reference/prisma-schema-reference#binarytargets-options) to make the compatible Prisma engine file available. + + + +```prisma +binaryTargets = ["native", "rhel-openssl-3.0.x"] +``` + + + + + +This is necessary because the runtimes used in development and deployment differ. Add the [`binaryTarget`](/orm/reference/prisma-schema-reference#binarytargets-options) to make the compatible Prisma ORM engine file available. #### Lambda functions with arm64 architectures @@ -41,7 +56,7 @@ Lambda functions that use [arm64 architectures (AWS Graviton2 processor)](https: In the `generator` block of your `schema.prisma` file, add the following: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers binaryTargets = ["native", "linux-arm64-openssl-1.0.x"] ``` @@ -51,7 +66,7 @@ While we do not recommend running migrations within AWS Lambda, some application In the case of AWS lambda, you will have to add the following environment variable: -```env file=.env +```env file=.env showLineNumbers PRISMA_CLI_BINARY_TARGETS=native,rhel-openssl-1.0.x ``` @@ -73,11 +88,11 @@ AWS SAM does not directly support loading values from a `.env` file. You will ha ### Loading required files -AWS SAM uses [esbuild](https://esbuild.github.io/) to bundle your TypeScript code. However, the full esbuild API is not exposed and esbuild plugins are not supported. This leads to problems when using Prisma in your application as certain files (like `schema.prisma`) must be available at runtime. +AWS SAM uses [esbuild](https://esbuild.github.io/) to bundle your TypeScript code. However, the full esbuild API is not exposed and esbuild plugins are not supported. This leads to problems when using Prisma ORM in your application as certain files (like `schema.prisma`) must be available at runtime. -To get around this, you need to directly reference the needed files in your code to bundle them correctly. In your application, you could add the following lines to your application where Prisma is instantiated. +To get around this, you need to directly reference the needed files in your code to bundle them correctly. In your application, you could add the following lines to your application where Prisma ORM is instantiated. -```ts file=app.ts +```ts file=app.ts showLineNumbers import schema from './prisma/schema.prisma' import x from './node_modules/.prisma/client/libquery_engine-rhel-openssl-1.0.x.so.node' @@ -88,18 +103,18 @@ if (process.env.NODE_ENV !== 'production') { You will also need to define how to bundle these files with esbuild by adding the following lines to `Metadata.BuildProperties` in your `template.yaml`: -```yaml file=template.yaml +```yaml file=template.yaml showLineNumbers Loader: - .prisma=file - .so.node=file AssetNames: '[name]' ``` -This will make sure that files needed by Prisma will be included in the AWS SAM build. +This will make sure that files needed by Prisma ORM will be included in the AWS SAM build. ## Deploying with the Serverless Framework -### Loading environment variables via a .env file +### Loading environment variables via a `.env` file Your functions will need the `DATABASE_URL` environment variable to access the database. The `serverless-dotenv-plugin` will allow you to use your `.env` file in your deployments. @@ -111,7 +126,7 @@ npm install -D serverless-dotenv-plugin Then, add `serverless-dotenv-plugin` to your list of plugins in `serverless.yml`: -```code file=serverless.yml no-copy +```code file=serverless.yml no-copy showLineNumbers plugins: - serverless-dotenv-plugin ``` @@ -144,9 +159,9 @@ Packaging deployment-example-sls for stage dev (us-east-1) ### Deploy only the required files -To reduce your deployment footprint, you can update your deployment process to only upload the files your application needs. The Serverless configuration file, `serverless.yml`, below shows a `package` pattern that includes only the Prisma engine file relevant to the Lambda runtime and excludes the others. This means that when Serverless Framework packages your app for upload, it includes only one engine file. This ensures the packaged archive is as small as possible. +To reduce your deployment footprint, you can update your deployment process to only upload the files your application needs. The Serverless configuration file, `serverless.yml`, below shows a `package` pattern that includes only the Prisma ORM engine file relevant to the Lambda runtime and excludes the others. This means that when Serverless Framework packages your app for upload, it includes only one engine file. This ensures the packaged archive is as small as possible. -```code file=serverless.yml no-copy +```code file=serverless.yml no-copy showLineNumbers package: patterns: - '!node_modules/.prisma/client/libquery_engine-*' @@ -157,10 +172,11 @@ package: If you are deploying to [Lambda functions with ARM64 architecture](#lambda-functions-with-arm64-architectures) you should update the Serverless configuration file to package the `arm64` engine file, as follows: -```code file=serverless.yml highlight=4;normal +```code file=serverless.yml highlight=4;normal showLineNumbers package: patterns: - '!node_modules/.prisma/client/libquery_engine-*' + //highlight-next-line - 'node_modules/.prisma/client/libquery_engine-linux-arm64-*' - '!node_modules/prisma/libquery_engine-*' - '!node_modules/@prisma/engines/**' @@ -168,13 +184,13 @@ package: If you use `serverless-webpack`, see [Deployment with serverless webpack](#deployment-with-serverless-webpack) below. -### Deployment with serverless-webpack +### Deployment with `serverless-webpack` If you use `serverless-webpack`, you will need additional configuration so that your `schema.prisma` is properly bundled. You will need to: 1. Copy your `schema.prisma` with [`copy-webpack-plugin`](https://www.npmjs.com/package/copy-webpack-plugin). 2. Run `prisma generate` via `custom > webpack > packagerOptions > scripts` in your `serverless.yml`. -3. Only package the correct Prisma engine file to save more than 40mb of capacity. +3. Only package the correct Prisma ORM engine file to save more than 40mb of capacity. #### 1. Install webpack specific dependencies @@ -184,15 +200,16 @@ First, ensure the following webpack dependencies are installed: npm install --save-dev webpack webpack-node-externals copy-webpack-plugin serverless-webpack ``` -#### 2. Update webpack.config.js +#### 2. Update `webpack.config.js` In your `webpack.config.js`, make sure that you set `externals` to `nodeExternals()` like the following: -```javascript file=webpack.config.js highlight=1,5;normal; +```javascript file=webpack.config.js highlight=1,5;normal; showLineNumbers const nodeExternals = require('webpack-node-externals') module.exports = { // ... other configuration + //highlight-next-line externals: [nodeExternals()], // ... other configuration } @@ -200,13 +217,15 @@ module.exports = { Update the `plugins` property in your `webpack.config.js` file to include the `copy-webpack-plugin`: -```javascript file=webpack.config.js highlight=2,7-13;normal; +```javascript file=webpack.config.js highlight=2,7-13;normal; showLineNumbers const nodeExternals = require('webpack-node-externals') +//highlight-next-line const CopyPlugin = require('copy-webpack-plugin') module.exports = { // ... other configuration externals: [nodeExternals()], + //highlight-start plugins: [ new CopyPlugin({ patterns: [ @@ -214,11 +233,12 @@ module.exports = { ], }), ], + //highlight-end // ... other configuration } ``` -This plugin will allow you to copy your `schema.prisma` file into your bundled code. Prisma requires that your `schema.prisma` be present in order make sure that queries are encoded and decoded according to your schema. In most cases, bundlers will not include this file by default and will cause your application to fail to run. +This plugin will allow you to copy your `schema.prisma` file into your bundled code. Prisma ORM requires that your `schema.prisma` be present in order make sure that queries are encoded and decoded according to your schema. In most cases, bundlers will not include this file by default and will cause your application to fail to run. @@ -228,11 +248,11 @@ Depending on how your application is bundled, you may need to copy the schema fi Refer to the [Serverless Webpack documentation](https://www.serverless.com/plugins/serverless-webpack) for additional configuration. -#### 3. Update serverless.yml +#### 3. Update `serverless.yml` In your `serverless.yml` file, make sure that the `custom > webpack` block has `prisma generate` under `packagerOptions > scripts` as follows: -```yaml file=serverless.yml +```yaml file=serverless.yml showLineNumbers custom: webpack: packagerOptions: @@ -242,25 +262,27 @@ custom: This will ensure that, after webpack bundles your code, the Prisma Client is generated according to your schema. Without this step, your app will fail to run. -Lastly, you will want to exclude [Prisma query engines](/orm/more/under-the-hood/engines) that do not match the AWS Lambda runtime. Update your `serverless.yml` by adding the following script that makes sure only the required query engine, `rhel-openssl-1.0.x`, is included in the final packaged archive. +Lastly, you will want to exclude [Prisma ORM query engines](/orm/more/under-the-hood/engines) that do not match the AWS Lambda runtime. Update your `serverless.yml` by adding the following script that makes sure only the required query engine, `rhel-openssl-1.0.x`, is included in the final packaged archive. -```yaml file=serverless.yml highlight=6;add +```yaml file=serverless.yml highlight=6;add showLineNumbers custom: webpack: packagerOptions: scripts: - prisma generate + //add-next-line -- find . -name "libquery_engine-*" -not -name "libquery_engine-rhel-openssl-*" | xargs rm ``` If you are deploying to [Lambda functions with ARM64 architecture](#lambda-functions-with-arm64-architectures) you should update the `find` command to the following: -```yaml file=serverless.yml highlight=6;add +```yaml file=serverless.yml highlight=6;add showLineNumbers custom: webpack: packagerOptions: scripts: - prisma generate + //add-next-line -- find . -name "libquery_engine-*" -not -name "libquery_engine-arm64-openssl-*" | xargs rm ``` @@ -307,7 +329,7 @@ While SST supports `.env` files, [it is not recommended](https://docs.sst.dev/co The SST guide [available here](https://docs.sst.dev/config#overview) is a step-by-step guide to get started with `Config`. Assuming you have created a new secret called `DATABASE_URL` and have [bound that secret to your app](https://docs.sst.dev/config#bind-the-config), you can set up `PrismaClient` with the following: -```ts file=prisma.ts +```ts file=prisma.ts showLineNumbers import { PrismaClient } from '@prisma/client' import { Config } from 'sst/node/config' diff --git a/content/200-orm/200-prisma-client/500-deployment/201-serverless/500-deploy-to-netlify.mdx b/content/200-orm/200-prisma-client/500-deployment/201-serverless/500-deploy-to-netlify.mdx index c0aabfe6cd..9c4f6a5181 100644 --- a/content/200-orm/200-prisma-client/500-deployment/201-serverless/500-deploy-to-netlify.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/201-serverless/500-deploy-to-netlify.mdx @@ -1,12 +1,12 @@ --- title: 'Deploy to Netlify' metaTitle: 'Deploy to Netlify' -metaDescription: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client to Netlify.' +description: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client to Netlify.' --- -This guide covers the steps you will need to take in order to deploy your application that uses Prisma to [Netlify](https://www.netlify.com/). +This guide covers the steps you will need to take in order to deploy your application that uses Prisma ORM to [Netlify](https://www.netlify.com/). Netlify is a cloud platform for continuous deployment, static sites, and serverless functions. Netlify integrates seamlessly with GitHub for automatic deployments upon commits. When you follow the steps below, you will use that approach to create a CI/CD pipeline that deploys your application from a GitHub repository. @@ -16,23 +16,38 @@ Netlify is a cloud platform for continuous deployment, static sites, and serverl Before you can follow this guide, you will need to set up your application to begin deploying to Netlify. We recommend the ["Get started with Netlify"](https://docs.netlify.com/get-started/) guide for a quick overview and ["Deploy functions"](https://docs.netlify.com/functions/deploy/?fn-language=ts) for an in-depth look at your deployment options. -## Binary targets in schema.prisma +## Binary targets in `schema.prisma` Since your code is being deployed to Netlify's environment, which isn't necessarily the same as your development environment, you will need to set [`binaryTargets`](/orm/reference/prisma-schema-reference#binarytargets-options) in order to download the query engine that is compatible with the Netlify runtime during your build step. If you do not set this option, your deployed code will have an incorrect query engine deployed with it and will not function. -You should update your Prisma schema to contain the following in the `generator` block: +Depending on the version of Node.js, your Prisma schema should contain either `rhel-openssl-1.0.x` or `rhel-openssl-3.0.x` in the `generator` block: + + + + ```prisma binaryTargets = ["native", "rhel-openssl-1.0.x"] ``` + + + +```prisma +binaryTargets = ["native", "rhel-openssl-3.0.x"] +``` + + + + + ## Store environment variables in Netlify We recommend keeping `.env` files in your `.gitignore` in order to prevent leakage of sensitives connection strings. Instead, you can use the Netlify CLI to [import values into netlify directly](https://docs.netlify.com/environment-variables/get-started/#import-variables-with-the-netlify-cli). Assuming you have a file like the following: -```env file=.env +```env file=.env showLineNumbers # Connect to DB DATABASE_URL="postgresql://postgres:__PASSWORD__@__HOST__:__PORT__/__DB_NAME__" ``` @@ -52,7 +67,7 @@ site: my-very-very-cool-site ```
-If you are not using an .env file +If you are not using an `.env` file If you are storing your database connection string and other environment variables in a different method, you will need to manually upload your environment variables to Netlify. These options are [discussed in Netlfiy's documentation](https://docs.netlify.com/environment-variables/get-started/) and one method, uploading via the UI, is described below. @@ -61,10 +76,10 @@ If you are storing your database connection string and other environment variabl netlify open --admin ``` 2. Click **Site settings**: - ![Netlify admin UI](images/500-06-deploy-to-netlify-site-settings.png) + ![Netlify admin UI](./images/500-06-deploy-to-netlify-site-settings.png) 3. Navigate to **Build & deploy** in the sidebar on the left and select **Environment**. 4. Click **Edit variables** and create a variable with the key `DATABASE_URL` and set its value to your database connection string. - ![Netlify environment variables](images/500-07-deploy-to-netlify-environment-variables-settings.png) + ![Netlify environment variables](./images/500-07-deploy-to-netlify-environment-variables-settings.png) 5. Click **Save**.
diff --git a/content/200-orm/200-prisma-client/500-deployment/201-serverless/index.mdx b/content/200-orm/200-prisma-client/500-deployment/201-serverless/index.mdx index 7aa4a9f808..b555f67f59 100644 --- a/content/200-orm/200-prisma-client/500-deployment/201-serverless/index.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/201-serverless/index.mdx @@ -1,7 +1,7 @@ --- title: 'Serverless functions' -metaTitle: 'Deploy Prisma apps to serverless function (FaaS) providers' -metaDescription: 'Learn how to deploy your Prisma-backed apps to FaaS providers like AWS Lambda, Netlify, or Vercel Serverless Functions' +metaTitle: 'Deploy Prisma ORM apps to serverless function (FaaS) providers' +description: 'Learn how to deploy your Prisma ORM-backed apps to FaaS providers like AWS Lambda, Netlify, or Vercel Serverless Functions' tocDepth: 2 --- diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/100-overview.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/100-overview.mdx new file mode 100644 index 0000000000..5304b9720c --- /dev/null +++ b/content/200-orm/200-prisma-client/500-deployment/301-edge/100-overview.mdx @@ -0,0 +1,60 @@ +--- +title: 'Overview (Deploy Prisma ORM at the Edge)' +sidebar_label: 'Overview' +description: 'Learn how to deploy your Prisma-backed apps to edge functions like Cloudflare Workers or Vercel Edge Functions' +tocDepth: 2 +--- + + + +## Deploying edge functions with Prisma ORM + +You can deploy an application that uses Prisma ORM to the edge. Depending on which edge function provider and which database you use, there are different considerations and things to be aware of. + +Here is a brief overview of all the edge function providers that are currently supported by Prisma ORM: + +| Provider / Product | Supported natively with Prisma ORM | Supported with Prisma Accelerate | +| ---------------------- | ------------------------------------------------------- | -------------------------------- | +| Vercel Edge Functions | ✅ (Preview; only compatible drivers) | ✅ | +| Vercel Edge Middleware | ✅ (Preview; only compatible drivers) | ✅ | +| Cloudflare Workers | ✅ (Preview; only compatible drivers) | ✅ | +| Cloudflare Pages | ✅ (Preview; only compatible drivers) | ✅ | +| Deno Deploy | [Not yet](https://github.com/prisma/prisma/issues/2452) | ✅ | + +Deploying edge functions that use Prisma ORM on Cloudflare and Vercel is currently in [Preview](/orm/more/releases#preview). + +## Edge-compatibility of database drivers + +### Why are there limitations around database drivers in edge functions? + +Edge functions typically don't use the standard Node.js runtime. For example, Vercel Edge Functions and Cloudflare Workers are running code in [V8 isolates](https://v8docs.nodesource.com/node-0.8/d5/dda/classv8_1_1_isolate.html). Deno Deploy is using the [Deno](https://deno.com/) JavaScript runtime. As a consequence, these edge functions only have access to a small subset of the standard Node.js APIs and also have constrained computing resources (CPU and memory). + +In particular, the constraint of not being able to freely open TCP connections makes it difficult to talk to a traditional database from an edge function. While Cloudflare has introduced a [`connect()`](https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/) API that enables limited TCP connections, this still only enables database access using specific database drivers that are compatible with that API. + +> **Note**: [Prisma Accelerate](/accelerate) enables you to access _any_ database from _any_ edge function provider. No edge-compatible driver is necessary. + +### Which database drivers are edge-compatible? + +Here is an overview of the different database drivers and their compatibility with different edge function offerings: + +- [Neon Serverless](https://neon.tech/docs/serverless/serverless-driver) uses HTTP to access the database. It works with Cloudflare Workers and Vercel Edge Functions. +- [PlanetScale Serverless](https://planetscale.com/docs/tutorials/planetscale-serverless-driver) uses HTTP to access the database. It works with Cloudflare Workers and Vercel Edge Functions. +- [`node-postgres`](https://node-postgres.com/) (`pg`) uses Cloudflare's `connect()` (TCP) to access the database. It is only compatible with Cloudflare Workers, not with Vercel Edge Functions. +- [`@libsql/client`](https://github.com/tursodatabase/libsql-client-ts) is used to access Turso databases. It works with Cloudflare Workers and Vercel Edge Functions. + +There's [also work being done](https://github.com/sidorares/node-mysql2/pull/2289) on the `node-mysql2` driver which will enable access to traditional MySQL databases from Cloudflare Workers and Pages in the future as well. + +You can use all of these drivers with Prisma ORM using the respective [driver adapters](/orm/overview/databases/database-drivers). + +Depending on which deployment provider and database/driver you use, there may be special considerations. Please take a look at the deployment docs for your respective scenario to make sure you can deploy your application successfully: + +- Cloudflare + - [PostgreSQL (traditional)](/orm/prisma-client/deployment/edge/deploy-to-cloudflare#postgresql-traditional) + - [PlanetScale](/orm/prisma-client/deployment/edge/deploy-to-cloudflare#planetscale) + - [Neon](/orm/prisma-client/deployment/edge/deploy-to-cloudflare#neon) +- Vercel + - [Vercel Postgres](/orm/prisma-client/deployment/edge/deploy-to-vercel#vercel-postgres) + - [Neon](/orm/prisma-client/deployment/edge/deploy-to-vercel#neon) + - [PlanetScale](/orm/prisma-client/deployment/edge/deploy-to-vercel#planetscale) + +If you want to deploy an app using Turso, you can follow the instructions [here](/orm/overview/databases/turso). diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare-workers.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare-workers.mdx deleted file mode 100644 index 42dffa603a..0000000000 --- a/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare-workers.mdx +++ /dev/null @@ -1,309 +0,0 @@ ---- -title: 'Deploy to Cloudflare Workers' -metaTitle: 'Deploy to Cloudflare Workers' -metaDescription: 'Learn how to deploy a TypeScript application to Cloudflare Workers that connects to PostgreSQL.' ---- - - - -Today you'll be deploying a Cloudflare Worker that uses Prisma to save every request to a PostgreSQL database and fetches 20 of the most recent logs. - -This guide covers Prisma, TypeScript, PostgreSQL, Prisma Accelerate, and Cloudflare Workers. - - - -## Prerequisites - -- A PostgreSQL database that is publicly accessible -- [Cloudflare Workers](https://workers.cloudflare.com/) account -- [Prisma Data Platform](https://console.prisma.io/) account -- Node.js & npm installed -- Git installed - -## 1. Set up your application - -Wrangler is the official Cloudflare Worker CLI. You will use it to develop and deploy to Cloudflare Workers. This guide uses [Wrangler v3](https://developers.cloudflare.com/workers/wrangler/). - -Open your terminal and navigate to a location of your choice. First, initialize your project using the [create-cloudflare-cli](https://www.npmjs.com/package/create-cloudflare). To do this, run the following command in your terminal: - -```terminal -npm create cloudflare@latest -``` - -This will ask you a few questions. - -```terminal -In which directory do you want to create your application? -``` - -Enter the name of your project, for example: `prisma-cloudflare-accelerate` - -```terminal -What type of application do you want to create? -``` - -Select the `"Hello World" Worker` option. - -```terminal -Would you like to use TypeScript? (y/n) -``` - -We also want to use TypeScript, so answer yes. - -```terminal -Would you like to use git to manage this Worker? (y/n) -``` - -We want to use Git, so answer yes. - -The command this will create a new project with a minimal preset configuration. Once `create-cloudflare-cli` is done, navigate to the project and open it on your editor of choice. - -Next, authenticate the Wrangler CLI with your Cloudflare Workers account. To do this, run the following command in your terminal: - -```terminal -npx wrangler login -``` - -You can now verify that you're logged in by running `npx wrangler whoami`. - -```terminal -npx wrangler whoami -``` - -## 2. Set up Prisma - -Now you're ready to add Prisma to the project. - -Install `prisma` as a development dependency: - -```terminal -npm install --save-dev prisma -``` - -Next, initialize Prisma in your project with the following command: - -```terminal -npx prisma init -``` - -This creates a Prisma schema in `prisma/schema.prisma`. - - - -**Note:**

- -`prisma init` also creates an `.env` file. The `.env` file will contain a placeholder `DATABASE_URL` variable that will be used to update your database schema using Prisma Migrate. Update this value with your database's connection string. - -
- -Update your Prisma schema with the following data model: - -```prisma -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Log { - id Int @id @default(autoincrement()) - level Level - message String - meta Json -} - -enum Level { - Info - Warn - Error -} -``` - -The above data model will be used to persist and retrieve logs from your Cloudflare Worker - -## 3. Update your database schema - -To map your data model to the database schema, you need to use the `prisma migrate dev` CLI command: - -```terminal -npx prisma migrate dev --name init -``` - -The command does two things: - -1. It creates a new SQL migration file for this migration -1. It runs the SQL migration file against the database - -## 4. Enable Accelerate in the Prisma Data Platform - -Prisma currently does not work on Cloudflare Workers yet. However, you can use Prisma on Cloudflare Workers through [Prisma Accelerate](/accelerate). - -To get started with Prisma Accelerate: - -1. Sign up for a free [Prisma Data Platform account](https://console.prisma.io/) -1. Create a project -1. Navigate to the project you created -1. Enable Accelerate -1. Generate an Accelerate connection string and copy it to your clipboard - -## 5. Configure the Accelerate connection string in your project - -1. Rename the existing `DATABASE_URL` environment variable to `DIRECT_URL`. The `DIRECT_URL` variable will be used perform migrations and introspections. -1. Add the Prisma Accelerate connection string to your `.env` file. - - ```diff file=.env - -DATABASE_URL="postgres://..." - +DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__" - +DIRECT_URL="postgres://..." - ``` - - Add [`directUrl`](/orm/reference/prisma-schema-reference#fields) property in `datasource` block in the `schema.prisma` file. - - ```prisma highlight=4;add file=prisma/schema.prisma - datasource db { - provider = "postgresql" - url = env("DATABASE_URL") - directUrl = env("DIRECT_URL") - } - ``` - - > The `directUrl` field is not required for Prisma Accelerate. It allows you to introspect and perform schema migrations. - -1. In `wrangler.toml` file, add a `[vars]` key and your connection string. - - ```diff file=wrangler.toml - name = "prisma-cloudflare-accelerate" - main = "src/main.ts" - compatibility_date = "2022-11-07" - - + [vars] - + DATABASE_URL = "prisma://accelerate.prisma-data.net/?api_key=__API_KEY__" - ``` - - - - Cloudflare Workers does not support `.env` files. To set environment variables, you can either adding the `[vars]` key in your `wrangler.toml` file or saving your environment variables in a `.dev.vars` file. Refer to [Cloudflare's documentation](https://developers.cloudflare.com/pages/platform/functions/bindings/#interact-with-your-environment-variables-locally) to learn more. - - - -1. Install the Prisma Accelerate extension - - ```bash - npm install @prisma/extension-accelerate - ``` - -You are now ready to generate a Prisma Client. - -## 6. Generate a Prisma Client - -Next, generate Prisma Client that connects to your database through [Prisma Accelerate](/accelerate) over HTTP. - -```terminal -npx prisma generate --no-engine -``` - - - -The `--no-engine` flag is available from Prisma 5.2.0 and later. If you're using an earlier version of Prisma, use the `--accelerate` flag. - -```terminal -npx prisma generate --accelerate -``` - - - -The generated Client has a smaller bundle size and is optimized for edge environments like Cloudflare Workers. - -The smaller bundle size is due to the fact that the interfaces talking to the database (the [Prisma engines](/orm/more/under-the-hood/engines)) are no longer bundled with Prisma Client as this logic is now handled by Prisma Accelerate. - -## 7. Develop the Cloudflare Worker function - -You're now ready to create a Cloudflare Worker. Create a `src/index.ts` file with the following code: - -```ts -import { PrismaClient } from '@prisma/client/edge' -import { withAccelerate } from '@prisma/extension-accelerate' - -export interface Env { - DATABASE_URL: string -} - -export default { - async fetch( - request: Request, - env: Env, - ctx: ExecutionContext - ): Promise { - const prisma = new PrismaClient({ - datasourceUrl: env.DATABASE_URL, - }).$extends(withAccelerate()) - - await prisma.log.create({ - data: { - level: 'Info', - message: `${request.method} ${request.url}`, - meta: { - headers: JSON.stringify(request.headers), - }, - }, - }) - - const { data, info } = await prisma.log - .findMany({ - take: 20, - orderBy: { - id: 'desc', - }, - }) - .withAccelerateInfo() - - console.log(JSON.stringify(info)) - - return new Response(`request method: ${request.method}!`) - }, -} -``` - -> The [`info`](/accelerate/api-reference#return-type) object has additional information which can be useful for debugging. -> Accelerate can also be used to cache your query results. You can find more information on caching with Prisma Accelerate in [here](/accelerate). - -Run `npm run dev` to see your worker in development: - -``` -👂 Listening on http://127.0.0.1:8787 -``` - -Go ahead and open `http://127.0.0.1:8787`. If all goes well, you should see: - -``` -request method: GET! -``` - -Refresh the page a couple times to verify that it's working. - -## 8. Publish to Cloudflare Workers - -You're now ready to deploy to Cloudflare Workers. Run the following command: - -```terminal -npm run deploy -``` - -This will package and upload to Cloudflare. With a bit of luck, you'll see the following: - -``` -✨ Built successfully, built project size is 94 KiB. -✨ Successfully published your script to -https://prisma-cloudflare-accelerate.ankman.workers.dev -``` - -Visit your deployment URL and you'll again see: - -``` -request method: GET! -``` - -You're all set! You've successfully deployed a Cloudflare Worker written in TypeScript that uses Prisma to talk to your PostgreSQL database. diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare.mdx new file mode 100644 index 0000000000..5601ea8b18 --- /dev/null +++ b/content/200-orm/200-prisma-client/500-deployment/301-edge/450-deploy-to-cloudflare.mdx @@ -0,0 +1,742 @@ +--- +title: 'Deploy to Cloudflare Workers & Pages' +sidebar_label: Deploy to Cloudflare +metaTitle: 'Deploy to Cloudflare Workers & Pages' +description: 'Learn the things you need to know in order to deploy an app that uses Prisma Client for talking to a database to a Cloudflare Worker or to Cloudflare Pages.' +tocDepth: 3 +preview: true +--- + + + +This page covers everything you need to know to deploy an app with Prisma ORM to a [Cloudflare Worker](https://developers.cloudflare.com/workers/) or to [Cloudflare Pages](https://developers.cloudflare.com/pages). + + + +## General considerations when deploying to Cloudflare Workers + +This section covers _general_ things you need to be aware of when deploying to Cloudflare Workers or Pages and are using Prisma ORM, regardless of the database provider you use. + +### Using an edge-compatible driver + +When deploying a Cloudflare Worker that uses Prisma ORM, you need to use an [edge-compatible driver](/orm/prisma-client/deployment/edge/overview#edge-compatibility-of-database-drivers) and its respective [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) for Prisma ORM. + +The edge-compatible drivers for Cloudflare Workers and Pages are: + +- [Neon Serverless](https://neon.tech/docs/serverless/serverless-driver) uses HTTP to access the database +- [PlanetScale Serverless](https://planetscale.com/docs/tutorials/planetscale-serverless-driver) uses HTTP to access the database +- [`node-postgres`](https://node-postgres.com/) (`pg`) uses Cloudflare's `connect()` (TCP) to access the database +- [`@libsql/client`](https://github.com/tursodatabase/libsql-client-ts) is used to access Turso databases via HTTP +- [Cloudflare D1](/orm/prisma-client/deployment/edge/deploy-to-cloudflare#cloudflare-d1) is used to access D1 databases + +There's [also work being done](https://github.com/sidorares/node-mysql2/pull/2289) on the `node-mysql2` driver which will enable access to traditional MySQL databases from Cloudflare Workers and Pages in the future as well. + +> **Note**: [Prisma Accelerate](/accelerate) enables you to access _any_ database from _any_ edge function provider. No edge-compatible driver is necessary. + +### Setting your database connection URL as an environment variable + +First, ensure that the `DATABASE_URL` is set as the `url` of the `datasource` in your Prisma schema: + +```prisma +datasource db { + provider = "postgresql" // this might also be `mysql` or another value depending on your database + url = env("DATABASE_URL") +} +``` + +#### Development + +When using your Worker in **development**, you can configure your database connection via the [`.dev.vars` file](https://developers.cloudflare.com/workers/configuration/secrets/#secrets-in-development) locally. + +Assuming you use the `DATABASE_URL` environment variable from above, you can set it inside `.dev.vars` as follows: + +```bash file=.dev.vars +DATABASE_URL="your-database-connection-string" +``` + +In the above snippet, `your-database-connection-string` is a placeholder that you need to replace with the value of your own connection string, for example: + +```bash file=.dev.vars +DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb" +``` + +Note that the `.dev.vars` file is not compatible with `.env` files which are typically used by Prisma ORM. + +This means that you need to make sure that Prisma ORM gets access to the environment variable when needed, e.g. when running a Prisma CLI command like `prisma migrate dev`. + +There are several options for achieving this: + +- Run your Prisma CLI commands using [`dotenv`](https://www.npmjs.com/package/dotenv-cli) to specify from where the CLI should read the environment variable, for example: + ```terminal + dotenv -e .dev.vars -- npx prisma migrate dev + ``` +- Create a script in `package.json` that reads `.dev.vars` via [`dotenv`](https://www.npmjs.com/package/dotenv-cli). You can then execute `prisma` commands as follows: `npm run env -- npx prisma migrate dev`. Here's a reference for the script: + ```js file=package.json + "scripts": { "env": "dotenv -e .dev.vars" } + ``` +- Duplicate the `DATABASE_URL` and any other relevant env vars into a new file called `.env` which can then be used by Prisma ORM. + +> **Note**: If you're using an approach that requires `dotenv`, you need to have the [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) package installed. You can do this e.g. by using this command to install the package locally in your project: `npm install -D dotenv-cli`. + +#### Production + +When deploying your Worker to **production**, you'll need to set the database connection using the `wrangler` CLI: + +```terminal +npx wrangler secret put DATABASE_URL +``` + +The command is interactive and will ask you to enter the value for the `DATABASE_URL` env var as the next step in the terminal. + +> **Note**: This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not. + +### Size limits on free accounts + +Cloudflare has a [size limit of 1 MB for Workers on the free plan](https://developers.cloudflare.com/workers/platform/limits/). If your application bundle with Prisma ORM exceeds that size, we recommend upgrading to a paid Worker plan or using Prisma Accelerate to deploy your application. + +If you're running into this problem with `pg` and the `@prisma/adapter-pg` package, you can replace the `pg` with the custom [`@prisma/pg-worker`](https://github.com/prisma/prisma/tree/main/packages/pg-worker) package and use the [`@prisma/adapter-pg-worker`](https://github.com/prisma/prisma/tree/main/packages/adapter-pg-worker) adapter that belongs to it. + +`@prisma/pg-worker` is an optimized and lightweight version of `pg` that is designed to be used in a Worker. It is a drop-in replacement for `pg` and is fully compatible with Prisma ORM. + +### Deploying a Next.js app to Cloudflare Pages with `@cloudflare/next-on-pages` + +Cloudflare offers an option to run Next.js apps on Cloudflare Pages with [`@cloudflare/next-on-pages`](https://github.com/cloudflare/next-on-pages), see the [docs](https://developers.cloudflare.com/pages/framework-guides/deploy-a-nextjs-site) for instructions. + +Based on some testing, we found the following: + +- You can deploy using the PlanetScale or Neon Serverless Driver. +- Traditional PostgreSQL deployments using `pg` don't work because `pg` itself currently does not work with `@cloudflare/next-on-pages` (see [here](https://github.com/cloudflare/next-on-pages/issues/605)). + +Feel free to reach out to us on [Discord](https://pris.ly/discord) if you find that anything has changed about this. + +### Set `PRISMA_CLIENT_FORCE_WASM=1` when running locally with `node` + +Some frameworks (e.g. [hono](https://hono.dev/)) use `node` instead of `wrangler` for running Workers locally. If you're using such a framework or are running your Worker locally with `node` for another reason, you need to set the `PRISMA_CLIENT_FORCE_WASM` environment variable: + +``` +export PRISMA_CLIENT_FORCE_WASM=1 +``` + +## Database-specific considerations & examples + +This section provides database-specific instructions for deploying a Cloudflare Worker with Prisma ORM. + +### Prerequisites + +As a prerequisite for the following section, you need to have a Cloudflare Worker running locally and the Prisma CLI installed. + +If you don't have that yet, you can run these commands: + +```terminal +npm create cloudflare@latest prisma-cloudflare-worker-example -- --type hello-world +cd prisma-cloudflare-worker-example +npm install prisma --save-dev +npx prisma init +``` + +You'll further need a database instance of your database provider of choice available. Refer to the respective documentation of the provider for setting up that instance. + +We'll use the default `User` model for the example below: + +```prisma +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? +} +``` + +### PostgreSQL (traditional) + +If you are using a traditional PostgreSQL database that's accessed via TCP and the `pg` driver, you need to: + +- use the `@prisma/adapter-pg` database adapter (via the `driverAdapters` Preview feature) +- set `node_compat = true` in `wrangler.toml` (see the [Cloudflare docs](https://developers.cloudflare.com/workers/wrangler/configuration/#add-polyfills-using-wrangler)) + +If you are running into a size issue and can't deploy your application because of that, you can use our slimmer variant of the `pg` driver package [`@prisma/pg-worker`](https://github.com/prisma/prisma/tree/main/packages/pg-worker) and the [`@prisma/adapter-pg-worker`](https://github.com/prisma/prisma/tree/main/packages/adapter-pg-worker) adapter that belongs to it. + +`@prisma/pg-worker` is an optimized and lightweight version of `pg` that is designed to be used in a Worker. It is a drop-in replacement for `pg` and is fully compatible with Prisma ORM. + +#### 1. Configure Prisma schema & database connection + +> **Note**: If you don't have a project to deploy, follow the instructions in the [Prerequisites](#prerequisites) to bootstrap a basic Cloudflare Worker with Prisma ORM in it. + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `DATABASE_URL` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Next, you need to set the `DATABASE_URL` environment variable to the value of your database connection string. You'll do this in a file called `.dev.vars` used by Cloudflare: + +```bash file=.dev.vars +DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb" +``` + +Because the Prisma CLI by default is only compatible with `.env` files, you can adjust your `package.json` with the following script that loads the env vars from `.dev.vars`. You can then use this script to load the env vars before executing a `prisma` command. + +Add this script to your `package.json`: + +```js file=package.json highlight=5;add +{ + // ... + "scripts": { + // .... + "env": "dotenv -e .dev.vars" + }, + // ... +} +``` + +Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in `.dev.vars`: + +```terminal +npm run env -- npx prisma +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-pg +npm install pg +npm install @types/pg --save-dev # if you're using TypeScript +``` + +#### 3. Set `node_compat = true` in `wrangler.toml` + +In your `wrangler.toml` file, add the following line: + +```toml file=wrangler.toml +node_compat = true +``` + +> **Note**: For Cloudflare Pages, using `node_compat` is not officially supported. If you want to use `pg` in Cloudflare Pages, you can find a workaround [here](https://github.com/cloudflare/workers-sdk/pull/2541#issuecomment-1954209855). + +#### 4. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npm run env -- npx prisma migrate dev --name init +``` + +#### 5. Use Prisma Client in your Worker to send a query to the database + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database: + +```ts +import { PrismaClient } from '@prisma/client' +import { PrismaPg } from '@prisma/adapter-pg' +import { Pool } from 'pg' + +export default { + async fetch(request, env, ctx) { + const pool = new Pool({ connectionString: env.DATABASE_URL }) + const adapter = new PrismaPg(pool) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + const result = JSON.stringify(users) + return new Response(result) + }, +} +``` + +#### 6. Run the Worker locally + +To run the Worker locally, you can run the `wrangler dev` command: + +```terminal +npx wrangler dev +``` + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Worker + +To deploy the Worker, you first need to the `DATABASE_URL` environment variable [via the `wrangler` CLI](https://developers.cloudflare.com/workers/configuration/secrets/#secrets-on-deployed-workers): + +```terminal +npx wrangler secret put DATABASE_URL +``` + +The command is interactive and will ask you to enter the value for the `DATABASE_URL` env var as the next step in the terminal. + +> **Note**: This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not. + +Then you can go ahead then deploy the Worker: + +```terminal +npx wrangler deploy +``` + +The command will output the URL where you can access the deployed Worker. + +### PlanetScale + +If you are using a PlanetScale database, you need to: + +- use the `@prisma/adapter-planetscale` database adapter (via the `driverAdapters` Preview feature) +- manually remove the conflicting `cache` field ([learn more]()): + + ```ts + export default { + async fetch(request, env, ctx) { + const client = new Client({ + url: env.DATABASE_URL, + // see https://github.com/cloudflare/workerd/issues/698 + fetch(url, init) { + delete init['cache'] + return fetch(url, init) + }, + }) + const adapter = new PrismaPlanetScale(client) + const prisma = new PrismaClient({ adapter }) + + // ... + }, + } + ``` + +#### 1. Configure Prisma schema & database connection + +> **Note**: If you don't have a project to deploy, follow the instructions in the [Prerequisites](#prerequisites) to bootstrap a basic Cloudflare Worker with Prisma ORM in it. + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `DATABASE_URL` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled) +} +``` + +Next, you need to set the `DATABASE_URL` environment variable to the value of your database connection string. You'll do this in a file called `.dev.vars` used by Cloudflare: + +```bash file=.dev.vars +DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:password@us-east.connect.psdb.cloud/demo-cf-worker-ps?sslaccept=strict" +``` + +Because the Prisma CLI by default is only compatible with `.env` files, you can adjust your `package.json` with the following script that loads the env vars from `.dev.vars`. You can then use this script to load the env vars before executing a `prisma` command. + +Add this script to your `package.json`: + +```js file=package.json highlight=5;add +{ + // ... + "scripts": { + // .... + "env": "dotenv -e .dev.vars" + }, + // ... +} +``` + +Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in `.dev.vars`: + +```terminal +npm run env -- npx prisma +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-planetscale +npm install @planetscale/database +``` + +#### 3. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npm run env -- npx prisma db push +``` + +#### 4. Use Prisma Client in your Worker to send a query to the database + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database: + +```ts +import { PrismaClient } from '@prisma/client' +import { PrismaPlanetScale } from '@prisma/adapter-planetscale' +import { Client } from '@planetscale/database' + +export default { + async fetch(request, env, ctx) { + const client = new Client({ + url: env.DATABASE_URL, + // see https://github.com/cloudflare/workerd/issues/698 + fetch(url, init) { + delete init['cache'] + return fetch(url, init) + }, + }) + const adapter = new PrismaPlanetScale(client) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + const result = JSON.stringify(users) + return new Response(result) + }, +} +``` + +#### 6. Run the Worker locally + +To run the Worker locally, you can run the `wrangler dev` command: + +```terminal +npx wrangler dev +``` + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Worker + +To deploy the Worker, you first need to the `DATABASE_URL` environment variable [via the `wrangler` CLI](https://developers.cloudflare.com/workers/configuration/secrets/#secrets-on-deployed-workers): + +```terminal +npx wrangler secret put DATABASE_URL +``` + +The command is interactive and will ask you to enter the value for the `DATABASE_URL` env var as the next step in the terminal. + +> **Note**: This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not. + +Then you can go ahead then deploy the Worker: + +```terminal +npx wrangler deploy +``` + +The command will output the URL where you can access the deployed Worker. + +### Neon + +If you are using a Neon database, you need to: + +- use the `@prisma/adapter-neon` database adapter (via the `driverAdapters` Preview feature) + +#### 1. Configure Prisma schema & database connection + +> **Note**: If you don't have a project to deploy, follow the instructions in the [Prerequisites](#prerequisites) to bootstrap a basic Cloudflare Worker with Prisma ORM in it. + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `DATABASE_URL` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Next, you need to set the `DATABASE_URL` environment variable to the value of your database connection string. You'll do this in a file called `.dev.vars` used by Cloudflare: + +```bash file=.dev.vars +DATABASE_URL="postgresql://janedoe:password@ep-nameless-pond-a23b1mdz.eu-central-1.aws.neon.tech/neondb?sslmode=require" +``` + +Because the Prisma CLI by default is only compatible with `.env` files, you can adjust your `package.json` with the following script that loads the env vars from `.dev.vars`. You can then use this script to load the env vars before executing a `prisma` command. + +Add this script to your `package.json`: + +```js file=package.json highlight=5;add +{ + // ... + "scripts": { + // .... + "env": "dotenv -e .dev.vars" + }, + // ... +} +``` + +Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in `.dev.vars`: + +```terminal +npm run env -- npx prisma +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-neon +npm install @neondatabase/serverless +``` + +#### 3. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npm run env -- npx prisma migrate dev --name init +``` + +#### 5. Use Prisma Client in your Worker to send a query to the database + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database: + +```ts +import { PrismaClient } from '@prisma/client' +import { PrismaNeon } from '@prisma/adapter-neon' +import { Pool } from '@neondatabase/serverless' + +export default { + async fetch(request, env, ctx) { + const neon = new Pool({ connectionString: env.DATABASE_URL }) + const adapter = new PrismaNeon(neon) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + const result = JSON.stringify(users) + return new Response(result) + }, +} +``` + +#### 6. Run the Worker locally + +To run the Worker locally, you can run the `wrangler dev` command: + +```terminal +npx wrangler dev +``` + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Worker + +To deploy the Worker, you first need to the `DATABASE_URL` environment variable [via the `wrangler` CLI](https://developers.cloudflare.com/workers/configuration/secrets/#secrets-on-deployed-workers): + +```terminal +npx wrangler secret put DATABASE_URL +``` + +The command is interactive and will ask you to enter the value for the `DATABASE_URL` env var as the next step in the terminal. + +> **Note**: This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not. + +Then you can go ahead then deploy the Worker: + +```terminal +npx wrangler deploy +``` + +The command will output the URL where you can access the deployed Worker. + +### Cloudflare D1 + +If you are using a D1 database, you need to: + +- use the `@prisma/adapter-d1` database adapter (via the `driverAdapters` Preview feature) +- set `sqlite` as the `datasource` provider in your Prisma schema +- manually generate SQL statements for schema changes using `prisma migrate diff` but execute them using [D1's migration system](https://developers.cloudflare.com/d1/reference/migrations/) + +You can find a [deployment-ready example on GitHub](https://github.com/prisma/prisma-examples/blob/latest/deployment-platforms/edge/cloudflare-workers/with-d1). + +#### 1. Configure Prisma schema + +> **Note**: If you don't have a project to deploy, follow the instructions in the [Prerequisites](#prerequisites) to bootstrap a basic Cloudflare Worker with Prisma ORM in it. + +In your Prisma schema, add the `driverAdapters` Preview feature to the `generator` block and set the `provider` of the `datasource` to `sqlite`. If you just bootstrapped the Prisma schema with `prisma init`, also be sure to add the following `User` model to it: + +```prisma file=schema.prisma +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? +} +``` + +Note that in this tutorial, you won't need the `.env` file since the connection between Prisma ORM and D1 will happen through a [binding](https://developers.cloudflare.com/workers/configuration/bindings/). + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-d1 +``` + +Also, be sure to use a version of the Wrangler CLI that's above [`wrangler@^3.39.0`](https://github.com/cloudflare/workers-sdk/releases/tag/wrangler%403.39.0), otherwise the `--remote` flag that's used in the next sections won't be available. + +#### 3. Set the D1 database connection via a binding + +To connect your Workers with the D1 instance, add the following binding to your `wrangler.toml` (if you don't have a D1 instance yet, you can create one using the [Cloudflare Dashboard](https://dash.cloudflare.com/) or with the [`wrangler d1 create`](https://developers.cloudflare.com/workers/wrangler/commands/#create) command): + +```toml file=wrangler.toml +name = "prisma-cloudflare-worker-example" +main = "src/index.ts" +compatibility_date = "2024-03-20" +compatibility_flags = ["nodejs_compat"] + +[[d1_databases]] +binding = "DB" # i.e. available in your Worker on env.DB +database_name = "__YOUR_D1_DATABASE_NAME__" # to be replaced +database_id = "__YOUR_D1_DATABASE_ID__" # to be replaced +``` + +Note that `__YOUR_D1_DATABASE_NAME__` and `__YOUR_D1_DATABASE_ID__` in the snippet above are placeholders that should be replaced with the database name and ID of your own D1 instance. + +If you weren't able to grab this ID from the terminal output, you can also find it in the Cloudflare Dashboard or by running `npx wrangler d1 list` and `npx wrangler d1 info __YOUR_D1_DATABASE_NAME__` in your terminal. + +#### 4. Migrate your database schema (if applicable) + +If your Prisma schema only contains the `User` model but your D1 database is still empty, you need to make sure that there is a table in D1 that mirrors the structure of the `User` model. + +D1 comes with its own [migration system](https://developers.cloudflare.com/d1/reference/migrations/) that lets you manage migration files in your file system. While this is convenient for creating and applying migration files, it doesn't help you identifying the actual SQL statements that you need to put into these migration files. That's where Prisma Migrate comes into play, because you can generate SQL statements for schema changes using the [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) command. + +First, create the `migrations` directory and initial migration file using the [`wrangler d1 migrations`](https://developers.cloudflare.com/workers/wrangler/commands/#migrations-create) command as follows: + +```terminal +npx wrangler d1 migrations create __YOUR_D1_DATABASE_NAME__ create_user_table +``` + +Replace `__YOUR_D1_DATABASE_NAME__` with the name of your database again and, when prompted, confirm that you want to create the `migrations` directory. After having run this command, there should be a new folder called `migrations` with a file called `0001_create_user_table.sql` inside of it. + +You can now generate the required SQL statement for creating a `User` table that can be mapped to the `User` model in your the Prisma schema as follows: + +```terminal +npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script --output migrations/0001_create_user_table.sql +``` + +Note that the resulting SQL statement is stored in a file in the `migrations` directory called `0001_create_user_table.sql` which looks as follows: + +```sql file=migrations/0001_create_user_table.sql no-copy +-- CreateTable +CREATE TABLE "User" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "email" TEXT NOT NULL, + "name" TEXT +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); +``` + +You now need to use the [`wrangler d1 migrations apply`](https://developers.cloudflare.com/workers/wrangler/commands/#migrations-apply) command to send this SQL statement to D1. Note that this command accepts two options: + +- `--local`: Executes the statement against a _local_ version of D1. This local version of D1 is a SQLite database file that'll be located in your project. This approach is useful, when you want to develop and test your Worker on your local machine. Learn more in the [Cloudflare docs](https://developers.cloudflare.com/d1/configuration/local-development/). +- `--remote`: Executes the statement against your _remote_ version of D1. This version is used by your _deployed_ Cloudflare Workers. Learn more in the [Cloudflare docs](https://developers.cloudflare.com/d1/configuration/remote-development/). + +In this tutorial, you'll do both: test the Worker locally _and_ deploy it afterwards. So, you need to run both commands. Open your terminal and paste the following commands: + +```terminal +# For the local database +npx wrangler d1 migrations apply __YOUR_D1_DATABASE_NAME__ --local + +# For the remote database +npx wrangler d1 migrations apply __YOUR_D1_DATABASE_NAME__ --remote +``` + +As before, you need to replace `__YOUR_D1_DATABASE_NAME__` with the name of your D1 database. + +Let's also create some dummy data that we can query once the Worker is running. This time, you'll run the SQL statement without storing it in a file: + +```terminal +# For the local database +npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES +('jane@prisma.io', 'Jane Doe (Local)');" --local + +# For the remote database +npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES +('jane@prisma.io', 'Jane Doe (Remote)');" --remote +``` + +#### 5. Use Prisma Client in your Worker to send a query to the database + +Before adding a Prisma Client query to your Worker, you need to generate Prisma Client with the following command: + +``` +npx prisma generate +``` + +In order to query your database from the Worker using Prisma ORM, you need to: + +1. Add the `DB` binding to the `Env` interface. (Alternatively, you can run [`npx wrangler types`](https://developers.cloudflare.com/workers/wrangler/commands/#types) to generate the `Env` type from the binding in a separate file called `worker-configuration.d.ts`.) +2. Instantiate `PrismaClient` using the `PrismaD1` driver adapter. +3. Send a query using Prisma Client and return the result. + +Open `src/index.ts` and replace the entire content with the following: + +```typescript file=src/index.ts +import { PrismaClient } from '@prisma/client' +import { PrismaD1 } from '@prisma/adapter-d1' + +export interface Env { + DB: D1Database +} + +export default { + async fetch( + request: Request, + env: Env, + ctx: ExecutionContext + ): Promise { + const adapter = new PrismaD1(env.DB) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + const result = JSON.stringify(users) + return new Response(result) + }, +} +``` + +#### 6. Run the Worker locally + +With the database query in place and Prisma Client generated, you can go ahead and run the Worker locally: + +``` +npm run dev +``` + +Now you can open your browser at [`http://localhost:8787`](http://localhost:8787/) to see the result of the database query: + +```js no-copy +;[{ id: 1, email: 'jane@prisma.io', name: 'Jane Doe (Local)' }] +``` + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Worker + +To deploy the Worker, run the the following command: + +``` +npm run deploy +``` + +Your deployed Worker is accessible via `https://prisma-d1-example.USERNAME.workers.dev`. If you navigate your browser to that URL, you should see the following data that's queried from your remote D1 database: + +```js no-copy +;[{ id: 1, email: 'jane@prisma.io', name: 'Jane Doe (Remote)' }] +``` diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/485-deploy-to-vercel.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/485-deploy-to-vercel.mdx new file mode 100644 index 0000000000..2a9e767ee2 --- /dev/null +++ b/content/200-orm/200-prisma-client/500-deployment/301-edge/485-deploy-to-vercel.mdx @@ -0,0 +1,471 @@ +--- +title: 'Deploy to Vercel Edge Functions & Middleware' +sidebar_label: 'Deploy to Vercel' +metaTitle: 'Deploy to Vercel Edge Functions & Middleware' +description: 'Learn the things you need to know in order to deploy an Edge function that uses Prisma Client for talking to a database.' +tocDepth: 3 +sidebar_class_name: preview-badge +--- + + + +This page covers everything you need to know to deploy an app that uses Prisma Client for talking to a database in [Vercel Edge Middleware](https://vercel.com/docs/functions/edge-middleware) or a [Vercel Function](https://vercel.com/docs/functions) deployed to the [Vercel Edge Runtime](https://vercel.com/docs/functions/runtimes/edge-runtime). + +To deploy a Vercel Function to the Vercel Edge Runtime, you can set `export const runtime = 'edge'` outside the request handler of the Vercel Function. + + + +## General considerations when deploying to Vercel Edge Functions & Edge Middleware + +### Using an edge-compatible driver + +Vercel's Edge Runtime currently only supports a limited set of database drivers: + +- [Neon Serverless](https://neon.tech/docs/serverless/serverless-driver) uses HTTP to access the database (also compatible with [Vercel Postgres](https://vercel.com/docs/storage/vercel-postgres)) +- [PlanetScale Serverless](https://planetscale.com/docs/tutorials/planetscale-serverless-driver) uses HTTP to access the database +- [`@libsql/client`](https://github.com/tursodatabase/libsql-client-ts) is used to access Turso databases + +Note that [`node-postgres`](https://node-postgres.com/) (`pg`) is currently _not_ supported on Vercel Edge Functions. + +When deploying a Vercel Edge Function that uses Prisma ORM, you need to use one of these [edge-compatible drivers](/orm/prisma-client/deployment/edge/overview#edge-compatibility-of-database-drivers) and its respective [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) for Prisma ORM. + +> **Note**: [Prisma Accelerate](/accelerate) enables you to access _any_ database from _any_ edge function provider. No edge-compatible driver is necessary. + +### Setting your database connection URL as an environment variable + +First, ensure that the `DATABASE_URL` is set as the `url` of the `datasource` in your Prisma schema: + +```prisma +datasource db { + provider = "postgresql" // this might also be `mysql` or another value depending on your database + url = env("DATABASE_URL") +} +``` + +#### Development + +When in **development**, you can configure your database connection via the `DATABASE_URL` environment variable (e.g. [using `.env` files](/orm/more/development-environment/environment-variables/env-files)). + +#### Production + +When deploying your Edge Function to **production**, you'll need to set the database connection using the `vercel` CLI: + +```terminal +npx vercel env add DATABASE_URL +``` + +This command is interactive and will ask you to select environments and provide the value for the `DATABASE_URL` in subsequent steps. + +Alternatively, you can configure the environment variable [via the UI](https://vercel.com/docs/projects/environment-variables#declare-an-environment-variable) of your project in the Vercel Dashboard. + +### Generate Prisma Client in `postinstall` hook + +In your `package.json`, you should add a `"postinstall"` section as follows: + +```js file=package.json showLineNumbers +{ + // ..., + "postinstall: "prisma generate" +} +``` + +### Size limits on free accounts + +Vercel has a [size limit of 1 MB on free accounts](https://vercel.com/docs/functions/limitations). If your application bundle with Prisma ORM exceeds that size, we recommend upgrading to a paid account or using Prisma Accelerate to deploy your application. + +## Database-specific considerations & examples + +This section provides database-specific instructions for deploying a Vercel Edge Functions with Prisma ORM. + +### Prerequisites + +As a prerequisite for the following section, you need to have a Vercel Edge Function (which typically comes in the form of a Next.js API route) running locally and the Prisma and Vercel CLIs installed. + +If you don't have that yet, you can run these commands to set up a Next.js app from scratch (following the instructions of the [Vercel Edge Quickstart](https://vercel.com/docs/functions/edge-functions/quickstart)): + +```terminal +npm install -g vercel +npx create-next-app@latest +npm install prisma --save-dev +npx prisma init +``` + +We'll use the default `User` model for the example below: + +```prisma +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? +} +``` + +### Vercel Postgres + +If you are using Vercel Postgres, you need to: + +- use the `@prisma/adapter-neon` database adapter (via the `driverAdapters` Preview feature) because Vercel Postgres uses [Neon](https://neon.tech/) under the hood +- be aware that Vercel by default calls the environment variable for the database connection string `POSTGRES_PRISMA_URL` while the default name used in the Prisma docs is typically `DATABASE_URL`; using Vercel's naming, you need to set the following fields on your `datasource` block: + ```prisma + datasource db { + provider = "postgresql" + url = env("POSTGRES_PRISMA_URL") // uses connection pooling + directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection + } + ``` + +#### 1. Configure Prisma schema & database connection + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `POSTGRES_PRISMA_URL` and the `directUrl` to the `POSTGRES_URL_NON_POOLING` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma showLineNumbers +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "postgresql" + url = env("POSTGRES_PRISMA_URL") // uses connection pooling + directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection +} +``` + +Next, you need to set the `POSTGRES_PRISMA_URL` and `POSTGRES_URL_NON_POOLING` environment variable to the values of your database connection. + +If you ran `npx prisma init`, you can use the `.env` file that was created by this command to set these: + +```bash file=.env showLineNumbers +POSTGRES_PRISMA_URL="postgres://user:password@host-pooler.region.postgres.vercel-storage.com:5432/name?pgbouncer=true&connect_timeout=15" +POSTGRES_URL_NON_POOLING="postgres://user:password@host.region.postgres.vercel-storage.com:5432/name" +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-neon +npm install @neondatabase/serverless +``` + +#### 3. Configure `postinstall` hook + +Next, add a new key to the `scripts` section in your `package.json`: + +```js file=package.json highlight=5;add showLineNumbers +{ + // ... + "scripts": { + // ... + //add-next-line + "postinstall": "prisma generate" + } +} +``` + +#### 4. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npx prisma migrate dev --name init +``` + +#### 5. Use Prisma Client in your Vercel Edge Function to send a query to the database + +If you created the project from scratch, you can create a new edge function as follows. + +First, create a new API route, e.g. by using these commands: + +```terminal +mkdir src/app/api +mkdir src/app/api/edge +touch src/app/api/edge/route.ts +``` + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database in the new `app/api/edge/route.ts` file you just created: + +```ts file=app/api/edge/route.ts showLineNumbers +import { NextResponse } from 'next/server' +import { PrismaClient } from '@prisma/client' +import { PrismaNeon } from '@prisma/adapter-neon' +import { Pool } from '@neondatabase/serverless' + +export const runtime = 'edge' + +export async function GET(request: Request) { + const neon = new Pool({ connectionString: process.env.POSTGRES_PRISMA_URL }) + const adapter = new PrismaNeon(neon) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + + return NextResponse.json(users, { status: 200 }) +} +``` + +#### 6. Run the Edge Function locally + +Run the app with the following command: + +```terminal +npm run dev +``` + +You can now access the Edge Function via this URL: [`http://localhost:3000/api/edge`](http://localhost:3000/api/edge). + +#### 7. Set the `POSTGRES_PRISMA_URL` environment variable and deploy the Edge Function + +Run the following command to deploy your project with Vercel: + +```terminal +npx vercel deploy +``` + +Note that once the project was created on Vercel, you will need to set the `POSTGRES_PRISMA_URL` environment variable (and if this was your first deploy, it likely failed). You can do this either via the Vercel UI or by running the following command: + +``` +npx vercel env add POSTGRES_PRISMA_URL +``` + +At this point, you can get the URL of the deployed application from the Vercel Dashboard and access the edge function via the `/api/edge` route. + +### PlanetScale + +If you are using a PlanetScale database, you need to: + +- use the `@prisma/adapter-planetscale` database adapter (via the `driverAdapters` Preview feature) + +#### 1. Configure Prisma schema & database connection + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `DATABASE_URL` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma showLineNumbers +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled) +} +``` + +Next, you need to set the `DATABASE_URL` environment variable in your `.env` file that's used both by Prisma and Next.js to read your env vars: + +```bash file=.env showLineNumbers +DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:password@us-east.connect.psdb.cloud/demo-cf-worker-ps?sslaccept=strict" +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-planetscale +npm install @planetscale/database +``` + +#### 3. Configure `postinstall` hook + +Next, add a new key to the `scripts` section in your `package.json`: + +```js file=package.json highlight=5;add showLineNumbers +{ + // ... + "scripts": { + // ... + //add-next-line + "postinstall": "prisma generate" + } +} +``` + +#### 4. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npx prisma db push +``` + +#### 5. Use Prisma Client in an Edge Function to send a query to the database + +If you created the project from scratch, you can create a new edge function as follows. + +First, create a new API route, e.g. by using these commands: + +```terminal +mkdir src/app/api +mkdir src/app/api/edge +touch src/app/api/edge/route.ts +``` + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database in the new `app/api/edge/route.ts` file you just created: + +```ts file=app/api/edge/route.ts showLineNumbers +import { NextResponse } from 'next/server' +import { PrismaClient } from '@prisma/client' +import { PrismaPlanetScale } from '@prisma/adapter-planetscale' +import { Client } from '@planetscale/database' + +export const runtime = 'edge' + +export async function GET(request: Request) { + const client = new Client({ url: process.env.DATABASE_URL }) + const adapter = new PrismaPlanetScale(client) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + + return NextResponse.json(users, { status: 200 }) +} +``` + +#### 6. Run the Edge Function locally + +Run the app with the following command: + +```terminal +npm run dev +``` + +You can now access the Edge Function via this URL: [`http://localhost:3000/api/edge`](http://localhost:3000/api/edge). + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Edge Function + +Run the following command to deploy your project with Vercel: + +```terminal +npx vercel deploy +``` + +Note that once the project was created on Vercel, you will need to set the `DATABASE_URL` environment variable (and if this was your first deploy, it likely failed). You can do this either via the Vercel UI or by running the following command: + +``` +npx vercel env add DATABASE_URL +``` + +At this point, you can get the URL of the deployed application from the Vercel Dashboard and access the edge function via the `/api/edge` route. + +### Neon + +If you are using a Neon database, you need to: + +- use the `@prisma/adapter-neon` database adapter (via the `driverAdapters` Preview feature) + +#### 1. Configure Prisma schema & database connection + +First, ensure that the database connection is configured properly. In your Prisma schema, set the `url` of the `datasource` block to the `DATABASE_URL` environment variable. You also need to enable the `driverAdapters` feature flag: + +```prisma file=schema.prisma showLineNumbers +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + +Next, you need to set the `DATABASE_URL` environment variable in your `.env` file that's used both by Prisma and Next.js to read your env vars: + +```bash file=.env showLineNumbers +DATABASE_URL="postgresql://janedoe:password@ep-nameless-pond-a23b1mdz.eu-central-1.aws.neon.tech/neondb?sslmode=require" +``` + +#### 2. Install dependencies + +Next, install the required packages: + +```terminal +npm install @prisma/adapter-neon +npm install @neondatabase/serverless +``` + +#### 3. Configure `postinstall` hook + +Next, add a new key to the `scripts` section in your `package.json`: + +```js file=package.json highlight=5;add showLineNumbers +{ + // ... + "scripts": { + // ... + //add-next-line + "postinstall": "prisma generate" + } +} +``` + +#### 4. Migrate your database schema (if applicable) + +If you ran `npx prisma init` above, you need to migrate your database schema to create the `User` table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step): + +```terminal +npx prisma migrate dev --name init +``` + +#### 5. Use Prisma Client in an Edge Function to send a query to the database + +If you created the project from scratch, you can create a new edge function as follows. + +First, create a new API route, e.g. by using these commands: + +```terminal +mkdir src/app/api +mkdir src/app/api/edge +touch src/app/api/edge/route.ts +``` + +Here is a sample code snippet that you can use to instantiate `PrismaClient` and send a query to your database in the new `app/api/edge/route.ts` file you just created: + +```ts file=app/api/edge/route.ts showLineNumbers +import { NextResponse } from 'next/server' +import { PrismaClient } from '@prisma/client' +import { PrismaNeon } from '@prisma/adapter-neon' +import { Pool } from '@neondatabase/serverless' + +export const runtime = 'edge' + +export async function GET(request: Request) { + const neon = new Pool({ connectionString: process.env.DATABASE_URL }) + const adapter = new PrismaNeon(neon) + const prisma = new PrismaClient({ adapter }) + + const users = await prisma.user.findMany() + + return NextResponse.json(users, { status: 200 }) +} +``` + +#### 6. Run the Edge Function locally + +Run the app with the following command: + +```terminal +npm run dev +``` + +You can now access the Edge Function via this URL: [`http://localhost:3000/api/edge`](http://localhost:3000/api/edge). + +#### 7. Set the `DATABASE_URL` environment variable and deploy the Edge Function + +Run the following command to deploy your project with Vercel: + +```terminal +npx vercel deploy +``` + +Note that once the project was created on Vercel, you will need to set the `DATABASE_URL` environment variable (and if this was your first deploy, it likely failed). You can do this either via the Vercel UI or by running the following command: + +``` +npx vercel env add DATABASE_URL +``` + +At this point, you can get the URL of the deployed application from the Vercel Dashboard and access the edge function via the `/api/edge` route. diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/550-deploy-to-deno-deploy.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/550-deploy-to-deno-deploy.mdx index 7e9dd03f9b..a699428607 100644 --- a/content/200-orm/200-prisma-client/500-deployment/301-edge/550-deploy-to-deno-deploy.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/301-edge/550-deploy-to-deno-deploy.mdx @@ -1,18 +1,18 @@ --- title: 'Deploy to Deno Deploy' metaTitle: 'Deploy to Deno Deploy' -metaDescription: 'Learn how to deploy a TypeScript application to Deno Deploy.' +description: 'Learn how to deploy a TypeScript application to Deno Deploy.' --- -With this guide, you can learn how to build and deploy a simple application to [Deno Deploy](https://deno.com/deploy). The application uses Prisma to save a log of each request to a PostgreSQL database. +With this guide, you can learn how to build and deploy a simple application to [Deno Deploy](https://deno.com/deploy). The application uses Prisma ORM to save a log of each request to a PostgreSQL database. This guide covers the use of Prisma CLI with Deno CLI, Deno Deploy, Prisma Client, and Prisma Accelerate. -This guide demonstrates how to deploy an application to Deno Deploy in conjunction with a PostgreSQL database, but you can use [any database type that Prisma supports](/orm/reference/supported-databases). +This guide demonstrates how to deploy an application to Deno Deploy in conjunction with a PostgreSQL database, but you can use [any database type that Prisma ORM supports](/orm/reference/supported-databases). @@ -49,11 +49,13 @@ To set up your application: To use Deno, you need to add the preview feature flag `deno` to the `generator` block of your `schema.prisma` file. Also, Deno requires that you generate Prisma Client in a custom location. You can enable this with the `output` parameter in the `generator` block. To satisfy both of these requirements, add the following lines to the `generator` block: - ```prisma file=schema.prisma highlight=3-4,12-23;add + ```prisma file=schema.prisma highlight=3-4,12-23;add showLineNumbers generator client { provider = "prisma-client-js" + //add-start previewFeatures = ["deno"] output = "../generated/client" + //add-end } datasource db { @@ -61,6 +63,7 @@ To set up your application: url = env("DATABASE_URL") } + //add-start model Log { id Int @id @default(autoincrement()) level Level @@ -73,6 +76,7 @@ To set up your application: Warn Error } + //add-end ``` 4. In your `.env` file, replace the current placeholder connection string `postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public` with your PostgreSQL connection string. @@ -102,7 +106,7 @@ deno run -A --unstable npm:prisma generate --no-engine -Prior to Prisma 5.2.0, the `--no-engine` flag is not available. Instead, use the `--accelerate` flag. +Prior to Prisma ORM 5.2.0, the `--no-engine` flag is not available. Instead, use the `--accelerate` flag. ```terminal deno run -A npm:prisma generate --accelerate @@ -175,7 +179,7 @@ To configure Prisma Accelerate: 1. Install the `dotenv-cli`. - ```sh + ```bash npm install dotenv-cli ``` @@ -187,7 +191,7 @@ To configure Prisma Accelerate: # DATABASE_URL="postgres://..." ``` -The configuration of your local environment is now ready to send Prisma queries to the database through Prisma Accelerate. +The configuration of your local environment is now ready to send Prisma Client queries to the database through Prisma Accelerate. ## 7. Test your application locally diff --git a/content/200-orm/200-prisma-client/500-deployment/301-edge/index.mdx b/content/200-orm/200-prisma-client/500-deployment/301-edge/index.mdx index 461d3d86b3..7b177b68a5 100644 --- a/content/200-orm/200-prisma-client/500-deployment/301-edge/index.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/301-edge/index.mdx @@ -1,16 +1,16 @@ --- title: 'Edge functions' -metaTitle: 'Deploy Prisma apps to edge function (distributed FaaS) providers' -metaDescription: 'Learn how to deploy your Prisma-backed apps to edge functions like Cloudflare Workers or Vercel Edge Functions' +metaTitle: 'Deploy Prisma ORM apps to edge function (distributed FaaS) providers' +description: 'Learn how to deploy your Prisma ORM-backed apps to edge functions like Cloudflare Workers or Vercel Edge Functions' tocDepth: 2 --- -If your application is deployed via an "Edge Function" offering or is deployed from a [serverless](/orm/prisma-client/deployment/serverless) offering and has a non-standard runtime, it is a edge deployed app. Common examples include [Cloudflare Workers](/orm/prisma-client/deployment/edge/deploy-to-cloudflare-workers), [Deno Deploy](/orm/prisma-client/deployment/edge/deploy-to-deno-deploy), and Vercel Edge Functions. +If your application is deployed via an "Edge Function" offering or is deployed from a [serverless](/orm/prisma-client/deployment/serverless) offering and has a non-standard runtime, it is a _edge-deployed_ app. Common examples for such offerings include [Cloudflare Workers or Pages](/orm/prisma-client/deployment/edge/deploy-to-cloudflare), [Vercel Edge Functions or Edge Middleware](/orm/prisma-client/deployment/edge/deploy-to-vercel), and [Deno Deploy](/orm/prisma-client/deployment/edge/deploy-to-deno-deploy). -## Guides for Edge Function providers +## In this section diff --git a/content/200-orm/200-prisma-client/500-deployment/210-module-bundlers.mdx b/content/200-orm/200-prisma-client/500-deployment/400-module-bundlers.mdx similarity index 63% rename from content/200-orm/200-prisma-client/500-deployment/210-module-bundlers.mdx rename to content/200-orm/200-prisma-client/500-deployment/400-module-bundlers.mdx index 0452fc3d45..567878255f 100644 --- a/content/200-orm/200-prisma-client/500-deployment/210-module-bundlers.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/400-module-bundlers.mdx @@ -1,9 +1,11 @@ --- title: 'Module bundlers' metaTitle: 'Module bundlers (Reference)' -metaDescription: 'This page gives an overview of the most important things to be aware of when using a module bundler to bundle an application that uses Prisma Client.' +description: 'This page gives an overview of the most important things to be aware of when using a module bundler to bundle an application that uses Prisma Client.' --- + + ## Overview _Module bundlers_ bundle JavaScript modules into a single JavaScript file. Most bundlers work by copying over the JavaScript code from a variety of source files into the target file. @@ -12,8 +14,8 @@ Since Prisma Client is not only based on JavaScript code, but also relies on the To do so, you can use plugins that let you copy over static assets: -| Bundler | Plugin | -| :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Webpack | [`copy-webpack-plugin`](https://github.com/webpack-contrib/copy-webpack-plugin#copy-webpack-plugin) | +| Bundler | Plugin | +| :---------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Webpack | [`copy-webpack-plugin`](https://github.com/webpack-contrib/copy-webpack-plugin#copy-webpack-plugin) | | Webpack (with [Next.js monorepo](/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-monorepo)) | [`nextjs-monorepo-workaround-plugin`](https://www.npmjs.com/package/@prisma/nextjs-monorepo-workaround-plugin) | -| Parcel | [`parcel-plugin-static-files-copy`](https://github.com/elwin013/parcel-plugin-static-files-copy#readme) | +| Parcel | [`parcel-plugin-static-files-copy`](https://github.com/elwin013/parcel-plugin-static-files-copy#readme) | diff --git a/content/200-orm/200-prisma-client/500-deployment/550-deploy-database-changes-with-prisma-migrate.mdx b/content/200-orm/200-prisma-client/500-deployment/550-deploy-database-changes-with-prisma-migrate.mdx index 0bd45a44fd..43d28f63db 100644 --- a/content/200-orm/200-prisma-client/500-deployment/550-deploy-database-changes-with-prisma-migrate.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/550-deploy-database-changes-with-prisma-migrate.mdx @@ -1,7 +1,7 @@ --- title: 'Deploying database changes with Prisma Migrate' -navTitle: 'Deploying database changes' -metaDescription: 'Learn how to deploy database changes with Prisma Migrate.' +sidebar_label: 'Deploying database changes' +description: 'Learn how to deploy database changes with Prisma Migrate.' --- @@ -41,7 +41,7 @@ As part of your CI/CD, you can run `prisma migrate deploy` as part of your pipel Here is an example action that will run your migrations against your database: -```yaml file=deploy.yml highlight=17-20 +```yaml file=deploy.yml highlight=17-20 showLineNumbers name: Deploy on: push: diff --git a/content/200-orm/200-prisma-client/500-deployment/600-deploy-migrations-from-a-local-environment.mdx b/content/200-orm/200-prisma-client/500-deployment/600-deploy-migrations-from-a-local-environment.mdx index dae0102219..c04a0a25f1 100644 --- a/content/200-orm/200-prisma-client/500-deployment/600-deploy-migrations-from-a-local-environment.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/600-deploy-migrations-from-a-local-environment.mdx @@ -1,7 +1,7 @@ --- title: 'Deploy migrations from a local environment' metaTitle: 'Deploy migrations from a local environment' -metaDescription: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client locally.' +description: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client locally.' tocDepth: 3 --- @@ -23,9 +23,11 @@ If you do not have an automated CI/CD process, you can technically deploy new mi 1. Make sure your migration history is up to date. You can do this through running `prisma migrate dev`, which will generate a migration history from the latest changes made. 2. Swap your local connection URL for your production connection URL -```bash file=.env highlight=1;delete|3;add +```bash file=.env highlight=1;delete|3;add showLineNumbers +//delete-next-line DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/my_local_database" +//add-next-line DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/my_production_database" ``` @@ -51,4 +53,4 @@ The pipeline should handle deployment to staging and production environments, an When you add Prisma Migrate to an **existing database**, you must [baseline](/orm/prisma-migrate/workflows/baselining) the production database. Baselining is performed **once**, and can be done from a local instance. -![](../../../doc-images/baseline-production-from-local.png) +![](/img/orm/baseline-production-from-local.png) diff --git a/content/200-orm/200-prisma-client/500-deployment/650-caveats-when-deploying-to-aws-platforms.mdx b/content/200-orm/200-prisma-client/500-deployment/650-caveats-when-deploying-to-aws-platforms.mdx index d9f560e340..0aaa82e8e4 100644 --- a/content/200-orm/200-prisma-client/500-deployment/650-caveats-when-deploying-to-aws-platforms.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/650-caveats-when-deploying-to-aws-platforms.mdx @@ -1,7 +1,8 @@ --- title: 'Caveats when deploying to AWS platforms' metaTitle: 'Caveats when deploying to AWS platforms' -metaDescription: 'Known caveats when deploying to an AWS platform' +description: 'Known caveats when deploying to an AWS platform' +toc_max_heading_level: 2 --- @@ -12,21 +13,21 @@ The following describes some caveats you might face when deploying to different ## AWS RDS Proxy -Prisma is compatible with AWS RDS Proxy. However, there is no benefit in using it for connection pooling with Prisma due to the way RDS Proxy pins connections: +Prisma ORM is compatible with AWS RDS Proxy. However, there is no benefit in using it for connection pooling with Prisma ORM due to the way RDS Proxy pins connections: > "Your connections to the proxy can enter a state known as pinning. When a connection is pinned, each later transaction uses the same underlying database connection until the session ends. Other client connections also can't reuse that database connection until the session ends. The session ends when Prisma Client's connection is dropped." - [AWS RDS Proxy Docs](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy-managing.html#rds-proxy-pinning) -[Prepared statements (of any size) or query statements greater than 16 KB cause RDS Proxy to pin the session.](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy-managing.html#rds-proxy-pinning.all) Because Prisma uses prepared statements for all queries, you won't see any benefit when using RDS Proxy with Prisma. +[Prepared statements (of any size) or query statements greater than 16 KB cause RDS Proxy to pin the session.](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy-managing.html#rds-proxy-pinning.all) Because Prisma ORM uses prepared statements for all queries, you won't see any benefit when using RDS Proxy with Prisma ORM. ## AWS Elastic Beanstalk AWS Elastic Beanstalk is a PaaS-like deployment service that abstracts away infrastructure and allows you to deploy applications to AWS quickly. -When deploying an app using Prisma Client to AWS Elastic Beanstalk, Prisma generates the Prisma Client code into `node_modules`. This is typically done in the `postinstall` hook. +When deploying an app using Prisma Client to AWS Elastic Beanstalk, Prisma ORM generates the Prisma Client code into `node_modules`. This is typically done in the `postinstall` hook. Because Beanstalk limits the ability to write to the filesystem in the `postinstall` hook, you need to create an [`.npmrc`](https://docs.npmjs.com/cli/v6/configuring-npm/npmrc) file in the root of your project and add the following configuration: -```config file=.npmrc +```config file=.npmrc showLineNumbers unsafe-perm=true ``` @@ -44,22 +45,24 @@ This error happens because AWS Elastic Beanstalk doesn't install `devDependencie AWS Lambda defines an **deployment package upload limit**, which includes: - All application code -- Binaries like the [Prisma query engine](/orm/more/under-the-hood/engines) +- Binaries like the [Prisma ORM query engine](/orm/more/under-the-hood/engines) -The [deployment package (.zip) size limit for lambdas is 50MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html). When you prepare a deployment package, remove any files that the function does not require in production to keep the final .zip as small as possible. This includes some [Prisma engine binaries](#deleting-prisma-engines-that-are-not-required). +The [deployment package (.zip) size limit for lambdas is 50MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html). When you prepare a deployment package, remove any files that the function does not require in production to keep the final .zip as small as possible. This includes some [Prisma ORM engine binaries](#deleting-prisma-orm-engines-that-are-not-required). -### Deleting Prisma engines that are not required +### Deleting Prisma ORM engines that are not required Prisma CLI downloads additional engine binaries that are **not required** in production. You can delete the following files and folders: 1. The entire `node_modules/@prisma/engines` folder (refer to the [sample bash script](https://github.com/prisma/ecosystem-tests/blob/13e74dc47eababa5d3c8f488b73fe7fc8bffead7/platforms-serverless/lambda/run.sh#L16) used by the Prisma end-to-end tests) -2. The **local engine file** for your development platform from the `node_modules/.prisma/client` folder. For example, your schema might define the following `binaryTargets` if you develop on Debian (`native`) but deploy to AWS Lambda (`rhel-openssl-1.0.x`): +2. The **local engine file** for your development platform from the `node_modules/.prisma/client` folder. For example, your schema might define the following `binaryTargets` if you develop on Debian (`native`) but deploy to AWS Lambda (`rhel-openssl-3.0.x`): ```prisma - binaryTargets = ["native", "rhel-openssl-1.0.x"] + binaryTargets = ["native", "rhel-openssl-3.0.x"] ``` In this scenario: - - Keep `node_modules/.prisma/client/query-engine-rhel-openssl-1.0.x`, which is the engine file used by AWS Lambda + - Keep `node_modules/.prisma/client/query-engine-rhel-openssl-3.0.x`, which is the engine file used by AWS Lambda - Delete `node_modules/.prisma/client/query-engine-debian-openssl-1.1.x`, which is only required locally + + > **Note**: When using Node.js 18 or earlier, the correct `binaryTarget` for AWS Lambda is `rhel-openssl-1.0.x`. `rhel-openssl-3.0.x` is the correct `binaryTarget` for Node.js versions greater than 18. diff --git a/content/200-orm/200-prisma-client/500-deployment/700-deploy-to-a-different-os.mdx b/content/200-orm/200-prisma-client/500-deployment/700-deploy-to-a-different-os.mdx index a1dd19f9be..a561e851f8 100644 --- a/content/200-orm/200-prisma-client/500-deployment/700-deploy-to-a-different-os.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/700-deploy-to-a-different-os.mdx @@ -1,14 +1,15 @@ --- title: 'Deploy to a different OS' metaTitle: 'Deploy to a different OS' -metaDescription: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client to a different operating system.' +description: 'Learn how to deploy Node.js and TypeScript applications that are using Prisma Client to a different operating system.' +hide_table_of_contents: true --- Prisma Client depends on the [query engine](/orm/more/under-the-hood/engines) that is running as a binary on the same host as your application. -The query engine is implemented in Rust and is used by Prisma in the form of executable binary files. The binary is downloaded when `prisma generate` is called. +The query engine is implemented in Rust and is used by Prisma Client in the form of executable binary files. The binary is downloaded when `prisma generate` is called. If you have developed your application on a Windows machine for example, and wish to upload to AWS Lambda, which is a Linux environment, you may encounter issues and be presented with some warnings in your terminal. diff --git a/content/200-orm/200-prisma-client/500-deployment/index.mdx b/content/200-orm/200-prisma-client/500-deployment/index.mdx index 19ccb52b47..9c07d42cc7 100644 --- a/content/200-orm/200-prisma-client/500-deployment/index.mdx +++ b/content/200-orm/200-prisma-client/500-deployment/index.mdx @@ -1,7 +1,8 @@ --- title: 'Deployment' metaTitle: 'Deploy a Node.js application with Prisma' -metaDescription: 'How to deploy a Node.js application that uses Prisma Client and TypeScript to various cloud platforms.' +description: 'How to deploy a Node.js application that uses Prisma Client and TypeScript to various cloud platforms.' +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/130-logging.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/130-logging.mdx index 60fd05dd0d..f133fb3b45 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/130-logging.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/130-logging.mdx @@ -1,14 +1,14 @@ --- title: 'Logging' metaTitle: 'Logging' -metaDescription: 'Learn how to configure Prisma Client to log the raw SQL queries it sends to the database and other information.' +description: 'Learn how to configure Prisma Client to log the raw SQL queries it sends to the database and other information.' --- Use the `PrismaClient` [`log`](/orm/reference/prisma-client-reference#log) parameter to configure [log levels](/orm/reference/prisma-client-reference#log-levels) , including warnings, errors, and information about the queries sent to the database. -Prisma supports two types of logging: +Prisma Client supports two types of logging: - Logging to [stdout](https://en.wikipedia.org/wiki/Standard_streams) (default) - Event-based logging (use [`$on()`](/orm/reference/prisma-client-reference#on) method to [subscribe to events](#event-based-logging)) @@ -71,9 +71,9 @@ To use event-based logging: The following example subscribes to all `query` events and write the `duration` and `query` to console: -, ]}> + - + @@ -122,9 +122,9 @@ Duration: 2ms - + - + @@ -167,7 +167,7 @@ Query: db.Post.aggregate([ { $match: { userId: { $in: [ "622f0bbbdf635a42016ee32 - + diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx index e805599be7..d02abfdc91 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/240-metrics.mdx @@ -1,14 +1,15 @@ --- title: 'Metrics' metaTitle: 'Metrics (Preview)' -metaDescription: 'Diagnose application performance with insights into Prisma Client database activity.' -preview: true +description: 'Diagnose application performance with insights into Prisma Client database activity.' +sidebar_class_name: preview-badge tocDepth: 4 +toc_max_heading_level: 4 --- -Prisma metrics give you a detailed insight into how Prisma Client interacts with your database. You can use this insight to help diagnose performance issues with your application. +Prisma Client metrics give you a detailed insight into how Prisma Client interacts with your database. You can use this insight to help diagnose performance issues with your application. @@ -50,12 +51,12 @@ You can [add global labels to your metrics data](#global-labels) to help you gro ## Prerequisites -To use Prisma metrics, you must do the following: +To use Prisma Client metrics, you must do the following: -1. [Install the appropriate dependencies](#step-1-install-up-to-date-prisma-dependencies). +1. [Install the appropriate dependencies](#step-1-install-up-to-date-prisma-orm-dependencies). 1. [Enable the `metrics` feature flag in your Prisma schema file](#step-2-enable-the-feature-flag-in-the-prisma-schema-file). -### Step 1. Install up-to-date Prisma dependencies +### Step 1. Install up-to-date Prisma ORM dependencies Use version `3.15.0` or higher of the `prisma` and `@prisma/client` npm packages. @@ -77,7 +78,7 @@ generator client { ## Retrieve metrics in JSON format -When you retrieve metrics in JSON format, you can use them in the format they are returned, or [send them to StatSD](#use-prisma-metrics-with-statsd) to visualize how they change over time. +When you retrieve metrics in JSON format, you can use them in the format they are returned, or [send them to StatSD](#use-prisma-client-metrics-with-statsd) to visualize how they change over time. To retrieve metrics in JSON format, add the following lines to your application code: @@ -265,13 +266,13 @@ Each histogram "bucket" has two values. The first one is the upper bound of the ... ``` -### Use Prisma metrics with StatsD +### Use Prisma Client metrics with StatsD You can send JSON-formatted metrics to [StatsD](https://github.com/statsd/statsd) to visualize your metrics data over time. -Note: You must provide counter metrics to StatsD as a series of values that are incremented or decremented from a previous retrieval of the metrics. However, Prisma counter +Note: You must provide counter metrics to StatsD as a series of values that are incremented or decremented from a previous retrieval of the metrics. However, Prisma Client's counter metrics return absolute values. Therefore, you must convert your counter metrics to a series of incremented and decremented values and send them to StatsD as gauge data. In the code example below, we convert counter metrics into incremented and decremented gauge data in `diffHistograms`. @@ -338,7 +339,7 @@ setInterval(async () => await statsdSender(), 10000) ## Retrieve metrics in Prometheus format -When you retrieve Prisma metrics in Prometheus format, you can use them in the format they are returned, or [send them to the Prometheus metrics system](#use-prisma-metrics-with-the-prometheus-metrics-system) to visualize how they change over time. +When you retrieve Prisma Client metrics in Prometheus format, you can use them in the format they are returned, or [send them to the Prometheus metrics system](#use-prisma-client-metrics-with-the-prometheus-metrics-system) to visualize how they change over time. To retrieve metrics in Prometheus format, add the following lines to your application code: @@ -465,14 +466,14 @@ Metrics of type `histogram` expose three different class of values in the Promet 1. Multiple cumulative counters for observation buckets. These counters are suffixed with `_bucket{le=""}`. For example, `prisma_datasource_queries_duration_histogram_ms` has a counter exposed as `prisma_datasource_queries_duration_histogram_ms_bucket{le="1"}` - When an observed value is less than or equal to the upper inclusive bound of a bucket, then Prisma Metrics increments that bucket by 1. Suppose that you have buckets with the upper inclusive bounds 0, 1, 5, 10, and 50 respectively. If the observed value is 5 then Prisma Metrics increments the third bucket onwards, because the value is greater than 0 and greater than 1, but less than or equal to 5, 10, and 50. + When an observed value is less than or equal to the upper inclusive bound of a bucket, then Prisma Client metrics increments that bucket by 1. Suppose that you have buckets with the upper inclusive bounds 0, 1, 5, 10, and 50 respectively. If the observed value is 5 then Prisma Client metrics increments the third bucket onwards, because the value is greater than 0 and greater than 1, but less than or equal to 5, 10, and 50. 2. A single **total sum** for all observed values. This counter is suffixed with `_sum`. For example the total sum of `prisma_datasource_queries_duration_histogram_ms` is exposed as `prisma_datasource_queries_duration_histogram_ms_sum`. 3. The **count** of the number of events that have been observed. This counter is suffixed with `_count`. For example the total count of `prisma_datasource_queries_duration_histogram_ms` events is exposed as `prisma_datasource_queries_duration_histogram_ms_count`. For more information, read the Prometheus documentation on [metric types](https://prometheus.io/docs/concepts/metric_types/#histogram). -### Use Prisma metrics with the Prometheus metrics system +### Use Prisma Client metrics with the Prometheus metrics system In the majority of cases, Prometheus must scrape an endpoint to retrieve metrics. The following example shows how to send data with `Express.js`: @@ -494,7 +495,7 @@ app.listen(port, () => { }) ``` -The following example shows how to combine Prisma metrics with other Prometheus client libraries that are also served with a REST API endpoint in conjunction with `Express.js`: +The following example shows how to combine Prisma Client metrics with other Prometheus client libraries that are also served with a REST API endpoint in conjunction with `Express.js`: ```js import { PrismaClient } from '@prisma/client' @@ -541,12 +542,14 @@ This returns information in the following format: "counters": [ { "key": "query_total_operations", + //add-next-line "labels": { "server": "us_server1", "app_version": "one" }, "value": 0, "description": "The total number of operations executed" }, { "key": "prisma_datasource_queries_total", + //add-next-line "labels": { "server": "us_server1", "app_version": "one" }, "value": 0, "description": "The total number of queries executed" diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx index 0c06f8d2b2..bdb7ce38dd 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/250-opentelemetry-tracing.mdx @@ -1,9 +1,10 @@ --- title: 'OpenTelemetry tracing' metaTitle: 'OpenTelemetry tracing (Preview)' -metaDescription: 'Diagnose application performance with detailed traces of each query.' -preview: true +description: 'Diagnose application performance with detailed traces of each query.' +sidebar_class_name: preview-badge tocDepth: 4 +toc_max_heading_level: 4 --- @@ -12,7 +13,7 @@ Tracing provides a detailed log of the activity that Prisma Client carries out, -Tracing gives you a highly detailed, operation-level insight into your Prisma project. If you want aggregated numerical reporting, such as query counts, connection counts, and total query execution times, see [Metrics](/orm/prisma-client/observability-and-logging/metrics). +Tracing gives you a highly detailed, operation-level insight into your Prisma ORM project. If you want aggregated numerical reporting, such as query counts, connection counts, and total query execution times, see [Metrics](/orm/prisma-client/observability-and-logging/metrics). @@ -29,17 +30,17 @@ The number and type of spans in a trace depends on the type of operation the tra -![image](trace-diagram.png) +![image](./trace-diagram.png) You can [send tracing output to the console](#send-tracing-output-to-the-console), or analyze it in any OpenTelemetry-compatible tracing system, such as [Jaeger](https://www.jaegertracing.io/), [Honeycomb](https://www.honeycomb.io/trace/) and [Datadog](https://www.datadoghq.com/). On this page, we give an example of how to send tracing output to Jaeger, which you can [run locally](#visualize-traces-with-jaeger). ## Trace output -For each trace, Prisma Client outputs a series of spans. The number and type of these spans depends on the Prisma operation. A typical Prisma trace has the following spans: +For each trace, Prisma Client outputs a series of spans. The number and type of these spans depends on the Prisma Client operation. A typical Prisma trace has the following spans: -- `prisma:client:operation`: Represents the entire Prisma operation, from Prisma Client to the database and back. It contains details such as the model and method called by Prisma Client. Depending on the Prisma operation, it contains one or more of the following spans: +- `prisma:client:operation`: Represents the entire Prisma Client operation, from Prisma Client to the database and back. It contains details such as the model and method called by Prisma Client. Depending on the Prisma operation, it contains one or more of the following spans: - `prisma:client:connect`: Represents how long it takes for Prisma Client to connect to the database. - - `prisma:client:serialize`: Represents how long it takes to validate and transform a Prisma operation into a query for the [query engine](/orm/more/under-the-hood/engines). + - `prisma:client:serialize`: Represents how long it takes to validate and transform a Prisma Client operation into a query for the [query engine](/orm/more/under-the-hood/engines). - `prisma:engine`: Represents how long a query takes in the query engine. - `prisma:engine:connection`: Represents how long it takes for Prisma Client to get a database connection. - `prisma:engine:db_query`: Represents the database query that was executed against the database. It includes the query in the tags, and how long the query took to run. @@ -74,15 +75,15 @@ If your application sends a large number of spans to a [collector](https://opent To use tracing, you must do the following: -1. [Install the appropriate dependencies](#step-1-install-up-to-date-prisma-dependencies). +1. [Install the appropriate dependencies](#step-1-install-up-to-date-prisma-orm-dependencies). 1. [Enable the `tracing` feature flag in your Prisma schema file](#step-2-enable-the-feature-flag-in-your-prisma-schema-file). 1. [Install OpenTelemetry packages](#step-3-install-opentelemetry-packages). -## Get started with tracing in Prisma +## Get started with tracing in Prisma ORM This section explains how to install and register tracing in your application. -### Step 1. Install up-to-date Prisma dependencies +### Step 1. Install up-to-date Prisma ORM dependencies Use version `4.2.0` or later of the `prisma`, `@prisma/client`, and `@prisma/instrumentation` npm packages. @@ -242,7 +243,7 @@ When you perform an interactive transaction, you'll see the following spans in a As an example, take the following Prisma schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" previewFeatures = ["tracing", "interactiveTransactions"] @@ -381,10 +382,12 @@ An example implementation looks like this: ```ts highlight=3,7;add import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +//add-next-line import { TraceIdRatioBasedSampler } from '@opentelemetry/core' import { Resource } from '@opentelemetry/resources' const provider = new NodeTracerProvider({ + //add-next-line sampler: new TraceIdRatioBasedSampler(0.1), resource: new Resource({ // we can define some metadata about the trace resource diff --git a/content/200-orm/200-prisma-client/600-observability-and-logging/index.mdx b/content/200-orm/200-prisma-client/600-observability-and-logging/index.mdx index f34f9635d0..cf4662d280 100644 --- a/content/200-orm/200-prisma-client/600-observability-and-logging/index.mdx +++ b/content/200-orm/200-prisma-client/600-observability-and-logging/index.mdx @@ -1,10 +1,13 @@ --- title: 'Observability & logging' metaTitle: 'Observability & logging' -metaDescription: 'Observability & logging' +description: 'Observability & logging' tocDepth: 3 +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/140-debugging.mdx b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/140-debugging.mdx index 30be2c7216..1b0416b323 100644 --- a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/140-debugging.mdx +++ b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/140-debugging.mdx @@ -1,14 +1,14 @@ --- title: 'Debugging' metaTitle: 'Debugging (Reference)' -metaDescription: 'This page explains how to enable debugging output for Prisma Client by setting the `DEBUG` environment variable.' +description: 'This page explains how to enable debugging output for Prisma Client by setting the `DEBUG` environment variable.' --- You can enable debugging output in Prisma Client via the [`DEBUG`](/orm/reference/environment-variables-reference#debug) environment variable. It accepts two namespaces to print debugging output: -- `prisma:engine`: Prints relevant debug messages happening in a Prisma [engine](https://github.com/prisma/prisma-engines/) +- `prisma:engine`: Prints relevant debug messages happening in a Prisma ORM [engine](https://github.com/prisma/prisma-engines/) - `prisma:client`: Prints relevant debug messages happening in the Prisma Client runtime - `prisma*`: Prints all debug messages from Prisma Client or CLI - `*`: Prints all debug messages diff --git a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/230-handling-exceptions-and-errors.mdx b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/230-handling-exceptions-and-errors.mdx index 6faf5c4319..840c4b870f 100644 --- a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/230-handling-exceptions-and-errors.mdx +++ b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/230-handling-exceptions-and-errors.mdx @@ -1,7 +1,8 @@ --- title: 'Handling exceptions and errors' metaTitle: 'Handling exceptions and errors (Reference)' -metaDescription: 'This page covers how to handle exceptions and errors' +description: 'This page covers how to handle exceptions and errors' +hide_table_of_contents: true --- @@ -10,7 +11,7 @@ In order to handle different types of errors you can use `instanceof` to check w The following example tries to create a user with an already existing email record. This will throw an error because the `email` field has the `@unique` attribute applied to it. -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id Int @id @default(autoincrement()) email String @unique diff --git a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/index.mdx b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/index.mdx index bb23db2ab7..09248d4f33 100644 --- a/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/index.mdx +++ b/content/200-orm/200-prisma-client/700-debugging-and-troubleshooting/index.mdx @@ -1,8 +1,9 @@ --- title: 'Debugging & troubleshooting' metaTitle: 'Debugging & troubleshooting' -metaDescription: 'Debugging & troubleshooting' +description: 'Debugging & troubleshooting' tocDepth: 3 +hide_table_of_contents: true --- diff --git a/content/200-orm/200-prisma-client/_category_.json b/content/200-orm/200-prisma-client/_category_.json new file mode 100644 index 0000000000..656f03be02 --- /dev/null +++ b/content/200-orm/200-prisma-client/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Prisma Client", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/200-prisma-client/index.mdx b/content/200-orm/200-prisma-client/index.mdx index c7b3fda5f6..a3b95da774 100644 --- a/content/200-orm/200-prisma-client/index.mdx +++ b/content/200-orm/200-prisma-client/index.mdx @@ -1,9 +1,9 @@ --- title: 'Prisma Client' metaTitle: 'Prisma Client' -metaDescription: 'Prisma Client is an auto-generated, type-safe query builder generated based on the models and attributes of your Prisma schema.' +description: 'Prisma Client is an auto-generated, type-safe query builder generated based on the models and attributes of your Prisma schema.' staticLink: true -toc: false +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/300-prisma-migrate/050-getting-started.mdx b/content/200-orm/300-prisma-migrate/050-getting-started.mdx index 8bad270665..4f38807d07 100644 --- a/content/200-orm/300-prisma-migrate/050-getting-started.mdx +++ b/content/200-orm/300-prisma-migrate/050-getting-started.mdx @@ -1,7 +1,7 @@ --- title: 'Getting started' metaTitle: 'Getting started' -metaDescription: 'Getting started' +description: 'Getting started' tocDepth: 3 --- @@ -17,7 +17,7 @@ To get started with Prisma Migrate in a development environment: 1. Create a Prisma schema: - ```prisma file=schema.prisma + ```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -38,11 +38,11 @@ To get started with Prisma Migrate in a development environment: } ``` - + :::tip You can use [native type mapping attributes](/orm/prisma-migrate/workflows/native-database-types) in your schema to decide which exact database type to create (for example, `String` can map to `varchar(100)` or `text`). - + ::: @@ -101,6 +101,7 @@ To get started with Prisma Migrate in a development environment: ```prisma highlight=3;add model User { id Int @id @default(autoincrement()) + //add-next-line jobTitle String name String posts Post[] @@ -213,8 +214,10 @@ To include [unsupported database features](/orm/prisma-migrate/workflows/unsuppo ```sql highlight=3,4;add /* Generated migration SQL */ + //add-start CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target) WHERE success; + //add-end ``` - If the changes are significant, it can be easier to replace the entire migration file with the result of a database dump ([`mysqldump`](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html), [`pg_dump`](https://www.postgresql.org/docs/12/app-pgdump.html)) diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/005-overview.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/005-overview.mdx index 8f30904435..92724b3e94 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/005-overview.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/005-overview.mdx @@ -1,9 +1,14 @@ --- title: 'Overview' metaTitle: 'Prisma Migrate Overview' -metaDescription: 'Learn everything you need to know about Prisma Migrate.' +description: 'Learn everything you need to know about Prisma Migrate.' +hide_table_of_contents: true --- + + +
+ **Does not apply for MongoDB**
Instead of `migrate dev` and related commands, use [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) for [MongoDB](/orm/overview/databases/mongodb). @@ -22,10 +27,10 @@ Prisma Migrate can be considered a _hybrid_ database schema migration tool, mean - Declarative: The data model is described in a declarative way in the [Prisma schema](/orm/prisma-schema). Prisma Migrate generates SQL migration files from that data model. - Imperative: All generated SQL migration files are fully customizable. Prisma Migrate hence provides the flexibility of an imperative migration tool by enabling you to modify what and how migrations are executed (and allows you to run custom SQL to e.g. make use of native database feature, perform data migrations, ...). - +:::tip If you are prototyping, consider using the [`db push`](/orm/reference/prisma-cli-reference#db-push) command - see [Schema prototyping with `db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) for examples. - +::: See the [Prisma Migrate reference](/orm/reference/prisma-cli-reference#prisma-migrate) for detailed information about the Prisma Migrate CLI commands. diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/010-mental-model.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/010-mental-model.mdx index 878cd65a7e..6b4a2c8355 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/010-mental-model.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/010-mental-model.mdx @@ -1,8 +1,9 @@ --- title: 'Mental model' metaTitle: 'A mental model for Prisma Migrate' -metaDescription: 'A mental model guide for working with Prisma Migrate in your project' +description: 'A mental model guide for working with Prisma Migrate in your project' tocDepth: 4 +toc_max_heading_level: 4 --- @@ -94,7 +95,7 @@ This section describes how you can evolve your database schema in different envi ### Prisma Migrate in a development environment (local) -#### Track your migration history with prisma migrate dev +#### Track your migration history with `prisma migrate dev` The [`prisma migrate dev`](/orm/reference/prisma-cli-reference#migrate-dev) command allows you to track the changes you make to your database. The `prisma migrate dev` command automatically generates SQL migration files (saved in `/prisma/migrations`) and applies them to the database. When a migration is applied to the database, the migrations table (`_prisma_migrations`) in your database is also updated. @@ -121,7 +122,7 @@ If `prisma migrate dev` detects a schema drift or a migration history conflict, Expand to see the shadow database explained using a cartoon -![A cartoon that shows how the shadow database works.](shadow-database.png) +![A cartoon that shows how the shadow database works.](./shadow-database.png)
diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/070-migration-histories.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/070-migration-histories.mdx index b6fe72d92a..3e9b5f6903 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/070-migration-histories.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/070-migration-histories.mdx @@ -1,13 +1,13 @@ --- title: 'About migration histories' metaTitle: 'About migration histories' -metaDescription: 'About migration histories' +description: 'About migration histories' tocDepth: 3 --- -This page explains how Prisma uses migration histories to track changes to your schema. +This page explains how Prisma ORM uses migration histories to track changes to your schema. diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/200-shadow-database.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/200-shadow-database.mdx index 26fad023f3..b32afcc4e5 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/200-shadow-database.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/200-shadow-database.mdx @@ -1,7 +1,7 @@ --- title: 'About the shadow database' metaTitle: 'About the shadow database' -metaDescription: 'About the shadow database' +description: 'About the shadow database' --- @@ -10,15 +10,20 @@ The shadow database is a second, _temporary_ database that is **created and dele [`migrate diff` command](/orm/reference/prisma-cli-reference#migrate-diff) also requires a shadow database when diffing against a local `migrations` directory with `--from-migrations` or `--to-migrations`. - +* If your database does not allow creation and deleting of databases (e.g. in a cloud-hosted environment), you need to [create and configure the shadow database manually](#cloud-hosted-shadow-databases-must-be-created-manually). -\* If your database does not allow creation and deleting of databases (e.g. in a cloud-hosted environment), you need to [create and configure the shadow database manually](#cloud-hosted-shadow-databases-must-be-created-manually). - + -> **Important**: The shadow database is **not** required in production, and is not used by production-focused commands such as `prisma migrate resolve` and `prisma migrate deploy`. +The shadow database is **not** required in production, and is not used by production-focused commands such as `prisma migrate resolve` and `prisma migrate deploy`. -> **Note**: A shadow database is never used for MongoDB as `migrate dev` is not used there. + + + + +A shadow database is never used for MongoDB as `migrate dev` is not used there. + + @@ -29,11 +34,11 @@ When you run `prisma migrate dev` to create a new migration, Prisma Migrate uses - [Detect schema drift](#detecting-schema-drift), which means checking that no **unexpected changes** have been made to the development database - [Generate new migrations](#generating-new-migrations) and evaluate if those could lead to **data loss** when applied -
🎨 Expand to see the shadow database explained as a cartoon. +
-
+🎨 Expand to see the shadow database explained as a cartoon. -![A cartoon that shows how the shadow database works.](shadow-database.png) +![A cartoon that shows how the shadow database works.](./shadow-database.png)
@@ -82,6 +87,7 @@ In some cases it might make sense (e.g. when [creating and dropping databases is datasource db { provider = "postgresql" url = env("DATABASE_URL") + //highlight-next-line shadowDatabaseUrl = env("SHADOW_DATABASE_URL") } ``` @@ -100,6 +106,7 @@ Some cloud providers do not allow you to drop and create databases with SQL. Som datasource db { provider = "postgresql" url = env("DATABASE_URL") + //highlight-next-line shadowDatabaseUrl = env("SHADOW_DATABASE_URL") } ``` @@ -113,7 +120,7 @@ In order to create and delete the shadow database when using `migrate dev`, Pris | Database | Database user requirements | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SQLite | No special requirements. | -| MySQL | Database user must have `CREATE, ALTER, DROP, REFERENCES ON *.*` privileges | +| MySQL/MariaDB | Database user must have `CREATE, ALTER, DROP, REFERENCES ON *.*` privileges | | PostgreSQL | The user must be a super user or have `CREATEDB` privilege. See `CREATE ROLE` ([PostgreSQL official documentation](https://www.postgresql.org/docs/12/sql-createrole.html)) | | Microsoft SQL Server | The user must be a site admin or have the `SERVER` securable. See the [official documentation](https://docs.microsoft.com/en-us/sql/relational-databases/security/permissions-database-engine?view=sql-server-ver15). | @@ -133,6 +140,6 @@ To resolve this error: - If you are working locally, we recommend that you update the database user's privileges. - If you are developing against a database that does not allow creating and dropping databases (for any reason) see [Manually configuring the shadow database](#manually-configuring-the-shadow-database) - If you are developing against a cloud-based database (for example, on Heroku, Digital Ocean, or Vercel Postgres) see: [Cloud-hosted shadow databases](#cloud-hosted-shadow-databases-must-be-created-manually). -- If you are developing against a cloud-based database (for example, on Heroku, Digital Ocean, or Vercel Postgres) and are currently **prototyping** such that you don't care about generated migration files and only need to apply your Prisma data model to the database schema, you can run [`prisma db push`](/orm/reference/prisma-cli-reference#db) instead of the `prisma migrate dev` command. +- If you are developing against a cloud-based database (for example, on Heroku, Digital Ocean, or Vercel Postgres) and are currently **prototyping** such that you don't care about generated migration files and only need to apply your Prisma schema to the database schema, you can run [`prisma db push`](/orm/reference/prisma-cli-reference#db) instead of the `prisma migrate dev` command. > **Important**: The shadow database is _only_ required in a development environment (specifically for the `prisma migrate dev` command) - you **do not** need to make any changes to your production environment. diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx index 4e9dffeab1..52bb4dadb3 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/300-limitations-and-known-issues.mdx @@ -1,7 +1,7 @@ --- title: Limitations and known issues metaTitle: Limitations and known issues -metaDescriptions: Limitations and known issues +description: Limitations and known issues --- @@ -63,7 +63,7 @@ See [Prisma Migrate and PgBouncer workaround](/orm/prisma-client/setup-and-confi ## Prisma Migrate in non-interactive environments -Prisma detects when you run CLI commands in non-interactive environments, such as Docker, from Node scripts or in bash shells. When this happens a warning displays, indicating that the environment is non-interactive and the `migrate dev` command is not supported. +Prisma ORM detects when you run CLI commands in non-interactive environments, such as Docker, from Node scripts or in bash shells. When this happens a warning displays, indicating that the environment is non-interactive and the `migrate dev` command is not supported. To ensure the Docker environment picks up the command, run the image in `interactive` mode so that it reacts to the `migrate dev` command. diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx index 88bd326fad..81fccb9830 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/600-legacy-migrate.mdx @@ -1,9 +1,9 @@ --- title: 'Legacy Prisma Migrate' metaTitle: 'Legacy Prisma Migrate (Reference)' -metaDescription: 'Legacy Prisma Migrate is a declarative data modeling and schema migration tool that is available via the Prisma CLI.' +description: 'Legacy Prisma Migrate is a declarative data modeling and schema migration tool that is available via the Prisma CLI.' tocDepth: 3 -hidePage: true +unlisted: true --- @@ -25,7 +25,7 @@ If you want to prototype or iterate on a schema design in a development environm Legacy Prisma Migrate is a _declarative_ migration system, as opposed to SQL which can be considered _imperative_: - **SQL (imperative)**: Provide the individual _steps_ to get from the current schema to the desired schema. -- **legacy Prisma Migrate (declarative)**: Define the desired schema as a [Prisma data model](/orm/prisma-schema/data-model/models) (legacy Prisma Migrate takes care of generating the necessary _steps_). +- **legacy Prisma Migrate (declarative)**: Define the desired schema as a [Prisma schema data model](/orm/prisma-schema/data-model/models) (legacy Prisma Migrate takes care of generating the necessary _steps_). Here's a quick comparison. Assume you have the following scenario: @@ -73,7 +73,7 @@ ADD COLUMN published BOOLEAN DEFAULT false; #### legacy Prisma Migrate -With legacy Prisma Migrate, you write the desired database schema in the form of a [Prisma data model](/orm/prisma-schema/data-model/models) inside your [Prisma schema file](/orm/prisma-schema). To map the data model to your database schema, you then have to run these two commands: +With legacy Prisma Migrate, you write the desired database schema in the form of a [Prisma schema data model](/orm/prisma-schema/data-model/models) inside your [Prisma schema file](/orm/prisma-schema). To map the data model to your database schema, you then have to run these two commands: ```terminal prisma migrate save --experimental @@ -222,13 +222,11 @@ The `_Migration` table additionally stores information about each migration that With **legacy Prisma Migrate**, the workflow looks slightly different: -1. Manually adjust your [Prisma data model](/orm/prisma-schema/data-model/models) +1. Manually adjust your [Prisma schema data model](/orm/prisma-schema/data-model/models) 1. Migrate your database using the `legacy Prisma Migrate` CLI commands 1. (Re-)generate Prisma Client 1. Use Prisma Client in your application code to access your database -![Typical workflow with legacy Prisma Migrate](../../../doc-images/unused/OImder6.png) - ### Troubleshooting Since legacy Prisma Migrate is currently Experimental, you might end up in a state where the `migrations` directory and/or the `_Migrations` table are out of sync with the actual state of the database. In these cases, it often helps to "reset" legacy Prisma Migrate by deleting the `migrations` folder and deleting all entries from the `_Migration` table. @@ -253,7 +251,7 @@ The `migrate` command creates and manages database migrations. It can be used to The `migrate` command includes a number of subcommands to specify the desired action. -### migrate save +### `migrate save` Saves a migration that defines the steps necessary to update your current schema. @@ -321,7 +319,7 @@ prisma migrate save --create-db --experimental prisma migrate save --preview --experimental ``` -### migrate up +### `migrate up` Migrate the database up to a specific state. @@ -398,7 +396,7 @@ prisma migrate up --create-db --experimental prisma migrate up --preview --experimental ``` -### migrate down +### `migrate down` Migrate the database down to a specific state. diff --git a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/index.mdx b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/index.mdx index 8a246de91a..bcf261a791 100644 --- a/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/index.mdx +++ b/content/200-orm/300-prisma-migrate/200-understanding-prisma-migrate/index.mdx @@ -1,9 +1,12 @@ --- title: 'Understanding Prisma Migrate' metaTitle: 'Understanding Prisma Migrate' -metaDescription: 'Learn about the mental model and basic building blocks of Prisma Migrate.' +description: 'Learn about the mental model and basic building blocks of Prisma Migrate.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx b/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx index 4f0a047239..9c5d7da129 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/10-seeding.mdx @@ -1,32 +1,33 @@ --- title: Seeding metaTitle: Seeding -metaDescription: Learn how to seed your database using Prisma's integrated seeding functionality and Prisma Client +description: Learn how to seed your database using Prisma ORM's integrated seeding functionality and Prisma Client tocDepth: 3 --- -This guide describes how to seed your database using Prisma Client and Prisma's integrated seeding functionality. Seeding allows you to consistently re-create the same data in your database and can be used to: +This guide describes how to seed your database using Prisma Client and Prisma ORM's integrated seeding functionality. Seeding allows you to consistently re-create the same data in your database and can be used to: - Populate your database with data that is required for your application to start - for example, a default language or a default currency. - Provide basic data for validating and using your application in a development environment. This is particularly useful if you are using Prisma Migrate, which sometimes requires resetting your development database. -## How to seed your database in Prisma +## How to seed your database in Prisma ORM -Prisma's integrated seeding functionality expects a command in the `"seed"` key in the `"prisma"` key of your `package.json` file. This can be any command, `prisma db seed` will just execute it. In this guide and as a default, we recommend writing a seed script inside your project's `prisma/` folder and starting it with the command. +Prisma ORM's integrated seeding functionality expects a command in the `"seed"` key in the `"prisma"` key of your `package.json` file. This can be any command, `prisma db seed` will just execute it. In this guide and as a default, we recommend writing a seed script inside your project's `prisma/` folder and starting it with the command. -, ]}> - - + + +
```json "prisma": { "seed": "ts-node prisma/seed.ts" }, ``` +
@@ -39,9 +40,10 @@ This can be useful to reduce memory usage (RAM) and increase execution speed of -
+ - + +
```json "prisma": { @@ -49,13 +51,13 @@ This can be useful to reduce memory usage (RAM) and increase execution speed of }, ``` -
+
## Integrated seeding with Prisma Migrate -Database seeding happens in two ways with Prisma: manually with `prisma db seed` and automatically in `prisma migrate dev` and `prisma migrate reset`. +Database seeding happens in two ways with Prisma ORM: manually with `prisma db seed` and automatically in `prisma migrate dev` and `prisma migrate reset`. With `prisma db seed`, _you_ decide when to invoke the seed command. It can be useful for a test setup or to prepare a new development environment, for example. @@ -73,14 +75,14 @@ Here we suggest some specific seed scripts for different situations. You are fre ### Seeding your database with TypeScript or JavaScript -, ]}> + - + 1. Create a new file named `seed.ts`. This can be placed anywhere within your projects folder structure. The below example places it in the `/prisma` folder. 2. In the `seed.ts` file, import Prisma Client, initialize it and create some records. As an example, take the following Prisma schema with a `User` and `Post` model: - ```prisma file=schema.prisma + ```prisma file=schema.prisma showLineNumbers model User { id Int @id @default(autoincrement()) email String @unique @@ -192,14 +194,14 @@ Here we suggest some specific seed scripts for different situations. You are fre npx prisma db seed ``` - + - + 1. Create a new file named `seed.js`. This can be placed anywhere within your projects folder structure. The below example places it in the `/prisma` folder. 2. In the `seed.js` file, import Prisma Client, initialize it and create some records. As an example, take the following Prisma schema with a `User` and `Post` model: - ```prisma file=schema.prisma + ```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } @@ -302,7 +304,7 @@ Here we suggest some specific seed scripts for different situations. You are fre npx prisma db seed ``` - + @@ -310,12 +312,13 @@ Here we suggest some specific seed scripts for different situations. You are fre In addition to TypeScript and JavaScript, you can also use a Bash script (`seed.sh`) to seed your database in another language such as Go, or plain SQL. -, ]}> + - + +
The following example runs a Go script in the same folder as `seed.sh`: - +
```bash file=seed.sh #!/bin/sh # -e Exit immediately when a command returns a non-zero status. @@ -325,11 +328,13 @@ set -ex go run ./seed/ ``` -
+ - + +
The following example uses [psql](https://www.postgresql.org/docs/13/app-psql.html) to run a SQL script in the same folder as `seed.sh`: +
```bash file=seed.sh #!/bin/sh @@ -340,7 +345,7 @@ set -ex psql file.sql ``` -
+
@@ -395,7 +400,7 @@ npx prisma db seed -- --environment development ## Going further -Here's a non-exhaustive list of other tools you can integrate with Prisma in your development workflow to seed your database: +Here's a non-exhaustive list of other tools you can integrate with Prisma ORM in your development workflow to seed your database: - [Replibyte](https://www.replibyte.com/docs/introduction) - [Snaplet](https://docs.snaplet.dev/recipes/prisma) diff --git a/content/200-orm/300-prisma-migrate/300-workflows/100-team-development.mdx b/content/200-orm/300-prisma-migrate/300-workflows/100-team-development.mdx index d058c52edb..5c37e001dd 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/100-team-development.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/100-team-development.mdx @@ -1,7 +1,8 @@ --- title: Team development metaTitle: Team development -metaDescription: How to use Prisma Migrate when collaborating on a project as a team. +description: How to use Prisma Migrate when collaborating on a project as a team. +toc_max_heading_level: 2 --- @@ -17,7 +18,7 @@ To incorporate changes from collaborators: Migrations are **applied in the same order as they were created**. The creation date is part of the migration subfolder name - for example, `20210316081837-updated-fields` was created on `2021-03-16-08:08:37`. - + This guide **does not apply for MongoDB**.
Instead of `migrate dev`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). @@ -32,11 +33,11 @@ The following sample scenario demonstrates how a team of three developers share The following tabs show the team's Prisma schema before and after a round of changes: -, ]}> + - + -```prisma +```prisma file=schema.prisma model Post { id Int @id @default(autoincrement()) title String @@ -54,11 +55,11 @@ model User { } ``` - + - + -```prisma highlight=14,15,19-23;add +```prisma file=schema.prisma highlight=14,15,19-23;add model Post { id Int @id @default(autoincrement()) title String @@ -72,19 +73,23 @@ model User { id Int @id @default(autoincrement()) email String @unique name String? + //add-start favoriteColor String? // Added by Ania bestPacmanScore Int? // Added by you + //add-end posts Post[] } +//add-start // Added by Javier model Tag { tagName String @id tagCategory Category } +//add-end ``` - + ### The team's changes @@ -98,6 +103,7 @@ Your team members Ania and Javier make additive changes to the schema in their l ```prisma highlight=3;add model User { /* ... */ + //add-next-line favoriteColor String? } ``` @@ -118,10 +124,12 @@ Your team members Ania and Javier make additive changes to the schema in their l 1. Adds a new model to the schema: ```prisma highlight=1-4;add + //add-start model Tag { tagName String @id tagCategory Category } + //add-end ``` 1. Generates a migration: @@ -137,7 +145,7 @@ Your team members Ania and Javier make additive changes to the schema in their l The migration history now has **two** new migrations: -![A diagram showing changes by two separate developers converging in a single migration history.](migrate-team-dev.png) +![A diagram showing changes by two separate developers converging in a single migration history.](./migrate-team-dev.png) ### Integrating changes @@ -155,15 +163,18 @@ The migration history now has **two** new migrations: ```prisma highlight=3,7-11;add model User { /* ... */ + //add-next-line favoriteColor String? bestPacmanScore Int? } + //add-start model Tag { tagName String @id tagCategory Category posts Post[] } + //add-end ``` 1. Run the `migrate dev` command: @@ -185,7 +196,7 @@ The migration history now has **two** new migrations: Your `schema.prisma` and local database now include your team's changes, and the migration history includes your migration: -![A migration history with 5 migrations.](migration-history.png) +![A migration history with 5 migrations.](./migration-history.png) ## Source control @@ -196,5 +207,5 @@ You should commit the following files to source control: Source-controlling the `schema.prisma` file is not enough - you must include your migration history. This is because: -- As you start to [customize migrations](customizing-migrations), your migration history contains **information that cannot be represented in the Prisma schema**. For example, you can customize a migration to mitigate data loss that would be caused by a breaking change. +- As you start to [customize migrations](/orm/prisma-migrate/workflows/customizing-migrations), your migration history contains **information that cannot be represented in the Prisma schema**. For example, you can customize a migration to mitigate data loss that would be caused by a breaking change. - The `prisma migrate deploy` command, which is used to deploy changes to staging, testing, and production environments, _only_ runs migration files. Prisma Migrate only uses the schema file to read the `url` and `provider` fields, not models and fields. diff --git a/content/200-orm/300-prisma-migrate/300-workflows/110-native-database-types.mdx b/content/200-orm/300-prisma-migrate/300-workflows/110-native-database-types.mdx index 777345b13b..558bc397d1 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/110-native-database-types.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/110-native-database-types.mdx @@ -1,7 +1,8 @@ --- title: Native database types metaTitle: Native database types -metaDescription: Native database types +description: Native database types +toc_max_heading_level: 2 --- @@ -19,21 +20,21 @@ For a complete list of Prisma schema features, refer to: Prisma Migrate also supports mapping each field to a [specific native type](#mapping-fields-to-a-specific-native-type), and there are ways to [include features without a Prisma schema equivalent in your database](#handling-unsupported-database-features). - +:::note -¹ Comments and Prisma-level functions (`uuid()` and `cuid()`) do not map to database features. +Comments and Prisma ORM-level functions (`uuid()` and `cuid()`) do not map to database features. - +::: ## Mapping fields to a specific native type -Each Prisma type maps to a default underlying database type - for example, the PostgreSQL connector maps `String` to `text` by default. [Native database type attributes](/orm/prisma-schema/data-model/models#native-types-mapping) determines which _specific_ native type should be created in the database. +Each Prisma ORM type maps to a default underlying database type - for example, the PostgreSQL connector maps `String` to `text` by default. [Native database type attributes](/orm/prisma-schema/data-model/models#native-types-mapping) determines which _specific_ native type should be created in the database. -**Note**: Some Prisma types only map to a single native type. +**Note**: Some Prisma ORM types only map to a single native type. @@ -82,9 +83,9 @@ CREATE TABLE "Post" ( ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; ``` -### Mappings by Prisma type +### Mappings by Prisma ORM type -For type mappings organized by Prisma type, refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) documentation. +For type mappings organized by Prisma ORM type, refer to the [Prisma schema reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) documentation. ### Mappings by database provider diff --git a/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx b/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx index b310d48ae2..6d635272b0 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/120-native-database-functions.mdx @@ -1,7 +1,7 @@ --- title: Native database functions metaTitle: Native database functions -metaDescription: How to enable PostgreSQL native database functions for projects that use Prisma Migrate. +description: How to enable PostgreSQL native database functions for projects that use Prisma Migrate. --- @@ -16,24 +16,26 @@ Do not activate extensions outside a migration file if you use Prisma Migrate. T
-In Prisma versions 4.5.0 and later, you can activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): +In Prisma ORM versions 4.5.0 and later, you can activate the extension by declaring it in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions): -```prisma file=schema.prisma highlight=3,9;add +```prisma file=schema.prisma highlight=3,9;add showLineNumbers generator client { provider = "prisma-client-js" + //add-next-line previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") + //add-next-line extensions = [pgcrypto] } ``` You can then apply these changes to your database with Prisma Migrate. See [How to migrate PostgreSQL extensions](/orm/prisma-schema/postgresql-extensions#how-to-migrate-postgresql-extensions) for details. -In earlier versions of Prisma, you must instead add a SQL command to your migration file to activate the extension. See [How to install a PostgreSQL extension as part of a migration](#how-to-install-a-postgresql-extension-as-part-of-a-migration). +In earlier versions of Prisma ORM, you must instead add a SQL command to your migration file to activate the extension. See [How to install a PostgreSQL extension as part of a migration](#how-to-install-a-postgresql-extension-as-part-of-a-migration).
diff --git a/content/200-orm/300-prisma-migrate/300-workflows/20-prototyping-your-schema.mdx b/content/200-orm/300-prisma-migrate/300-workflows/20-prototyping-your-schema.mdx index 6729c667bb..08c825de1f 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/20-prototyping-your-schema.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/20-prototyping-your-schema.mdx @@ -1,7 +1,7 @@ --- title: 'Prototyping your schema' metaTitle: 'Prototyping your schema' -metaDescription: 'Prototyping your schema' +description: 'Prototyping your schema' codeStyle: false --- @@ -25,7 +25,7 @@ The Prisma CLI has a dedicated command for prototyping schemas: [`db push`](/orm
-## Choosing db push or Prisma Migrate +## Choosing `db push` or Prisma Migrate `db push` works well if: @@ -42,7 +42,7 @@ See [Schema prototyping with `db push`](/orm/prisma-migrate/workflows/prototypin - You want to keep track of changes made to the database schema over time. `db push` does not create any artifacts that allow you to keep track of these changes. - You want the schema changes to be reversible. You can use `db push` again to revert to the original state, but this might result in data loss. -## Can I use Prisma Migrate and db push together? +## Can I use Prisma Migrate and `db push` together? Yes, you can [use `db push` and Prisma Migrate together in your development workflow](/orm/prisma-migrate/workflows/prototyping-your-schema) . For example, you can: @@ -130,6 +130,7 @@ The following scenario demonstrates how to use `db push` to synchronize a new sc model Post { id Int @id @default(autoincrement()) title String + //add-next-line description String published Boolean @default(true) content String @db.VarChar(500) @@ -157,11 +158,11 @@ The following scenario demonstrates how to use `db push` to synchronize a new sc ? To apply this step we need to reset the database, do you want to continue? All data will be lost. » (y/N) ``` - +:::tip Use the `--accept-data-loss` flag to skip this warning, or `--force-reset` to ignore all warnings. - +::: 6. Confirm data loss and apply changes to your database (or revisit your schema): @@ -279,10 +280,10 @@ The following scenario demonstrates how to use `db push` to prototype a change t 4. Prisma Migrate replays the existing migration history, generates a new migration based on your schema changes, and applies those changes to the database. - +:::tip When using `migrate dev`, if your schema changes mean that seed scripts will no longer work, you can use the `--skip-seed` flag to ignore seed scripts. - +::: At this point, the final result of your prototyping is preserved in a migration, and can be pushed to other environments (testing, production, or other members of your team). diff --git a/content/200-orm/300-prisma-migrate/300-workflows/200-troubleshooting.mdx b/content/200-orm/300-prisma-migrate/300-workflows/200-troubleshooting.mdx index 6d54b61c3e..20d7d35ea3 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/200-troubleshooting.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/200-troubleshooting.mdx @@ -1,7 +1,7 @@ --- title: Troubleshooting metaTitle: Troubleshooting -metaDescription: Troubleshooting issues with Prisma Migrate in a development environment. +description: Troubleshooting issues with Prisma Migrate in a development environment. --- @@ -11,7 +11,7 @@ This guide describes how to resolve issues with Prisma Migrate in a development - [Production troubleshooting](/orm/prisma-migrate/workflows/patching-and-hotfixing) - [Patching / hotfixing production databases](/orm/prisma-migrate/workflows/patching-and-hotfixing) - + This guide **does not apply for MongoDB**.
Instead of `migrate dev`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). @@ -89,7 +89,7 @@ If you made manual changes to the database that you want to keep, you can: A migration might fail if: -- You [modify a migration before running it](customizing-migrations) and introduce a syntax error +- You [modify a migration before running it](/orm/prisma-migrate/workflows/customizing-migrations) and introduce a syntax error - You add a mandatory (`NOT NULL`) column to a table that already has data - The migration process stopped unexpectedly - The database shut down in the middle of the migration process diff --git a/content/200-orm/300-prisma-migrate/300-workflows/30-baselining.mdx b/content/200-orm/300-prisma-migrate/300-workflows/30-baselining.mdx index 23daf7ff66..eeee379ef9 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/30-baselining.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/30-baselining.mdx @@ -1,6 +1,6 @@ --- title: Baselining a database -metaDescription: How to initialize a migration history for an existing database that contains important data. +description: How to initialize a migration history for an existing database that contains important data. --- @@ -16,7 +16,7 @@ Baselining tells Prisma Migrate to assume that one or more migrations have **alr Baselining is part of [adding Prisma Migrate to a project with an existing database](/orm/prisma-migrate/getting-started#adding-prisma-migrate-to-an-existing-project). - + This guide **does not apply for MongoDB**.
Instead of `migrate deploy`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). @@ -29,27 +29,23 @@ Instead of `migrate deploy`, [`db push`](/orm/prisma-migrate/workflows/prototypi When you add Prisma Migrate to an existing project, your initial migration contains all the SQL required to recreate the state of the database **before you started using Prisma Migrate**: -![The image shows a database labelled 'Existing database', and a list of existing database features next to it - 24 tables, 13 relationships, 92 fields, 3 indexes. An arrow labelled 'represented by' connects the database features list to a box that represents a migration. The existing databases's features are represented by a single migration.](existing-database.png) +![The image shows a database labelled 'Existing database', and a list of existing database features next to it - 24 tables, 13 relationships, 92 fields, 3 indexes. An arrow labelled 'represented by' connects the database features list to a box that represents a migration. The existing databases's features are represented by a single migration.](./existing-database.png) - - - +:::tip You can edit the initial migration to include schema elements that cannot be represented in the Prisma schema - such as stored procedures or triggers. - - - +::: You need this initial migration to create and reset **development environments**: -![The image shows a migration history with three migrations. Each migration is represented by a file icon and a name, and all migrations are surrounded by a box labelled 'migration history'. The first migration has an additional label: "State of database before Prisma Migrate", and the two remaining migrations are labelled "Generated as part of the Prisma Migrate workflow". An arrow labelled "prisma migrate dev" connects the migration history box to a database labelled "new development database", signifying that all three migrations are applied to the development database - none are skipped.](new-dev-db.png) +![The image shows a migration history with three migrations. Each migration is represented by a file icon and a name, and all migrations are surrounded by a box labelled 'migration history'. The first migration has an additional label: "State of database before Prisma Migrate", and the two remaining migrations are labelled "Generated as part of the Prisma Migrate workflow". An arrow labelled "prisma migrate dev" connects the migration history box to a database labelled "new development database", signifying that all three migrations are applied to the development database - none are skipped.](./new-dev-db.png) However, when you `prisma migrate deploy` your migrations to databases that already exist and _cannot_ be reset - such as production - you **do not want to include the initial migrations**. The target database already contains the tables and columns created by the initial migration, and attempting to create these elements again will most likely result in an error. -![A migration history represented by three migration files (file icon and name), surrounded by a a box labelled 'migration history'. The first migration is marked 'do not apply', and the second two migrations are marked 'apply'. An arrow labelled with the command 'prisma migrate deploy' points from the migration history to a database labelled 'production'.](deploy-db.png) +![A migration history represented by three migration files (file icon and name), surrounded by a a box labelled 'migration history'. The first migration is marked 'do not apply', and the second two migrations are marked 'apply'. An arrow labelled with the command 'prisma migrate deploy' points from the migration history to a database labelled 'production'.](./deploy-db.png) Baselining solves this problem by telling Prisma Migrate to pretend that the initial migration(s) **have already been applied**. diff --git a/content/200-orm/300-prisma-migrate/300-workflows/40-customizing-migrations.mdx b/content/200-orm/300-prisma-migrate/300-workflows/40-customizing-migrations.mdx index 32717eaf11..8916f1939e 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/40-customizing-migrations.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/40-customizing-migrations.mdx @@ -1,13 +1,13 @@ --- title: Customizing migrations metaTitle: Customizing migrations -metaDescription: How to edit a migration file before applying it to avoid data loss in production. +description: How to edit a migration file before applying it to avoid data loss in production. tocDepth: 3 --- - + This guide **does not apply for MongoDB**.
Instead of `migrate dev`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). @@ -50,6 +50,7 @@ To actually **rename** a field and avoid data loss when you run the migration in ```prisma highlight=3;normal; model Profile { id Int @id @default(autoincrement()) + //highlight-next-line biograpy String userId Int @unique user User @relation(fields: [userId], references: [id]) @@ -63,7 +64,9 @@ To rename the `biograpy` field to `biography`: ```prisma highlight=3;delete|4;add; model Profile { id Int @id @default(autoincrement()) + //delete-next-line biograpy String + //add-next-line biography String userId Int @unique user User @relation(fields: [userId], references: [id]) @@ -78,25 +81,25 @@ To rename the `biograpy` field to `biography`: 1. Edit the draft migration as shown, changing `DROP` / `DELETE` to a single `RENAME COLUMN`: - , ]}> + - + ```sql file=./prisma/migrations/20210308092620_rename_migration/migration.sql ALTER TABLE "Profile" DROP COLUMN "biograpy", ADD COLUMN "biography" TEXT NOT NULL; ``` - + - + ```sql file=./prisma/migrations/20210308092620_rename_migration/migration.sql ALTER TABLE "Profile" RENAME COLUMN "biograpy" TO "biography"; ``` - + @@ -124,6 +127,7 @@ With the _expand and contract_ pattern, renaming the field `bio` to `biography` model Profile { id Int @id @default(autoincrement()) bio String + //add-next-line biography String userId Int @unique user User @relation(fields: [userId], references: [id]) @@ -149,6 +153,7 @@ With the _expand and contract_ pattern, renaming the field `bio` to `biography` ```prisma highlight=3;delete; model Profile { id Int @id @default(autoincrement()) + //delete-next-line bio String biography String userId Int @unique @@ -214,9 +219,9 @@ To change the direction of a 1-1 relation: 1. Edit the draft migration as shown: - , ]}> + - + ```sql @@ -239,9 +244,9 @@ To change the direction of a 1-1 relation: ALTER TABLE "User" ADD FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE; ``` - + - + ```sql @@ -271,7 +276,7 @@ To change the direction of a 1-1 relation: ALTER TABLE "User" ADD FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE; ``` - + diff --git a/content/200-orm/300-prisma-migrate/300-workflows/45-data-migration.mdx b/content/200-orm/300-prisma-migrate/300-workflows/45-data-migration.mdx index 5640babf88..6bffd4d9c8 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/45-data-migration.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/45-data-migration.mdx @@ -1,14 +1,14 @@ --- title: Data migrations -metaDescription: How to migrate data using Prisma using the expand and contract pattern. +description: How to migrate data using Prisma ORM with the expand and contract pattern. tocDepth: 3 --- -Prisma does not yet natively support data migrations, but you can use the [expand and contract pattern](https://www.prisma.io/dataguide/types/relational/expand-and-contract-pattern) to migrate your data. For example from one column into another. +Prisma ORM does not yet natively support data migrations, but you can use the [expand and contract pattern](https://www.prisma.io/dataguide/types/relational/expand-and-contract-pattern) to migrate your data. For example from one column into another. -This guide covers how you can use Prisma with the expand and contract pattern to: +This guide covers how you can use Prisma ORM with the expand and contract pattern to: - Expand your schema with a new column - Create and run the data migration @@ -32,7 +32,7 @@ It also makes the following assumptions: For this guide, you will modify the following schema by replacing the `published` boolean field with a `status` enum: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } @@ -64,13 +64,15 @@ Make the following updates to your Prisma schema: - Add a `status` column to the `Post` model - Mark the `published` field as optional -```prisma file=prisma/schema.prisma highlight=5,6,9-15;edit +```prisma file=prisma/schema.prisma highlight=5,6,9-15;edit showLineNumbers model Post { id Int @id @default(autoincrement()) title String content String? + //edit-start published Boolean? @default(false) status Status + //edit-end } enum Status { @@ -112,12 +114,13 @@ Then run prisma migrate dev to apply it and verify it works. Exit from the migration step and update the schema by adding a default value for the `status` field by adding the `@default()` attribute function. -```prisma file=prisma/schema.prisma highlight=6;edit +```prisma file=prisma/schema.prisma highlight=6;edit showLineNumbers model Post { id Int @id @default(autoincrement()) title String content String? published Boolean? @default(false) + //edit-next-line status Status @default(Unknown) } @@ -223,6 +226,7 @@ model Post { id Int @id @default(autoincrement()) title String content String? + //delete-next-line published Boolean? @default(false) status Status @default(Unknown) } diff --git a/content/200-orm/300-prisma-migrate/300-workflows/50-squashing-migrations.mdx b/content/200-orm/300-prisma-migrate/300-workflows/50-squashing-migrations.mdx index 32e26652da..ffe9809e98 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/50-squashing-migrations.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/50-squashing-migrations.mdx @@ -1,7 +1,8 @@ --- title: Squashing migrations metaTitle: Squashing migrations -metaDescription: How to squash multiple migration files into a single migration +description: How to squash multiple migration files into a single migration +toc_max_heading_level: 2 --- diff --git a/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx b/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx index f21838bc72..c75a4507a3 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/60-generating-down-migrations.mdx @@ -1,7 +1,7 @@ --- title: Generating down migrations metaTitle: Generating down migrations -metaDescription: How to generate down migrations +description: How to generate down migrations tocDepth: 3 --- @@ -17,9 +17,9 @@ When generating a migration SQL file, you may wish to also create a "down migrat This guide explains how to use Prisma Migrate's [`migrate diff` command](/orm/reference/prisma-cli-reference#migrate-diff) to create a down migration, and how to apply it to your production database with the [`db execute`](/orm/reference/prisma-cli-reference#db-execute) command in the case of a failed up migration. - + -This guide applies to generating SQL down migrations for relational databases only. It does not apply to MongoDB. +This guide applies to generating SQL down migrations for relational databases only. It **does not apply to MongoDB**. @@ -47,7 +47,7 @@ This section describes how to generate a down migration SQL file along with the As an example, take the following Prisma schema with a `User` and `Post` model as a starting point: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) title String @db.VarChar(255) @@ -69,7 +69,7 @@ You will need to create the down migration first, before creating the correspond 1. Edit your Prisma schema to make the changes you require for your up migration. In this example, you will add a new `Profile` model: - ```prisma file=schema.prisma highlight=8-14;add|20;add + ```prisma file=schema.prisma highlight=8-14;add|20;add showLineNumbers model Post { id Int @id @default(autoincrement()) title String @db.VarChar(255) @@ -77,6 +77,7 @@ You will need to create the down migration first, before creating the correspond author User @relation(fields: [authorId], references: [id]) authorId Int } + //add-start model Profile { id Int @id @default(autoincrement()) @@ -84,11 +85,13 @@ You will need to create the down migration first, before creating the correspond user User @relation(fields: [userId], references: [id]) userId Int @unique } + //add-end model User { id Int @id @default(autoincrement()) name String? posts Post[] + //add-next-line profile Profile? } ``` diff --git a/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx b/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx index 98dd67e26f..a545b687aa 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/70-patching-and-hotfixing.mdx @@ -1,7 +1,7 @@ --- title: Patching & hotfixing -navTitle: Patching & hotfixing -metaDescription: How to reconcile the migration history after applying a hotfix or patch to a production environment. +sidebar_label: Patching & hotfixing +description: How to reconcile the migration history after applying a hotfix or patch to a production environment. --- @@ -10,7 +10,7 @@ Patching or hotfixing a database involves making an often time critical change d Patching the production database directly results in **schema drift**: your database schema has 'drifted away' from the source of truth, and is out of sync with your migration history. You can use the `prisma migrate resolve` command to reconcile your migration history _without_ having to remove and re-apply the hotfix with `prisma migrate deploy`. - + This guide **does not apply for MongoDB**.
Instead of `migrate dev`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). @@ -122,9 +122,9 @@ The following example demonstrates how to manually complete the steps of a migra prisma migrate resolve --applied "20201127134938_my_migration" ``` -## Fixing failed migrations with migrate diff and db execute +## Fixing failed migrations with `migrate diff` and `db execute` -To help with fixing a failed migration, Prisma provides the following commands for creating and executing a migration file: +To help with fixing a failed migration, Prisma ORM provides the following commands for creating and executing a migration file: - [`prisma migrate diff`](/orm/reference/prisma-cli-reference#migrate-diff) which diffs two database schema sources to create a migration taking one to the state of the second. You can output either a summary of the difference or a sql script. The script can be output into a file via `> file_name.sql` or be piped to the `db execute --stdin` command. - [`prisma db execute`](/orm/reference/prisma-cli-reference#db-execute) which applies a SQL script to the database without interacting with the Prisma migrations table. @@ -137,7 +137,7 @@ This section gives an example scenario of a failed migration, and explains how t Imagine that you have the following `User` model in your schema, in both your local development environment and your production environment: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id Int @id name String @@ -148,7 +148,7 @@ At this point, your schemas are in sync, but the data in the two environments is You then decide to make changes to your data model, adding another `Post` model and making the `name` field on `User` unique: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id Int @id name String @unique diff --git a/content/200-orm/300-prisma-migrate/300-workflows/80-unsupported-database-features.mdx b/content/200-orm/300-prisma-migrate/300-workflows/80-unsupported-database-features.mdx index d22ac1b1fb..4abcb9a847 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/80-unsupported-database-features.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/80-unsupported-database-features.mdx @@ -1,7 +1,7 @@ --- title: Unsupported database features metaTitle: Unsupported database features -metaDescription: How to include unsupported database features for projects that use Prisma Migrate. +description: How to include unsupported database features for projects that use Prisma Migrate. --- @@ -15,13 +15,13 @@ Prisma Migrate uses the Prisma schema to determine what features to create in th To add an unsupported feature to your database, you must [customize a migration](/orm/prisma-migrate/workflows/customizing-migrations) to include that feature before you apply it. - +:::tip The Prisma schema is able to represent [unsupported field types](/orm/prisma-schema/data-model/unsupported-database-features#unsupported-field-types) and [native database functions](/orm/prisma-migrate/workflows/native-database-functions). - +::: - + This guide **does not apply for MongoDB**.
Instead of `migrate dev`, [`db push`](/orm/prisma-migrate/workflows/prototyping-your-schema) is used for [MongoDB](/orm/overview/databases/mongodb). diff --git a/content/200-orm/300-prisma-migrate/300-workflows/90-development-and-production.mdx b/content/200-orm/300-prisma-migrate/300-workflows/90-development-and-production.mdx index b84c774059..b50d413af7 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/90-development-and-production.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/90-development-and-production.mdx @@ -1,7 +1,7 @@ --- title: 'Development and production' metaTitle: 'Development and production' -metaDescription: 'Development and production' +description: 'Development and production' tocDepth: 3 --- @@ -21,7 +21,7 @@ npx prisma migrate dev ### Create and apply migrations - + `migrate dev` is a development command and should never be used in a production environment. @@ -48,7 +48,7 @@ You can also `reset` the database yourself to undo manual changes or `db push` e npx prisma migrate reset ``` - + `migrate reset` is a development command and should never be used in a production environment. diff --git a/content/200-orm/300-prisma-migrate/300-workflows/index.mdx b/content/200-orm/300-prisma-migrate/300-workflows/index.mdx index fcdb1e427e..a9a6e4cc75 100644 --- a/content/200-orm/300-prisma-migrate/300-workflows/index.mdx +++ b/content/200-orm/300-prisma-migrate/300-workflows/index.mdx @@ -1,9 +1,12 @@ --- title: 'Workflows' metaTitle: 'Workflows' -metaDescription: 'Learn about important Prisma Migrate workflows, like seeding, prototyping, baselining, & more.' +description: 'Learn about important Prisma Migrate workflows, like seeding, prototyping, baselining, & more.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/300-prisma-migrate/_category_.json b/content/200-orm/300-prisma-migrate/_category_.json new file mode 100644 index 0000000000..fc1ab2e766 --- /dev/null +++ b/content/200-orm/300-prisma-migrate/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Prisma Migrate", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/300-prisma-migrate/index.mdx b/content/200-orm/300-prisma-migrate/index.mdx index 2dae4d4947..da9b451785 100644 --- a/content/200-orm/300-prisma-migrate/index.mdx +++ b/content/200-orm/300-prisma-migrate/index.mdx @@ -1,9 +1,9 @@ --- title: 'Prisma Migrate' metaTitle: 'Prisma Migrate | Database, Schema, SQL Migration Tool' -metaDescription: 'Prisma Migrate is a database migration tool available via the Prisma CLI that integrates with Prisma schema for data modeling.' +description: 'Prisma Migrate is a database migration tool available via the Prisma CLI that integrates with Prisma schema for data modeling.' staticLink: true -toc: false +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/400-tools/05-prisma-cli.mdx b/content/200-orm/400-tools/05-prisma-cli.mdx index 7010a28f38..31a499d848 100644 --- a/content/200-orm/400-tools/05-prisma-cli.mdx +++ b/content/200-orm/400-tools/05-prisma-cli.mdx @@ -1,8 +1,9 @@ --- title: 'Prisma CLI' metaTitle: 'Prisma CLI' -metaDescription: 'The Prisma command line interface (CLI) is the primary way to interact with your Prisma project from the command line.' +description: 'The Prisma command line interface (CLI) is the primary way to interact with your Prisma project from the command line.' toc: true +toc_max_heading_level: 2 --- @@ -192,7 +193,7 @@ All `prisma` CLI commands return the following codes when they exit: - exit code 0 when a command runs successfully - exit code 1 when a command errors -- exit code 130 when the CLI receives a signal interrupt (SIGINT) message or if the user cancels a prompt. This exit code is available in Prisma versions 4.3.0 and later. +- exit code 130 when the CLI receives a signal interrupt (SIGINT) message or if the user cancels a prompt. This exit code is available in Prisma ORM versions 4.3.0 and later. ## Telemetry diff --git a/content/200-orm/400-tools/06-prisma-studio.mdx b/content/200-orm/400-tools/06-prisma-studio.mdx index d86da69998..32fa773e3b 100644 --- a/content/200-orm/400-tools/06-prisma-studio.mdx +++ b/content/200-orm/400-tools/06-prisma-studio.mdx @@ -1,9 +1,18 @@ --- title: 'Prisma Studio' metaTitle: 'Prisma Studio' -metaDescription: 'Prisma Studio is a visual database editor.' +description: 'Prisma Studio is a visual database editor.' +toc_max_heading_level: 2 --- +import StudioStringSvg from './images/prisma-studio/string.svg'; +import StudioNumberSvg from './images/prisma-studio/number.svg'; +import StudioDatetimeSvg from './images/prisma-studio/datetime.svg'; +import StudioBooleanSvg from './images/prisma-studio/boolean.svg'; +import StudioEnumSvg from './images/prisma-studio/enum.svg'; +import StudioArraySvg from './images/prisma-studio/array.svg'; +import StudioObjectSvg from './images/prisma-studio/object.svg'; + Prisma Studio is a visual editor for the data in your database. Note that Prisma Studio is not open source but you can still create issues in the [`prisma/studio`](https://github.com/prisma/studio) repo. @@ -18,7 +27,7 @@ When you first open Prisma Studio, you see a list of all models defined in your -**What is a model?**

+**What is a model?**
The term **model** refers to the data model definitions that you add to the Prisma schema file. Depending on the database that you use, a model definition, such as `model User`, refers to a **table** in a relational database (PostgreSQL, MySQL, SQL Server, SQLite, CockroachDB) or a **collection** in MongoDB.

For more information, see [Defining models](/orm/prisma-schema/data-model/models#defining-models). @@ -28,8 +37,9 @@ For more information, see [Defining models](/orm/prisma-schema/data-model/models You can select a model and its data opens in a new tab. Prisma Studio - Models view ### Open and close models @@ -39,7 +49,7 @@ To open another model, click the **+** button. To close a model, click the the **x** button in the model tab. Prisma Studio - Open and close models @@ -50,15 +60,15 @@ The data type for each field is indicated with an icon in the header. The table below lists all data types and their identifying icon. -| Field data type | Description | -| :-------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------- | -| String type | Text | -| Number type | Integer | -| Datetime type | Date-time

| -| Boolean type | Boolean
| -| Enum type | Pre-defined list of values (`enum` data type) | -| Array type | List of related records from another model | -| Object type | The `{}` symbol can refer to one of the two types of fields.

• Relation field
• JSON field | +| Field data type | Description | +| :-------------------------------------------------------------------------------: | ------------------------------------ | +| | Text | +| | Integer | +| | Date-time

| +| | Boolean
| +| | Pre-defined list of values (`enum` data type) | +| | List of related records from another model | +| | The `{}` symbol can refer to one of the two types of fields.

• Relation field
• JSON field | ### Keyboard shortcuts in models @@ -66,13 +76,12 @@ When you open a model, a number of keyboard shortcuts are available to browse an -**Note**

With Prisma Studio open, you can open the keyboard shortcuts modal by pressing Cmd ⌘+/ on macOS or Ctrl+/ on Windows.
Prisma Studio - Keyboard shortcuts @@ -108,15 +117,15 @@ To paste in another cell, first double-click the cell to enter edit mode, and th 1. In the model view, click **Add record**. 2. Based on the data allowed in each field, type the data for the record. - | Field data type | Description | - | :-------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | String type | Text | - | Number type | Integer

If such a field has `autoincrement()` pre-filled, do not edit the cell and do not add a number manually. | - | Datetime type | Date-time

Date-time fields contain a long string of numbers, letters, and others. As a best practice, copy the value of another date-time cell and modify it as necessary before pasting in the field. | - | Boolean type | Boolean

Select `true` or `false`. | - | Enum type | Pre-defined list

Double-click a cell in the field and select one of the pre-defined options. | - | Array type | List of related records from another model

It typically refers to a list of records that exist in another model in the database. If you are adding a new record and records from the related model do not yet exist, you do not need to enter anything in the current model. | - | Object type | The `{}` symbol can refer to one of the two types of fields.

• Relation field
• JSON field

**Relation with a model defined separately in the database**

Typically, you need to select the same value as any of the previous records
Click the name of the model to see the list of values which you can then select for the related field.

**JSON field**

Double-click the field to edit the JSON data. As a best practice, validate the edited JSON data in a validator and paste it back in the cell. | + | Field data type | Description | + | :-------------------------------------------------------------------------------: | ------------------ | + | | Text | + | | Integer

If such a field has `autoincrement()` pre-filled, do not edit the cell and do not add a number manually. | + | | Date-time

Date-time fields contain a long string of numbers, letters, and others. As a best practice, copy the value of another date-time cell and modify it as necessary before pasting in the field. | + | | Boolean

Select `true` or `false`. | + | | Pre-defined list

Double-click a cell in the field and select one of the pre-defined options. | + | | List of related records from another model

It typically refers to a list of records that exist in another model in the database. If you are adding a new record and records from the related model do not yet exist, you do not need to enter anything in the current model. | + | | The `{}` symbol can refer to one of the two types of fields.

• Relation field
• JSON field

**Relation with a model defined separately in the database**

Typically, you need to select the same value as any of the previous records
Click the name of the model to see the list of values which you can then select for the related field.

**JSON field**

Double-click the field to edit the JSON data. As a best practice, validate the edited JSON data in a validator and paste it back in the cell. | 3. (Optional) If you are unhappy with your changes, click **Discard changes** and start over. 4. Click **Save 1 change**. @@ -146,10 +155,7 @@ Deleting a record is a separate operation that cannot be accumulated. If you del
-Prisma Studio - Save multiple data edits +![Prisma Studio - Save multiple data edits](./images/prisma-studio/04-save-multiple-changes.png) ## Filters @@ -166,10 +172,7 @@ When you add multiple conditions, Prisma Studio filters the results so that all 1. Click **Filters** to open the **Filters** menu. - - **Note**

Click **Filters** again if you want to hide the menu. -
2. Click **Add a new filter**. @@ -189,7 +192,7 @@ When you add multiple conditions, Prisma Studio filters the results so that all 4. To add a new filter, click **Add a new filter** and repeat the steps above. 5. To remove a filter, click the **x** button on the right. Prisma Studio - add and remove filters @@ -206,9 +209,9 @@ You can select which fields to view or hide by using the **Fields** menu. -**What is a field?**

+**What is a field?**
-A **field** is a property of a model which you add in the data model definitions in the Prisma schema file. Depending on the database that you use, a field, such as the `title` field in `model User { title String }`, refers to a **column** in a relational database (PostgreSQL, MySQL, SQL Server, SQLite, CockroachDB) or a **document field** in MongoDB.

+A **field** is a property of a model which you add in the data model definitions in the Prisma schema file. Depending on the database that you use, a field, such as the `title` field in `model User { title String }`, refers to a **column** in a relational database (PostgreSQL, MySQL, SQL Server, SQLite, CockroachDB) or a **document field** in MongoDB.
For more information, see [Defining fields](/orm/prisma-schema/data-model/models#defining-fields).
@@ -218,7 +221,7 @@ For more information, see [Defining fields](/orm/prisma-schema/data-model/models 1. Click the **Fields** menu. 2. Select only the fields you want to see and deselect any fields you want to hide. Prisma Studio - show and hide fields @@ -235,7 +238,7 @@ You can also select to show or skip a specific number of records in the model vi -**What is a record?**

+**What is a record?**
A **record** refers to a **row of data in a table** in a relational database (PostgreSQL, MySQL, SQL Server, SQLite, CockroachDB) or a **document** in MongoDB. @@ -247,7 +250,7 @@ A **record** refers to a **row of data in a table** in a relational database (Po 2. In the **Take** box, specify the maximum number of records that you want the model view to show. 3. In the **Skip** box, specify how many of the first records you want to hide. Prisma Studio - Show and hide records @@ -265,7 +268,7 @@ Click a field title to sort by the field data. The first click sorts the data in ascending order, the second - in descending order. Prisma Studio - Sort data @@ -276,7 +279,7 @@ The first click sorts the data in ascending order, the second - in descending or Caching issues may cause Prisma Studio to use an older version of the query engine. You may see the following error: -``` +```terminal wrap Error in request: PrismaClientKnownRequestError: Failed to validate the query Error occurred during query validation & transformation ``` diff --git a/content/200-orm/400-tools/_category_.json b/content/200-orm/400-tools/_category_.json new file mode 100644 index 0000000000..7453ee16c0 --- /dev/null +++ b/content/200-orm/400-tools/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tools", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/400-tools/index.mdx b/content/200-orm/400-tools/index.mdx index 28dc9f58de..1f58213d72 100644 --- a/content/200-orm/400-tools/index.mdx +++ b/content/200-orm/400-tools/index.mdx @@ -1,9 +1,9 @@ --- title: 'Tools' metaTitle: 'Tools' -metaDescription: 'Learn about important Prisma tools.' +description: 'Learn about important Prisma tools.' staticLink: true -toc: false +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/500-reference/050-prisma-client-reference.mdx b/content/200-orm/500-reference/050-prisma-client-reference.mdx index 26bf6dc072..f9ea4c96d6 100644 --- a/content/200-orm/500-reference/050-prisma-client-reference.mdx +++ b/content/200-orm/500-reference/050-prisma-client-reference.mdx @@ -1,8 +1,8 @@ --- title: 'Prisma Client API reference' -navTitle: 'Prisma Client API' +sidebar_label: 'Prisma Client API' metaTitle: 'Prisma Client API' -metaDescription: 'API reference documentation for Prisma Client.' +description: 'API reference documentation for Prisma Client.' tocDepth: 3 toc: true --- @@ -54,7 +54,7 @@ All example generated types (such as `UserSelect` and `UserWhereUniqueInput`) ar
-## PrismaClient +## `PrismaClient` This section describes the `PrismaClient` constructor and its parameters. @@ -62,7 +62,7 @@ This section describes the `PrismaClient` constructor and its parameters. - Parameters are validated at runtime. -### datasources +### `datasources` Programmatically overrides properties of the `datasource` block in the `schema.prisma` file - for example, as part of an integration test. See also: [Data sources](/orm/prisma-schema/overview/data-sources) @@ -104,7 +104,7 @@ datasource db { } ``` -### datasourceUrl +### `datasourceUrl` Programmatically overrides the [`datasource`](#datasources) block in the `schema.prisma` file. @@ -124,7 +124,7 @@ const prisma = new PrismaClient({ }) ``` -### log +### `log` Determines the type and level of logging. See also: [Logging](/orm/prisma-client/observability-and-logging/logging) @@ -330,9 +330,9 @@ main() -### errorFormat +### `errorFormat` -Determines the level and formatting of errors returned by Prisma. +Determines the level and formatting of errors returned by Prisma Client. #### Error formats @@ -377,7 +377,7 @@ const prisma = new PrismaClient({ }) ``` -### adapter +### `adapter` Defines an instance of a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters). See also [Database drivers](/orm/overview/databases/database-drivers) . @@ -389,7 +389,7 @@ This is available from version 5.4.0 and newer behind the `driverAdapters` featu #### Example -The example below uses the [Neon driver adapter](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-preview) +The example below uses the [Neon driver adapter](/orm/overview/databases/neon#how-to-use-neons-serverless-driver-with-prisma-orm-preview) ```ts import { Pool, neonConfig } from '@neondatabase/serverless' @@ -407,7 +407,7 @@ const adapter = new PrismaNeon(pool) const prisma = new PrismaClient({ adapter }) ``` -### rejectOnNotFound +### `rejectOnNotFound` @@ -467,11 +467,45 @@ const prisma = new PrismaClient({ }) ``` +### `transactionOptions` + + + +**Note**: `transactionOptions` was introduced in v5.10.0. + + + +Allows to set [transaction options](/orm/prisma-client/queries/transactions#transaction-options) globally on the constructor level. + +#### Remarks + +- The transaction levels can be overridden on a per-transaction level. + +#### Options + +| Option | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `maxWait` | The maximum amount of time Prisma Client will wait to acquire a transaction from the database. The default value is 2 seconds. | +| `timeout` | The maximum amount of time the interactive transaction can run before being canceled and rolled back. The default value is 5 seconds. | +| `isolationLevel` | Sets the [transaction isolation level](/orm/prisma-client/queries/transactions#transaction-isolation-level). By default this is set to the value currently configured in your database. The available can vary depending on the database you use. | + +#### Example + +```ts +const prisma = new PrismaClient({ + transactionOptions: { + isolationLevel: Prisma.TransactionIsolationLevel.Serializable, + maxWait: 5000, // default: 2000 + timeout: 10000, // default: 5000 + }, +}) +``` + ## Model queries Use model queries to perform CRUD operations on your models. See also: [CRUD](/orm/prisma-client/queries/crud) -### findUnique() +### `findUnique()` `findUnique` query lets you retrieve a single database record: @@ -482,7 +516,7 @@ Use model queries to perform CRUD operations on your models. See also: [CRUD](/o #### Remarks -- Prisma's dataloader [automatically batches `findUnique` queries](/orm/prisma-client/queries/query-optimization-performance#solving-n1-in-graphql-with-findunique-and-prismas-dataloader) with the same `select` and `where` parameters. +- Prisma Client's dataloader [automatically batches `findUnique` queries](/orm/prisma-client/queries/query-optimization-performance#solving-n1-in-graphql-with-findunique-and-prisma-clients-dataloader) with the same `select` and `where` parameters. - If you want the query to throw an error if the record is not found, then consider using [`findUniqueOrThrow`](#finduniqueorthrow) instead. - You cannot use [filter conditions](#filter-conditions-and-operators) (e.g. `equals`, `contains`, `not`) to filter fields of the [JSON](/orm/reference/prisma-schema-reference#json) data type. Using filter conditions will likely result in a `null` response for that field. @@ -529,7 +563,9 @@ const result = await prisma.user.findUnique({ ##### Get the `User` record with `firstName` of `Alice` and `lastName` of `Smith` (`@@unique`) -
Expand for example User model with a @@unique block +
+ +Expand for example User model with a @@unique block ```prisma model User { @@ -556,7 +592,9 @@ const result = await prisma.user.findUnique({ ##### Get the `User` record with `firstName` of `Alice` and `lastName` of `Smith` (`@@id`) -
Expand for example User model with an @@id block +
+ +Expand for example User model with an @@id block ```prisma model User { @@ -580,7 +618,7 @@ const result = await prisma.user.findUnique({ }) ``` -### findUniqueOrThrow() +### `findUniqueOrThrow()` @@ -602,7 +640,7 @@ We introduced `findUniqueOrThrow` in v4.0.0. It replaces the [`rejectOnNotFound` }) ``` -### findFirst() +### `findFirst()` `findFirst` returns the first record in a list that matches your criteria. @@ -687,9 +725,7 @@ async function main() { main() ``` -### findFirstOrThrow() - - +### `findFirstOrThrow()` @@ -711,9 +747,7 @@ We introduced `findFirstOrThrow` in v4.0.0. It replaces the [`rejectOnNotFound`] }) ``` -### findMany() - - +### `findMany()` `findMany` returns a list of records. @@ -751,7 +785,7 @@ const user = await prisma.user.findMany({ }) ``` -### create() +### `create()` `create` creates a new database record. @@ -857,7 +891,7 @@ prisma:query COMMIT -### update() +### `update()` `update` updates an existing database record. @@ -895,7 +929,7 @@ const user = await prisma.user.update({ }) ``` -### upsert() +### `upsert()` @@ -930,7 +964,7 @@ This section covers the usage of the `upsert()` operation. To learn about using - To perform arithmetic operations on update (add, subtract, multiply, divide), use [atomic updates](#atomic-number-operations) to prevent race conditions. - If two or more upsert operations happen at the same time and the record doesn't already exist, then a race condition might happen. As a result, one or more of the upsert operations might throw a unique key constraint error. Your application code can catch this error and retry the operation. [Learn more](#unique-key-constraint-errors-on-upserts). -- From version 4.6.0, Prisma hands over upsert queries to the database where possible. [Learn more](#database-upserts). +- From version 4.6.0, Prisma ORM hands over upsert queries to the database where possible. [Learn more](#database-upserts). #### Examples @@ -952,10 +986,10 @@ If multiple upsert operations happen at the same time and the record doesn't alr ##### Cause -When Prisma does an upsert, it first checks whether that record already exists in the database. To make this check, Prisma performs a read operation with the `where` clause from the upsert operation. This has two possible outcomes, as follows: +When Prisma Client does an upsert, it first checks whether that record already exists in the database. To make this check, Prisma Client performs a read operation with the `where` clause from the upsert operation. This has two possible outcomes, as follows: -- If the record does not exist, then Prisma creates that record. -- If the record exists, then Prisma updates it. +- If the record does not exist, then Prisma Client creates that record. +- If the record exists, then Prisma Client updates it. When your application tries to perform two or more concurrent upsert operations, then a race condition might happen where two or more operations do not find the record and therefore try to create that record. In this situation, one of the operations successfully creates the new record but the other operations fail and return a unique key constraint error. @@ -969,7 +1003,7 @@ Where possible, Prisma Client hands over an `upsert` query to the database. This Database upserts have the following advantages: -- They are faster than upserts handled by Prisma +- They are faster than upserts handled by Prisma Client - [Unique key constraint errors](#unique-key-constraint-errors-on-upserts) cannot happen Prisma Client uses a database upsert automatically when [specific criteria](#database-upsert-query-criteria) are met. When these criteria are not met, Prisma Client handles the `upsert`. @@ -980,7 +1014,7 @@ To use a database upsert, Prisma Client sends the SQL construction [`INSERT ... Prisma Client can use database upserts if your stack meets the following criteria: -- You use Prisma version 4.6.0 or later +- You use Prisma ORM version 4.6.0 or later - Your application uses a CockroachDB, PostgreSQL, or SQLite data source ##### Database upsert query criteria @@ -1106,7 +1140,7 @@ prisma.user.upsert({ }) ``` -### delete() +### `delete()` `delete` deletes an existing database record. You can delete a record: @@ -1178,7 +1212,7 @@ const deleteUser = await prisma.user.delete({ -### createMany() +### `createMany()` `createMany` creates multiple records in a transaction. @@ -1215,7 +1249,7 @@ const users = await prisma.user.createMany({ }) ``` -### updateMany() +### `updateMany()` `updateMany` updates a batch of existing database records in bulk and returns the number of updated records. @@ -1271,7 +1305,7 @@ const deleteUser = await prisma.user.updateMany({ }) ``` -### deleteMany() +### `deleteMany()` `deleteMany` deletes multiple records in a transaction. @@ -1311,7 +1345,7 @@ const deletedUserCount = await prisma.user.deleteMany({ See [Filter conditions and operators](#filter-conditions-and-operators) for examples of how to filter the records to delete. -### count() +### `count()` #### Options @@ -1370,7 +1404,7 @@ const c = await prisma.user.count({ }) ``` -### aggregate() +### `aggregate()` See also: [Aggregation, grouping, and summarizing](/orm/prisma-client/queries/aggregation-grouping-summarizing#aggregate) @@ -1451,7 +1485,7 @@ const setValue = await prisma.user.aggregate({ -### groupBy() +### `groupBy()` See also: [Aggregation, grouping, and summarizing](/orm/prisma-client/queries/aggregation-grouping-summarizing#group-by) @@ -1534,7 +1568,7 @@ const groupUsers = await prisma.user.groupBy({ ## Model query options -### select +### `select` `select` defines which fields are included in the object that Prisma Client returns. See: [Select fields and include relations](/orm/prisma-client/queries/select-fields) . @@ -1767,7 +1801,7 @@ const selectNameEmailNotPosts = Prisma.validator()({ }) ``` -### include +### `include` `include` defines which relations are included in the result that Prisma Client returns. See: [Select fields and include relations](/orm/prisma-client/queries/select-fields) . @@ -1855,11 +1889,11 @@ const usersWithCount = await prisma.user.findMany({ -### relationLoadStrategy (Preview) +### `relationLoadStrategy` (Preview) `relationLoadStrategy` specifies how a relation should be loaded from the database. It has two possible values: -- `join` (default): Uses a database-level `LATERAL JOIN` and fetches all data with a single query to the database. +- `join` (default): Uses a database-level `LATERAL JOIN` (PostgreSQL) or correlated subqueries (MySQL) and fetches all data with a single query to the database. - `query`: Sends multiple queries to the database (one per table) and joins them on the application level. > **Note**: Once `relationLoadStrategy` moves from [Preview](/orm/more/releases#preview) into [General Availability](/orm/more/releases/#generally-available-ga), `join` will universally become the default for all relation queries. @@ -1875,7 +1909,7 @@ generator client { } ``` -After adding this flag, you need to run `prisma generate` again to re-generate Prisma Client. Also note that this feature is currently only available on PostgreSQL and CockroachDB, support for other DBs is coming soon. +After adding this flag, you need to run `prisma generate` again to re-generate Prisma Client. This feature is currently available on PostgreSQL, CockroachDB and MySQL. #### Remarks @@ -1906,7 +1940,7 @@ const users = await prisma.user.findMany({ }) ``` -### where +### `where` `where` defines one or more [filters](#filter-conditions-and-operators), and can be used to filter on record properties (like a user's email address) or related record properties (like a user's top 10 most recent post titles). @@ -2018,7 +2052,7 @@ const whereEmailIsUnique = Prisma.validator()({ }) ``` -### orderBy +### `orderBy` Sorts a list of records. See also: [Sorting](/orm/prisma-client/queries/filtering-and-sorting) @@ -2030,14 +2064,14 @@ Sorts a list of records. See also: [Sorting](/orm/prisma-client/queries/filterin - In [4.1.0](https://github.com/prisma/prisma/releases/4.1.0) and later, you can [sort `null` records first or last](#sort-post-by-the-related-user-records-name-with-null-records-first). For details, see [Sort with nulls first or last](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last). -#### Inputs for sort argument +#### Inputs for `sort` argument | Name | Description | | ------ | ---------------------------- | | `asc` | Sort ascending (A → Z) | | `desc` | Sort descending (Z → A) | -#### Inputs for nulls argument +#### Inputs for `nulls` argument Note: @@ -2518,7 +2552,7 @@ The following examples demonstrate how to use the [`validator`](/orm/prisma-clie }) ``` -### distinct +### `distinct` Deduplicate a list of records from [`findMany`](#findmany) or [`findFirst`](#findfirst). See also: [Aggregation, grouping, and summarizing](/orm/prisma-client/queries/aggregation-grouping-summarizing#select-distinct) @@ -2633,7 +2667,7 @@ const distinctCitiesAndCountries = await prisma.user.findMany({ ## Nested queries -### create +### `create` A nested `create` query adds a new related record or set of records to a parent record. See: [Working with relations](/orm/prisma-client/queries/relation-queries) . @@ -2734,17 +2768,18 @@ const user = await prisma.user.update({ }) ``` -### createMany +### `createMany` A nested `createMany` query adds a new set of records to a parent record. See: [Working with relations](/orm/prisma-client/queries/relation-queries) . #### Remarks - `createMany` is available as a nested query when you `create` (`prisma.user.create(...)`) a new parent record or `update` (`prisma.user.update(...)`) an existing parent record. -- Available in the context of a has-many relation - for example, you can `prisma.user.create(...)` a user and use a nested `createMany` to create multiple posts (posts have one user). -- **Not** available in the context of a many-to-many relation - for example, you **cannot** `prisma.post.create(...)` a post and use a nested `createMany` to create categories (many posts have many categories). -- Does not support nesting additional relations - you cannot nest an additional `create` or `createMany`. -- Allows setting foreign keys directly - for example, setting the `categoryId` on a post. +- Available in the context of a one-to-many relation — for example, you can `prisma.user.create(...)` a user and use a nested `createMany` to create multiple posts (posts have one user). +- **Not** available in the context of a many-to-many relation — for example, you **cannot** `prisma.post.create(...)` a post and use a nested `createMany` to create categories (many posts have many categories). +- Does not support nesting additional relations — you cannot nest an additional `create` or `createMany`. +- Allows setting foreign keys directly — for example, setting the `categoryId` on a post. +- Nested `createMany` is not supported by SQLite. > You can use a nested `create` _or_ a nested `createMany` to create multiple related records - [each technique pros and cons](/orm/prisma-client/queries/relation-queries#create-a-single-record-and-multiple-related-records) . @@ -2768,7 +2803,7 @@ const user = await prisma.user.update({ }) ``` -### set +### `set` `set` overwrites the value of a relation - for example, replacing a list of `Post` records with a different list. See: [Working with relations](/orm/prisma-client/queries/relation-queries) @@ -2787,9 +2822,7 @@ const user = await prisma.user.update({ }) ``` -### connect - - +### `connect` A nested `connect` query connects a record to an existing related record by specifying an ID or unique identifier. See: [Working with relations](/orm/prisma-client/queries/relation-queries) @@ -2880,9 +2913,7 @@ const user = await prisma.user.update({ }) ``` -### connectOrCreate - - +### `connectOrCreate` `connectOrCreate` _either_ connects a record to an existing related record by ID or unique identifier _or_ creates a new related record if the record does not exist. See: [Working with relations](/orm/prisma-client/queries/relation-queries) @@ -2892,8 +2923,8 @@ const user = await prisma.user.update({ - Multiple `connectOrCreate` queries that run _as concurrent transactions_ can result in a **race condition**. Consider the following example, where two queries attempt to `connectOrCreate` a blog post tag named `computing` at the same time (tag names must be unique): - , ]}> - + + ```ts const createPost = await prisma.post.create({ @@ -2919,8 +2950,8 @@ const user = await prisma.user.update({ }) ``` - - + + ```ts const createPost = await prisma.post.create({ @@ -2946,7 +2977,7 @@ const user = await prisma.user.update({ }) ``` - + If query A and query B overlap in the following way, query A results in an exception: @@ -3048,9 +3079,7 @@ const user = await prisma.user.update({ }) ``` -### disconnect - - +### `disconnect` A nested `disconnect` query breaks the connection between a parent record and a related record, but does not delete either record. See: [Working with relations](/orm/prisma-client/queries/relation-queries) @@ -3094,9 +3123,7 @@ const user = await prisma.user.update({ }) ``` -### update - - +### `update` A nested `update` query updates one or more related records where the parent record's ID is `n`. See: [Working with relations](/orm/prisma-client/queries/relation-queries#update-a-specific-related-record) @@ -3152,9 +3179,7 @@ const user = await prisma.user.update({ }) ``` -### upsert - - +### `upsert` @@ -3206,9 +3231,7 @@ const user = await prisma.user.update({ }) ``` -### delete - - +### `delete` A nested `delete` query deletes a related record. The parent record is not deleted. @@ -3244,9 +3267,7 @@ const user = await prisma.user.update({ }) ``` -### updateMany - - +### `updateMany` A nested `updateMany` updates a list of related records and supports filtering - for example, you can update a user's unpublished posts. @@ -3274,9 +3295,7 @@ const result = await prisma.user.update({ }) ``` -### deleteMany - - +### `deleteMany` A nested `deleteMany` deletes related records and supports filtering. For example, you can delete a user's posts while updating other properties of that user. @@ -3307,7 +3326,7 @@ const result = await prisma.user.update({ -### equals +### `equals` Value equals `n`. @@ -3335,7 +3354,7 @@ const result = await prisma.user.findMany({ }) ``` -### not +### `not` Value does not equal `n`. @@ -3353,7 +3372,7 @@ const result = await prisma.user.findMany({ }) ``` -### in +### `in` Value `n` exists in list. @@ -3420,7 +3439,7 @@ const getUser = await prisma.user.findMany({ }) ``` -### notIn +### `notIn` Value `n` does not exist in list. @@ -3440,7 +3459,7 @@ const getUser = await prisma.user.findMany({ }) ``` -### lt +### `lt` Value `n` is less than `x`. @@ -3458,7 +3477,7 @@ const getPosts = await prisma.post.findMany({ }) ``` -### lte +### `lte` Value `n` is less than _or_ equal to `x`. @@ -3476,7 +3495,7 @@ const getPosts = await prisma.post.findMany({ }) ``` -### gt +### `gt` Value `n` is greater than `x`. @@ -3494,7 +3513,7 @@ const getPosts = await prisma.post.findMany({ }) ``` -### gte +### `gte` Value `n` is greater than _or_ equal to `x`. @@ -3528,7 +3547,7 @@ const result = await prisma.post.findMany({ }) ``` -### contains +### `contains` Value `n` contains `x`. @@ -3560,7 +3579,7 @@ const result = await prisma.post.count({ }) ``` -### search +### `search` Use [Full-Text Search](/orm/prisma-client/queries/full-text-search) to search within a `String` field. @@ -3612,7 +3631,7 @@ const result = await prisma.post.findMany({ }) ``` -### mode +### `mode` #### Remarks @@ -3633,7 +3652,7 @@ const result = await prisma.post.findMany({ }) ``` -### startsWith +### `startsWith` #### Examples @@ -3649,7 +3668,7 @@ const result = await prisma.post.findMany({ }) ``` -### endsWith +### `endsWith` #### Get all `User` records where `email` ends with `prisma.io` @@ -3663,7 +3682,7 @@ const result = await prisma.user.findMany({ }) ``` -### AND +### `AND` All conditions must return `true`. Alternatively, pass a list of objects into the `where` clause - the [`AND` operator is not required](#get-all-post-records-where-the-content-field-contains-prisma-and-published-is-false-no-and). @@ -3733,7 +3752,7 @@ const result = await prisma.post.findMany({ }) ``` -### OR +### `OR` One or more conditions must return `true`. @@ -3814,7 +3833,7 @@ const result = await prisma.post.findMany({ }) ``` -### NOT +### `NOT` All conditions must return `false`. @@ -3884,7 +3903,7 @@ const result = await prisma.post.findMany({ ## Relation filters -### some +### `some` Returns all records where **one or more** ("some") _related_ records match filtering criteria. @@ -3910,7 +3929,7 @@ const result = await prisma.user.findMany({ } ``` -### every +### `every` Returns all records where **all** ("every") _related_ records match filtering criteria. @@ -3930,7 +3949,7 @@ const result = await prisma.user.findMany({ } ``` -### none +### `none` Returns all records where **zero** _related_ records match filtering criteria. @@ -3966,7 +3985,7 @@ const result = await prisma.user.findMany({ } ``` -### is +### `is` Returns all records where related record matches filtering criteria (for example, user's name `is` Bob). @@ -3986,7 +4005,7 @@ const result = await prisma.post.findMany({ } ``` -### isNot +### `isNot` Returns all records where related record matches filtering criteria (for example, user's name `isNot` Bob). @@ -4008,7 +4027,7 @@ const result = await prisma.post.findMany({ ## Scalar list methods -### set +### `set` Use `set` to overwrite the value of a scalar list field. @@ -4065,7 +4084,7 @@ const setTags = await prisma.post.update({ }) ``` -### push +### `push` `push` is available in version [2.20.0](https://github.com/prisma/prisma/releases/2.20.0) and later. Use `push` to add _one_ value or _multiple_ values to a scalar list field. @@ -4104,7 +4123,7 @@ const addTag = await prisma.post.update({ }) ``` -### unset +### `unset` @@ -4150,7 +4169,7 @@ Available for: - Scalar list / array filters [ignore `NULL` values](/orm/prisma-client/special-fields-and-types/working-with-scalar-lists-arrays#null-values-in-arrays) . Using `isEmpty` or `NOT` does not return records with `NULL` value lists / arrays, and `{ equals: null }` results in an error. -### has +### `has` The given value exists in the list. @@ -4182,7 +4201,7 @@ const posts = await client.post.findMany({ }) ``` -### hasEvery +### `hasEvery` Every value exists in the list. @@ -4200,7 +4219,7 @@ const posts = await prisma.post.findMany({ }) ``` -### hasSome +### `hasSome` At least one value exists in the list. @@ -4218,7 +4237,7 @@ const posts = await prisma.post.findMany({ }) ``` -### isEmpty +### `isEmpty` The list is empty. @@ -4236,7 +4255,7 @@ const posts = await prisma.post.findMany({ }) ``` -### isSet +### `isSet` @@ -4261,7 +4280,7 @@ const posts = await prisma.post.findMany({ }) ``` -### equals +### `equals` The list matches the given value exactly. @@ -4289,7 +4308,7 @@ Available for MongoDB only in Prisma `3.10.0` and later. Composite type methods allow you to create, update and delete [composite types](/orm/prisma-client/special-fields-and-types/composite-types). -### set +### `set` Use `set` to overwrite the value of a composite type. @@ -4305,7 +4324,7 @@ Use `set` to overwrite the value of a composite type. #### Examples -##### Set the shippingAddress composite type within a new order +##### Set the `shippingAddress` composite type within a new `order` ```ts const order = await prisma.order.create({ @@ -4326,7 +4345,7 @@ const order = await prisma.order.create({ }) ``` -##### Set an optional composite type to null +##### Set an optional composite type to `null` ```ts const order = await prisma.order.create({ @@ -4339,13 +4358,13 @@ const order = await prisma.order.create({ }) ``` -### unset +### `unset` Use `unset` to unset the value of a composite type. Unlike `set: null`, this removes the field entirely from the MongoDB document. #### Examples -##### Remove the billingAddress from an order +##### Remove the `billingAddress` from an `order` ```ts const order = await prisma.order.update({ @@ -4362,7 +4381,7 @@ const order = await prisma.order.update({ }) ``` -### update +### `update` Use `update` to update fields within a required composite type. @@ -4372,7 +4391,7 @@ The `update` method cannot be used on optional types. Instead, use [upsert](#ups #### Examples -##### Update the zip field of a shippingAddress composite type +##### Update the zip field of a `shippingAddress` composite type ```ts const order = await prisma.order.update({ @@ -4390,7 +4409,7 @@ const order = await prisma.order.update({ }) ``` -### upsert +### `upsert` Use `upsert` to update an existing optional composite type if it exists, and otherwise set the composite type. @@ -4400,7 +4419,7 @@ The `upsert` method cannot be used on required types. Instead, use [update](#upd #### Examples -##### Create a new billingAddress if it doesn't exist, and otherwise update it +##### Create a new `billingAddress` if it doesn't exist, and otherwise update it ```ts const order = await prisma.order.update({ @@ -4426,13 +4445,13 @@ const order = await prisma.order.update({ }) ``` -### push +### `push` Use `push` to push values to the end of a list of composite types. #### Examples -##### Add a new photo to the photos list +##### Add a new photo to the `photos` list ```ts const product = prisma.product.update({ @@ -4458,7 +4477,7 @@ Available for MongoDB only in Prisma `3.11.0` and later. Composite type filters allow you to filter the contents of [composite types](/orm/prisma-client/special-fields-and-types/composite-types). -### equals +### `equals` Use `equals` to filter results by matching a composite type or a list of composite types. Requires all required fields of the composite type to match. @@ -4476,7 +4495,7 @@ The ordering of fields and lists matters when using `equals`: #### Examples -##### Find orders that exactly match the given shippingAddress +##### Find orders that exactly match the given `shippingAddress` ```ts const orders = await prisma.order.findMany({ @@ -4492,7 +4511,7 @@ const orders = await prisma.order.findMany({ }) ``` -##### Find products with photos that match all of a list of urls +##### Find products with photos that match all of a list of `url`s ```ts const product = prisma.product.findMany({ @@ -4504,13 +4523,13 @@ const product = prisma.product.findMany({ }) ``` -### is +### `is` Use `is` to filter results by matching specific fields within composite types. #### Examples -##### Find orders with a shippingAddress that matches the given street name +##### Find orders with a `shippingAddress` that matches the given street name ```ts const orders = await prisma.order.findMany({ @@ -4524,13 +4543,13 @@ const orders = await prisma.order.findMany({ }) ``` -### isNot +### `isNot` Use `isNot` to filter results for composite type fields that do not match. #### Examples -##### Find orders with a shippingAddress that does not match the given zip code +##### Find orders with a `shippingAddress` that does not match the given zip code ```ts const orders = await prisma.order.findMany({ @@ -4544,7 +4563,7 @@ const orders = await prisma.order.findMany({ }) ``` -### isEmpty +### `isEmpty` Use `isEmpty` to filter results for an empty list of composite types. @@ -4562,13 +4581,13 @@ const product = prisma.product.findMany({ }) ``` -### every +### `every` Use `every` to filter for lists of composite types where every item in the list matches the condition #### Examples -##### Find the first product where every photo has a height of 200 +##### Find the first product where every photo has a `height` of `200` ```ts const product = prisma.product.findFirst({ @@ -4582,13 +4601,13 @@ const product = prisma.product.findFirst({ }) ``` -### some +### `some` Use `some` to filter for lists of composite types where one or more items in the list match the condition. #### Examples -##### Find the first product where one or more photos have a url of 2.jpg +##### Find the first product where one or more photos have a `url` of `2.jpg` ```ts const product = prisma.product.findFirst({ @@ -4602,13 +4621,13 @@ const product = prisma.product.findFirst({ }) ``` -### none +### `none` Use `none` to filter for lists of composite types where no items in the list match the condition. #### Examples -##### Find the first product where no photos have a url of 2.jpg +##### Find the first product where no photos have a `url` of `2.jpg` ```ts const product = prisma.product.findFirst({ @@ -4627,7 +4646,9 @@ const product = prisma.product.findFirst({ Atomic operations on update is available for number field types (`Float` and `Int`). This feature allows you to update a field based on its **current** value (such as _subtracting_ or _dividing_) without risking a race condition. -
Overview: Race conditions +
+ +Overview: Race conditions A race conditions occurs when two or more operations must be done in sequence in order to complete a task. In the following example, two clients try to increase the same field (`postCount`) by one: @@ -4701,7 +4722,7 @@ const updatePosts = await prisma.post.updateMany({ }) ``` -## Json filters +## `Json` filters For use cases and advanced examples, see: [Working with `Json` fields](/orm/prisma-client/special-fields-and-types/working-with-json-fields). @@ -4738,12 +4759,12 @@ The examples in this section assumes that the value of the `pet` field is: - The implementation of `Json` filtering [differs between database connectors](/orm/prisma-client/special-fields-and-types/working-with-json-fields) - Filtering is case sensitive in PostgreSQL and does not yet support `mode` -### path +### `path` `path` represents the location of a specific key. The following query returns all users where the nested `favourites` > `dogBreed` key equals `"Rottweiler"`. -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4756,8 +4777,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4770,13 +4791,13 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following query returns all users where the nested `owned` > `cats` array contains `"Elliott"`. -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4789,8 +4810,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4803,7 +4824,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + @@ -4814,9 +4835,6 @@ Filtering by the key values of objects inside an array (below) is only supported The following query returns all users where the nested `favorites` > `treats` array contains an object where the `name` value is `"Dreamies"`: -]}> - - ```ts const getUsers = await prisma.user.findMany({ where: { @@ -4828,20 +4846,12 @@ const getUsers = await prisma.user.findMany({ }) ``` - - - - - - - - -### string_contains +### `string_contains` The following query returns all users where the nested `favorites` > `catBreed` key value contains `"Van"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4854,8 +4864,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4868,16 +4878,16 @@ const getUsers = await prisma.user.findMany({ }) ``` - + -### string_starts_with +### `string_starts_with` The following query returns all users where the nested `favorites` > `catBreed` key value starts with `"Turkish"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4890,9 +4900,9 @@ const getUsers = await prisma.user.findMany({ }) ``` - + - + ```ts const getUsers = await prisma.user.findMany({ @@ -4905,16 +4915,16 @@ const getUsers = await prisma.user.findMany({ }) ``` - + -### string_ends_with +### `string_ends_with` -The following query returns all users where the nested `favorites` > `catBreed` key value ends with `"Van"`: +The following query returns all users where the nested `favorites` \> `catBreed` key value ends with `"Van"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4927,9 +4937,9 @@ const getUsers = await prisma.user.findMany({ }) ``` - + - + ```ts const getUsers = await prisma.user.findMany({ @@ -4942,16 +4952,16 @@ const getUsers = await prisma.user.findMany({ }) ``` - + -### array_contains +### `array_contains` The following query returns all users where the `sanctuaries` array contains the value `"RSPCA"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4970,8 +4980,8 @@ const getUsers = await prisma.user.findMany({ - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -4984,13 +4994,13 @@ const getUsers = await prisma.user.findMany({ }) ``` - + The following query returns all users where the `sanctuaries` array contains _all_ the values in the given array: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -5003,8 +5013,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -5017,15 +5027,15 @@ const getUsers = await prisma.user.findMany({ }) ``` - + -### array_starts_with +### `array_starts_with` The following query returns all users where the `sanctuaries` array starts with the value `"RSPCA"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -5038,9 +5048,9 @@ const getUsers = await prisma.user.findMany({ }) ``` - + - + ```ts const getUsers = await prisma.user.findMany({ @@ -5053,15 +5063,15 @@ const getUsers = await prisma.user.findMany({ }) ``` - + -### array_ends_with +### `array_ends_with` The following query returns all users where the `sanctuaries` array ends with the value `"Alley Cat Allies"`: -, ]}> - + + ```ts const getUsers = await prisma.user.findMany({ @@ -5074,8 +5084,8 @@ const getUsers = await prisma.user.findMany({ }) ``` - - + + ```ts const getUsers = await prisma.user.findMany({ @@ -5088,7 +5098,7 @@ const getUsers = await prisma.user.findMany({ }) ``` - + ## Client methods @@ -5107,23 +5117,23 @@ In addition, if you are using `$on` or `$use`, you will need to use these client -### $disconnect() +### `$disconnect()` -The `$disconnect()` method closes the database connections that were established when `$connect` was called and stops the process that was running Prisma's query engine. See [Connection management](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management) for an overview of `$connect()` and `$disconnect()`. +The `$disconnect()` method closes the database connections that were established when `$connect` was called and stops the process that was running Prisma ORM's query engine. See [Connection management](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management) for an overview of `$connect()` and `$disconnect()`. #### Remarks - `$disconnect()` returns a `Promise`, so you should call it inside an `async` function with the `await` keyword. -### $connect() +### `$connect()` -The `$connect()` method establishes a physical connection to the database via Prisma's query engine. See [Connection management](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management) for an overview of `$connect()` and `$disconnect()`. +The `$connect()` method establishes a physical connection to the database via Prisma ORM's query engine. See [Connection management](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management) for an overview of `$connect()` and `$disconnect()`. #### Remarks - `$connect()` returns a `Promise`, so you should call it inside an `async` function with the `await` keyword. -### $on() +### `$on()` @@ -5133,7 +5143,7 @@ The `$connect()` method establishes a physical connection to the database via Pr The `$on()` method allows you to subscribe to [logging events](#log) or the [exit hook](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management#exit-hooks). -### $use() +### `$use()` @@ -5152,11 +5162,11 @@ prisma.$use(async (params, next) => { }) ``` -#### next +#### `next` `next` represents the "next level" in the middleware stack, which could be the next middleware or the Prisma Query, depending on [where in the stack you are](/orm/prisma-client/client-extensions/middleware#running-order-and-the-middleware-stack). -#### params +#### `params` `params` is an object with information to use in your middleware. @@ -5168,11 +5178,11 @@ prisma.$use(async (params, next) => { | `model` | The model type - for example, `Post` or `User`. | | `runInTransaction` | Returns `true` if the query ran in the context of a [transaction](#transaction). | - +:::tip If you need the `model` property as a string, use: `String(params.model)` - +::: Example parameter values: @@ -5190,32 +5200,32 @@ Example parameter values: See [middleware examples](/orm/prisma-client/client-extensions/middleware#samples) . -### $executeRaw() +### `$executeRaw()` See: [Raw database access (`$executeRaw()`)](/orm/prisma-client/queries/raw-database-access/raw-queries#executeraw). -### $queryRaw() +### `$queryRaw()` See: [Raw database access (`$queryRaw()`)](/orm/prisma-client/queries/raw-database-access/raw-queries#queryraw). -### $runCommandRaw() +### `$runCommandRaw()` See: [Raw database access (`$runCommandRaw()`)](/orm/prisma-client/queries/raw-database-access/raw-queries#runcommandraw). -### $transaction() +### `$transaction()` See: [Transactions](/orm/prisma-client/queries/transactions). -### $metrics +### `$metrics` -Prisma metrics give you a detailed insight into how Prisma Client interacts with your database. You can use this insight to help diagnose performance issues with your application. Learn more: [Metrics](/orm/prisma-client/observability-and-logging/metrics). +Prisma Client metrics give you a detailed insight into how Prisma Client interacts with your database. You can use this insight to help diagnose performance issues with your application. Learn more: [Metrics](/orm/prisma-client/observability-and-logging/metrics). -Prisma metrics has the following methods: +Prisma Client metrics has the following methods: -- `$metrics.json()`: [Retrieves Prisma metrics in JSON format](/orm/prisma-client/observability-and-logging/metrics#retrieve-metrics-in-json-format). -- `$metrics.prometheus()`: [Retrieves Prisma metrics in Prometheus format](/orm/prisma-client/observability-and-logging/metrics#retrieve-metrics-in-prometheus-format). +- `$metrics.json()`: [Retrieves Prisma Client metrics in JSON format](/orm/prisma-client/observability-and-logging/metrics#retrieve-metrics-in-json-format). +- `$metrics.prometheus()`: [Retrieves Prisma Client metrics in Prometheus format](/orm/prisma-client/observability-and-logging/metrics#retrieve-metrics-in-prometheus-format). -### $extends +### `$extends` With `$extends`, you can create and use Prisma Client extensions to add functionality to Prisma Client in the following ways: @@ -5228,9 +5238,9 @@ Learn more: [Prisma Client extensions](/orm/prisma-client/client-extensions). ## Utility types -Utility types are helper functions and types that live on the Prisma namespace. They are useful for keeping your application type safe. +Utility types are helper functions and types that live on the `Prisma` namespace. They are useful for keeping your application type safe. -### Prisma.validator +### `Prisma.validator` The `validator` helps you create re-usable query parameters based on your schema models while making sure that the objects you create are valid. See also: [Using `Prisma.validator`](/orm/prisma-client/type-safety/prisma-validator) @@ -5307,7 +5317,7 @@ const validateUserAndPostInput = (name, email, postTitle) => { You can compare columns in the same table directly, for non-unique filters. -This feature was moved to general availability in version 5.0.0 and was available via the `fieldReference` Preview feature from Prisma versions 4.3.0 to 4.16.2. +This feature was moved to general availability in version 5.0.0 and was available via the `fieldReference` Preview feature from Prisma ORM versions 4.3.0 to 4.16.2. @@ -5366,7 +5376,7 @@ await prisma.order.findMany({ However, you can compare fields in separate models with [standard queries](#model-queries). -#### In groupBy model queries, put your referenced fields in the by argument +#### In `groupBy` model queries, put your referenced fields in the `by` argument If you use the [groupBy](#groupby) model query with the `having` option, then you must put your referenced fields in the `by` argument. @@ -5403,7 +5413,7 @@ await prisma.user.findMany({ }) ``` -## Filter on non-unique fields with UserWhereUniqueInput +## Filter on non-unique fields with `UserWhereUniqueInput` From version 5.0.0, the generated type `UserWhereUniqueInput` on [`where`](#where) exposes all fields on the model, not just unique fields. This was available under the [`extendedWhereUnique` Preview flag](/orm/reference/preview-features/client-preview-features#preview-features-promoted-to-general-availability) between versions 4.5.0 to 4.16.2 @@ -5480,9 +5490,9 @@ In the following example, we do not want to return a post if it is soft-deleted. prisma.Post.findUnique({ where: { id: postId, isDeleted: false } }) ``` -### UserWhereUniqueInput considerations +### `UserWhereUniqueInput` considerations -#### Boolean operators with UserWhereUniqueInput +#### Boolean operators with `UserWhereUniqueInput` With `UserWhereUniqueInput`, you must specify at least one unique field outside of the boolean operators `AND`, `OR`, `NOT`. You can still use these boolean operators in conjunction with any other unique fields or non-unique fields in your filter. @@ -5585,7 +5595,7 @@ await prisma.user.update({ }) ``` -## PrismaPromise behavior +## `PrismaPromise` behavior All Prisma Client queries return an instance of `PrismaPromise`. This is a ["thenable"](https://masteringjs.io/tutorials/fundamentals/thenable), meaning a `PrismaPromise` only executes when you call `await` or `.then()` or `.catch()`. This behavior is different from a regular JavaScript [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), which starts executing immediately. diff --git a/content/200-orm/500-reference/100-prisma-schema-reference.mdx b/content/200-orm/500-reference/100-prisma-schema-reference.mdx index b7d3dff7f3..0cb7d0dea2 100644 --- a/content/200-orm/500-reference/100-prisma-schema-reference.mdx +++ b/content/200-orm/500-reference/100-prisma-schema-reference.mdx @@ -1,13 +1,15 @@ --- title: 'Prisma schema reference' -navTitle: 'Prisma Schema' +sidebar_label: 'Prisma Schema' metaTitle: 'Prisma Schema API' -metaDescription: 'API reference documentation for the Prisma Schema Language (PSL).' +description: 'API reference documentation for the Prisma Schema Language (PSL).' tocDepth: 3 toc: true --- -## datasource + + +## `datasource` Defines a [data source](/orm/prisma-schema/overview/data-sources) in the Prisma schema. @@ -15,14 +17,14 @@ Defines a [data source](/orm/prisma-schema/overview/data-sources) in the Prisma A `datasource` block accepts the following fields: -| Name | Required | Type | Description | -| ------------------- | -------- | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `provider` | **Yes** | String (`postgresql`, `mysql`, `sqlite`, `sqlserver`, `mongodb`, `cockroachdb`) | Describes which data source connectors to use. | -| `url` | **Yes** | String (URL) | Connection URL including authentication info. Most connectors use [the syntax provided by the database](/orm/reference/connection-urls#format). | -| `shadowDatabaseUrl` | No | String (URL) | Connection URL to the shadow database used by Prisma Migrate. Allows you to use a cloud-hosted database as the shadow database. | +| Name | Required | Type | Description | +| ------------------- | -------- | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `provider` | **Yes** | String (`postgresql`, `mysql`, `sqlite`, `sqlserver`, `mongodb`, `cockroachdb`) | Describes which data source connectors to use. | +| `url` | **Yes** | String (URL) | Connection URL including authentication info. Most connectors use [the syntax provided by the database](/orm/reference/connection-urls#format). | +| `shadowDatabaseUrl` | No | String (URL) | Connection URL to the shadow database used by Prisma Migrate. Allows you to use a cloud-hosted database as the shadow database. | | `directUrl` | No | String (URL) | Connection URL for direct connection to the database.

If you use a connection pooler URL in the `url` argument (for example, if you use [Prisma Accelerate](/accelerate) or pgBouncer), Prisma CLI commands that require a direct connection to the database use the URL in the `directUrl` argument.

The `directUrl` property is supported by Prisma Studio from version 5.1.0 upwards. | -| `relationMode` | No | String (`foreignKeys`, `prisma`) | Sets whether [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode) is enforced by foreign keys in the database or emulated in the Prisma Client.

In preview in versions 3.1.1 and later. The field is named `relationMode` in versions 4.5.0 and later, and was previously named `referentialIntegrity`. | -| `extensions` | No | List of strings (PostgreSQL extension names) | Allows you to [represent PostgreSQL extensions in your schema](/orm/prisma-schema/postgresql-extensions#how-to-represent-postgresql-extensions-in-your-prisma-schema). Available in preview for PostgreSQL only in Prisma versions 4.5.0 and later. | +| `relationMode` | No | String (`foreignKeys`, `prisma`) | Sets whether [referential integrity](/orm/prisma-schema/data-model/relations/relation-mode) is enforced by foreign keys in the database or emulated in the Prisma Client.

In preview in versions 3.1.1 and later. The field is named `relationMode` in versions 4.5.0 and later, and was previously named `referentialIntegrity`. | +| `extensions` | No | List of strings (PostgreSQL extension names) | Allows you to [represent PostgreSQL extensions in your schema](/orm/prisma-schema/postgresql-extensions#how-to-represent-postgresql-extensions-in-your-prisma-schema). Available in preview for PostgreSQL only in Prisma ORM versions 4.5.0 and later. | The following providers are available: @@ -155,9 +157,7 @@ datasource db { The format for connection strings is the same as for PostgreSQL. Learn more about PostgreSQL connection strings [here](/orm/overview/databases/postgresql). -## generator - - +## `generator` Defines a [generator](/orm/prisma-schema/overview/generators) in the Prisma schema. @@ -166,14 +166,14 @@ Defines a [generator](/orm/prisma-schema/overview/generators) in the Prisma sche A `generator` block accepts the following fields: | Name | Required | Type | Description | -| ----------------- | -------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | +| ----------------- | -------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `provider` | **Yes** | String (file path) or Enum (`prisma-client-js`) | Describes which [generator](/orm/prisma-schema/overview/generators) to use. This can point to a file that implements a generator or specify a built-in generator directly. | | `output` | No | String (file path) | Determines the location for the generated client, [learn more](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path). **Default**: `node_modules/.prisma/client` | | `previewFeatures` | No | List of Enums | Use intellisense to see list of currently available Preview features (`Ctrl+Space` in Visual Studio Code) **Default**: none | | | `engineType` | No | Enum (`library` or `binary`) | Defines the [query engine](/orm/more/under-the-hood/engines) type to download and use. **Default**: `library` | | `binaryTargets` | No | List of Enums (see below) | Specify the OS on which the Prisma Client will run to ensure compatibility of the [query engine](/orm/more/under-the-hood/engines). **Default**: `native` | -#### binaryTargets options +#### `binaryTargets` options The following tables list all supported operating systems with the name of platform to specify in [`binaryTargets`](/orm/prisma-schema/overview/generators#binary-targets). @@ -199,7 +199,7 @@ Unless specified otherwise, the default supported CPU architecture is x86_64. | Alpine (3.17 and newer) | `linux-musl-openssl-3.0.x`\* | 3.0.x | | Alpine (3.16 and older) | `linux-musl` | 1.1.x | -\* Available in Prisma versions 4.8.0 and later. +\* Available in Prisma ORM versions 4.8.0 and later. ##### Linux (Alpine on ARM64 architectures) @@ -208,7 +208,7 @@ Unless specified otherwise, the default supported CPU architecture is x86_64. | Alpine (3.17 and newer) | `linux-musl-arm64-openssl-3.0.x`\* | 3.0.x | | Alpine (3.16 and older) | `linux-musl-arm64-openssl-1.1.x`\* | 1.1.x | -\* Available in Prisma versions 4.10.0 and later. +\* Available in Prisma ORM versions 4.10.0 and later. ##### Linux (Debian), x86_64 @@ -328,7 +328,7 @@ generator client { } ``` -## model +## `model` Defines a Prisma [model](/orm/prisma-schema/data-model/models#defining-models) . @@ -345,7 +345,7 @@ Defines a Prisma [model](/orm/prisma-schema/data-model/models#defining-models) . - Model names must adhere to the following regular expression: `[A-Za-z][A-Za-z0-9_]*` - Model names must start with a letter and are typically spelled in [PascalCase](https://wiki.c2.com/?PascalCase) - Model names should use the singular form (for example, `User` instead of `user`, `users` or `Users`) -- Prisma has a number of **reserved words** that are being used by Prisma internally and therefore cannot be used as a model name. You can find the reserved words [here](https://github.com/prisma/prisma/blob/main/packages/client/src/generation/generateClient.ts#L376) and [here](https://github.com/prisma/prisma-engines/blob/main/psl/parser-database/src/names/reserved_model_names.rs#L44). +- Prisma ORM has a number of **reserved words** that are being used by Prisma ORM internally and therefore cannot be used as a model name. You can find the reserved words [here](https://github.com/prisma/prisma/blob/main/packages/client/src/generation/generateClient.ts#L376) and [here](https://github.com/prisma/prisma-engines/blob/main/psl/parser-database/src/names/reserved_model_names.rs#L44). > **Note**: You can use the [`@@map` attribute](#map-1) to map a model (for example, `User`) to a table with a different name that does not match model naming conventions (for example, `users`). @@ -357,8 +357,8 @@ Defines a Prisma [model](/orm/prisma-schema/data-model/models#defining-models) . #### A model named `User` with two scalar fields -, ]}> - + + ```prisma model User { @@ -367,8 +367,8 @@ model User { } ``` - - + + ```prisma model User { @@ -378,10 +378,10 @@ model User { } ``` - + -## model fields +## `model` fields [Fields](/orm/prisma-schema/data-model/models#defining-fields) are properties of models. @@ -395,13 +395,13 @@ model User { > **Note**: You can use the [`@map` attribute](#map) to [map a field name to a column](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) with a different name that does not match field naming conventions: e.g. `myField @map("my_field")`. -## model field scalar types +## `model` field scalar types -The _data source connector_ determines what _native database type_ each of Prisma scalar type maps to. Similarly, the _generator_ determines what _type in the target programming language_ each of these types map to. +The _data source connector_ determines what _native database type_ each of Prisma ORM scalar type maps to. Similarly, the _generator_ determines what _type in the target programming language_ each of these types map to. Prisma models also have [model field types](/orm/prisma-schema/data-model/relations) that define relations between models. -### String +### `String` Variable length text. @@ -432,9 +432,9 @@ Variable length text. #### MySQL -| Native database type | Native database type attribute | Notes | -| :------------------- | :----------------------------- | ----- | -| `VARCHAR(x)` | `@db.VarChar(x)` | | +| Native database type | Native database type attribute | +| :------------------- | :----------------------------- | +| `VARCHAR(x)` | `@db.VarChar(x)` | | `TEXT` | `@db.Text` | | `CHAR(x)` | `@db.Char(x)` | | `TINYTEXT` | `@db.TinyText` | @@ -461,12 +461,12 @@ model Model { #### Microsoft SQL Server -| Native database type | Native database type attribute | Notes | -| :------------------- | :----------------------------- | ----- | +| Native database type | Native database type attribute | +| :------------------- | :----------------------------- | | `char(x)` | `@db.Char(x)` | | `nchar(x)` | `@db.NChar(x)` | | `varchar(x)` | `@db.VarChar(x)` | -| `nvarchar(x)` | `@db.NVarChar(x)` | | +| `nvarchar(x)` | `@db.NVarChar(x)` | | `text` | `@db.Text` | | `ntext` | `@db.NText` | | `xml` | `@db.Xml` | @@ -496,7 +496,7 @@ Note that the `xml` and `citext` types supported in PostgreSQL are not currently | ---------------- | | `string` | -### Boolean +### `Boolean` True or false value. @@ -550,7 +550,7 @@ True or false value. | ---------------- | | `boolean` | -### Int +### `Int` #### Default type mappings @@ -626,7 +626,7 @@ True or false value. | ---------------- | | `number` | -### BigInt +### `BigInt` `BigInt` is available in version [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later. @@ -682,11 +682,11 @@ True or false value. | :--------------- | :-------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------- | | Prisma Client JS | [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) | See [examples of working with `BigInt`](/orm/prisma-client/special-fields-and-types#working-with-bigint) | -### Float +### `Float` Floating point number. -> `Float` maps to `Double` in [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later - see [release notes](https://github.com/prisma/prisma/releases/tag/2.17.0) and [Video: Changes to the default mapping of Float in Prisma 2.17.0](https://www.youtube.com/watch?v=OsuGP_xNHco&%3Bab_channel=Prisma) for more information about this change. +> `Float` maps to `Double` in [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later - see [release notes](https://github.com/prisma/prisma/releases/tag/2.17.0) and [Video: Changes to the default mapping of Float in Prisma ORM 2.17.0](https://www.youtube.com/watch?v=OsuGP_xNHco&%3Bab_channel=Prisma) for more information about this change. #### Default type mappings @@ -743,7 +743,7 @@ Floating point number. | ---------------- | | `number` | -### Decimal +### `Decimal` #### Default type mappings @@ -804,7 +804,7 @@ Floating point number. | :--------------- | :------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | | Prisma Client JS | [`Decimal`](https://mikemcl.github.io/decimal.js/) | See [examples of working with `Decimal`](/orm/prisma-client/special-fields-and-types#working-with-decimal) | -### DateTime +### `DateTime` #### Remarks @@ -884,7 +884,7 @@ yearField Int @db.Year | ---------------- | | `Date` | -### Json +### `Json` A JSON object. @@ -940,7 +940,7 @@ Not supported | ---------------- | | `object` | -### Bytes +### `Bytes` `Bytes` is available in version [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later. @@ -1006,7 +1006,7 @@ Not supported | :--------------- | :--------------------------------------------- | :------------------------------------------------------------------------------------------------------ | | Prisma Client JS | [`Buffer`](https://nodejs.org/api/buffer.html) | See [examples of working with `Buffer`](/orm/prisma-client/special-fields-and-types#working-with-bytes) | -### Unsupported +### `Unsupported` @@ -1021,7 +1021,7 @@ The `Unsupported` type was introduced in [2.17.0](https://github.com/prisma/pris - Fields with `Unsupported` types are not available in the generated client. - If a model contains a **required** `Unsupported` type, `prisma.model.create(..)`, `prisma.model.update(...)` and `prisma.model.upsert(...)` are not available in Prisma Client. -- When you introspect a database that contains unsupported types, Prisma will provide the following warning: +- When you introspect a database that contains unsupported types, Prisma ORM will provide the following warning: ``` *** WARNING *** @@ -1032,9 +1032,6 @@ The `Unsupported` type was introduced in [2.17.0](https://github.com/prisma/pris #### Examples -]}> - - ```prisma model Star { id Int @id @default(autoincrement()) @@ -1044,15 +1041,9 @@ model Star { } ``` - - - +## `model` field type modifiers - - -## model field type modifiers - -### [] modifier +### `[]` modifier Makes a field a list. @@ -1072,57 +1063,61 @@ Makes a field a list. ##### Define a scalar list -, ]}> - + + ```prisma highlight=3;normal model User { id Int @id @default(autoincrement()) + //highlight-next-line favoriteColors String[] } ``` - - + + ```prisma highlight=3;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-next-line favoriteColors String[] } ``` - + ##### Define a scalar list with a default value Available in version 4.0.0 and later. -, ]}> - + + ```prisma highlight=3;normal model User { id Int @id @default(autoincrement()) + //highlight-next-line favoriteColors String[] @default(["red", "blue", "green"]) } ``` - - + + ```prisma highlight=3;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-next-line favoriteColors String[] @default(["red", "blue", "green"]) } ``` - + -### ? modifier +### `?` modifier Makes a field optional. @@ -1137,6 +1132,7 @@ Makes a field optional. ```prisma highlight=3;normal model User { id Int @id @default(autoincrement()) + //highlight-next-line name String? } ``` @@ -1152,9 +1148,7 @@ Some attributes take arguments. Arguments in attributes are always named, but in > **Note**: The leading underscore in a signature means the _argument name_ can be omitted. -### @id - - +### `@id` Defines a single-field ID on the model. @@ -1231,10 +1225,7 @@ Defines a single-field ID on the model. In most cases, you want your database to create the ID. To do this, annotate the ID field with the `@default` attribute and initialize the field with a [function](#attribute-functions). -##### Generate autoincrementing integers as IDs - -]}> - +##### Generate autoincrementing integers as IDs (Relational databases only) ```prisma model User { @@ -1243,17 +1234,8 @@ model User { } ``` - - - - - - ##### Generate `ObjectId` as IDs (MongoDB only) -]}> - - ```prisma model User { id String @id @default(auto()) @map("_id") @db.ObjectId @@ -1261,16 +1243,10 @@ model User { } ``` - - - - - - ##### Generate `cuid()` values as IDs -, ]}> - + + ```prisma model User { @@ -1279,8 +1255,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1299,14 +1275,14 @@ id String @id @default(auto()) @db.ObjectId @map("_id") - + ##### Generate `uuid()` values as IDs -, ]}> + - + ```prisma model User { @@ -1315,9 +1291,9 @@ model User { } ``` - + - + ```prisma model User { @@ -1335,7 +1311,7 @@ id String @id @default(auto()) @db.ObjectId @map("_id") ```
- + @@ -1343,8 +1319,8 @@ id String @id @default(auto()) @db.ObjectId @map("_id") In the following example, `id` does not have a default value: -, ]}> - + + ```prisma model User { @@ -1353,27 +1329,29 @@ model User { } ``` - - + + ```prisma model User { id String @id @map("_id") @db.ObjectId name String +} ``` ```prisma model User { id String @id @map("_id") name String +} ``` - + Note that in the above case, you _must_ provide your own ID values when creating new records for the `User` model using Prisma Client, e.g.: -```ts +```ts const newUser = await prisma.user.create({ data: { id: 1, @@ -1386,8 +1364,8 @@ const newUser = await prisma.user.create({ In the following example, `authorId` is a both a relation scalar and the ID of `Profile`: -, ]}> - + + ```prisma model Profile { @@ -1404,8 +1382,8 @@ model User { } ``` - - + + ```prisma model Profile { @@ -1422,7 +1400,7 @@ model User { } ``` - + In this scenario, you cannot create a `Profile` only - you must use Prisma Client's [nested writes](/orm/prisma-client/queries/relation-queries#nested-writes) create a `User` **or** connect the profile to an existing user. @@ -1459,7 +1437,7 @@ const profileWithUser = await prisma.profile.create({ }) ``` -### @@id +### `@@id` @@ -1511,10 +1489,7 @@ The name of the `fields` argument on the `@@id` attribute can be omitted: #### Examples -##### Specify a multi-field ID on two `String` fields - -]}> - +##### Specify a multi-field ID on two `String` fields (Relational databases only) ```prisma model User { @@ -1527,16 +1502,8 @@ model User { } ``` - - - - - When you create a user, you must provide a unique combination of `firstName` and `lastName`: -]}> - - ```ts const user = await prisma.user.create({ data: { @@ -1546,16 +1513,8 @@ const user = await prisma.user.create({ }) ``` - - - - - To retrieve a user, use the generated composite ID field (`firstName_lastName`): -]}> - - ```ts const user = await prisma.user.findUnique({ where: { @@ -1567,15 +1526,7 @@ const user = await prisma.user.findUnique({ }) ``` - - - - - -##### Specify a multi-field ID on two `String` fields and one `Boolean` field - -]}> - +##### Specify a multi-field ID on two `String` fields and one `Boolean` field (Relational databases only) ```prisma model User { @@ -1588,16 +1539,8 @@ model User { } ``` - - - - - When creating new `User` records, you now must provide a unique combination of values for `firstName`, `lastName` and `isAdmin`: -]}> - - ```ts const user = await prisma.user.create({ data: { @@ -1608,15 +1551,7 @@ const user = await prisma.user.create({ }) ``` - - - - - -##### Specify a multi-field ID that includes a relation field - -]}> - +##### Specify a multi-field ID that includes a relation field (Relational databases only) ```prisma model Post { @@ -1636,16 +1571,8 @@ model User { } ``` - - - - - When creating new `Post` records, you now must provide a unique combination of values for `authorId` (foreign key) and `title`: -]}> - - ```ts const post = await prisma.post.create({ data: { @@ -1659,14 +1586,7 @@ const post = await prisma.post.create({ }) ``` - - - - - -### @default - - +### `@default` Defines a [default value for a field](/orm/prisma-schema/data-model/models#defining-a-default-value) . @@ -1730,8 +1650,8 @@ id Int @id @default(autoincrement()) ##### Default value for an `Int` -, ]}> - + + ```prisma model User { @@ -1740,8 +1660,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1750,13 +1670,13 @@ model User { } ``` - + ##### Default value for a `Float` -, ]}> - + + ```prisma model User { @@ -1765,8 +1685,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1775,13 +1695,13 @@ model User { } ``` - + ##### Default value for `Decimal` -, ]}> - + + ```prisma model User { @@ -1790,18 +1710,18 @@ model User { } ``` - - + + [Not supported](https://github.com/prisma/prisma/issues/12637). - + ##### Default value for `BigInt` -, ]}> - + + ```prisma model User { @@ -1810,8 +1730,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1820,13 +1740,13 @@ model User { } ``` - + ##### Default value for a `String` -, ]}> - + + ```prisma model User { @@ -1835,8 +1755,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1845,13 +1765,13 @@ model User { } ``` - + ##### Default value for a `Boolean` -, ]}> - + + ```prisma model User { @@ -1860,8 +1780,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1870,15 +1790,15 @@ model User { } ``` - + ##### Default value for a `DateTime` Note that static default values for `DateTime` are based on the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) standard. -, ]}> - + + ```prisma model User { @@ -1887,8 +1807,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1897,13 +1817,13 @@ model User { } ``` - + ##### Default value for a `Bytes` -, ]}> - + + ```prisma model User { @@ -1912,8 +1832,8 @@ model User { } ``` - - + + ```prisma model User { @@ -1922,13 +1842,13 @@ model User { } ``` - + ##### Default value for an `enum` -, ]}> - + + ```prisma enum Role { @@ -1942,14 +1862,15 @@ model User { id Int @id @default(autoincrement()) email String @unique name String? + //highlight-next-line role Role @default(USER) posts Post[] profile Profile? } ``` - - + + ```prisma enum Role { @@ -1963,24 +1884,26 @@ model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String @unique name String? + //highlight-next-line role Role @default(USER) posts Post[] profile Profile? } ``` - + ##### Default values for scalar lists -, ]}> - + + ```prisma highlight=4;normal model User { id Int @id @default(autoincrement()) posts Post[] + //highlight-next-line favoriteColors String[] @default(["red", "yellow", "purple"]) roles Role[] @default([USER, DEVELOPER]) } @@ -1992,13 +1915,14 @@ enum Role { } ``` - - + + ```prisma highlight=4;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId posts Post[] + //highlight-next-line favoriteColors String[] @default(["red", "yellow", "purple"]) roles Role[] @default([USER, DEVELOPER]) } @@ -2010,10 +1934,10 @@ enum Role { } ``` - + -### @unique +### `@unique` Defines a unique constraint for this field. @@ -2039,9 +1963,9 @@ Defines a unique constraint for this field. #### Arguments -| Name | Required | Type | Description | -| ----------- | -------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `map` | **No** | `String` | | +| Name | Required | Type | Description | +| ----------- | -------- | --------- | ----------- | +| `map` | **No** | `String` | | | `length` | **No** | `number` | Allows you to specify a maximum length for the subpart of the value to be indexed.

MySQL only. In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | | `sort` | **No** | `String` | Allows you to specify in what order the entries of the constraint are stored in the database. The available options are `Asc` and `Desc`.

In preview in versions 3.5.0 and later, and in general availability in versions 4.0.0 and later. | | `clustered` | **No** | `Boolean` | Defines whether the constraint is clustered or non-clustered. Defaults to `false`.

SQL Server only. In preview in versions 3.13.0 and later, and in general availability in versions 4.0.0 and later. | @@ -2070,8 +1994,8 @@ Defines a unique constraint for this field. ##### Specify a unique attribute on a required `String` field -, ]}> - + + ```prisma model User { @@ -2080,8 +2004,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2090,13 +2014,13 @@ model User { } ``` - + ##### Specify a unique attribute on an optional `String` field -, ]}> - + + ```prisma model User { @@ -2106,8 +2030,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2117,13 +2041,13 @@ model User { } ``` - + ##### Specify a unique attribute on relation scalar field `authorId` -, ]}> - + + ```prisma model Post { @@ -2141,8 +2065,8 @@ model User { } ``` - - + + ```prisma model Post { @@ -2160,13 +2084,13 @@ model User { } ``` - + ##### Specify a unique attribute with `cuid()` values as default values -, ]}> - + + ```prisma model User { @@ -2175,8 +2099,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2186,10 +2110,10 @@ model User { } ``` - + -### @@unique +### `@@unique` Defines a compound [unique constraint](/orm/prisma-schema/data-model/models#defining-a-unique-field) for the specified fields. @@ -2234,7 +2158,7 @@ Defines a compound [unique constraint](/orm/prisma-schema/data-model/models#defi #### Arguments | Name | Required | Type | Description | -| ----------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | +| ----------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `fields` | **Yes** | `FieldReference[]` | A list of field names - for example, `["firstname", "lastname"]`. Fields must be mandatory - see remarks. | | `name` | **No** | `String` | The name of the unique combination of fields - defaults to `fieldName1_fieldName2_fieldName3` | | `map` | **No** | `String` | @@ -2279,8 +2203,8 @@ The `length` and `sort` arguments are added to the relevant field names: ##### Specify a multi-field unique attribute on two `String` fields -, ]}> - + + ```prisma model User { @@ -2293,8 +2217,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2307,7 +2231,7 @@ model User { } ``` - + To retrieve a user, use the generated field name (`firstname_lastname`): @@ -2326,8 +2250,8 @@ const user = await prisma.user.findUnique({ ##### Specify a multi-field unique attribute on two `String` fields and one `Boolean` field -, ]}> - + + ```prisma model User { @@ -2340,8 +2264,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2354,13 +2278,13 @@ model User { } ``` - + ##### Specify a multi-field unique attribute that includes a relation field -, ]}> - + + ```prisma model Post { @@ -2380,8 +2304,8 @@ model User { } ``` - - + + ```prisma model Post { @@ -2401,13 +2325,13 @@ model User { } ``` - + ##### Specify a custom `name` for a multi-field unique attribute -, ]}> - + + ```prisma model User { @@ -2420,8 +2344,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2434,7 +2358,7 @@ model User { } ``` - + To retrieve a user, use the custom field name (`admin_identifier`): @@ -2451,7 +2375,7 @@ const user = await prisma.user.findUnique({ }) ``` -### @@index +### `@@index` Defines an index in the database. @@ -2521,10 +2445,7 @@ The `length` and `sort` arguments are added to the relevant field names: Assume you want to add an index for the `title` field of the `Post` model -##### Define a single-column index - -]}> - +##### Define a single-column index (Relational databases only) ```prisma model Post { @@ -2536,15 +2457,7 @@ model Post { } ``` - - - - - -##### Define a multi-column index - -]}> - +##### Define a multi-column index (Relational databases only) ```prisma model Post { @@ -2556,15 +2469,7 @@ model Post { } ``` - - - - - -##### Define an index with a name - -]}> - +##### Define an index with a name (Relational databases only) ```prisma model Post { @@ -2576,15 +2481,7 @@ model Post { } ``` - - - - - -##### Define an index on a composite type field - -]}> - +##### Define an index on a composite type field (Relational databases only) ```prisma type Address { @@ -2601,12 +2498,7 @@ model User { } ``` - - - - - -### @relation +### `@relation` Defines meta information about the relation. [Learn more](/orm/prisma-schema/data-model/relations#the-relation-attribute). @@ -2667,7 +2559,7 @@ With SQLite, the signature changes to: See: [The `@relation` attribute](/orm/prisma-schema/data-model/relations#the-relation-attribute). -### @map +### `@map` Maps a field name or enum value from the Prisma schema to a column or document field with a different name in the database. If you do not use `@map`, the Prisma field name matches the column name or document field name exactly. @@ -2713,8 +2605,8 @@ The name of the `name` argument on the `@map` attribute can be omitted: ##### Map the `firstName` field to a column called `first_name` -, ]}> - + + ```prisma model User { @@ -2723,8 +2615,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2733,7 +2625,7 @@ model User { } ``` - + The generated client: @@ -2755,7 +2647,7 @@ enum Role { } ``` -### @@map +### `@@map` Maps the Prisma schema model name to a table (relational databases) or collection (MongoDB) with a different name, or an enum name to a different underlying enum in the database. If you do not use `@@map`, the model name matches the table (relational databases) or collection (MongoDB) name exactly. @@ -2784,8 +2676,8 @@ The name of the `name` argument on the `@@map` attribute can be omitted ##### Map the `User` model to a database table/collection named `users` -, ]}> - + + ```prisma model User { @@ -2796,8 +2688,8 @@ model User { } ``` - - + + ```prisma model User { @@ -2808,7 +2700,7 @@ model User { } ``` - + The generated client: @@ -2833,14 +2725,14 @@ enum Role { } ``` -### @updatedAt +### `@updatedAt` Automatically stores the time when a record was last updated. If you do not supply a time yourself, Prisma Client will automatically set the value for fields with this attribute. #### Remarks - Compatible with [`DateTime`](#datetime) fields -- Implemented at Prisma level +- Implemented at Prisma ORM level #### Arguments @@ -2854,8 +2746,8 @@ N/A #### Examples -, ]}> - + + ```prisma line-number model Post { @@ -2864,8 +2756,8 @@ model Post { } ``` - - + + ```prisma line-number model Post { @@ -2874,18 +2766,16 @@ model Post { } ``` - + -### @ignore - - +### `@ignore` -Add `@ignore` to a field that you want to exclude from Prisma Client (for example, a field that you do not want Prisma users to update). Ignored fields are excluded from the generated Prisma Client. The model's `create` method is disabled when doing this for _required_ fields with no `@default` (because the database cannot create an entry without that data). +Add `@ignore` to a field that you want to exclude from Prisma Client (for example, a field that you do not want Prisma Client users to update). Ignored fields are excluded from the generated Prisma Client. The model's `create` method is disabled when doing this for _required_ fields with no `@default` (because the database cannot create an entry without that data). #### Remarks -- In [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later, Prisma automatically adds `@ignore` to fields that _refer to_ invalid models when you introspect. +- In [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later, Prisma ORM automatically adds `@ignore` to fields that _refer to_ invalid models when you introspect. #### Examples @@ -2895,19 +2785,18 @@ The following example demonstrates manually adding `@ignore` to exclude the `ema model User { id Int @id name String + //highlight-next-line email String @ignore // this field will be excluded } ``` -### @@ignore - - +### `@@ignore` Add `@@ignore` to a model that you want to exclude from Prisma Client (for example, a model that you do not want Prisma users to update). Ignored models are excluded from the generated Prisma Client. #### Remarks -- In [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later, Prisma adds `@@ignore` to an invalid model. (It also adds [`@ignore`](#ignore) to relations pointing to such a model) +- In [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) and later, Prisma ORM adds `@@ignore` to an invalid model. (It also adds [`@ignore`](#ignore) to relations pointing to such a model) #### Examples @@ -2920,6 +2809,7 @@ model Post { author User @relation(fields: [authorId], references: [id]) authorId Int + //highlight-next-line @@ignore } ``` @@ -2933,19 +2823,19 @@ model Post { author User @relation(fields: [authorId], references: [id]) authorId Int + //highlight-next-line @@ignore } model User { id Int @id @default(autoincrement()) name String? + //highlight-next-line posts Post[] @ignore } ``` -### @@schema - - +### `@@schema` @@ -2981,12 +2871,14 @@ The name of the `name` argument on the `@@schema` attribute can be omitted ```prisma highlight=3,9,16;normal generator client { provider = "prisma-client-js" + //highlight-next-line previewFeatures = ["multiSchema"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") + //highlight-next-line schemas = ["auth"] } @@ -2994,6 +2886,7 @@ model User { id Int @id @default(autoincrement()) name String + //highlight-next-line @@schema("auth") } ``` @@ -3006,7 +2899,7 @@ For more information about using the `multiSchema` feature, refer to [this guide ## Attribute functions -### auto() +### `auto()` This function is available on MongoDB only. @@ -3030,10 +2923,7 @@ The `auto()` function is not available on relational databases. #### Example -##### Generate ObjectId (MongoDB only) - -]}> - +##### Generate `ObjectId` (MongoDB only) ```prisma model User { @@ -3042,12 +2932,7 @@ model User { } ``` - - - - - -### autoincrement() +### `autoincrement()` @@ -3072,10 +2957,7 @@ Create a sequence of integers in the underlying database and assign the incremen #### Examples -##### Generate autoincrementing integers as IDs - -]}> - +##### Generate autoincrementing integers as IDs (Relational databases only) ```prisma model User { @@ -3084,12 +2966,7 @@ model User { } ``` - - - - - -### sequence() +### `sequence()` @@ -3115,9 +2992,6 @@ Create a sequence of integers in the underlying database and assign the incremen ##### Generate sequencing integers as IDs -]}> - - ```prisma model User { id Int @id @default(sequence(maxValue: 4294967295)) @@ -3125,20 +2999,15 @@ model User { } ``` - - - - - -### cuid() +### `cuid()` Generate a globally unique identifier based on the [`cuid`](https://github.com/ericelliott/cuid) spec. #### Remarks - Compatible with `String` -- Implemented by Prisma and therefore not "visible" in the underlying database schema. You can still use `cuid()` when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma's [query engine](/orm/more/under-the-hood/engines). -- Since the length of `cuid()` output is undefined per the cuid creator, a safe field size is 30 characters, in order to allow for enough characters for very large values. If you set the field size as less than 30, and then a larger value is generated by `cuid()`, you might see Prisma errors such as `Error: The provided value for the column is too long for the column's type.` +- Implemented by Prisma ORM and therefore not "visible" in the underlying database schema. You can still use `cuid()` when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma's [query engine](/orm/more/under-the-hood/engines). +- Since the length of `cuid()` output is undefined per the cuid creator, a safe field size is 30 characters, in order to allow for enough characters for very large values. If you set the field size as less than 30, and then a larger value is generated by `cuid()`, you might see Prisma Client errors such as `Error: The provided value for the column is too long for the column's type.` ##### MongoDB @@ -3148,8 +3017,8 @@ Generate a globally unique identifier based on the [`cuid`](https://github.com/e ##### Generate `cuid()` values as IDs -, ]}> - + + ```prisma model User { @@ -3158,8 +3027,8 @@ model User { } ``` - - + + ```prisma model User { @@ -3168,21 +3037,21 @@ model User { } ``` - + -### uuid() +### `uuid()` Generate a globally unique identifier based on the [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) spec, version 4 (random). #### Remarks - Compatible with `String` -- Implemented by Prisma and therefore not "visible" in the underlying database schema. You can still use `uuid()` when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma's [query engine](/orm/more/under-the-hood/engines). +- Implemented by Prisma ORM and therefore not "visible" in the underlying database schema. You can still use `uuid()` when using [introspection](/orm/prisma-schema/introspection) by [manually changing your Prisma schema](/orm/prisma-client/setup-and-configuration/custom-model-and-field-names) and [generating Prisma Client](/orm/prisma-client/setup-and-configuration/generating-prisma-client), in that case the values will be generated by Prisma ORM's [query engine](/orm/more/under-the-hood/engines). -**Note (Relational databases)**: If you do not want to use Prisma's `uuid()` function, you can use [the native database function with `dbgenerated`](#override-default-value-behavior-for-supported-types). +**Note (Relational databases)**: If you do not want to use Prisma ORM's `uuid()` function, you can use [the native database function with `dbgenerated`](#override-default-value-behavior-for-supported-types). @@ -3194,8 +3063,8 @@ Generate a globally unique identifier based on the [UUID](https://en.wikipedia.o ##### Generate `uuid()` values as IDs -, ]}> - + + ```prisma model User { @@ -3204,8 +3073,8 @@ model User { } ``` - - + + ```prisma model User { @@ -3214,10 +3083,10 @@ model User { } ``` - + -### now() +### `now()` Set a timestamp of the time when a record is created. @@ -3240,14 +3109,14 @@ Set a timestamp of the time when a record is created. ##### MongoDB -- Implemented at Prisma level +- Implemented at Prisma ORM level #### Examples ##### Set current timestamp value when a record is created -, ]}> - + + ```prisma model User { @@ -3256,8 +3125,8 @@ model User { } ``` - - + + ```prisma model User { @@ -3266,10 +3135,10 @@ model User { } ``` - + -### dbgenerated() +### `dbgenerated()` Represents **default values** that cannot be expressed in the Prisma schema (such as `random()`). @@ -3290,59 +3159,45 @@ Represents **default values** that cannot be expressed in the Prisma schema (suc ##### Set default value for `Unsupported` type -]}> - - ```prisma circle Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle")) ``` - - - - - ##### Override default value behavior for supported types -]}> - - -You can also use `dbgenerated()` to set the default value for supported types. For example, in PostgreSQL you can generate UUIDs at the database level rather than rely on Prisma's `uuid()`: +You can also use `dbgenerated()` to set the default value for supported types. For example, in PostgreSQL you can generate UUIDs at the database level rather than rely on Prisma ORM's `uuid()`: ```prisma highlight=2;add|3;delete model User { + //add-next-line id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + //delete-next-line id String @id @default(uuid()) @db.Uuid test String? } ``` - - - - - -**Note**: [`gen_random_uuid()` is a PostgreSQL function](https://www.postgresql.org/docs/13/functions-uuid.html). To use it in PostgreSQL versions 12.13 and earlier, you must enable the `pgcrypto` extension.

In Prisma versions 4.5.0 and later, you can declare the `pgcrypto` extension in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions). +**Note**: [`gen_random_uuid()` is a PostgreSQL function](https://www.postgresql.org/docs/13/functions-uuid.html). To use it in PostgreSQL versions 12.13 and earlier, you must enable the `pgcrypto` extension.

In Prisma ORM versions 4.5.0 and later, you can declare the `pgcrypto` extension in your Prisma schema with the [`postgresqlExtensions` preview feature](/orm/prisma-schema/postgresql-extensions).
## Attribute argument types -### FieldReference[] +### `FieldReference[]` An array of [field](#model-fields) names: `[id]`, `[firstName, lastName]` -### String +### `String` A variable length text in double quotes: `""`, `"Hello World"`, `"Alice"` -### Expression +### `Expression` -An expression that can be evaluated by Prisma: `42.0`, `""`, `Bob`, `now()`, `cuid()` +An expression that can be evaluated by Prisma ORM: `42.0`, `""`, `Bob`, `now()`, `cuid()` -## enum +## `enum` @@ -3356,7 +3211,7 @@ Defines an [enum](/orm/prisma-schema/data-model/models#defining-enums) . ### Remarks - Enums are natively supported by [PostgreSQL](https://www.postgresql.org/docs/current/datatype-enum.html) and [MySQL](https://dev.mysql.com/doc/refman/8.0/en/enum.html) -- Enums are implemented and enforced at Prisma level in MongoDB +- Enums are implemented and enforced at Prisma ORM level in MongoDB ### Naming conventions @@ -3368,8 +3223,8 @@ Defines an [enum](/orm/prisma-schema/data-model/models#defining-enums) . #### Specify an `enum` with two possible values -, ]}> - + + ```prisma enum Role { @@ -3383,8 +3238,8 @@ model User { } ``` - - + + ```prisma enum Role { @@ -3398,13 +3253,13 @@ model User { } ``` - + #### Specify an `enum` with two possible values and set a default value -, ]}> - + + ```prisma enum Role { @@ -3418,8 +3273,8 @@ model User { } ``` - - + + ```prisma enum Role { @@ -3433,10 +3288,10 @@ model User { } ``` - + -## type +## `type` diff --git a/content/200-orm/500-reference/200-prisma-cli-reference.mdx b/content/200-orm/500-reference/200-prisma-cli-reference.mdx index 43e020f9d5..161576d463 100644 --- a/content/200-orm/500-reference/200-prisma-cli-reference.mdx +++ b/content/200-orm/500-reference/200-prisma-cli-reference.mdx @@ -1,8 +1,8 @@ --- title: 'Prisma CLI reference' -navTitle: 'Prisma CLI' +sidebar_label: 'Prisma CLI' metaTitle: 'Prisma CLI' -metaDescription: 'This page gives an overview of all available Prisma CLI commands, explains their options and shows numerous usage examples.' +description: 'This page gives an overview of all available Prisma CLI commands, explains their options and shows numerous usage examples.' tocDepth: 3 --- @@ -14,7 +14,7 @@ This document describes the Prisma CLI commands, arguments, and options. ## Commands -### version (-v) +### `version` (`-v`) The `version` command outputs information about your current `prisma` version, platform, and engine binaries. @@ -58,7 +58,7 @@ Studio : 0.365.0 -##### Output version information (-v) +##### Output version information (`-v`) @@ -120,9 +120,9 @@ Environment variables loaded from .env -### init +### `init` -Bootstraps a fresh Prisma project within the current directory. +Bootstraps a fresh Prisma ORM project within the current directory. The `init` command does not interpret any existing files. Instead, it creates a `prisma` directory containing a bare-bones `schema.prisma` file within your current directory. @@ -176,7 +176,7 @@ https://pris.ly/d/getting-started prisma init --datasource-provider sqlite ``` -The command output contains helpful information on how to use the generated files and begin using Prisma with your project. +The command output contains helpful information on how to use the generated files and begin using Prisma ORM with your project. #### Run `prisma init --preview-feature` @@ -312,7 +312,7 @@ A file to define environment variables for your project: DATABASE_URL="mysql://user:password@localhost:3306/mydb" ``` -### generate +### `generate` The `generate` command generates assets like Prisma Client based on the [`generator`](/orm/prisma-schema/overview/generators) and [`data model`](/orm/prisma-schema/data-model/models) blocks defined in your `prisma/schema.prisma` file. @@ -334,12 +334,12 @@ generator client { #### Options -| Option | Required | Description | Default | -| -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- | -| `--data-proxy` | No | The `generate` command will generate Prisma Client for use with [Prisma Accelerate](/accelerate) prior to Prisma 5.0.0. Mutually exclusive with `--accelerate` and `--no-engine`. -| `--accelerate` | No | The `generate` command will generate Prisma Client for use with [Prisma Accelerate](/accelerate). Mutually exclusive with `--data-proxy` and `--no-engine`. Available in Prisma 5.1.0 and later. | -| `--no-engine` | No | The `generate` command will generate Prisma Client without an accompanied engine for use with [Prisma Accelerate](/accelerate). Mutually exclusive with `--data-proxy` and `--accelerate`. Available in Prisma 5.2.0 and later. | -| `--watch` | No | The `generate` command will continue to watch the `schema.prisma` file and re-generate Prisma Client on file changes. | +| Option | Required | Description | Default | +| -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `--data-proxy` | No | The `generate` command will generate Prisma Client for use with [Prisma Accelerate](/accelerate) prior to Prisma 5.0.0. Mutually exclusive with `--accelerate` and `--no-engine`. | +| `--accelerate` | No | The `generate` command will generate Prisma Client for use with [Prisma Accelerate](/accelerate). Mutually exclusive with `--data-proxy` and `--no-engine`. Available in Prisma 5.1.0 and later. | +| `--no-engine` | No | The `generate` command will generate Prisma Client without an accompanied engine for use with [Prisma Accelerate](/accelerate). Mutually exclusive with `--data-proxy` and `--accelerate`. Available in Prisma ORM 5.2.0 and later. | +| `--watch` | No | The `generate` command will continue to watch the `schema.prisma` file and re-generate Prisma Client on file changes. | @@ -435,16 +435,16 @@ prisma generate --generator client --generator zod_schemas The `prisma-client-js` generator creates a customized client for working with your database within the `./node_modules/.prisma/client` directory by default - you can [customize the output folder](/orm/prisma-client/setup-and-configuration/generating-prisma-client#using-a-custom-output-path). -### introspect +### `introspect` **Deprecation warning**
-From Prisma 3.0.0 onwards, the `prisma introspect` command is deprecated and replaced with the [`prisma db pull`](#db-pull) command. +From Prisma ORM 3.0.0 onwards, the `prisma introspect` command is deprecated and replaced with the [`prisma db pull`](#db-pull) command.
-### validate +### `validate` Validates the [Prisma Schema Language](/orm/prisma-schema) of the Prisma schema file. @@ -510,7 +510,7 @@ Prisma CLI Version : 4.5.0 -### format +### `format` Formats the Prisma schema file, which includes validating, formatting, and persisting the schema. @@ -576,7 +576,7 @@ Prisma CLI Version : 4.5.0 -### debug +### `debug` Prints information for debugging and bug reports. @@ -699,9 +699,9 @@ If you're using an older version of Prisma, you can use this command by running: npx prisma@latest debug ``` -## db +## `db` -### db pull +### `db pull` The `db pull` command connects to your database and adds Prisma models to your Prisma schema that reflect the current database schema. @@ -762,7 +762,7 @@ prisma db pull ```code no-copy Introspecting based on datasource defined in schema.prisma … -✔ Wrote Prisma data model into schema.prisma in 38ms +✔ Introspected 2 models and wrote them into schema.prisma in 38ms Run prisma generate to generate Prisma Client. ``` @@ -788,7 +788,7 @@ prisma db pull --schema=./alternative/schema.prisma ```code no-copy Introspecting based on datasource defined in alternative/schema.prisma … -✔ Wrote Prisma data model into alternative/schema.prisma in 60ms +✔ Introspected 2 models and wrote them into alternative/schema.prisma in 60ms Run prisma generate to generate Prisma Client. ``` @@ -849,7 +849,7 @@ model Profile { -### db push +### `db push` The `db push` command pushes the state of your Prisma schema file to the database without using migrations. It creates the database if the database does not exist. @@ -908,7 +908,7 @@ Push the schema with a custom schema location: prisma db push --schema=/tmp/schema.prisma ``` -### db seed +### `db seed` `db seed` changed from Preview to Generally Available (GA) in 3.0.1. @@ -929,7 +929,7 @@ The `--` argument/ [delimiter](https://pubs.opengroup.org/onlinepubs/9699919799/ prisma db seed ``` -### db execute +### `db execute` @@ -1014,7 +1014,7 @@ Instead of `migrate dev` and related commands, [`db push`](/orm/prisma-migrate/w -### migrate dev +### `migrate dev` **For use in development environments only, requires shadow database** @@ -1074,7 +1074,7 @@ Apply all migrations and create a new migration if there are schema changes, but prisma migrate dev --create-only ``` -### migrate reset +### `migrate reset` **For use in development environments only** @@ -1112,7 +1112,7 @@ This command is not supported on [MongoDB](/orm/overview/databases/mongodb). Use prisma migrate reset ``` -### migrate deploy +### `migrate deploy` The `migrate deploy` command applies all pending migrations, and creates the database if it does not exist. Primarily used in non-development environments. This command: @@ -1144,7 +1144,7 @@ This command is not supported on [MongoDB](/orm/overview/databases/mongodb). Use prisma migrate deploy ``` -### migrate resolve +### `migrate resolve` The `migrate resolve` command allows you to solve migration history issues in production by marking a failed migration as already applied (supports baselining) or rolled back. @@ -1182,7 +1182,7 @@ prisma migrate resolve --applied 20201231000000_add_users_table prisma migrate resolve --rolled-back 20201231000000_add_users_table ``` -### migrate status +### `migrate status` The `prisma migrate status` command looks up the migrations in `./prisma/migrations/*` folder and the entries in the `_prisma_migrations` table and compiles information about the state of the migrations in your database. @@ -1235,7 +1235,7 @@ In versions 4.3.0 and later, `prisma migrate status` exits with exit code 1 in t prisma migrate status ``` -### migrate diff +### `migrate diff` @@ -1269,7 +1269,7 @@ where the `--from-...` and `--to-...` options are selected based on the type of - live databases - migration histories -- Prisma data models +- Prisma schema data models - an empty schema Both schema sources must use the same database provider. For example, a diff comparing a PostgreSQL data source with a SQLite data source is not supported. @@ -1342,9 +1342,55 @@ Other options: --script > script.sql ``` +## Prisma Data Platform + +### `platform` ([Early Access](/platform/maturity-levels#early-access)) + +The `platform` command provides access to the Prisma Data Platform through the Prisma CLI starting in version `5.10.0` or later. + +- **Authentication**: + + - `platform auth login`: Opens a browser window for login or account creation. + - `platform auth logout`: Logs out of the platform. + - `platform auth show`: Displays information about the currently authenticated user. + +- **Workspace Management**: + + - `platform workspace show`: Lists all workspaces available to your account. + +- **Project Management**: + + - `platform project show`: Lists all projects within the specified workspace. + - `platform project create`: Creates a new project within the specified workspace. + - `platform project delete`: Deletes the specified project. + +- **Environment Management**: + + - `platform environment show`: Lists all environments for the specified project. + - `platform environment create`: Creates a new environment within the specified project. + - `platform environment delete`: Deletes the specified environment. + +- **API Key Management**: + + - `platform apikey show`: Lists all API keys for the specified environment. + - `platform apikey create`: Creates a new API key for the specified environment. + - `platform apikey delete`: Deletes the specified API key. + +- **Prisma Accelerate**: + + - `platform accelerate enable`: Enables Prisma Accelerate for the specified environment. + - `platform accelerate disable`: Disables Prisma Accelerate for the specified environment. + +- **Prisma Pulse**: + + - `platform pulse enable`: Enables Prisma Pulse for the specified environment. + - `platform pulse disable`: Disables Prisma Pulse for the specified environment. + +You can find the complete list of available commands with the arguments [here](/platform/platform-cli/commands). + ## Studio -### studio +### `studio` The `studio` command allows you to interact with and manage your data interactively. It does this by starting a local web server with a web app configured with your project's data schema and records. @@ -1403,9 +1449,9 @@ prisma studio --browser firefox prisma studio --browser none ``` -## package.json entry options +## `package.json` entry options -### schema +### `schema` The path to the desired `schema.prisma` file can be specified with the `prisma.schema` entry in the `package.json` file. The path defines the file the Prisma CLI should use when you run any of the CLI commands. Both absolute and relative paths are supported. @@ -1421,7 +1467,7 @@ The path to the desired `schema.prisma` file can be specified with the `prisma.s This is available from version 2.7.0 and later. -### seed +### `seed` The command used to populate the datasource is specified in the `prisma.seed` entry in the `package.json` file. It is used when `prisma db seed` is invoked or triggered. diff --git a/content/200-orm/500-reference/250-error-reference.mdx b/content/200-orm/500-reference/250-error-reference.mdx index aaf51cfae4..d06e1cca3e 100644 --- a/content/200-orm/500-reference/250-error-reference.mdx +++ b/content/200-orm/500-reference/250-error-reference.mdx @@ -1,8 +1,8 @@ --- title: 'Error message reference' -navTitle: 'Errors' +sidebar_label: 'Errors' metaTitle: 'Errors' -metaDescription: 'Prisma Client, Migrate, Introspection error message reference' +description: 'Prisma Client, Migrate, Introspection error message reference' tocDepth: 3 --- @@ -16,7 +16,7 @@ For more information about how to work with exceptions and error codes, see [Han Prisma Client throws different kinds of errors. The following lists the exception types, and their documented data fields: -### PrismaClientKnownRequestError +### `PrismaClientKnownRequestError` Prisma Client throws a `PrismaClientKnownRequestError` exception if the query engine returns a known error related to the request - for example, a unique constraint violation. @@ -27,7 +27,7 @@ Prisma Client throws a `PrismaClientKnownRequestError` exception if the query en | `message` | Error message associated with [error code](#error-codes). | | `clientVersion` | Version of Prisma Client (for example, `2.19.0`) | -### PrismaClientUnknownRequestError +### `PrismaClientUnknownRequestError` Prisma Client throws a `PrismaClientUnknownRequestError` exception if the query engine returns an error related to a request that does not have an error code. @@ -36,7 +36,7 @@ Prisma Client throws a `PrismaClientUnknownRequestError` exception if the query | `message` | Error message associated with [error code](#error-codes). | | `clientVersion` | Version of Prisma Client (for example, `2.19.0`) | -### PrismaClientRustPanicError +### `PrismaClientRustPanicError` Prisma Client throws a `PrismaClientRustPanicError` exception if the underlying engine crashes and exits with a non-zero exit code. In this case, Prisma Client or the whole Node process must be restarted. @@ -45,7 +45,7 @@ Prisma Client throws a `PrismaClientRustPanicError` exception if the underlying | `message` | Error message associated with [error code](#error-codes). | | `clientVersion` | Version of Prisma Client (for example, `2.19.0`) | -### PrismaClientInitializationError +### `PrismaClientInitializationError` Prisma Client throws a `PrismaClientInitializationError` exception if something goes wrong when the query engine is started and the connection to the database is created. This happens either: @@ -66,7 +66,7 @@ Errors that can occur include: | `message` | Error message associated with [error code](#error-codes). | | `clientVersion` | Version of Prisma Client (for example, `2.19.0`) | -### PrismaClientValidationError +### `PrismaClientValidationError` Prisma Client throws a `PrismaClientValidationError` exception if validation fails - for example: @@ -82,47 +82,47 @@ Prisma Client throws a `PrismaClientValidationError` exception if validation fai ### Common -#### P1000 +#### `P1000` "Authentication failed against database server at `{database_host}`, the provided database credentials for `{database_user}` are not valid. Please make sure to provide valid database credentials for the database server at `{database_host}`." -#### P1001 +#### `P1001` "Can't reach database server at `{database_host}`:`{database_port}` Please make sure your database server is running at `{database_host}`:`{database_port}`." -#### P1002 +#### `P1002` "The database server at `{database_host}`:`{database_port}` was reached but timed out. Please try again. Please make sure your database server is running at `{database_host}`:`{database_port}`. " -#### P1003 +#### `P1003` -"Database {database_file_name} does not exist at {database_file_path}" +"Database \{database_file_name} does not exist at \{database_file_path}" "Database `{database_name}.{database_schema_name}` does not exist on the database server at `{database_host}:{database_port}`." "Database `{database_name}` does not exist on the database server at `{database_host}:{database_port}`." -#### P1008 +#### `P1008` "Operations timed out after `{time}`" -#### P1009 +#### `P1009` "Database `{database_name}` already exists on the database server at `{database_host}:{database_port}`" -#### P1010 +#### `P1010` "User `{database_user}` was denied access on the database `{database_name}`" -#### P1011 +#### `P1011` -"Error opening a TLS connection: {message}" +"Error opening a TLS connection: \{message}" -#### P1012 +#### `P1012` -**Note:** If you get error code P1012 after you upgrade Prisma to version 4.0.0 or later, see the [version 4.0.0 upgrade guide](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4#upgrade-your-prisma-schema). A schema that was valid before version 4.0.0 might be invalid in version 4.0.0 and later. The upgrade guide explains how to update your schema to make it valid. +**Note:** If you get error code P1012 after you upgrade Prisma ORM to version 4.0.0 or later, see the [version 4.0.0 upgrade guide](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4#upgrade-your-prisma-schema). A schema that was valid before version 4.0.0 might be invalid in version 4.0.0 and later. The upgrade guide explains how to update your schema to make it valid. -"{full_error}" +"\{full_error}" Possible P1012 error messages: @@ -158,164 +158,180 @@ Possible P1012 error messages: - "Expected a {} value, but failed while parsing `{}`: {}." - "Error validating model `{}`: {}" - "Error validating field `{}` in model `{}`: {}" -- "Error validating datasource `{datasource}`: {message}"" +- "Error validating datasource `{datasource}`: \{message}"" - "Error validating enum `{}`: {}" - "Error validating: {}" -#### P1013 +#### `P1013` -"The provided database string is invalid. {details}" +"The provided database string is invalid. \{details}" -#### P1014 +#### `P1014` -"The underlying {kind} for model `{model}` does not exist." +"The underlying \{kind} for model `{model}` does not exist." -#### P1015 +#### `P1015` -"Your Prisma schema is using features that are not supported for the version of the database.
Database version: {database_version}
Errors:
{errors}" +"Your Prisma schema is using features that are not supported for the version of the database.
Database version: \{database_version}
Errors:
\{errors}" -#### P1016 +#### `P1016` "Your raw query had an incorrect number of parameters. Expected: `{expected}`, actual: `{actual}`." -#### P1017 +#### `P1017` "Server has closed the connection." ### Prisma Client (Query Engine) -#### P2000 +#### `P2000` -"The provided value for the column is too long for the column's type. Column: {column_name}" +"The provided value for the column is too long for the column's type. Column: \{column_name}" -#### P2001 +#### `P2001` "The record searched for in the where condition (`{model_name}.{argument_name} = {argument_value}`) does not exist" -#### P2002 +#### `P2002` -"Unique constraint failed on the {constraint}" +"Unique constraint failed on the \{constraint}" -#### P2003 +#### `P2003` "Foreign key constraint failed on the field: `{field_name}`" -#### P2004 +#### `P2004` "A constraint failed on the database: `{database_error}`" -#### P2005 +#### `P2005` "The value `{field_value}` stored in the database for the field `{field_name}` is invalid for the field's type" -#### P2006 +#### `P2006` "The provided value `{field_value}` for `{model_name}` field `{field_name}` is not valid" -#### P2007 +#### `P2007` "Data validation error `{database_error}`" -#### P2008 +#### `P2008` "Failed to parse the query `{query_parsing_error}` at `{query_position}`" -#### P2009 +#### `P2009` "Failed to validate the query: `{query_validation_error}` at `{query_position}`" -#### P2010 +#### `P2010` "Raw query failed. Code: `{code}`. Message: `{message}`" -#### P2011 +#### `P2011` -"Null constraint violation on the {constraint}" +"Null constraint violation on the \{constraint}" -#### P2012 +#### `P2012` "Missing a required value at `{path}`" -#### P2013 +#### `P2013` "Missing the required argument `{argument_name}` for field `{field_name}` on `{object_name}`." -#### P2014 +#### `P2014` -"The change you are trying to make would violate the required relation '{relation_name}' between the `{model_a_name}` and `{model_b_name}` models." +"The change you are trying to make would violate the required relation '\{relation_name}' between the `{model_a_name}` and `{model_b_name}` models." -#### P2015 +#### `P2015` -"A related record could not be found. {details}" +"A related record could not be found. \{details}" -#### P2016 +#### `P2016` -"Query interpretation error. {details}" +"Query interpretation error. \{details}" -#### P2017 +#### `P2017` "The records for relation `{relation_name}` between the `{parent_name}` and `{child_name}` models are not connected." -#### P2018 +#### `P2018` -"The required connected records were not found. {details}" +"The required connected records were not found. \{details}" -#### P2019 +#### `P2019` -"Input error. {details}" +"Input error. \{details}" -#### P2020 +#### `P2020` -"Value out of range for the type. {details}" +"Value out of range for the type. \{details}" -#### P2021 +#### `P2021` "The table `{table}` does not exist in the current database." -#### P2022 +#### `P2022` "The column `{column}` does not exist in the current database." -#### P2023 +#### `P2023` -"Inconsistent column data: {message}" +"Inconsistent column data: \{message}" -#### P2024 +#### `P2024` -"Timed out fetching a new connection from the connection pool. (More info: [http://pris.ly/d/connection-pool](http://pris.ly/d/connection-pool) (Current connection pool timeout: {timeout}, connection limit: {connection_limit})" +"Timed out fetching a new connection from the connection pool. (More info: [http://pris.ly/d/connection-pool](http://pris.ly/d/connection-pool) (Current connection pool timeout: \{timeout}, connection limit: \{connection_limit})" -#### P2025 +#### `P2025` -"An operation failed because it depends on one or more records that were required but not found. {cause}" +"An operation failed because it depends on one or more records that were required but not found. \{cause}" -#### P2026 +#### `P2026` -"The current database provider doesn't support a feature that the query used: {feature}" +"The current database provider doesn't support a feature that the query used: \{feature}" -#### P2027 +#### `P2027` -"Multiple errors occurred on the database during query execution: {errors}" +"Multiple errors occurred on the database during query execution: \{errors}" -#### P2028 +#### `P2028` -"Transaction API error: {error}" +"Transaction API error: \{error}" -#### P2030 +#### `P2029` + +"Query parameter limit exceeded error: \{message}" + +#### `P2030` "Cannot find a fulltext index to use for the search, try adding a @@fulltext([Fields...]) to your schema" -#### P2031 +#### `P2031` "Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set. See details: [https://pris.ly/d/mongodb-replica-set](https://pris.ly/d/mongodb-replica-set)" -#### P2033 +#### `P2033` "A number used in the query does not fit into a 64 bit signed integer. Consider using `BigInt` as field type if you're trying to store large integers" -#### P2034 +#### `P2034` "Transaction failed due to a write conflict or a deadlock. Please retry your transaction" +#### `P2035` + +"Assertion violation on the database: \{database_error}" + +#### `P2036` + +"Error in external connector (id \{id})" + +#### `P2037` + +"Too many database connections opened: \{message}" + ### Prisma Migrate (Schema Engine) @@ -324,113 +340,113 @@ The Schema Engine was previously called Migration Engine. This change was introd -#### P3000 +#### `P3000` -"Failed to create database: {database_error}" +"Failed to create database: \{database_error}" -#### P3001 +#### `P3001` -"Migration possible with destructive changes and possible data loss: {migration_engine_destructive_details}" +"Migration possible with destructive changes and possible data loss: \{migration_engine_destructive_details}" -#### P3002 +#### `P3002` -"The attempted migration was rolled back: {database_error}" +"The attempted migration was rolled back: \{database_error}" -#### P3003 +#### `P3003` "The format of migrations changed, the saved migrations are no longer valid. To solve this problem, please follow the steps at: [https://pris.ly/d/migrate](https://pris.ly/d/migrate)" -#### P3004 +#### `P3004` "The `{database_name}` database is a system database, it should not be altered with prisma migrate. Please connect to another database." -#### P3005 +#### `P3005` "The database schema is not empty. Read more about how to baseline an existing production database: [https://pris.ly/d/migrate-baseline](https://pris.ly/d/migrate-baseline)" -#### P3006 +#### `P3006` -"Migration `{migration_name}` failed to apply cleanly to the shadow database.
{error_code}Error:
{inner_error}" +"Migration `{migration_name}` failed to apply cleanly to the shadow database.
\{error_code}Error:
\{inner_error}" -#### P3007 +#### `P3007` -"Some of the requested preview features are not yet allowed in schema engine. Please remove them from your data model before using migrations. (blocked: {list_of_blocked_features})" +"Some of the requested preview features are not yet allowed in schema engine. Please remove them from your data model before using migrations. (blocked: \{list_of_blocked_features})" -#### P3008 +#### `P3008` "The migration `{migration_name}` is already recorded as applied in the database." -#### P3009 +#### `P3009` -"migrate found failed migrations in the target database, new migrations will not be applied. Read more about how to resolve migration issues in a production database: [https://pris.ly/d/migrate-resolve](https://pris.ly/d/migrate-resolve)
{details}" +"migrate found failed migrations in the target database, new migrations will not be applied. Read more about how to resolve migration issues in a production database: [https://pris.ly/d/migrate-resolve](https://pris.ly/d/migrate-resolve)
\{details}" -#### P3010 +#### `P3010` "The name of the migration is too long. It must not be longer than 200 characters (bytes)." -#### P3011 +#### `P3011` "Migration `{migration_name}` cannot be rolled back because it was never applied to the database. Hint: did you pass in the whole migration name? (example: \"20201207184859_initial_migration\")" -#### P3012 +#### `P3012` "Migration `{migration_name}` cannot be rolled back because it is not in a failed state." -#### P3013 +#### `P3013` "Datasource provider arrays are no longer supported in migrate. Please change your datasource to use a single provider. Read more at [https://pris.ly/multi-provider-deprecation](https://pris.ly/multi-provider-deprecation)" -#### P3014 +#### `P3014` "Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at [https://pris.ly/d/migrate-shadow](https://pris.ly/d/migrate-shadow). -Original error: {error_code}
{inner_error}" +Original error: \{error_code}
\{inner_error}" -#### P3015 +#### `P3015` -"Could not find the migration file at {migration_file_path}. Please delete the directory or restore the migration file." +"Could not find the migration file at \{migration_file_path}. Please delete the directory or restore the migration file." -#### P3016 +#### `P3016` -"The fallback method for database resets failed, meaning Migrate could not clean up the database entirely. Original error: {error_code}
{inner_error}" +"The fallback method for database resets failed, meaning Migrate could not clean up the database entirely. Original error: \{error_code}
\{inner_error}" -#### P3017 +#### `P3017` -"The migration {migration_name} could not be found. Please make sure that the migration exists, and that you included the whole name of the directory. (example: \"20201207184859_initial_migration\")" +"The migration \{migration_name} could not be found. Please make sure that the migration exists, and that you included the whole name of the directory. (example: \"20201207184859_initial_migration\")" -#### P3018 +#### `P3018` -"A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database: https://pris.ly/d/migrate-resolve

Migration name: {migration_name}

Database error code: {database_error_code}

Database error:
{database_error} " +"A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database: https://pris.ly/d/migrate-resolve

Migration name: \{migration_name}

Database error code: \{database_error_code}

Database error:
\{database_error} " -#### P3019 +#### `P3019` "The datasource provider `{provider}` specified in your schema does not match the one specified in the migration_lock.toml, `{expected_provider}`. Please remove your current migration directory and start a new migration history with prisma migrate dev. Read more: [https://pris.ly/d/migrate-provider-switch](https://pris.ly/d/migrate-provider-switch)" -#### P3020 +#### `P3020` "The automatic creation of shadow databases is disabled on Azure SQL. Please set up a shadow database using the `shadowDatabaseUrl` datasource attribute.
Read the docs page for more details: [https://pris.ly/d/migrate-shadow](https://pris.ly/d/migrate-shadow)" -#### P3021 +#### `P3021` "Foreign keys cannot be created on this database. Learn more how to handle this: [https://pris.ly/d/migrate-no-foreign-keys](https://pris.ly/d/migrate-no-foreign-keys)" -#### P3022 +#### `P3022` "Direct execution of DDL (Data Definition Language) SQL statements is disabled on this database. Please read more here about how to handle this: [https://pris.ly/d/migrate-no-direct-ddl](https://pris.ly/d/migrate-no-direct-ddl)" -### prisma db pull +### `prisma db pull` -#### P4000 +#### `P4000` -"Introspection operation failed to produce a schema file: {introspection_error}" +"Introspection operation failed to produce a schema file: \{introspection_error}" -#### P4001 +#### `P4001` "The introspected database was empty." -#### P4002 +#### `P4002` -"The schema of the introspected database was inconsistent: {explanation}" +"The schema of the introspected database was inconsistent: \{explanation}" @@ -438,38 +454,79 @@ Original error: {error_code}
{inner_error}" Prisma Accelerate-related errors start with `P6xxx`. -#### P6000 (ServerError) +#### `P6000` (`ServerError`) Generic error to catch all other errors. -#### P6001 (InvalidDataSource) +#### `P6001` (`InvalidDataSource`) The URL is malformed; for instance, it does not use the `prisma://` protocol. -#### P6002 (Unauthorized) +#### `P6002` (`Unauthorized`) The API Key in the connection string is invalid. -#### P6003 (PlanLimitReached) +#### `P6003` (`PlanLimitReached`) The included usage of the current plan has been exceeded. This can only occur on the [free plan](https://www.prisma.io/pricing). -#### P6004 (QueryTimeout) +#### `P6004` (`QueryTimeout`) The global timeout of Accelerate has been exceeded. You can find the limit [here](/accelerate/limitations#query-timeout-limit). -#### P6005 (InvalidParameters) +> Also see the [troubleshooting guide](/accelerate/troubleshoot#p6004-querytimeout) for more information. + +#### `P6005` (`InvalidParameters`) The user supplied invalid parameters. Currently only relevant for transaction methods. For example, setting a timeout that is too high. You can find the limit [here](/accelerate/limitations#interactive-transactions-query-timeout-limit). -#### P6006 (VersionNotSupported) +#### `P6006` (`VersionNotSupported`) The chosen Prisma version is not compatible with Accelerate. This may occur when a user uses an unstable development version that we occasionally prune. -#### P6008 (ConnectionError|EngineStartError) +#### `P6008` (`ConnectionError|EngineStartError`) The engine failed to start. For example, it couldn't establish a connection to the database. -#### P6009 (ResponseSizeLimitExceeded) +> Also see the [troubleshooting guide](/accelerate/troubleshoot#p6008-connectionerrorenginestarterror) for more information. + +#### `P6009` (`ResponseSizeLimitExceeded`) The global response size limit of Accelerate has been exceeded. You can find the limit [here](/accelerate/limitations#response-size-limit). + +> Also see the [troubleshooting guide](/accelerate/troubleshoot#p6009-responsesizelimitexceeded) for more information. + +### Prisma Pulse + +Prisma Pulse-related errors start with `P61xx`. + +#### `P6100` (`ServerError`) – HTTP Status `500` + +An unexpected server error occurred. +This can happen due to a technical issue within the Prisma Pulse or its infrastructure. +For any incidents related to Prisma Pulse, you can refer to our status page [here](https://www.prisma-status.com/) and reach out to our support team through one of our available [channels](/platform/support) to report your issue. + +#### `P6101` (`DatasourceError`) – HTTP Status `400` + +Reasons: + +1. The datasource is not reachable by Prisma Pulse. The Console will validate the connection when enabling Pulse to reduce the likelihood of this error. However, the datasource may become unavailable after the configuration step, resulting in this error. +2. The datasource is reachable, but did not meet the requirements for Prisma Pulse. The Console will validate the configuration when enabling Pulse to reduce the likelihood of this error. However, the datasource may change after the configuration step, resulting in this error. + +#### `P6102` (`Unauthorized`) – HTTP Status `400` + +The API key is invalid. + +#### `P6103` (`ProjectDisabledError`) – HTTP Status `400` + +Prisma Pulse is not enabled for the configured API key. + +#### `P6104` (`AccountHoldError`) – HTTP Status `400` + +Your Prisma Data Platform account has been blocked, potentially due to exceeding the usage limit included in your current plan. Please review the error message for further information. + +If you require further assistance, please get in touch with us via one of our support [channels](/platform/support). + +#### `P6105` (`VersionNotSupported`) – HTTP Status `400` + +The Prisma version of the project is not compatible with Prisma Pulse. diff --git a/content/200-orm/500-reference/300-environment-variables-reference.mdx b/content/200-orm/500-reference/300-environment-variables-reference.mdx index 0b1fa39e44..f0c59247b2 100644 --- a/content/200-orm/500-reference/300-environment-variables-reference.mdx +++ b/content/200-orm/500-reference/300-environment-variables-reference.mdx @@ -1,8 +1,8 @@ --- title: 'Environment variables reference' -navTitle: 'Environment variables' +sidebar_label: 'Environment variables' metaTitle: 'Prisma environment variables' -metaDescription: 'This page gives an overview of all environment variables available for use.' +description: 'This page gives an overview of all environment variables available for use.' tocDepth: 3 --- @@ -14,7 +14,7 @@ This document describes different environment variables and their use cases. ## Prisma Client -### DEBUG +### `DEBUG` `DEBUG` is used to enable debugging output in Prisma Client. @@ -27,7 +27,7 @@ export DEBUG="prisma:client" See [Debugging](/orm/prisma-client/debugging-and-troubleshooting/debugging) for more information. -### NO_COLOR +### `NO_COLOR` `NO_COLOR` if [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy) will activate the `colorless` setting for error formatting and strip colors from error messages. @@ -35,7 +35,7 @@ See [Formatting via environment variables](/orm/prisma-client/setup-and-configur ## Prisma Studio -### BROWSER +### `BROWSER` `BROWSER` is for Prisma Studio to force which browser it should be open in, if not set it will open in the default browser. @@ -53,27 +53,27 @@ See [Studio](/orm/reference/prisma-cli-reference#studio) documentation for more ## Prisma CLI -### PRISMA_HIDE_PREVIEW_FLAG_WARNINGS +### `PRISMA_HIDE_PREVIEW_FLAG_WARNINGS` `PRISMA_HIDE_PREVIEW_FLAG_WARNINGS` hides the warning message that states that a preview feature flag can be removed. It is a truthy value. -### PRISMA_HIDE_UPDATE_MESSAGE +### `PRISMA_HIDE_UPDATE_MESSAGE` `PRISMA_HIDE_UPDATE_MESSAGE` is used to hide the update notification message that is shown when a newer Prisma CLI version is available. It's a truthy value. -### PRISMA_GENERATE_SKIP_AUTOINSTALL +### `PRISMA_GENERATE_SKIP_AUTOINSTALL` `PRISMA_GENERATE_SKIP_AUTOINSTALL` can be set to a truthy value to skip the auto-install of `prisma` CLI and `@prisma/client` dependencies (if they are missing), if the `prisma-client-js` generator is defined in the Prisma Schema, when using the `prisma generate` command. -### PRISMA_SKIP_POSTINSTALL_GENERATE +### `PRISMA_SKIP_POSTINSTALL_GENERATE` `PRISMA_SKIP_POSTINSTALL_GENERATE` can be set to a truthy value to skip the auto-generation of Prisma Client when its `postinstall` hook is triggered by a package manager. The `postinstall` hook of the `@prisma/client` package is triggered when the package is installed, or its version is updated. -### PRISMA_DISABLE_WARNINGS +### `PRISMA_DISABLE_WARNINGS` Disables all CLI warnings generated by `logger.warn`. -### PRISMA_GENERATE_NO_ENGINE +### `PRISMA_GENERATE_NO_ENGINE` @@ -83,7 +83,7 @@ This environment variable is available since version `5.2.0` `PRISMA_GENERATE_NO_ENGINE` can be set to a truthy value to generate a Prisma Client without an included [query engine](/orm/more/under-the-hood/engines) in order to reduce deployed application size when paired with [Prisma Accelerate](/accelerate). -### PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK +### `PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK` @@ -97,7 +97,7 @@ This environment variable is available since version `5.3.0` The Prisma CLI supports custom HTTP(S) proxies to download the Prisma engines. These can be helpful to use when working behind a corporate firewall. See [Using a HTTP proxy for the CLI](/orm/reference/prisma-cli-reference#using-a-http-proxy-for-the-cli) for more information. -### NO_PROXY +### `NO_PROXY` `NO_PROXY` is a comma-separated list of hostnames or IP addresses that do not require a proxy. @@ -105,7 +105,7 @@ The Prisma CLI supports custom HTTP(S) proxies to download the Prisma engines. T NO_PROXY=myhostname.com,10.11.12.0/16,172.30.0.0/16 ``` -### HTTP_PROXY +### `HTTP_PROXY` `HTTP_PROXY` is set with the hostname or IP address of a proxy server. @@ -113,7 +113,7 @@ NO_PROXY=myhostname.com,10.11.12.0/16,172.30.0.0/16 HTTP_PROXY=http://proxy.example.com ``` -### HTTPS_PROXY +### `HTTPS_PROXY` `HTTPS_PROXY` is set with the hostname or IP address of a proxy server. @@ -125,7 +125,7 @@ HTTPS_PROXY=https://proxy.example.com ### Configuring Query Engine Type -#### PRISMA_CLI_QUERY_ENGINE_TYPE +#### `PRISMA_CLI_QUERY_ENGINE_TYPE` `PRISMA_CLI_QUERY_ENGINE_TYPE` is used to [define the query engine type Prisma CLI downloads and uses](/orm/more/under-the-hood/engines#configuring-the-query-engine). Defaults to `library`, but can be set to `binary`: @@ -133,7 +133,7 @@ HTTPS_PROXY=https://proxy.example.com PRISMA_CLI_QUERY_ENGINE_TYPE=binary ``` -#### PRISMA_CLIENT_ENGINE_TYPE +#### `PRISMA_CLIENT_ENGINE_TYPE` `PRISMA_CLIENT_ENGINE_TYPE` is used to [define the query engine type Prisma Client downloads and uses](/orm/more/under-the-hood/engines#configuring-the-query-engine). Defaults to `library`, but can be set to `binary`: @@ -147,7 +147,7 @@ It is the environment variable equivalent for the [`engineType` property of the ### Downloading Engines -#### PRISMA_ENGINES_MIRROR +#### `PRISMA_ENGINES_MIRROR` `PRISMA_ENGINES_MIRROR` can be used to specify a custom CDN (or server) endpoint to download the engines files for the CLI/Client. The default value is `https://binaries.prisma.sh`, where Prisma hosts the engine files. @@ -157,9 +157,9 @@ PRISMA_ENGINES_MIRROR=https://example.org/custom-engines/ See [Prisma engines](/orm/more/under-the-hood/engines#hosting-engines) for a conceptual overview of how to use this environment variable. -Note: This environment variable used to be available as `PRISMA_BINARIES_MIRROR`, which was deprecated in Prisma 3.0.1. It is discouraged to use anymore and will be removed in the future. +Note: This environment variable used to be available as `PRISMA_BINARIES_MIRROR`, which was deprecated in Prisma ORM 3.0.1. It is discouraged to use anymore and will be removed in the future. -#### PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING +#### `PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING` @@ -167,7 +167,7 @@ This environment variable is available since version `4.16.0` -`PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING` can be can be set to a truthy value to ignore problems around downloading & verifying the integrity (via a checksum file) of the Prisma engines. +`PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING` can be can be set to a truthy value to ignore problems around downloading & verifying the integrity (via a checksum file) of the Prisma ORM engines. This is particularly useful when deploying to an offline system environment where the checksum file cannot be downloaded. ```env @@ -180,7 +180,7 @@ Note: we might change the overall download behavior in a future release in a way By default, all engine files are downloaded when you install Prisma CLI, copied when generating Prisma Client, and put into known locations. There are however situations where you may want to use a custom engine file from custom locations: -#### PRISMA_QUERY_ENGINE_BINARY +#### `PRISMA_QUERY_ENGINE_BINARY` `PRISMA_QUERY_ENGINE_BINARY` is used to set a custom location for your own query engine binary. @@ -194,7 +194,7 @@ For Prisma Client, on build time (during `prisma generate`), it defines where th Note: This can only have an effect if the engine type of CLI or Client are set to `binary`. If the engine type is `library` (the default), use PRISMA_QUERY_ENGINE_LIBARY instead. -#### PRISMA_QUERY_ENGINE_LIBRARY +#### `PRISMA_QUERY_ENGINE_LIBRARY` `PRISMA_QUERY_ENGINE_LIBRARY` is used to set a custom location for your own query engine library. @@ -208,7 +208,7 @@ For Prisma Client, on build time (during `prisma generate`), it defines where th Note: This can only have an effect if the engine type of CLI or Client are set to `library` (the default) -#### PRISMA_SCHEMA_ENGINE_BINARY +#### `PRISMA_SCHEMA_ENGINE_BINARY` `PRISMA_SCHEMA_ENGINE_BINARY` is used to set a custom location for your Schema engine binary. @@ -216,7 +216,7 @@ Note: This can only have an effect if the engine type of CLI or Client are set t PRISMA_SCHEMA_ENGINE_BINARY=custom/my-schema-engine-unix ``` -#### PRISMA_MIGRATION_ENGINE_BINARY +#### `PRISMA_MIGRATION_ENGINE_BINARY` @@ -230,7 +230,7 @@ PRISMA_SCHEMA_ENGINE_BINARY=custom/my-schema-engine-unix PRISMA_MIGRATION_ENGINE_BINARY=custom/my-migration-engine-unix ``` -#### PRISMA_INTROSPECTION_ENGINE_BINARY +#### `PRISMA_INTROSPECTION_ENGINE_BINARY` `PRISMA_INTROSPECTION_ENGINE_BINARY` is used to set a custom location for your own introspection engine binary. @@ -244,9 +244,9 @@ The Introspection Engine is served by the Migration Engine from [4.9.0](https:// -#### PRISMA_FMT_BINARY +#### `PRISMA_FMT_BINARY` - + This functionality has been removed in Prisma CLI version 4.10.0. It only works in earlier versions. @@ -266,14 +266,16 @@ The `PRISMA_FMT_BINARY` variable is used in versions [4.2.0](https://github.com/ ### CLI Binary Targets -#### PRISMA_CLI_BINARY_TARGETS +#### `PRISMA_CLI_BINARY_TARGETS` `PRISMA_CLI_BINARY_TARGETS` can be used to specify one or more binary targets that Prisma CLI will download during installation (so it must be provided during `npm install` of Prisma CLI and does not affect runtime of Prisma CLI or Prisma Client). -Use `PRISMA_CLI_BINARY_TARGETS` if you 1) deploy to a specific platform via an upload of a local project that includes dependencies, and 2) your local environment is different from the target (e.g. AWS Lambda is `rhel-openssl-1.0.x`, and your local environment might be macOS arm64 `darwin-arm64`). Using the `PRISMA_CLI_BINARY_TARGETS` environment variable ensures that the target engine files are also downloaded. +Use `PRISMA_CLI_BINARY_TARGETS` if you 1) deploy to a specific platform via an upload of a local project that includes dependencies, and 2) your local environment is different from the target (e.g. AWS Lambda with Node.js 20+ is `rhel-openssl-3.0.x`, and your local environment might be macOS arm64 `darwin-arm64`). Using the `PRISMA_CLI_BINARY_TARGETS` environment variable ensures that the target engine files are also downloaded. ```terminal -PRISMA_CLI_BINARY_TARGETS=darwin-arm64,rhel-openssl-1.0.x npm install +PRISMA_CLI_BINARY_TARGETS=darwin-arm64,rhel-openssl-3.0.x npm install ``` This is the Prisma CLI equivalent for the [`binaryTargets` property of the `generator` block](/orm/prisma-schema/overview/generators#binary-targets), which enables you to define the same setting for Prisma Client. + +> **Note**: For Node.js versions earlier than 20, the openssl version was 1.0.x instead of 3.0.x. This is most obvious in AWS Lambda deployments, where the binary target would be `rhel-openssl-1.0.x` instead of `rhel-openssl-3.0.x`. diff --git a/content/200-orm/500-reference/350-database-features.mdx b/content/200-orm/500-reference/350-database-features.mdx index 11a545a45c..b617da886b 100644 --- a/content/200-orm/500-reference/350-database-features.mdx +++ b/content/200-orm/500-reference/350-database-features.mdx @@ -1,22 +1,22 @@ --- title: 'Database features matrix' metaTitle: 'Database features matrix' -metaDescription: 'Learn which database features are supported in Prisma and how they map to the different Prisma tools.' +description: 'Learn which database features are supported in Prisma ORM and how they map to the different Prisma ORM tools.' wide: true tocDepth: 3 --- -This page gives an overview of the features which are provided by the databases that Prisma supports. Additionally, it explains how each of these features can be used in Prisma with pointers to further documentation. +This page gives an overview of the features which are provided by the databases that Prisma ORM supports. Additionally, it explains how each of these features can be used in Prisma ORM with pointers to further documentation. -> **Note**: If a feature is not supported natively by the database, it's also not available in Prisma. +> **Note**: If a feature is not supported natively by the database, it's also not available in Prisma ORM. ## Relational database features -This section describes which database features exist on the relational databases that are currently supported by Prisma. The **Prisma schema** column indicates how a certain feature can be represented in the [Prisma schema](/orm/prisma-schema) and links to its documentation. Note that database features can be used in **Prisma Client** even though they might not yet be representable in the Prisma schema. +This section describes which database features exist on the relational databases that are currently supported by Prisma ORM. The **Prisma schema** column indicates how a certain feature can be represented in the [Prisma schema](/orm/prisma-schema) and links to its documentation. Note that database features can be used in **Prisma Client** even though they might not yet be representable in the Prisma schema. ### Constraints @@ -68,27 +68,7 @@ Algorithm specified via `USING`: | SP-GiST | ✔️ | ✔️ | No | No | ✔️ | ✔️† | ✔️\* | Not yet | - \* Only available if natively supported by database. -- † Available with the PostgreSQL connector only in Prisma versions `4.0.0` and later. - - +- † Available with the PostgreSQL connector only in Prisma ORM versions `4.0.0` and later. ### Misc @@ -104,34 +84,30 @@ Lock option (MySQL): | Table inheritance | ✔️ | ✔️ | No | No | ✔️ | Not yet | ✔️\* | Not yet | | Authorization and user management | ✔️ | ✔️ | ✔️ | No | ✔️ | Not yet | Not yet | Not yet | - - - \* Only available if natively supported by database. - † Only supports JSON through SQL functions, but doesn't have a JSON column type. Therefore client JSON operations are not supported. - ‡ JSON arrays are not yet supported: see the [CockroachDB connector page](/orm/overview/databases/cockroachdb) for details - - ## NoSQL database features -This section describes which database features exist on the NoSQL databases that are currently supported by Prisma. +This section describes which database features exist on the NoSQL databases that are currently supported by Prisma ORM. ### MongoDB -The following table lists common MongoDB features and describes the level of support offered by Prisma: - -| Feature | Supported by Prisma | Notes | -| ----------------------------------------- | :-----------------: | :---------------------------------------------------------------------------------------------: | -| Embedded documents | ✔️ | | -| Transactions | ✔️ | | -| Indexes | ✔️ with caveats | Indexes can only be introspected if the field they refer to includes at least some data. | -| Autoincrementing IDs | No | | -| Compound IDs | No | MongoDB does not support composite IDs (`@@id`) | -| Generated `ObjectId` | ✔️ | See: [Defining IDs for MongoDB](/orm/prisma-schema/data-model/models#defining-ids-in-mongodb) | -| Arrays | ✔️ | | -| Enums | ✔️ | Implemented at Prisma level | -| Native database types | ✔️ | See: [Field mapping reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) | -| JSON support | ✔️ | Advanced `Json` field filtering is not yet supported. | -| DBrefs | No | -| Change streams | No | -| Direct access to the aggregation pipeline | No | +The following table lists common MongoDB features and describes the level of support offered by Prisma ORM: + +| Feature | Supported by Prisma ORM | Notes | +| ----------------------------------------- | :---------------------: | :---------------------------------------------------------------------------------------------: | +| Embedded documents | ✔️ | | +| Transactions | ✔️ | | +| Indexes | ✔️ with caveats | Indexes can only be introspected if the field they refer to includes at least some data. | +| Autoincrementing IDs | No | | +| Compound IDs | No | MongoDB does not support composite IDs (`@@id`) | +| Generated `ObjectId` | ✔️ | See: [Defining IDs for MongoDB](/orm/prisma-schema/data-model/models#defining-ids-in-mongodb) | +| Arrays | ✔️ | | +| Enums | ✔️ | Implemented at Prisma ORM level | +| Native database types | ✔️ | See: [Field mapping reference](/orm/reference/prisma-schema-reference#model-field-scalar-types) | +| JSON support | ✔️ | Advanced `Json` field filtering is not yet supported. | +| DBrefs | No | +| Change streams | No | +| Direct access to the aggregation pipeline | No | diff --git a/content/200-orm/500-reference/375-supported-databases.mdx b/content/200-orm/500-reference/375-supported-databases.mdx index fdaaf78d57..fefc222d76 100644 --- a/content/200-orm/500-reference/375-supported-databases.mdx +++ b/content/200-orm/500-reference/375-supported-databases.mdx @@ -1,12 +1,12 @@ --- title: 'Supported databases' -metaTitle: 'Databases supported by Prisma' -metaDescription: 'This page lists all the databases and their versions that are supported by Prisma.' +metaTitle: 'Databases supported by Prisma ORM' +description: 'This page lists all the databases and their versions that are supported by Prisma ORM.' --- -Prisma currently supports the following databases. +Prisma ORM currently supports the following databases. > See also: [System requirements](/orm/reference/system-requirements). @@ -19,14 +19,15 @@ An asterisk (\*) indicates that the version number is not relevant; either all v | Database | Version | | -------------------- | ------- | | CockroachDB | 21.2.4+ | -| MariaDB | 10 | +| MariaDB | 10.0+ | +| MariaDB | 11.0+ | | Microsoft SQL Server | 2017 | | Microsoft SQL Server | 2019 | | Microsoft SQL Server | 2022 | | MongoDB | 4.2+ | | MySQL | 5.6 | | MySQL | 5.7 | -| MySQL | 8 | +| MySQL | 8.0 | | PostgreSQL | 9.6 | | PostgreSQL | 10 | | PostgreSQL | 11 | @@ -36,7 +37,7 @@ An asterisk (\*) indicates that the version number is not relevant; either all v | PostgreSQL | 15 | | SQLite | \* | -Note that a fixed version of SQLite is shipped with every Prisma release. +Note that a fixed version of SQLite is shipped with every Prisma ORM release. ## Managed databases diff --git a/content/200-orm/500-reference/380-connection-urls.mdx b/content/200-orm/500-reference/380-connection-urls.mdx index 28b6dbbbf0..9a88293162 100644 --- a/content/200-orm/500-reference/380-connection-urls.mdx +++ b/content/200-orm/500-reference/380-connection-urls.mdx @@ -1,13 +1,13 @@ --- title: 'Connection URLs' metaTitle: 'Connection URLs (Reference)' -metaDescription: 'Learn about the format and syntax Prisma uses for defining database connection URLs for PostgreSQL, MySQL and SQLite.' +description: 'Learn about the format and syntax Prisma ORM uses for defining database connection URLs for PostgreSQL, MySQL and SQLite.' tocDepth: 3 --- -Prisma needs a connection URL to be able to connect to your database, e.g. when sending queries with [Prisma Client](/orm/prisma-client) or when changing the database schema with [Prisma Migrate](/orm/prisma-migrate). +Prisma ORM needs a connection URL to be able to connect to your database, e.g. when sending queries with [Prisma Client](/orm/prisma-client) or when changing the database schema with [Prisma Migrate](/orm/prisma-migrate). The connection URL is provided via the `url` field of a `datasource` block in your Prisma schema. It generally consists of the following components (except for SQLite): @@ -17,13 +17,13 @@ The connection URL is provided via the `url` field of a `datasource` block in yo - **Port**: The port on which your database server is running - **Database name**: The name of the database you want to use -Make sure you have this information at hand when getting started with Prisma. If you don't have a database server running yet, you can either use a local SQLite database file (see the [Quickstart](/getting-started/quickstart)) or [setup a free PostgreSQL database on Supabase](https://dev.to/prisma/set-up-a-free-postgresql-database-on-supabase-to-use-with-prisma-3pk6). +Make sure you have this information at hand when getting started with Prisma ORM. If you don't have a database server running yet, you can either use a local SQLite database file (see the [Quickstart](/getting-started/quickstart)) or [setup a free PostgreSQL database on Supabase](https://dev.to/prisma/set-up-a-free-postgresql-database-on-supabase-to-use-with-prisma-3pk6). ## Format -The format of the connection URL depends on the _database connector_ you're using. Prisma generally supports the standard formats for each database. You can find out more about the connection URL of your database on the dedicated docs page: +The format of the connection URL depends on the _database connector_ you're using. Prisma ORM generally supports the standard formats for each database. You can find out more about the connection URL of your database on the dedicated docs page: - [PostgreSQL](/orm/overview/databases/postgresql) - [MySQL](/orm/overview/databases/mysql) @@ -40,11 +40,11 @@ For Microsoft SQL Server, you must [escape special characters](/orm/overview/dat ## Examples -Here are examples for the connection URLs of the databases Prisma supports: +Here are examples for the connection URLs of the databases Prisma ORM supports: ### PostgreSQL -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = "postgresql://janedoe:mypassword@localhost:5432/mydb?schema=sample" @@ -53,7 +53,7 @@ datasource db { ### MySQL -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mysql" url = "mysql://janedoe:mypassword@localhost:3306/mydb" @@ -62,7 +62,7 @@ datasource db { ### Microsoft SQL Server -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlserver" url = "sqlserver://localhost:1433;initial catalog=sample;user=sa;password=mypassword;" @@ -71,7 +71,7 @@ datasource db { ### SQLite -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = "file:./dev.db" @@ -80,7 +80,7 @@ datasource db { ### CockroachDB -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "cockroachdb" url = "postgresql://janedoe:mypassword@localhost:26257/mydb?schema=public" @@ -89,7 +89,7 @@ datasource db { ### MongoDB -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mongodb" url = "mongodb+srv://root:@cluster0.ab1cd.mongodb.net/myDatabase?retryWrites=true&w=majority" @@ -100,7 +100,7 @@ datasource db { You can also provide the connection URL as an environment variable: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -109,7 +109,7 @@ datasource db { You can then either set the environment variable in your terminal or by providing a [dotenv](https://github.com/motdotla/dotenv) file named `.env`. This will automatically be picked up by the Prisma CLI. -Prisma reads the connection URL from the dotenv file in the following situations: +Prisma ORM reads the connection URL from the dotenv file in the following situations: - When it updates the schema during build time - When it connects to the database during run time diff --git a/content/200-orm/500-reference/400-system-requirements.mdx b/content/200-orm/500-reference/400-system-requirements.mdx index ae53a63eae..c8dbb09516 100644 --- a/content/200-orm/500-reference/400-system-requirements.mdx +++ b/content/200-orm/500-reference/400-system-requirements.mdx @@ -1,23 +1,23 @@ --- title: 'System requirements' metaTitle: 'System requirements (Reference)' -metaDescription: 'System requirements for running Prisma' +description: 'System requirements for running Prisma ORM' tocDepth: 3 --- -This page provides an overview of the system requirements for Prisma. +This page provides an overview of the system requirements for Prisma ORM. ## System requirements -This section lists the software that Prisma requires and the supported operating systems, along with runtime dependency requirements for specific operating systems. +This section lists the software that Prisma ORM requires and the supported operating systems, along with runtime dependency requirements for specific operating systems. ### Software requirements -The latest version of Prisma requires the following software: +The latest version of Prisma ORM requires the following software: | | Minimum required version | | :-------------------- | :----------------------- | @@ -27,7 +27,7 @@ The latest version of Prisma requires the following software: Notes: -- Prisma supports and tests all _Active LTS_ and _Maintenance LTS_ **Node.js** releases. [Releases that are not in these states like _Current_, and also odd-numbered versions](https://nodejs.org/en/about/releases/) probably also work, but are not recommended for production use. +- Prisma ORM supports and tests all _Active LTS_ and _Maintenance LTS_ **Node.js** releases. [Releases that are not in these states like _Current_, and also odd-numbered versions](https://nodejs.org/en/about/releases/) probably also work, but are not recommended for production use. - **TypeScript** is only required for TypeScript users. - When using **Yarn 1**, `1.19.2` is the minimum version compatible with Prisma Client. @@ -35,11 +35,11 @@ See also: [Supported database versions](/orm/reference/supported-databases) ### Operating systems -Prisma is supported on MacOS, Windows and most Linux distributions. +Prisma ORM is supported on MacOS, Windows and most Linux distributions. #### Linux runtime dependencies -Prisma requires the following system libraries to be installed to work: +Prisma ORM requires the following system libraries to be installed to work: - OpenSSL 1.0.x, 1.1.x or 3.x - zlib (`libz.so.1`) @@ -65,7 +65,7 @@ On `ARM64` (`aarch64`) architecture: | RHEL | 1.0.x, 1.1.x, 3.x | glibc 2.24+ | | Debian or others | 1.0.x, 1.1.x, 3.x | glibc 2.24+ | -When Prisma can not resolve the OpenSSL version on a system (e.g. because it is not installed), it will default to OpenSSL 1.1.x. +When Prisma ORM can not resolve the OpenSSL version on a system (e.g. because it is not installed), it will default to OpenSSL 1.1.x. Systems that can run the supported Node.js versions will most likely have zlib and libgcc available. One notable exception is Google's Distroless images, where `libz.so.1` needs to be copied from a compatible Debian system. @@ -75,7 +75,7 @@ On Windows [Microsoft Visual C++ Redistributable 2015](https://download.microsof #### macOS runtime dependencies -Prisma supports macOS 10.15 or newer. There are no additional platform-specific requirements on macOS other than what is listed for all platforms in the [Software requirements](#software-requirements) section. +Prisma ORM supports macOS 10.15 or newer. There are no additional platform-specific requirements on macOS other than what is listed for all platforms in the [Software requirements](#software-requirements) section. ## Troubleshooting @@ -101,7 +101,7 @@ Type error: Type expected. #### Solution -Upgrade the TypeScript dependency in your project to a [version supported by Prisma](#software-requirements). `npm install -D typescript`. +Upgrade the TypeScript dependency in your project to a [version supported by Prisma ORM](#software-requirements). `npm install -D typescript`. ### Unable to use `groupBy` preview feature @@ -128,4 +128,4 @@ server.ts:6:48 - error TS2554: Expected 0 arguments, but got 1. #### Solution -Upgrade the TypeScript dependency in your project to a [version supported by Prisma](#software-requirements). `npm install -D typescript`. +Upgrade the TypeScript dependency in your project to a [version supported by Prisma ORM](#software-requirements). `npm install -D typescript`. diff --git a/content/200-orm/500-reference/500-preview-features/050-client-preview-features.mdx b/content/200-orm/500-reference/500-preview-features/050-client-preview-features.mdx index 07053bff87..4ba80b6205 100644 --- a/content/200-orm/500-reference/500-preview-features/050-client-preview-features.mdx +++ b/content/200-orm/500-reference/500-preview-features/050-client-preview-features.mdx @@ -1,7 +1,7 @@ --- title: 'Prisma Client & Prisma schema' metaTitle: 'Prisma Client & Prisma schema' -metaDescription: 'Prisma Client and Prisma schema features that are currently in Preview.' +description: 'Prisma Client and Prisma schema features that are currently in Preview.' --- @@ -57,36 +57,36 @@ To enable a Prisma Client Preview feature: In the list below, you can find a history of Prisma Client and Prisma schema features that were in Preview and are now in general availability. The features are sorted by the most recent version in which they were promoted to general availability. -| Feature | Released into Preview | Released into General Availability | -| -------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------: | -| `jsonProtocol` | [4.11.0](https://github.com/prisma/prisma/releases/tag/4.11.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | -| [`extendedWhereUnique`](/orm/reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) | [4.5.0](https://github.com/prisma/prisma/releases/tag/4.5.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | -| [`fieldReference`](/orm/reference/prisma-client-reference#compare-columns-in-the-same-table) | [4.3.0](https://github.com/prisma/prisma/releases/tag/4.3.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | -| [`clientExtensions`](/orm/prisma-client/client-extensions) | [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | -| [`filteredRelationCount`](/orm/prisma-client/queries/aggregation-grouping-summarizing#filter-the-relation-count) | [4.3.0](https://github.com/prisma/prisma/releases/tag/4.3.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | -| [`orderByNulls`](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last) | [4.1.0](https://github.com/prisma/prisma/releases/tag/4.1.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | -| [`referentialIntegrity`](/orm/prisma-schema/data-model/relations/relation-mode) | [3.1.1](https://github.com/prisma/prisma/releases/tag/3.1.1) | [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0) | -| [`interactiveTransactions`](/orm/prisma-client/queries/transactions#interactive-transactions) | [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) |
  • [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0)
  • with Prisma Accelerate [5.1.1](https://github.com/prisma/prisma/releases/tag/5.1.1)
| -| [`extendedIndexes`](/orm/prisma-schema/data-model/indexes) | [3.5.0](https://github.com/prisma/prisma/releases/tag/3.5.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | -| [`filterJson`](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filter-on-a-json-field) | [2.23.0](https://github.com/prisma/prisma/releases/tag/2.23.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | -| [`improvedQueryRaw`](/orm/prisma-client/queries/raw-database-access/raw-queries#raw-query-type-mapping) | [3.14.0](https://github.com/prisma/prisma/releases/tag/3.14.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | -| [`cockroachdb`](/orm/overview/databases/cockroachdb) |
  • [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0)
  • migrations in CockroachDB in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
| [3.14.0](https://github.com/prisma/prisma/releases/tag/3.14.0) | -| [`mongodb`](/orm/overview/databases/mongodb) |
  • [2.27.0](https://github.com/prisma/prisma/releases/tag/2.27.0)
  • introspection of MongoDB in [3.2.0](https://github.com/prisma/prisma/releases/tag/3.2.0)
  • introspection of embedded documents in [3.4.0](https://github.com/prisma/prisma/releases/tag/3.4.0)
  • MongoDB embedded documents in [3.10.0](https://github.com/prisma/prisma/releases/tag/3.10.0)
  • introspection of embedded documents in [3.10.0](https://github.com/prisma/prisma/releases/tag/3.10.0)
  • raw query support for MongoDB in [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0)
  • filters in embedded documents as an Experimental Feature in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
  • order by embedded documents in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
| [3.12.0](https://github.com/prisma/prisma/releases/tag/3.12.0) | -| [`microsoftSqlServer`](/orm/overview/databases/sql-server) | [2.10.0](https://github.com/prisma/prisma/releases/tag/2.10.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`namedConstraints`](/orm/prisma-schema/data-model/database-mapping#constraint-and-index-names) | [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`referentialActions`](/orm/prisma-schema/data-model/relations/referential-actions) | [2.26.0](https://github.com/prisma/prisma/releases/tag/2.26.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`orderByAggregateGroup`](/orm/prisma-client/queries/aggregation-grouping-summarizing#order-by-aggregate-group) | [2.21.0](https://github.com/prisma/prisma/releases/tag/2.21.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`orderByRelation`](/orm/prisma-client/queries/filtering-and-sorting#sort-by-relation) |
  • [2.16.0](https://github.com/prisma/prisma/releases/tag/2.16.0)
  • order by aggregates of relations in [2.19.0](https://github.com/prisma/prisma/releases/tag/2.19.0)
| [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`selectRelationCount`](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| `napi` | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | -| [`groupBy`](/orm/reference/prisma-client-reference#groupby) | [2.14.0](https://github.com/prisma/prisma/releases/tag/2.14.0) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | -| [`createMany`](/orm/reference/prisma-client-reference#createmany) | [2.16.0](https://github.com/prisma/prisma/releases/tag/2.16.0) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | -| [`nativeTypes`](/orm/prisma-schema/data-model/models#native-types-mapping) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) | -| [`uncheckedScalarInputs`](/orm/prisma-client/queries/relation-queries#create-a-single-record-and-multiple-related-records) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) | -| [`transactionApi`](/orm/prisma-client/queries/transactions#the-transaction-api) | [2.1.0](https://github.com/prisma/prisma/releases/tag/2.1.0) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | -| [`connectOrCreate`](/orm/reference/prisma-client-reference#connectorcreate) | [2.1.0](https://github.com/prisma/prisma/releases/tag/2.1.0) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | -| [`atomicNumberOperations`](/orm/reference/prisma-client-reference#atomic-number-operations) | [2.6.0](https://github.com/prisma/prisma/releases/tag/2.6.0) | [2.10.0](https://github.com/prisma/prisma/releases/tag/2.10.0) | -| [`insensitiveFilters` (PostgreSQL)](/orm/prisma-client/queries/filtering-and-sorting#case-insensitive-filtering) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | [2.8.0](https://github.com/prisma/prisma/releases/tag/2.8.0) | -| [`middlewares`](/orm/prisma-client/client-extensions/middleware) | [2.3.0](https://github.com/prisma/prisma/releases/tag/2.3.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | -| [`aggregateApi`](/orm/prisma-client/queries/aggregation-grouping-summarizing#aggregate) | [2.2.0](https://github.com/prisma/prisma/releases/tag/2.2.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | -| [`distinct`](/orm/reference/prisma-client-reference#distinct) | [2.3.0](https://github.com/prisma/prisma/releases/tag/2.3.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | +| Feature | Released into Preview | Released into General Availability | +| -------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| `jsonProtocol` | [4.11.0](https://github.com/prisma/prisma/releases/tag/4.11.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | +| [`extendedWhereUnique`](/orm/reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) | [4.5.0](https://github.com/prisma/prisma/releases/tag/4.5.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | +| [`fieldReference`](/orm/reference/prisma-client-reference#compare-columns-in-the-same-table) | [4.3.0](https://github.com/prisma/prisma/releases/tag/4.3.0) | [5.0.0](https://github.com/prisma/prisma/releases/tag/5.0.0) | +| [`clientExtensions`](/orm/prisma-client/client-extensions) | [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | +| [`filteredRelationCount`](/orm/prisma-client/queries/aggregation-grouping-summarizing#filter-the-relation-count) | [4.3.0](https://github.com/prisma/prisma/releases/tag/4.3.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | +| [`orderByNulls`](/orm/prisma-client/queries/filtering-and-sorting#sort-with-null-records-first-or-last) | [4.1.0](https://github.com/prisma/prisma/releases/tag/4.1.0) | [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) | +| [`referentialIntegrity`](/orm/prisma-schema/data-model/relations/relation-mode) | [3.1.1](https://github.com/prisma/prisma/releases/tag/3.1.1) | [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0) | +| [`interactiveTransactions`](/orm/prisma-client/queries/transactions#interactive-transactions) | [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) |
  • [4.7.0](https://github.com/prisma/prisma/releases/tag/4.7.0)
  • with Prisma Accelerate [5.1.1](https://github.com/prisma/prisma/releases/tag/5.1.1)
| +| [`extendedIndexes`](/orm/prisma-schema/data-model/indexes) | [3.5.0](https://github.com/prisma/prisma/releases/tag/3.5.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | +| [`filterJson`](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filter-on-a-json-field) | [2.23.0](https://github.com/prisma/prisma/releases/tag/2.23.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | +| [`improvedQueryRaw`](/orm/prisma-client/queries/raw-database-access/raw-queries#raw-query-type-mapping) | [3.14.0](https://github.com/prisma/prisma/releases/tag/3.14.0) | [4.0.0](https://github.com/prisma/prisma/releases/tag/4.0.0) | +| [`cockroachdb`](/orm/overview/databases/cockroachdb) |
  • [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0)
  • migrations in CockroachDB in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
| [3.14.0](https://github.com/prisma/prisma/releases/tag/3.14.0) | +| [`mongodb`](/orm/overview/databases/mongodb) |
  • [2.27.0](https://github.com/prisma/prisma/releases/tag/2.27.0)
  • introspection of MongoDB in [3.2.0](https://github.com/prisma/prisma/releases/tag/3.2.0)
  • introspection of embedded documents in [3.4.0](https://github.com/prisma/prisma/releases/tag/3.4.0)
  • MongoDB embedded documents in [3.10.0](https://github.com/prisma/prisma/releases/tag/3.10.0)
  • introspection of embedded documents in [3.10.0](https://github.com/prisma/prisma/releases/tag/3.10.0)
  • raw query support for MongoDB in [3.9.0](https://github.com/prisma/prisma/releases/tag/3.9.0)
  • filters in embedded documents as an Experimental Feature in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
  • order by embedded documents in [3.11.0](https://github.com/prisma/prisma/releases/tag/3.11.0)
| [3.12.0](https://github.com/prisma/prisma/releases/tag/3.12.0) | +| [`microsoftSqlServer`](/orm/overview/databases/sql-server) | [2.10.0](https://github.com/prisma/prisma/releases/tag/2.10.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`namedConstraints`](/orm/prisma-schema/data-model/database-mapping#constraint-and-index-names) | [2.29.0](https://github.com/prisma/prisma/releases/tag/2.29.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`referentialActions`](/orm/prisma-schema/data-model/relations/referential-actions) | [2.26.0](https://github.com/prisma/prisma/releases/tag/2.26.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`orderByAggregateGroup`](/orm/prisma-client/queries/aggregation-grouping-summarizing#order-by-aggregate-group) | [2.21.0](https://github.com/prisma/prisma/releases/tag/2.21.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`orderByRelation`](/orm/prisma-client/queries/filtering-and-sorting#sort-by-relation) |
  • [2.16.0](https://github.com/prisma/prisma/releases/tag/2.16.0)
  • order by aggregates of relations in [2.19.0](https://github.com/prisma/prisma/releases/tag/2.19.0)
| [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`selectRelationCount`](/orm/prisma-client/queries/aggregation-grouping-summarizing#count-relations) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| `napi` | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | [3.0.1](https://github.com/prisma/prisma/releases/tag/3.0.1) | +| [`groupBy`](/orm/reference/prisma-client-reference#groupby) | [2.14.0](https://github.com/prisma/prisma/releases/tag/2.14.0) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | +| [`createMany`](/orm/reference/prisma-client-reference#createmany) | [2.16.0](https://github.com/prisma/prisma/releases/tag/2.16.0) | [2.20.0](https://github.com/prisma/prisma/releases/tag/2.20.0) | +| [`nativeTypes`](/orm/prisma-schema/data-model/models#native-types-mapping) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | [2.17.0](https://github.com/prisma/prisma/releases/tag/2.17.0) | +| [`uncheckedScalarInputs`](/orm/prisma-client/queries/relation-queries#create-a-single-record-and-multiple-related-records) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | [2.15.0](https://github.com/prisma/prisma/releases/tag/2.15.0) | +| [`transactionApi`](/orm/prisma-client/queries/transactions#the-transaction-api) | [2.1.0](https://github.com/prisma/prisma/releases/tag/2.1.0) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | +| [`connectOrCreate`](/orm/reference/prisma-client-reference#connectorcreate) | [2.1.0](https://github.com/prisma/prisma/releases/tag/2.1.0) | [2.11.0](https://github.com/prisma/prisma/releases/tag/2.11.0) | +| [`atomicNumberOperations`](/orm/reference/prisma-client-reference#atomic-number-operations) | [2.6.0](https://github.com/prisma/prisma/releases/tag/2.6.0) | [2.10.0](https://github.com/prisma/prisma/releases/tag/2.10.0) | +| [`insensitiveFilters` (PostgreSQL)](/orm/prisma-client/queries/filtering-and-sorting#case-insensitive-filtering) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | [2.8.0](https://github.com/prisma/prisma/releases/tag/2.8.0) | +| [`middlewares`](/orm/prisma-client/client-extensions/middleware) | [2.3.0](https://github.com/prisma/prisma/releases/tag/2.3.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | +| [`aggregateApi`](/orm/prisma-client/queries/aggregation-grouping-summarizing#aggregate) | [2.2.0](https://github.com/prisma/prisma/releases/tag/2.2.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | +| [`distinct`](/orm/reference/prisma-client-reference#distinct) | [2.3.0](https://github.com/prisma/prisma/releases/tag/2.3.0) | [2.5.0](https://github.com/prisma/prisma/releases/tag/2.5.0) | diff --git a/content/200-orm/500-reference/500-preview-features/080-cli-preview-features.mdx b/content/200-orm/500-reference/500-preview-features/080-cli-preview-features.mdx index cec13a9203..ca87fd6677 100644 --- a/content/200-orm/500-reference/500-preview-features/080-cli-preview-features.mdx +++ b/content/200-orm/500-reference/500-preview-features/080-cli-preview-features.mdx @@ -1,7 +1,7 @@ --- title: 'Prisma CLI' metaTitle: 'Prisma CLI' -metaDescription: Prisma CLI features that are currently in Preview. +description: Prisma CLI features that are currently in Preview. tocDepth: 3 --- @@ -17,20 +17,6 @@ For more information, see [ORM releases and maturity levels](/orm/more/releases) There are currently no [Preview](/orm/more/releases#preview) features for Prisma CLI. - - ## Preview features promoted to general availability In the list below, you can find a history of Prisma CLI features that were in Preview and are now in general availability. The features are sorted by the most recent version in which they were promoted to general availability. diff --git a/content/200-orm/500-reference/500-preview-features/index.mdx b/content/200-orm/500-reference/500-preview-features/index.mdx index a66e14815b..4a9b23354c 100644 --- a/content/200-orm/500-reference/500-preview-features/index.mdx +++ b/content/200-orm/500-reference/500-preview-features/index.mdx @@ -1,17 +1,18 @@ --- title: 'Preview features' metaTitle: 'Preview features (Reference)' -metaDescription: 'Previews are typically available behind a feature flag or require some form of opt-in.' +description: 'Previews are typically available behind a feature flag or require some form of opt-in.' +hide_table_of_contents: true hiddenPage: false --- -Some Prisma features are released as [Previews](/orm/more/releases#preview). [Share your feedback on all Preview features on GitHub](https://github.com/prisma/prisma/issues/3108). For information about available preview features and how to enable them, see: +Some Prisma ORM features are released as [Previews](/orm/more/releases#preview). [Share your feedback on all Preview features on GitHub](https://github.com/prisma/prisma/issues/3108). For information about available preview features and how to enable them, see: -- [Prisma Client and Prisma schema preview features](client-preview-features) -- [Prisma CLI preview features](cli-preview-features) +- [Prisma Client and Prisma schema preview features](/orm/reference/preview-features/client-preview-features) +- [Prisma CLI preview features](/orm/reference/preview-features/cli-preview-features) -For information regarding upgrading Prisma and enabling Preview features see [Upgrading to use Preview features](/orm/more/upgrade-guides/upgrading-to-use-preview-features). +For information regarding upgrading Prisma ORM and enabling Preview features see [Upgrading to use Preview features](/orm/more/upgrade-guides/upgrading-to-use-preview-features). diff --git a/content/200-orm/500-reference/_category_.json b/content/200-orm/500-reference/_category_.json new file mode 100644 index 0000000000..6a03fc6cc2 --- /dev/null +++ b/content/200-orm/500-reference/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Reference", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/500-reference/index.mdx b/content/200-orm/500-reference/index.mdx index 3991d92a30..4efe4fc1a5 100644 --- a/content/200-orm/500-reference/index.mdx +++ b/content/200-orm/500-reference/index.mdx @@ -1,14 +1,14 @@ --- title: 'Reference' metaTitle: 'Reference' -metaDescription: 'Reference for Prisma Client API, Prisma CLI, errors & more.' +description: 'Reference for Prisma Client API, Prisma CLI, errors & more.' staticLink: true -toc: false +hide_table_of_contents: true --- -The reference section of the documentation is a collection of reference pages that describe the Prisma APIs and database implementations. +The reference section of the documentation is a collection of reference pages that describe the Prisma ORM APIs and database implementations. diff --git a/content/200-orm/800-more/100-under-the-hood/100-engines.mdx b/content/200-orm/800-more/100-under-the-hood/100-engines.mdx index 21c612ba19..18c744316f 100644 --- a/content/200-orm/800-more/100-under-the-hood/100-engines.mdx +++ b/content/200-orm/800-more/100-under-the-hood/100-engines.mdx @@ -1,7 +1,7 @@ --- title: 'Engines' metaTitle: 'Engines' -metaDescription: "Prisma's query engine manages the communication with the database when using Prisma Client. Learn how it works on this page." +description: "Prisma's query engine manages the communication with the database when using Prisma Client. Learn how it works on this page." --- @@ -26,7 +26,7 @@ A Prisma engine is the **direct interface to the database**, any higher-level in As an example, Prisma Client connects to the [query engine](/orm/more/under-the-hood/engines) in order to read and write data in a database: -![Prisma engine](typical-flow-query-engine-at-runtime.png) +![Prisma engine](./typical-flow-query-engine-at-runtime.png) ### Using custom engine libraries or binaries @@ -60,25 +60,22 @@ You can define environment variables globally on your machine or in the `.env` f Add the environment variable to the [`.env` file](/orm/more/development-environment/environment-variables/env-files). -, ]} - defaultTabType="OS" -> + - + ``` PRISMA_QUERY_ENGINE_BINARY=custom/my-query-engine-unix ``` - - + + ``` PRISMA_QUERY_ENGINE_BINARY=c:\custom\path\my-query-engine-binary.exe ``` - + > **Note**: It is possible to [use an `.env` file in a location outside the `prisma` folder](/orm/more/development-environment/environment-variables/managing-env-files-and-setting-variables). @@ -87,26 +84,23 @@ PRISMA_QUERY_ENGINE_BINARY=c:\custom\path\my-query-engine-binary.exe Run the following command to set the environment variable globally (in this example, `PRISMA_QUERY_ENGINE_BINARY`): -, ]} - defaultTabType="OS" -> + - + ```terminal export PRISMA_QUERY_ENGINE_BINARY=/custom/my-query-engine-unix ``` - + - + ```terminal set PRISMA_QUERY_ENGINE_BINARY=c:\custom\my-query-engine-windows.exe ``` - + @@ -120,13 +114,9 @@ npx prisma -v The output shows that the query engine path comes from the `PRISMA_QUERY_ENGINE_BINARY` environment variable: -, ]} - defaultTabType="OS" -> - - + + ```terminal highlight=2;normal Current platform : darwin Query Engine : query-engine d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at /custom/my-query-engine-unix) @@ -134,8 +124,8 @@ Migration Engine : migration-engine-cli d6ff7119649922b84e413b3b69660e2f49e2 Introspection Engine : introspection-core d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at /myproject/node_modules/@prisma/engines/introspection-engine-unix) ``` - - + + ```terminal highlight=2;normal Current platform : windows @@ -144,7 +134,7 @@ Migration Engine : migration-engine-cli d6ff7119649922b84e413b3b69660e2f49e2 Introspection Engine : introspection-core d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at c:\myproject\node_modules\@prisma\engines\introspection-engine-windows.exe) ``` - + @@ -170,7 +160,7 @@ Note that the query engine is implemented in Rust. The source code is located in By default, Prisma Client loads the query engine as a [Node-API library](https://nodejs.org/api/n-api.html). You can alternatively [configure Prisma to use the query engine compiled as an executable binary](#configuring-the-query-engine), which is run as a sidecar process alongside your application. The Node-API library approach is recommended since it reduces the communication overhead between Prisma Client and the query engine. -![Diagram showing the query engine and Node.js at runtime](query-engine-node-js-at-runtime.png) +![Diagram showing the query engine and Node.js at runtime](./query-engine-node-js-at-runtime.png) The query engine is started when the first Prisma Client query is invoked or when the [`$connect()`](/orm/prisma-client/setup-and-configuration/databases-connections/connection-management) method is called on your `PrismaClient` instance. Once the query engine is started, it creates a [connection pool](/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool) and manages the physical connections to the database. From that point onwards, Prisma Client is ready to send [queries](/orm/prisma-client/queries/crud) to the database (e.g. `findUnique`, `findMany`, `create`, ...). @@ -190,7 +180,7 @@ The following diagram depicts a "typical flow": 1. The query engine closes the database connections 1. The query engine is stopped -![Typical flow of the query engine at run time](typical-flow-query-engine-at-runtime.png) +![Typical flow of the query engine at run time](./typical-flow-query-engine-at-runtime.png) ## Responsibilities of the query engine @@ -212,7 +202,7 @@ export DEBUG="engine" You can also get more visibility into the SQL queries that are generated by the query engine by setting the [`query` log level](/orm/reference/prisma-client-reference#log-levels) in Prisma Client: -```ts +```ts showLineNumbers const prisma = new PrismaClient({ log: ['query'], }) diff --git a/content/200-orm/800-more/100-under-the-hood/index.mdx b/content/200-orm/800-more/100-under-the-hood/index.mdx index 2c2dfae346..891e5adcda 100644 --- a/content/200-orm/800-more/100-under-the-hood/index.mdx +++ b/content/200-orm/800-more/100-under-the-hood/index.mdx @@ -1,16 +1,17 @@ --- title: 'Under the hood' metaTitle: 'Under the hood' -metaDescription: 'Learn about Prisma internals and how it works "under the hood". Prisma tools are based on an engine-layer which manages the communication with the database.' +description: 'Learn about Prisma ORM internals and how it works "under the hood". Prisma ORM tools are based on an engine-layer which manages the communication with the database.' +hide_table_of_contents: true --- -This page gives an overview of the Prisma internals and how it works "under the hood". +This page gives an overview of the Prisma ORM internals and how it works "under the hood". -Note that **this page does not contain any practical information that is relevant for _using_ Prisma**. It rather aims at providing a _mental model_ for what the Prisma toolkit _actually_ is and how the different tools that are available to developers are structured. +Note that **this page does not contain any practical information that is relevant for _using_ Prisma ORM**. It rather aims at providing a _mental model_ for what the Prisma ORM toolkit _actually_ is and how the different tools that are available to developers are structured. -If you're new to Prisma, be sure to check out the [Quickstart](/getting-started/quickstart) and [Introduction](/orm/overview/introduction/what-is-prisma) pages first. +If you're new to using Prisma ORM, be sure to check out the [Quickstart](/getting-started/quickstart) and [Introduction](/orm/overview/introduction/what-is-prisma) pages first. diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/001-rejectonnotfound-changes.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/001-rejectonnotfound-changes.mdx index 384649c21c..354865d063 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/001-rejectonnotfound-changes.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/001-rejectonnotfound-changes.mdx @@ -1,24 +1,24 @@ --- title: 'rejectOnNotFound changes' -metaTitle: 'How to handle removal of rejectOnNotFound in Prisma 5' -metaDescription: 'Sub-guide explaining how to update your code due to the removal of rejectOnNotFound in Prisma 5' +metaTitle: 'How to handle removal of rejectOnNotFound in Prisma ORM 5' +description: 'Sub-guide explaining how to update your code due to the removal of rejectOnNotFound in Prisma ORM 5' tocDepth: 2 toc: true --- -As of Prisma version 5.0.0, the deprecated parameter `rejectOnNotFound` has been removed. Depending on if your project used `rejectOnNotFound` per query or globally, there will be be different ways of updating your code. +As of Prisma ORM version 5.0.0, the deprecated parameter `rejectOnNotFound` has been removed. Depending on if your project used `rejectOnNotFound` per query or globally, there will be be different ways of updating your code. If you are using the `rejectOnNotFound` parameter on a per-query basis, then follow our steps for [updating your code at the query level](#replacing-rejectonnotfound-enabled-at-the-query-level). If instead you have set up the `rejectOnNotFound` parameter at the client level, you will need to follow [the steps for updating your code at the client level](#replacing-rejectonnotfound-enabled-at-the-client-level). -A full list of Prisma 5 changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). +A full list of Prisma ORM 5 changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). -## Replacing rejectOnNotFound enabled at the query level +## Replacing `rejectOnNotFound` enabled at the query level If you previously enabled `rejectOnNotFound` on a per-query basis, you will need to replace your usage at the _query level_. You can use our `*OrThrow` query variants, `findFirstOrThrow` or `findUniqueOrThrow` instead of supplying the parameter to `findFirst` and `findUnique`. @@ -82,7 +82,7 @@ const user = await prisma.user.findFirstOrThrow({ }).catch(adaptError(() => new MyCustomError()) ``` -## Replacing rejectOnNotFound enabled at the Client level +## Replacing `rejectOnNotFound` enabled at the Client level ### `rejectOnNotFound` via Prisma Client Constructor @@ -138,7 +138,7 @@ const prisma = new PrismaClient({ You will need to update your method usage to `...OrThrow` and then use a [Client Extension](/orm/prisma-client/client-extensions) in order to get the same behavior. -As an example, the following extension would give the same behavior in Prisma 5 that `Example 5` gave in Prisma 4 and lower. +As an example, the following extension would give the same behavior in Prisma ORM 5 that `Example 5` gave in Prisma ORM 4 and lower. ```js import { PrismaClient } from '@prisma/client'; diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/101-jsonprotocol-changes.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/101-jsonprotocol-changes.mdx index 01ddeee543..1a43abd564 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/101-jsonprotocol-changes.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/101-jsonprotocol-changes.mdx @@ -1,28 +1,28 @@ --- title: 'jsonProtocol changes' -metaTitle: 'Upgrade to jsonProtocol in Prisma 5' -metaDescription: 'Changes that need to be made to your app in Prisma 5 due to the jsonProtocol' +metaTitle: 'Upgrade to jsonProtocol in Prisma ORM 5' +description: 'Changes that need to be made to your app in Prisma ORM 5 due to the jsonProtocol' tocDepth: 2 toc: true --- -As of Prisma version 5.0.0, the new `jsonProtocol` is the default. There are some changes that directly result from this change and a few changes that are related to the new protocol. +As of Prisma ORM version 5.0.0, the new `jsonProtocol` is the default. There are some changes that directly result from this change and a few changes that are related to the new protocol. -A full list of Prisma 5 changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). +A full list of Prisma ORM 5 changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). -## jsonProtocol specific changes +## `jsonProtocol` specific changes -Below are changes that result directly from the `jsonProtocol` feature becoming the default in Prisma 5. +Below are changes that result directly from the `jsonProtocol` feature becoming the default in Prisma ORM 5. -### Removal of jsonProtocol Preview Feature +### Removal of `jsonProtocol` Preview Feature -In Prisma 5, `jsonProtocol` is the default and only protocol in Prisma. The `jsonProtocol` Preview feature is no longer needed. +In Prisma ORM 5, `jsonProtocol` is the default and only protocol in Prisma Client. The `jsonProtocol` Preview feature is no longer needed. -Prisma 4 and lower: +Prisma ORM 4 and lower: ```prisma generator client { @@ -31,7 +31,7 @@ generator client { } ``` -Prisma 5: +Prisma ORM 5: ```prisma generator client { @@ -41,13 +41,13 @@ generator client { ### Improved error messages -Due to the switch to the new protocol, several error messages have been improved. For example, the following error message in Prisma 4 and below: +Due to the switch to the new protocol, several error messages have been improved. For example, the following error message in Prisma ORM 4 and below: ```terminal Failed to validate the query: `Unable to match input value to any allowed input type for the field. Parse errors: [Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create`: Unable to match input value to any allowed input type for the field. Parse errors: [Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create.PersonCreateWithoutUserInput.hubspot_id`: A value is required but not set., Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create.PersonUncheckedCreateWithoutUserInput.hubspot_id`: A value is required but not set.], Query parsing/validation error at `Mutation.createOneUser.data.UserUncheckedCreateInput.person`: Field does not exist on enclosing type.]` at `Mutation.createOneUser.data` ``` -becomes the following in Prisma 5: +becomes the following in Prisma ORM 5: ```terminal Invalid `prisma.user.create()` invocation in @@ -72,7 +72,7 @@ Invalid `prisma.user.create()` invocation in Argument `hubspot_id` must not be null. ``` -## jsonProtocol related changes +## `jsonProtocol` related changes Below are changes that are related to the switch to the new protocol. If you were using the `jsonProtocol` Preview Feature, you most likely ran into these issues. @@ -80,9 +80,9 @@ Below are changes that are related to the switch to the new protocol. If you wer Several array shortcuts were removed as a part of this major update. These shortcuts were a way to add a single element as a value to an array-based operator. -#### OR operators +#### `OR` operators -The following code in Prisma 4 and lower: +The following code in Prisma ORM 4 and lower: ```js prisma.user.findMany({ @@ -92,7 +92,7 @@ prisma.user.findMany({ }) ``` -Will need to be changed to the following in Prisma 5: +Will need to be changed to the following in Prisma ORM 5: ```js highlight=3;normal prisma.user.findMany({ @@ -104,11 +104,11 @@ prisma.user.findMany({ `OR` operators will only accept array values. -#### in and notIn operators +#### `in` and `notIn` operators Similar to `OR`, `in` and `notIn` require array values. -Prisma 4 and lower: +Prisma ORM 4 and lower: ```js prisma.user.findMany({ @@ -124,7 +124,7 @@ prisma.user.findMany({ }) ``` -Prisma 5: +Prisma ORM 5: ```js highlight=4,12;normal prisma.user.findMany({ @@ -165,7 +165,7 @@ prisma.user.findMany({
-#### path argument for filtering on JSON fields in PostgreSQL +#### `path` argument for filtering on JSON fields in PostgreSQL [When filtering on JSON fields in a PostgreSQL model](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filter-on-a-json-field) the `path` argument now only accepts an array. @@ -178,7 +178,7 @@ model User { } ``` -Prisma 4 and lower: +Prisma ORM 4 and lower: ```js prisma.user.findMany({ @@ -191,7 +191,7 @@ prisma.user.findMany({ }) ``` -Prisma 5: +Prisma ORM 5: ```js highlight=4;normal prisma.user.findMany({ @@ -223,7 +223,7 @@ model Post { } ``` -Prisma 4 and lower: +Prisma ORM 4 and lower: ```js prisma.post.create({ @@ -239,7 +239,7 @@ prisma.post.findMany({ }) ``` -Prisma 5: +Prisma ORM 5: ```js highlight=3,9;normal prisma.post.create({ @@ -272,7 +272,7 @@ type Comment { } ``` -Prisma 4 and lower: +Prisma ORM 4 and lower: ```js prisma.post.findMany({ @@ -284,7 +284,7 @@ prisma.post.findMany({ }) ``` -Prisma 5: +Prisma ORM 5: ```js highlight=4;normal prisma.post.findMany({ diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/index.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/index.mdx index 3fc37ecc78..4a46562636 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/600-upgrading-to-prisma-5/index.mdx @@ -1,53 +1,53 @@ --- -title: 'Upgrade to Prisma 5' -metaTitle: 'Upgrade to Prisma 5' -metaDescription: 'Guides on how to upgrade to Prisma 5' +title: 'Upgrade to Prisma ORM 5' +metaTitle: 'Upgrade to Prisma ORM 5' +description: 'Guides on how to upgrade to Prisma ORM 5' tocDepth: 3 toc: true --- -Prisma 5.0.0 introduces a number of changes, including the usage of our new JSON Protocol, [which make Prisma faster by default](https://www.prisma.io/blog/prisma-5-f66prwkjx72s). A full list of these changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). +Prisma ORM 5.0.0 introduces a number of changes, including the usage of our new JSON Protocol, [which make Prisma Client faster by default](https://www.prisma.io/blog/prisma-5-f66prwkjx72s). A full list of these changes can be found [in our release notes](https://github.com/prisma/prisma/releases/tag/5.0.0). -This guide explains how upgrading might affect your application and gives instructions on how to handle breaking changes within Prisma 5. +This guide explains how upgrading might affect your application and gives instructions on how to handle breaking changes within Prisma ORM 5. -## Upgrade the prisma and @prisma/client packages to Prisma 5 +## Upgrade the `prisma` and `@prisma/client` packages to version 5 -To upgrade to Prisma 5 from an earlier version, you need to update both the `prisma` and `@prisma/client` packages. +To upgrade to Prisma ORM 5 from an earlier version, you need to update both the `prisma` and `@prisma/client` packages. -, , ]}> + - + ```terminal npm install @prisma/client@5 npm install -D prisma@5 ``` - + - + ```terminal yarn up prisma@5 @prisma/client@5 ``` - + - + ```terminal pnpm upgrade prisma@5 @prisma/client@5 ``` - + - + Before you upgrade, check each breaking change below to see how the upgrade might affect your application. @@ -55,54 +55,54 @@ Before you upgrade, check each breaking change below to see how the upgrade migh ## Version changes -Prisma 5 includes some minimum version changes for Node.js, TypeScript, and PostgreSQL. To use Prisma version 5.0.0 and up, you will need to have at least the minimum versions below: +Prisma ORM 5 includes some minimum version changes for Node.js, TypeScript, and PostgreSQL. To use Prisma version 5.0.0 and up, you will need to have at least the minimum versions below: See our [system requirements](/orm/reference/system-requirements) for all minimum version requirements. ### Node.js minimum version change -From Prisma version 5.0.0, the minimum version of Node.js supported is 16.13.0. If your project uses an earlier version of Node.js, you will need to upgrade it. +From Prisma ORM version 5.0.0, the minimum version of Node.js supported is 16.13.0. If your project uses an earlier version of Node.js, you will need to upgrade it. -Node.js v16.x is reaching [end-of-life on 11 September 2023](https://nodejs.org/en/blog/announcements/nodejs16-eol) in order to coincide with the end-of-life of OpenSSL 1.1.1. For that reason, we recommend upgrading to the current Node.js LTS, v18.x. Please note that Prisma 5 will be the last major version of Prisma to support Node.js v16. +Node.js v16.x is reaching [end-of-life on 11 September 2023](https://nodejs.org/en/blog/announcements/nodejs16-eol) in order to coincide with the end-of-life of OpenSSL 1.1.1. For that reason, we recommend upgrading to the current Node.js LTS, v18.x. Please note that Prisma ORM 5 will be the last major version of Prisma ORM to support Node.js v16. ### TypeScript minimum version change -From Prisma version 5.0.0, the minimum version of TypeScript supported is 4.7. If your project uses an earlier version of TypeScript, you will need to upgrade it. +From Prisma ORM version 5.0.0, the minimum version of TypeScript supported is 4.7. If your project uses an earlier version of TypeScript, you will need to upgrade it. ### PostgreSQL minimum version change -From Prisma version 5.0.0, the minimum version of PostgreSQL supported is 9.6. If your project uses an earlier version of PostgreSQL, you will need to upgrade it. +From Prisma ORM version 5.0.0, the minimum version of PostgreSQL supported is 9.6. If your project uses an earlier version of PostgreSQL, you will need to upgrade it. -While Prisma supports PostgreSQL versions 9.6 and above, we **strongly** recommend updating to a version that is currently supported and still receiving updates. Please check [PostgreSQL's versioning policy](https://www.postgresql.org/support/versioning/) to determine which versions are currently supported. +While Prisma ORM supports PostgreSQL versions 9.6 and above, we **strongly** recommend updating to a version that is currently supported and still receiving updates. Please check [PostgreSQL's versioning policy](https://www.postgresql.org/support/versioning/) to determine which versions are currently supported. ### Prisma Client embedded SQLite version updated -With Prisma version 5.0.0, we have upgraded the embedded version of SQLite from `3.35.4` to `3.41.2`. We did not see any breaking changes and don't anticipate any changes needed in user projects, but if you are using SQLite, especially with raw queries that might go beyond Prisma's functionality, make sure to check [the SQLite changelog](https://www.sqlite.org/changes.html). +With Prisma ORM version 5.0.0, we have upgraded the embedded version of SQLite from `3.35.4` to `3.41.2`. We did not see any breaking changes and don't anticipate any changes needed in user projects, but if you are using SQLite, especially with raw queries that might go beyond Prisma ORM's functionality, make sure to check [the SQLite changelog](https://www.sqlite.org/changes.html). ## Primary changes -This section gives an overview of the main breaking changes in Prisma 5. +This section gives an overview of the main breaking changes in Prisma ORM 5. -### Removal of rejectOnNotFound parameter +### Removal of `rejectOnNotFound` parameter -With Prisma 5, the deprecated parameter `rejectOnNotFound` has been removed. Depending on if your project used `rejectOnNotFound` per query or globally, there will be be different ways of updating your code. +With Prisma ORM 5, the deprecated parameter `rejectOnNotFound` has been removed. Depending on if your project used `rejectOnNotFound` per query or globally, there will be be different ways of updating your code. If you are using the `rejectOnNotFound` parameter on a per-query basis, then follow our steps for [updating your code at the query level](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes#replacing-rejectonnotfound-enabled-at-the-query-level). If instead you have set up the `rejectOnNotFound` parameter at the client level, you will need to follow [the steps for updating your code at the client level](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes#replacing-rejectonnotfound-enabled-at-the-client-level). -### jsonProtocol out of Preview +### `jsonProtocol` out of Preview -The `jsonProtocol` preview feature is now Generally Available. This new protocol leads to [significantly improved startup times](https://www.prisma.io/blog/prisma-5-f66prwkjx72s#improved-startup-performance-in-prisma-client) when compared to our previous GraphQL-based protocol. When upgrading to Prisma 5, make sure to remove `jsonProtocol` from your preview features, if added. +The `jsonProtocol` preview feature is now Generally Available. This new protocol leads to [significantly improved startup times](https://www.prisma.io/blog/prisma-5-f66prwkjx72s#improved-startup-performance-in-prisma-client) when compared to our previous GraphQL-based protocol. When upgrading to Prisma ORM 5, make sure to remove `jsonProtocol` from your preview features, if added. -Prisma 4 and lower: +Prisma ORM 4 and lower: ```prisma generator client { @@ -111,7 +111,7 @@ generator client { } ``` -Prisma 5: +Prisma ORM 5: ```prisma generator client { @@ -119,16 +119,16 @@ generator client { } ``` -Please review our [jsonProtocol changes guide](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes) to learn how to update your app to account for the new protocol in Prisma 5. You will need to: +Please review our [jsonProtocol changes guide](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes) to learn how to update your app to account for the new protocol in Prisma ORM 5. You will need to: - [Remove the `jsonProtocol` Preview Feature](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes#removal-of-jsonprotocol-preview-feature) - [Remove usage of certain array shortcuts](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes#removal-of-array-shortcuts) ### Removal of array shortcuts -Prisma 5 drops support for a number of "array shortcuts". These shortcuts were a way to add a single element as a value to an array-based operator instead of wrapping that one element in an array. To make our typings more consistent and logical and to conform to the new JSON Protocol, we now require array values for these operators. +Prisma ORM 5 drops support for a number of "array shortcuts". These shortcuts were a way to add a single element as a value to an array-based operator instead of wrapping that one element in an array. To make our typings more consistent and logical and to conform to the new JSON Protocol, we now require array values for these operators. -In most cases, the fix will be as simple as wrapping the existing value in an array. The shortcuts removed in Prisma 5 are: +In most cases, the fix will be as simple as wrapping the existing value in an array. The shortcuts removed in Prisma ORM 5 are: - [`OR` shortcuts](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes#or-operators) - [`in` and `notIn` shortcuts](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes#in-and-notin-operators) @@ -138,9 +138,9 @@ In most cases, the fix will be as simple as wrapping the existing value in an ar While `OR`, `in`, and `notIn` operators are affected, `AND` and `NOT` are not affected by this change. -### cockroachdb provider is now required when connecting to a CockroachDB database +### `cockroachdb` provider is now required when connecting to a CockroachDB database -With Prisma version 5.0.0, we require the `cockroachdb` provider to be used when connecting to CockroachDB databases. Previously, we had accepted `postgresql` as well, but we are removing that option. +With Prisma ORM version 5.0.0, we require the `cockroachdb` provider to be used when connecting to CockroachDB databases. Previously, we had accepted `postgresql` as well, but we are removing that option. If you were using [native database types](/orm/reference/prisma-schema-reference#postgresql) and also the `postgresql` provider, you will need to [baseline your database](/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-cockroachdb) from PostgreSQL to CockroachDB: @@ -151,13 +151,13 @@ If you were using [native database types](/orm/reference/prisma-schema-reference 5. Delete your existing migrations. We will be [performing a baseline](/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-cockroachdb) in order to make your local setup agree with your existing CockroachDB instance. 6. Perform the [baselining steps](/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-cockroachdb). After these steps, you'll have migrated successfully from the `postgresql` provider to the `cockroachdb` provider! -### Removal of runtime/index.js from generated client +### Removal of `runtime/index.js` from generated client The `runtime/index.js` file has been removed from Prisma Client. -#### Using public APIs from @prisma/client/runtime +#### Using public APIs from `@prisma/client/runtime` -Importing from `@prisma/client/runtime` is no longer available in Prisma 5. If you were using public APIs available in this namespace before, you can instead import `Prisma` and access them. For example: +Importing from `@prisma/client/runtime` is no longer available in Prisma ORM 5. If you were using public APIs available in this namespace before, you can instead import `Prisma` and access them. For example: ```js import { Decimal, NotFoundError } from '@prisma/client/runtime' @@ -179,9 +179,9 @@ We highly discourage the use of internal private APIs as they can change without ### Generated type changes -#### Changes to RelationFilterInput to account for nullability +#### Changes to `RelationFilterInput` to account for nullability -Prior to Prisma 5, there was a long-standing bug that caused nullable reverse relations to not be marked as nullable in our generated types. For example, take the following schema: +Prior to Prisma ORM 5, there was a long-standing bug that caused nullable reverse relations to not be marked as nullable in our generated types. For example, take the following schema: ```prisma model User { @@ -207,11 +207,11 @@ model Post { } ``` -In the generated types, `Address.user` and `Post.user` would use the same type, `UserRelationFilter`. This is obviously unintended as `Address.user` is nullable while `Post.user` is not. In Prisma 5, the type of `Address.user` would be `UserNullableRelationFilter`, resolving this issue. +In the generated types, `Address.user` and `Post.user` would use the same type, `UserRelationFilter`. This is obviously unintended as `Address.user` is nullable while `Post.user` is not. In Prisma ORM 5, the type of `Address.user` would be `UserNullableRelationFilter`, resolving this issue. If you import generated types in your code, you will need to update instances like this to utilize the new `Nullable` types. -#### Changes to UncheckedUpdateManyInput to avoid name collisions +#### Changes to `UncheckedUpdateManyInput` to avoid name collisions In certain instances it was possible for name collisions to occur when one model had two foreign keys to two other models that had the same property name for the reverse relation. As an example, the following schema: @@ -240,13 +240,13 @@ model Track { } ``` -Would lead to conflicting names between the two relations on `InvoiceItem`. The reverse relations, that is `Invoice.invoice_items` and `Track.invoice_items` would both get the type `InvoiceItemUncheckedUpdateManyWithoutInvoice_itemsInput`. In Prisma 5, this is resolved and Prisma will generate `InvoiceItemUncheckedUpdateManyWithoutInvoicesInput` and `InvoiceItemUncheckedUpdateManyWithoutTracksInput` respectively. +Would lead to conflicting names between the two relations on `InvoiceItem`. The reverse relations, that is `Invoice.invoice_items` and `Track.invoice_items` would both get the type `InvoiceItemUncheckedUpdateManyWithoutInvoice_itemsInput`. In Prisma ORM 5, this is resolved and Prisma Client will generate `InvoiceItemUncheckedUpdateManyWithoutInvoicesInput` and `InvoiceItemUncheckedUpdateManyWithoutTracksInput` respectively. If you import generated types in your code, you will need to update instances like this to the corrected types. ## Other changes -The following changes may cause an application to initially throw an error message after upgrading to Prisma 5. Fortunately, they are easy to solve, as the underlying functionality has been removed for a while or the change is a simple string replace. +The following changes may cause an application to initially throw an error message after upgrading to Prisma ORM 5. Fortunately, they are easy to solve, as the underlying functionality has been removed for a while or the change is a simple string replace. ### Removal of deprecated Prisma CLI flags @@ -261,11 +261,11 @@ The outdated use of `db push --force` can be replaced with the newer implementat All other flags are from previous APIs and are no longer needed. -### Removal of the beforeExit hook from the library engine +### Removal of the `beforeExit` hook from the library engine -The `beforeExit` hook has been removed from the Prisma library engine. While this functionality is still required for the Prisma binary engine in order to run last minute queries or perform shutdown related operations, it provides no benefit over native Node.js exit hooks in the library engine. Instead of this hook we recommend using built-in Node.js exit events. +The `beforeExit` hook has been removed from the Prisma ORM library engine. While this functionality is still required for the Prisma ORM binary engine in order to run last minute queries or perform shutdown related operations, it provides no benefit over native Node.js exit hooks in the library engine. Instead of this hook we recommend using built-in Node.js exit events. -The following code with Prisma 4: +The following code with Prisma ORM 4: ```js const exitHandler = () => { @@ -289,7 +289,7 @@ process.on('SIGTERM', exitHandler) process.on('SIGUSR2', exitHandler) ``` -If you're using the `beforeExit` hook in NestJS, you can upgrade to Prisma 5 by removing the custom `enableShutdownHooks` method in your service: +If you're using the `beforeExit` hook in NestJS, you can upgrade to Prisma ORM 5 by removing the custom `enableShutdownHooks` method in your service: ```diff file="prisma.service.ts" @Injectable() @@ -313,19 +313,19 @@ Instead, use the built-in `enableShutdownHooks` method in NestJS if you need to + app.enableShutdownHooks() ``` -### Removal of deprecated prisma2 executable +### Removal of deprecated `prisma2` executable -When we released Prisma 2, the `prisma2` executable was used in order to differentiate from Prisma 1. In a later release, the `prisma2` cli took over the `prisma` executable name. +When we released Prisma ORM 2, the `prisma2` executable was used in order to differentiate from Prisma 1. In a later release, the `prisma2` cli took over the `prisma` executable name. Needless to say, the `prisma2` executable has been deprecated for some time and is now removed. If your scripts use Prisma CLI as `prisma2`, please replace it with simply `prisma`. -### Removal of deprecated experimentalFeatures property +### Removal of deprecated `experimentalFeatures` property The `previewFeatures` field of the [generator block](/orm/reference/prisma-schema-reference#fields-1) used to be called `experimentalFeatures`. We are removing that deprecated property. -In Prisma 5, you will need to update references of `experimentalFeatures` to `previewFeatures` manually or use the new code action in the Prisma VSCode extension. +In Prisma ORM 5, you will need to update references of `experimentalFeatures` to `previewFeatures` manually or use the new code action in the Prisma VSCode extension. -### migration-engine renamed to schema-engine +### `migration-engine` renamed to `schema-engine` The engine responsible for commands like `prisma migrate` and `prisma db` has been renamed from `migration-engine` to `schema-engine` to better describe its use. For many users, no changes will be required. However, if you need to explicitly include or exclude this engine file, or refer to the engine name for any other reason, you will need to update your code references. @@ -359,4 +359,4 @@ package:
-Enjoy Prisma 5! +Enjoy Prisma ORM 5! diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx index 9fcd482c37..12fc31baaf 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/700-upgrading-to-prisma-4.mdx @@ -1,20 +1,20 @@ --- -title: 'Upgrade to Prisma 4' -metaTitle: 'Upgrade to Prisma 4' -metaDescription: 'Guides on how to upgrade to Prisma 4' +title: 'Upgrade to Prisma ORM 4' +metaTitle: 'Upgrade to Prisma ORM 4' +description: 'Guides on how to upgrade to Prisma ORM 4' tocDepth: 3 toc: true --- -Prisma 4 introduces a number of **breaking changes** when you upgrade from an earlier Prisma version. This guide explains how this upgrade might affect your application and gives instructions on how to handle any changes. +Prisma ORM 4 introduces a number of **breaking changes** when you upgrade from an earlier Prisma ORM version. This guide explains how this upgrade might affect your application and gives instructions on how to handle any changes. ## Breaking changes -This section gives an overview of breaking changes in Prisma 4, grouped under [general changes](#general-changes) that affect both the Prisma Schema and Prisma Client, [Schema changes](#schema-changes) and [Client changes](#client-changes). +This section gives an overview of breaking changes in Prisma ORM 4, grouped under [general changes](#general-changes) that affect both the Prisma Schema and Prisma Client, [Schema changes](#schema-changes) and [Client changes](#client-changes). We recommend that you first address any Prisma schema validation errors, then pull your database to reflect new Prisma schema capabilities, and finally fix any type errors in Prisma Client and validate by running your test suite. @@ -43,7 +43,7 @@ We recommend that you first address any Prisma schema validation errors, then pu 2. If no, proceed with 2. 2. Some API changes in Prisma Client are impacting runtime behavior, so please run your test suite. -Enjoy Prisma 4! +Enjoy Prisma ORM 4! ### General changes @@ -51,7 +51,7 @@ This section includes changes that affect both the Prisma Schema and Prisma Clie #### Node.js minimum version change -From Prisma version 4.0.0, the minimum version of Node.js that we support is 14.17.x. If you use an earlier version of Node.js, you will need to update it. +From Prisma ORM version 4.0.0, the minimum version of Node.js that we support is 14.17.x. If you use an earlier version of Node.js, you will need to update it. See our [system requirements](/orm/reference/system-requirements) for all minimum version requirements. @@ -61,7 +61,7 @@ This section includes changes that affect the Prisma Schema. #### Index configuration -In Prisma 4, the `extendedIndexes` Preview feature will now become generally available. This includes the following index configuration options: +In Prisma ORM 4, the `extendedIndexes` Preview feature will now become generally available. This includes the following index configuration options: - Length configuration of indexes, unique constraints and primary key constraints for MySQL (in Preview in versions 3.5.0 and later) - Sort order configuration of indexes, unique constraints and primary key constraints (in Preview in versions 3.5.0 and later) @@ -74,53 +74,55 @@ See our documentation on [Index configuration](/orm/prisma-schema/data-model/ind These can all be breaking changes if you were previously configuring these properties at the database level. In this case, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) -1. run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you may lose any configuration that was defined in the database but not previously represented in the Prisma schema. +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) +1. Run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you may lose any configuration that was defined in the database but not previously represented in the Prisma schema. For more details, see the [Upgrading from previous versions](/orm/prisma-schema/data-model/indexes#upgrading-from-previous-versions) section of our index configuration documentation. #### Scalar list defaults -For database connectors that support scalar lists (PostgreSQL, CockroachDB and MongoDB), Prisma 4 introduces the ability to set a default value in your Prisma schema file with the `@default` attribute: +For database connectors that support scalar lists (PostgreSQL, CockroachDB and MongoDB), Prisma ORM 4 introduces the ability to set a default value in your Prisma schema file with the `@default` attribute: -, ]}> - + + ```prisma highlight=4;normal model User { id Int @id @default(autoincrement()) posts Post[] + //highlight-next-line favoriteColors String[] @default(["red", "yellow", "purple"]) } ``` - - + + ```prisma highlight=4;normal model User { id String @id @default(auto()) @map("_id") @db.ObjectId posts Post[] + //highlight-next-line favoriteColors String[] @default(["red", "yellow", "purple"]) } ``` - + ##### Upgrade path This is a breaking change if you previously had defaults defined for scalar lists at the database level. In this case, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) -1. run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you will lose any defaults that are defined in the database but not previously represented in the Prisma schema. +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) +1. Run `npx prisma db pull` afterwards to retrieve any existing configuration of indexes and constraints. This needs to be done before running any `npx prisma db push` or `npx prisma migrate dev` command, or you will lose any defaults that are defined in the database but not previously represented in the Prisma schema. -#### Explicit @unique constraints on one-to-one relations +#### Explicit `@unique` constraints on one-to-one relations -When using one-to-one relations in Prisma 4, you will need to explicitly add the `@unique` attribute to the relation scalar field. For example, for this one-to-one relation between a `User` and a `Profile` model, you will need to add the `@unique` attribute to the `profileId` field: +When using one-to-one relations in Prisma ORM 4, you will need to explicitly add the `@unique` attribute to the relation scalar field. For example, for this one-to-one relation between a `User` and a `Profile` model, you will need to add the `@unique` attribute to the `profileId` field: -, ]}> - + + ```prisma model User { @@ -135,8 +137,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -151,26 +153,26 @@ model Profile { } ``` - + ##### Upgrade path -After you upgrade to Prisma 4, any one-to-one relations without a `@unique` attribute on the relation scalar will trigger a validation error. To upgrade, you will need to: +After you upgrade to Prisma ORM 4, any one-to-one relations without a `@unique` attribute on the relation scalar will trigger a validation error. To upgrade, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) -1. manually fix the validation errors in your Prisma schema by adding the explicit `@unique` or `@id` attribute to your data model. -1. push the changes to your database using `prisma db push` for MongoDB or `prisma migrate dev` for MySQL. +1. Manually fix the validation errors in your Prisma schema by adding the explicit `@unique` or `@id` attribute to your data model. +1. Push the changes to your database using `prisma db push` for MongoDB or `prisma migrate dev` for MySQL. -#### Enforced use of @unique or @id attribute for one-to-one and one-to-many relations (MySQL and MongoDB) +#### Enforced use of `@unique` or `@id` attribute for one-to-one and one-to-many relations (MySQL and MongoDB) -When you use one-to-one and one-to-many relations in Prisma 4, you will need to use a `@unique` attribute on the relation field to guarantee that the singular side(s) of the relation has only one record. This is now enforced for MySQL and MongoDB, bringing them into line with other connectors. Missing `@unique` attributes will now trigger a validation error. +When you use one-to-one and one-to-many relations in Prisma ORM 4, you will need to use a `@unique` attribute on the relation field to guarantee that the singular side(s) of the relation has only one record. This is now enforced for MySQL and MongoDB, bringing them into line with other connectors. Missing `@unique` attributes will now trigger a validation error. In the following example of a _one-to-many relation_ between a `User` and `Post` model, the `@unique` attribute must be added to the `email` field: -, ]}> - + + ```prisma model User { @@ -186,8 +188,8 @@ model Post { } ``` - - + + ```prisma model User { @@ -203,13 +205,13 @@ model Post { } ``` - + In the following example of a _one-to-one relation_ between a `User` and `Profile` model, the `@unique` attribute must be added to the `email` field: -, ]}> - + + ```prisma model User { @@ -226,8 +228,8 @@ model Profile { } ``` - - + + ```prisma model User { @@ -244,21 +246,21 @@ model Profile { } ``` - + ##### Upgrade path -After you upgrade to Prisma 4, any one-to-one or one-to-many relations without a `@unique` or `@id` attribute on the relation field will trigger a validation error. To upgrade, you will need to: +After you upgrade to Prisma ORM 4, any one-to-one or one-to-many relations without a `@unique` or `@id` attribute on the relation field will trigger a validation error. To upgrade, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) -1. manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will add the `@unique` attributes automatically. +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) +1. Manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will add the `@unique` attributes automatically. #### Disallow `references` syntax for implicit many-to-many relations -When using [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) in Prisma 4, you will no longer be able to use the `references` argument, which was previously optional. For example, the following relation would now trigger a validation error: +When using [implicit many-to-many relations](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) in Prisma ORM 4, you will no longer be able to use the `references` argument, which was previously optional. For example, the following relation would now trigger a validation error: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) categories Category[] @relation("my-relation", references: [id]) // <-- validation error @@ -272,7 +274,7 @@ model Category { Instead, you can write: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) categories Category[] @relation("my-relation") @@ -288,10 +290,10 @@ This is because the only valid value for `references` was `id`, so removing this ##### Upgrade path -After you upgrade to Prisma 4, any implicit many-to-many relations with a `references` argument will trigger a validation error. To upgrade, you will need to: +After you upgrade to Prisma ORM 4, any implicit many-to-many relations with a `references` argument will trigger a validation error. To upgrade, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) -1. manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will remove the `references` arguments automatically. +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) +1. Manually fix the validation errors in your Prisma schema. Alternatively, if you have an up-to-date live database, running `npx prisma db pull` will remove the `references` arguments automatically. #### Better grammar for string literals @@ -299,10 +301,10 @@ String literals in your Prisma Schema now need to follow the same rules as strin ##### Upgrade path -This is a breaking change for some existing schemas. After you upgrade to Prisma 4, incorrectly escaped characters will trigger a validation error. To upgrade, you will need to: +This is a breaking change for some existing schemas. After you upgrade to Prisma ORM 4, incorrectly escaped characters will trigger a validation error. To upgrade, you will need to: -1. upgrade to the new Prisma 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-4) -1. manually fix the validation errors in your Prisma schema. +1. Upgrade to the new Prisma ORM 4 packages following [these instructions](#upgrade-the-prisma-and-prismaclient-packages-to-prisma-orm-4) +1. Manually fix the validation errors in your Prisma schema. ### Client changes @@ -312,7 +314,7 @@ This section includes changes that affect Prisma Client. In versions 3.14.x and 3.15.x, [raw query type mapping](/orm/prisma-client/queries/raw-database-access/raw-queries#raw-query-type-mapping) was available with the Preview feature `improvedQueryRaw`. In version 4.0.0, we have made raw query type mapping Generally Available. You do not need to use `improvedQueryRaw` to get this functionality in versions 4.0.0 and later. -Raw queries now deserialize scalar values to their corresponding JavaScript types. Note that Prisma infers types from the values themselves and not from the Prisma Schema types. +Raw queries now deserialize scalar values to their corresponding JavaScript types. Note that Prisma ORM infers types from the values themselves and not from the Prisma Schema types. Example query and response: @@ -360,7 +362,7 @@ await prisma.$queryRaw`select length(${42});` // HINT: No function matches the given name and argument types. You might need to add explicit type casts. ``` -This is because PostgreSQL’s `length` function expects `text` as input. Prisma used to silently coerce `42` to `text`, but does not do this in version 4.0.0. To fix this, explicitly cast `42` to `text` as follows: +This is because PostgreSQL’s `length` function expects `text` as input. Prisma ORM used to silently coerce `42` to `text`, but does not do this in version 4.0.0. To fix this, explicitly cast `42` to `text` as follows: ```js await prisma.$queryRaw`select length(${42}::text);` @@ -370,7 +372,7 @@ await prisma.$queryRaw`select length(${42}::text);` In versions 3.14.x and 3.15.x, [raw query type mapping](/orm/prisma-client/queries/raw-database-access/raw-queries#raw-query-type-mapping) was available with the Preview feature `improvedQueryRaw`. In version 4.0.0, we have made raw query type mapping Generally Available. You do not need to use `improvedQueryRaw` to get this functionality in versions 4.0.0 and later. -Prisma sends JavaScript integers to PostgreSQL as `INT8`. This might conflict with your user-defined functions that accept only `INT4` as input. +Prisma ORM sends JavaScript integers to PostgreSQL as `INT8`. This might conflict with your user-defined functions that accept only `INT4` as input. ##### Upgrade path @@ -379,9 +381,9 @@ If you use `$queryRaw` or parametrized `$queryRawUnsafe`queries with a PostgreSQ - Update the input types of any integers in your user-defined functions to `INT8`, or - Cast any integers in your query parameters to `INT4`. -#### DbNull, JsonNull and AnyNull are now objects +#### `DbNull`, `JsonNull` and `AnyNull` are now objects -JavaScript `null` is ambiguous for JSON columns, so Prisma uses `DbNull`, `JsonNull`, and `AnyNull` to distinguish between the database `NULL` value and the JSON `null` value. Before version 4.0.0, `DbNull`, `JsonNull`, and `AnyNull` were string constants. From version 4.0.0, they are objects. +JavaScript `null` is ambiguous for JSON columns, so Prisma ORM uses `DbNull`, `JsonNull`, and `AnyNull` to distinguish between the database `NULL` value and the JSON `null` value. Before version 4.0.0, `DbNull`, `JsonNull`, and `AnyNull` were string constants. From version 4.0.0, they are objects. See [Filtering by null values](/orm/prisma-client/special-fields-and-types/working-with-json-fields#filtering-by-null-values) for more information. @@ -396,7 +398,7 @@ See [Filtering by null values](/orm/prisma-client/special-fields-and-types/worki If you already use these named constants, then you do not need to take any action. 1. If you now get a type error when you pass `Prisma.DbNull` as the value of a JSON field, then this probably indicates a bug in your code that our types did not catch before version 4.0.0. The field where you tried to store `DbNull` is probably not nullable in your schema. As a result, a literal `DbNull` string was stored in the database instead of `NULL`. -1. You might now encounter a type error or runtime validation error when you use `Prisma.DbNull`, `Prisma.JsonNull`, or `Prisma.AnyNull` with MongoDB. This was never valid, but was silently accepted prior to Prisma 4. You need to review your data and change these fields to `null`. +1. You might now encounter a type error or runtime validation error when you use `Prisma.DbNull`, `Prisma.JsonNull`, or `Prisma.AnyNull` with MongoDB. This was never valid, but was silently accepted prior to Prisma ORM 4. You need to review your data and change these fields to `null`. 1. If you pass in dynamic JSON to a JSON column in Prisma Client (for example `prisma.findMany({where: { jsonColumn: someJson } })`), then you must check that `someJson`cannot be the string "DBNull", "JsonNull", or "AnyNull". If it is any of these values, then the query will return different results in version 4.0.0. #### Default fields on composite types in MongoDB @@ -415,13 +417,13 @@ To learn more, see [Default values for required fields on composite types](/orm/ ##### Upgrade path -If you currently rely on a return value of `null`, then you need to refactor your code to handle the default value that is now returned in Prisma 4. +If you currently rely on a return value of `null`, then you need to refactor your code to handle the default value that is now returned in Prisma ORM 4. #### Rounding errors on big numbers in SQLite -SQLite is a loosely-typed database. If your schema has a field with type `Int`, then Prisma prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. +SQLite is a loosely-typed database. If your schema has a field with type `Int`, then Prisma ORM prevents you from inserting a value larger than an integer. However, nothing prevents the database from directly accepting a bigger number. These manually-inserted big numbers cause rounding errors when queried. -To avoid this problem, Prisma version 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma throws a P2023 error, such as: +To avoid this problem, Prisma ORM version 4.0.0 and later checks numbers on the way out of the database to verify that they fit within the boundaries of an integer. If a number does not fit, then Prisma ORM throws a P2023 error, such as: ``` Inconsistent column data: Conversion failed: @@ -431,53 +433,53 @@ try migrating the 'int' column type to BIGINT ##### Upgrade path -If you use Prisma in conjunction with SQLite, then you need to find any code that queries `Int` fields and ensure that it handles any P2023 errors that might be returned. +If you use Prisma ORM in conjunction with SQLite, then you need to find any code that queries `Int` fields and ensure that it handles any P2023 errors that might be returned. -#### Prisma no longer exports `Prisma.dmmf.schema` into the generated Prisma Client +#### Prisma ORM no longer exports `Prisma.dmmf.schema` into the generated Prisma Client -From version 4.0.0, Prisma no longer exports `Prisma.dmmf.schema` into the generated Prisma Client. This makes the generated Prisma Client much more efficient, and also avoids some memory leaks with Jest. +From version 4.0.0, Prisma ORM no longer exports `Prisma.dmmf.schema` into the generated Prisma Client. This makes the generated Prisma Client much more efficient, and also avoids some memory leaks with Jest. Note: -- This change does not affect the DMMF that Prisma passes to the generators. +- This change does not affect the DMMF that Prisma ORM passes to the generators. - You can use `getDmmf()`from `@prisma/internals` to access the schema property. - We still export `Prisma.dmmf.datamodel` into the generated Prisma Client. -## Upgrade the prisma and @prisma/client packages to Prisma 4 +## Upgrade the `prisma` and `@prisma/client` packages to version 4 -To upgrade to Prisma 4 from an earlier version, you need to update both the `prisma` and `@prisma/client` packages. Both the `prisma` and `@prisma/client` packages install with a caret `^` in their version number. This allows upgrades to new minor versions, but not major versions, to safeguard against breaking changes. +To upgrade to Prisma ORM 4 from an earlier version, you need to update both the `prisma` and `@prisma/client` packages. Both the `prisma` and `@prisma/client` packages install with a caret `^` in their version number. This allows upgrades to new minor versions, but not major versions, to safeguard against breaking changes. To ignore the caret `^` and upgrade across major versions, you can use the `@4` tag when you upgrade with `npm`, or `yarn`: - + Before you upgrade, check each **breaking change** to see how the upgrade might affect your application. -, ]}> + - + ```terminal npm install prisma@4 @prisma/client@4 ``` - + - + ```terminal yarn up prisma@4 @prisma/client@4 ``` - + ## Video guide -For a video walkthrough of the upgrade process and examples of upgrade scenarios, see our recorded livestream on upgrading to Prisma 4: +For a video walkthrough of the upgrade process and examples of upgrade scenarios, see our recorded livestream on upgrading to Prisma ORM 4:
diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx index 28fb6b4216..425ec2affb 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/100-named-constraints.mdx @@ -1,29 +1,29 @@ --- title: 'Named constraints upgrade path' metaTitle: 'Named constraints upgrade path' -metaDescription: 'Guides on how to upgrade depending on your workflow using Prisma Introspect or Prisma Migrate' +description: 'Guides on how to upgrade depending on your workflow using Prisma Introspect or Prisma Migrate' tocDepth: 3 toc: true --- -After upgrading to Prisma 3, the default naming convention for constraint and index names will change and your primary and foreign key names will now be part of the schema for databases that support them. Therefore the meaning of your existing Prisma schema will change. +After upgrading to Prisma ORM 3, the default naming convention for constraint and index names will change and your primary and foreign key names will now be part of the schema for databases that support them. Therefore the meaning of your existing Prisma schema will change. Before you continue to evolve your schema and your database, you should decide which names for constraints and indexes you want to use on your project going forward. -You can either keep the names as they exist in your database or you can switch to use the names generated by Prisma, which follow the new naming convention. +You can either keep the names as they exist in your database or you can switch to use the names generated by Prisma ORM, which follow the new naming convention. -This page describes the manual upgrade steps that you need to perform after upgrading to Prisma 3. You can pick either of the two options: +This page describes the manual upgrade steps that you need to perform after upgrading to Prisma ORM 3. You can pick either of the two options: - **Option 1**: [I want to maintain my existing constraint and index names](#option-1-i-want-to-maintain-my-existing-constraint-and-index-names) -- **Option 2**: [I want to use Prisma's default constraint and index names](#option-2-i-want-to-use-prismas-default-constraint-and-index-names) +- **Option 2**: [I want to use Prisma ORM's default constraint and index names](#option-2-i-want-to-use-prisma-orms-default-constraint-and-index-names) ## Option 1: I want to maintain my existing constraint and index names -If you want to keep your database unchanged and keep the existing names for constraints and indexes you need to pull them into your schema so Prisma is aware of them. +If you want to keep your database unchanged and keep the existing names for constraints and indexes you need to pull them into your schema so Prisma ORM is aware of them. Reasons to keep your existing names might be: @@ -31,7 +31,7 @@ Reasons to keep your existing names might be: - Other tooling relying on the names - Personal preference -To keep existing names, run `prisma db pull` against the target environment. This will result in all names that do not match Prisma's naming convention for constraint and index names being pulled into your schema as `map` arguments on their respective attributes. +To keep existing names, run `prisma db pull` against the target environment. This will result in all names that do not match Prisma ORM's naming convention for constraint and index names being pulled into your schema as `map` arguments on their respective attributes. 1. Example schema: @@ -50,13 +50,13 @@ To keep existing names, run `prisma db pull` against the target environment. Thi } ``` -1. Introspect your **development database** to populate the Prisma schema with constraint and index names in your underlying database _that do not match Prisma's naming convention_: +1. Introspect your **development database** to populate the Prisma schema with constraint and index names in your underlying database _that do not match Prisma ORM's naming convention_: ```terminal npx prisma db pull ``` - In this example, the highlighted constraints did not conform to Prisma's default naming convention and now include the `map` attribute field: + In this example, the highlighted constraints did not conform to Prisma ORM's default naming convention and now include the `map` attribute field: ```prisma highlight=11;normal model User { @@ -69,17 +69,18 @@ To keep existing names, run `prisma db pull` against the target environment. Thi id Int @id @default(autoincrement()) title String authorName String @default("Anonymous") + //highlight-next-line author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint") } ``` -## Option 2: I want to use Prisma's default constraint and index names +## Option 2: I want to use Prisma ORM's default constraint and index names If you want to keep your Prisma Schema clean and if you have no reasons preventing you from renaming constraints and indexes in your database, then you can create a migration to update the names. -Run `prisma migrate dev` to create a migration updating the constraint names to Prisma's defaults. +Run `prisma migrate dev` to create a migration updating the constraint names to Prisma ORM's defaults. -Afterwards, do not forget to `prisma migrate deploy` against your production environment if you have one to also update the names there. The schema below has no explicit constraint or index names spelled out, so Prisma will infer them. +Afterwards, do not forget to `prisma migrate deploy` against your production environment if you have one to also update the names there. The schema below has no explicit constraint or index names spelled out, so Prisma ORM will infer them. 1. Example schema: @@ -102,7 +103,7 @@ Afterwards, do not forget to `prisma migrate deploy` against your production env npx prisma migrate dev ``` - This migration renames any constraints that do not currently follow Prisma's naming convention. + This migration renames any constraints that do not currently follow Prisma ORM's naming convention. 1. Run the [`prisma migrate deploy`](/orm/prisma-client/deployment/deploy-database-changes-with-prisma-migrate) command to apply the migration to your production environment: @@ -114,7 +115,7 @@ Afterwards, do not forget to `prisma migrate deploy` against your production env ### Checking whether your environments use identical names -Since Prisma did not offer a way to define constraint or index names explicitly in the past, you can face situations where your different database environments have differing constraint or index names. +Since Prisma ORM did not offer a way to define constraint or index names explicitly in the past, you can face situations where your different database environments have differing constraint or index names. In order to detect this: @@ -132,6 +133,7 @@ model Post { id Int @id @default(autoincrement()) title String authorName String @default("Anonymous") + //highlight-next-line author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint") } ``` @@ -143,6 +145,7 @@ model Post { id Int @id @default(autoincrement()) title String authorName String @default("Anonymous") + //highlight-next-line author User? @relation(fields: [authorName], references: [name], map: "Custom_Production_Name") } ``` @@ -157,6 +160,6 @@ In order to achieve this: - Switch to development and run `prisma migrate dev` to create a new migration. You can call that migration `migration-to-sync-names` - Switch to production, and run `prisma migrate resolve --applied migration-to-sync-names` to mark the migration as applied on production -Your migration history now contains a migration to ensure that the names of any new environments you spin up contain the same names as your production database. And Prisma knows not to apply this migration to production since you already marked it as applied. +Your migration history now contains a migration to ensure that the names of any new environments you spin up contain the same names as your production database. And Prisma ORM knows not to apply this migration to production since you already marked it as applied. -Your environments are now in sync and you can proceed to the [upgrade paths for migrate users](#option-2-i-want-to-use-prismas-default-constraint-and-index-names). These let you choose your future naming scheme. +Your environments are now in sync and you can proceed to the [upgrade paths for migrate users](#option-2-i-want-to-use-prisma-orms-default-constraint-and-index-names). These let you choose your future naming scheme. diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx index abab80e61f..8141850a3e 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/150-referential-actions.mdx @@ -1,30 +1,31 @@ --- title: 'Referential actions upgrade path' metaTitle: 'Referential actions upgrade path' -metaDescription: 'Guides on how to upgrade depending on your workflow using Prisma Introspect or Prisma Migrate' +description: 'Guides on how to upgrade depending on your workflow using Prisma Introspect or Prisma Migrate' tocDepth: 4 +toc_max_heading_level: 4 toc: true --- -Prisma version 2.x prevents deletion of connected records in some Prisma Client functions, and does not let you configure referential actions in your Prisma Schema to change that behavior. +Prisma ORM version 2.x prevents deletion of connected records in some Prisma Client functions, and does not let you configure referential actions in your Prisma Schema to change that behavior. -Prisma version 3.x and later lets you control what should happen when deleting or updating records by explicitly setting referential actions on your models' relations. After the upgrade, Prisma Client will not enforce any referential actions anymore, and any action written to the database foreign keys will define the behavior when deleting or updating records. +Prisma ORM version 3.x and later lets you control what should happen when deleting or updating records by explicitly setting referential actions on your models' relations. After the upgrade, Prisma Client will not enforce any referential actions anymore, and any action written to the database foreign keys will define the behavior when deleting or updating records. Prisma Migrate 3.x will use the actions previously done by Prisma Client as the new default when writing the foreign key constraints to the database. -## Prisma 2.x behavior +## Prisma ORM 2.x behavior When invoking the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteAll()`](/orm/prisma-client/queries/crud#delete-all-records) methods using Prisma Client on required relations, a runtime check is performed and the deletion of records prevented if they are referencing related objects. **This prevents cascade behavior, no matter how the foreign key is defined**. -The behavior in Prisma 2, without upgrading, does not allow setting referential actions at all. [See Prisma 2.x default referential actions](#prisma-2x-default-referential-actions) +The behavior in Prisma ORM 2, without upgrading, does not allow setting referential actions at all. [See Prisma ORM 2.x default referential actions](#prisma-orm-2x-default-referential-actions) If you need to actually use the cascade behavior configured in the database, you _can_ use [`raw`](/orm/prisma-client/queries/raw-database-access/raw-queries) SQL queries to [delete multiple referenced records](/orm/prisma-client/queries/crud#deleting-all-data-with-raw-sql--truncate). This is because Prisma Client will **not** perform runtime checks on raw queries. -### Prisma 2.x default referential actions +### Prisma ORM 2.x default referential actions Below are the default referential actions written to the database foreign keys when using Prisma Migrate versions 2.x: @@ -50,13 +51,13 @@ You can also decide to skip checking the defaults and run a migration to update ### Using Introspection -If you [Introspect](/orm/prisma-schema/introspection) your database, the referential actions configured at the database level will be reflected in your Prisma Schema. If you have been using Prisma Migrate or `prisma db push` to manage the database schema, these are likely to be the [<=2.25.0 default values](#prisma-2x-default-referential-actions). +If you [Introspect](/orm/prisma-schema/introspection) your database, the referential actions configured at the database level will be reflected in your Prisma Schema. If you have been using Prisma Migrate or `prisma db push` to manage the database schema, these are likely to be the [\<=2.25.0 default values](#prisma-orm-2x-default-referential-actions). -When you run an Introspection, Prisma compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. +When you run an Introspection, Prisma ORM compares all the foreign keys in the database with the schema, if the SQL statements `ON DELETE` and `ON UPDATE` do **not** match the default values, they will be explicitly set in the schema file. After introspecting, you can review the non-default clauses in your schema. The most important clause to review is `onDelete`, which defaults to `Cascade` in version 2.25.0 and earlier. - + If you are using either the [`delete()`](/orm/prisma-client/queries/crud#delete-a-single-record) or [`deleteAll()`](/orm/prisma-client/queries/crud#delete-all-records) methods, **cascading deletes will now be performed, as the safety net in Prisma Client that previously prevented cascading deletes at runtime is removed**. Be sure to check your code and make any adjustments accordingly. @@ -75,6 +76,7 @@ The following example would result in a cascading delete, meaning that if the `U model Post { id Int @id @default(autoincrement()) title String + //add-next-line author User @relation(fields: [authorId], references: [id], onDelete: Cascade) authorId Int } @@ -96,15 +98,15 @@ You will have to manually add them if you wish to use anything other than the ne -Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma uses the [new defaults](/orm/prisma-schema/data-model/relations/referential-actions#referential-action-defaults). +Explicitly defining referential actions in your Prisma schema is optional. If you do not explicitly define a referential action for a relation, Prisma ORM uses the [new defaults](/orm/prisma-schema/data-model/relations/referential-actions#referential-action-defaults). Note that referential actions can be added on a case by case basis. This means that you can add them to one single relation and leave the rest set to the defaults by not manually specifying anything. ### Checking for errors -**Before** upgrading to version 3.0.1 (or versions 2.26.0 and above with the `referentialActions` feature flag enabled), Prisma prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. +**Before** upgrading to version 3.0.1 (or versions 2.26.0 and above with the `referentialActions` feature flag enabled), Prisma ORM prevented the deletion of records while using `delete()` or `deleteMany()` to preserve referential integrity. A custom runtime error would be thrown by Prisma Client with the error code `P2014`. -**After** upgrading, Prisma no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. +**After** upgrading, Prisma ORM no longer performs runtime checks. You can instead specify a custom referential action to preserve the referential integrity between relations. When you use [`NoAction`](/orm/prisma-schema/data-model/relations/referential-actions#noaction) or [`Restrict`](/orm/prisma-schema/data-model/relations/referential-actions#restrict) to prevent the deletion of records, the error messages will be different in versions 3.0.1 and above (or 2.26.0 with the `referentialActions` feature flag enabled) compared to versions prior to that. This is because they are now triggered by the database and **not** Prisma Client. The new error code that can be expected is `P2003`, so you should check your code to make adjustments accordingly. @@ -114,7 +116,7 @@ The following example uses the below blog schema with a 1-m relationship between This means that if a user has a post, that user (and their posts) **cannot** be deleted. -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id Int @id @default(autoincrement()) title String @@ -130,7 +132,7 @@ model User { Prior to upgrading, the error code you would receive when trying to delete a user which has posts would be `P2014` and it's message: -> "The change you are trying to make would violate the required relation '{relation_name}' between the {model_a_name} and {model_b_name} models." +> "The change you are trying to make would violate the required relation '\{relation_name}' between the \{model_a_name} and \{model_b_name} models." ```ts import { PrismaClient } from '@prisma/client' @@ -166,7 +168,7 @@ main() To make sure you are checking for the correct errors in your code, modify your check to look for `P2003`, which will deliver the message: -> "Foreign key constraint failed on the field: {field_name}" +> "Foreign key constraint failed on the field: \{field_name}" ```ts highlight=14;delete|15;add import { PrismaClient } from '@prisma/client' @@ -182,7 +184,9 @@ async function main() { }) } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { + //delete-next-line if (error.code === 'P2014') { + //add-next-line if (error.code === 'P2003') { console.log(error.message) } diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx index 706c9d2030..a3aa7087c4 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/800-upgrading-to-prisma-3/index.mdx @@ -1,14 +1,14 @@ --- -title: 'Upgrade to Prisma 3' -metaTitle: 'Upgrade to Prisma 3' -metaDescription: 'Guides on how to upgrade to Prisma 3' +title: 'Upgrade to Prisma ORM 3' +metaTitle: 'Upgrade to Prisma ORM 3' +description: 'Guides on how to upgrade to Prisma ORM 3' tocDepth: 3 toc: true --- -Prisma 3 introduces a number of **breaking changes** if you are upgrading from an earlier version (any 2.x version), therefore, it is important to understand how this upgrade might affect your application and make any needed adjustments to ensure a smooth transition. +Prisma ORM 3 introduces a number of **breaking changes** if you are upgrading from an earlier version (any 2.x version), therefore, it is important to understand how this upgrade might affect your application and make any needed adjustments to ensure a smooth transition. Below you will find a list of the breaking changes and how to handle them. @@ -26,7 +26,7 @@ See [Referential action upgrade path](/orm/more/upgrade-guides/upgrading-version ### [Named constraints](/orm/prisma-schema/data-model/database-mapping) -We changed the convention followed by Prisma to name constraints and indexes. We also introduced a clear distinction between the `map` attribute (database-level name) and `name` attribute (Prisma Client API name) in the PSL to explicitly control how constraints are defined in the Prisma schema. +We changed the convention followed by Prisma ORM to name constraints and indexes. We also introduced a clear distinction between the `map` attribute (database-level name) and `name` attribute (Prisma Client API name) in the PSL to explicitly control how constraints are defined in the Prisma schema. This means that you will notice an impact when running Prisma `migrate` or `db pull` which will follow this new convention. We advise you to adjust your schema to reflect the names of your constraints and indexes appropriately. @@ -128,34 +128,34 @@ They also do not apply to the `array_contains` operator because there can only b -## Upgrading the prisma and @prisma/client packages to Prisma 3 +## Upgrading the `prisma` and `@prisma/client` packages to Prisma ORM 3 To upgrade from version 2.x to 3.x, you need to update both the `prisma` and `@prisma/client` packages. Both the `prisma` and `@prisma/client` packages install with a caret `^` in their version number to safe guard against breaking changes. To ignore the caret `^` and upgrade across major versions, you can use the `@3` tag when upgrading with `npm`, or `yarn` . - + Before upgrading, check each **breaking change** to see how the upgrade might affect your application. -, ]}> + - + ```terminal npm install prisma@3 @prisma/client@3 ``` - + - + ```terminal yarn up prisma@3 @prisma/client@3 ``` - + diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/900-codemods.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/900-codemods.mdx index e28bab5e4f..3058b0d95a 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/900-codemods.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/900-codemods.mdx @@ -1,12 +1,12 @@ --- title: 'Codemods' metaTitle: 'Codemods (Guides)' -metaDescription: 'Use codemods to upgrade your codebase as Prisma changes and evolves.' +description: 'Use codemods to upgrade your codebase as Prisma ORM evolves.' --- -The `@prisma/codemods` package helps you to upgrade your codebase as Prisma evolves and changes. +The `@prisma/codemods` package helps you to upgrade your codebase as Prisma ORM evolves. diff --git a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx index f8ef2b3358..d75e93c334 100644 --- a/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/200-upgrading-versions/index.mdx @@ -1,12 +1,12 @@ --- title: 'Upgrading versions' metaTitle: 'Upgrading versions (Guides)' -metaDescription: 'Upgrading your project to the latest version of Prisma.' +description: 'Upgrading your project to the latest version of Prisma ORM.' --- -To upgrade to the latest version of Prisma: +To upgrade to the latest version of Prisma ORM: 1. Review [release notes](https://github.com/prisma/prisma/releases) on GitHub for breaking changes and new features. 1. Upgrade **both** of the following packages to the same version: @@ -16,21 +16,21 @@ To upgrade to the latest version of Prisma: 1. Upgrade your codebase where applicable. Breaking changes may require you to change your Prisma schema or the way you use Prisma Client. - +:::tip -[codemods](codemods) help you refactor your code to account for breaking changes - for example, the 2.12.0 codemod automatically renames `findOne` to `findUnique`. +[codemods](/orm/more/upgrade-guides/upgrading-versions/codemods) help you refactor your code to account for breaking changes - for example, the 2.12.0 codemod automatically renames `findOne` to `findUnique`. - +::: ## Common upgrade paths -### Prisma 2 and onwards +### Prisma ORM 2 and onwards -- [Upgrade to Prisma 5](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5) -- [Upgrade to Prisma 4](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4) -- [Upgrade to Prisma 3](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3) +- [Upgrade to Prisma ORM 5](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5) +- [Upgrade to Prisma ORM 4](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4) +- [Upgrade to Prisma ORM 3](/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3) ### Prisma 1 @@ -38,7 +38,7 @@ To upgrade to the latest version of Prisma: ## Testing new features, without upgrading -### dev distribution tag +### `dev` distribution tag The `dev` [Npm distribution tag](http://npm.github.io/publishing-pkgs-docs/updating/using-tags.html) points to the most recent development version of the package, which is published for each commit to the main branch of `prisma/prisma`. You can use the `dev` distribution tag to verify a fix or test a feature before it is officially released. @@ -48,7 +48,7 @@ To install the latest `dev` distribution tag: npm install @prisma/client@dev prisma@dev ``` - + Do not use the `dev` distribution tag in production - wait until the official release that contains the features and fixes you are interested in is released. For example, fixes present `@prisma/client@2.23.0-dev.25` will eventually be released as part of `@prisma/client@2.23.0`. diff --git a/content/200-orm/800-more/300-upgrade-guides/250-upgrading-to-use-preview-features.mdx b/content/200-orm/800-more/300-upgrade-guides/250-upgrading-to-use-preview-features.mdx index 793f39ca0b..3d13e30a4a 100644 --- a/content/200-orm/800-more/300-upgrade-guides/250-upgrading-to-use-preview-features.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/250-upgrading-to-use-preview-features.mdx @@ -1,8 +1,8 @@ --- title: 'Upgrading to use Preview features' metaTitle: 'Upgrading to use Preview features (Guides)' -metaDescription: 'Upgrading your project to use a Preview feature.' -toc: false +description: 'Upgrading your project to use a Preview feature.' +hide_table_of_contents: true --- diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx index 673c434a07..216433f49d 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/01-how-to-upgrade.mdx @@ -1,19 +1,21 @@ --- title: 'How to upgrade' -metaTitle: 'How to upgrade from Prisma 1 to Prisma version 2.x and later' -metaDescription: 'Learn how to upgrade your Prisma 1 project to Prisma version 2.x and later' +metaTitle: 'How to upgrade from Prisma 1 to Prisma ORM version 2.x and later' +description: 'Learn how to upgrade your Prisma 1 project to Prisma ORM version 2.x and later' --- + + ## Overview -This page helps you make an informed decision on when and how to upgrade from Prisma 1 to Prisma version 2._x_ and later. +This page helps you make an informed decision on when and how to upgrade from Prisma 1 to Prisma ORM version 2._x_ and later. ## Upgrade documentation The upgrade documentation consists of several pages, here's an overview of how to use them: - **How to upgrade** (_you are here_): Starting point to learn about the upgrade process in general. -- [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql): A _reference_ page about the schema incompatibilities between Prisma 1 and Prisma 2._x_ (and later versions). Reading this page is optional but it will give you a better understanding of certain steps in the upgrade process. +- [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql): A _reference_ page about the schema incompatibilities between Prisma 1 and Prisma ORM 2._x_ (and later versions). Reading this page is optional but it will give you a better understanding of certain steps in the upgrade process. In addition to these two pages, there are various _practical guides_ that walk you through an example scenario of the upgrade process: @@ -26,11 +28,11 @@ Once you're done with that guide, you can choose **one of the following four gui - [prisma-binding to SDL-first](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) GraphQL server. - [REST API](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api): Choose this guide if you're currently running Prisma 1 using Prisma Client 1 and are building a REST API. -## Main differences between Prisma 1 and Prisma version 2._x_ and later +## Main differences between Prisma 1 and Prisma ORM version 2._x_ and later -On a high-level, the biggest differences between Prisma 1 and Prisma versions 2._x_ and later are summarized below. +On a high-level, the biggest differences between Prisma 1 and Prisma ORM versions 2._x_ and later are summarized below. -Prisma 2._x_ and later versions: +Prisma ORM 2._x_ and later versions: - don't require hosting a database proxy server (i.e., the [Prisma server](https://v1.prisma.io/docs/1.34/prisma-server/)). - make the features of Prisma 1 more modular and splits them into dedicated tools: @@ -39,26 +41,26 @@ Prisma 2._x_ and later versions: - use the [Prisma schema](/orm/prisma-schema), a merge of Prisma 1 datamodel and `prisma.yml`. - use its own [modeling language](https://github.com/prisma/specs/tree/master/schema) instead of being based on GraphQL SDL. - don't expose ["a GraphQL API for your database"](https://www.prisma.io/blog/prisma-and-graphql-mfl5y2r7t49c) anymore, but only allows for _programmatic access_ via the Prisma Client API. - - don't support Prisma binding any more. -- allows connecting Prisma 2._x_ and later version to any existing database, via more powerful introspection + - don't support Prisma ORM binding any more. +- allows connecting Prisma ORM 2._x_ and later version to any existing database, via more powerful introspection ## Feature parity -Prisma 2._x_ and later versions do not yet have full feature parity with Prisma 1. The biggest feature that is still missing from Prisma versions 2._x_ and later is real-time subscriptions. +Prisma ORM 2._x_ and later versions do not yet have full feature parity with Prisma 1. The biggest feature that is still missing from Prisma ORM versions 2._x_ and later is real-time subscriptions. -- **Real-time API (Subscriptions)**: Prisma version 2._x_ and later currently [doesn't have a way to subscribe to events happening in the database](https://github.com/prisma/prisma/issues/298) and get notified in real time. It is currently unclear if, when, and in what form a real-time API will be added to Prisma versions 2._x_ and later. For the time being, you can implement real-time functionality using native database triggers, or if you're using GraphQL subscriptions you can consider triggering subscriptions manually inside your _mutation resolvers_. +- **Real-time API (Subscriptions)**: Prisma ORM version 2._x_ and later currently [doesn't have a way to subscribe to events happening in the database](https://github.com/prisma/prisma/issues/298) and get notified in real time. It is currently unclear if, when, and in what form a real-time API will be added to Prisma ORM versions 2._x_ and later. For the time being, you can implement real-time functionality using native database triggers, or if you're using GraphQL subscriptions you can consider triggering subscriptions manually inside your _mutation resolvers_. ## Schema incompatibilities -The database schema that is created when running `prisma deploy` in Prisma 1 is only partially compatible with the one that Prisma versions 2._x_ and later creates. This section gives a quick overview of the general incompatibilities and the potential workarounds. - +The database schema that is created when running `prisma deploy` in Prisma 1 is only partially compatible with the one that Prisma ORM versions 2._x_ and later creates. This section gives a quick overview of the general incompatibilities and the potential workarounds. - > **Note**: For a detailed explanation of the problems and respective workarounds, please refer to the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. Here's an overview of the different columns: -- **Problem**: A short description of the problem when upgrading from Prisma 1 to Prisma versions 2._x_ and later +- **Problem**: A short description of the problem when upgrading from Prisma 1 to Prisma ORM versions 2._x_ and later - **SQL**: Can this be solved by making a non-breaking change to the SQL schema? -- **Prisma schema**: Can this be solved by making a non-breaking change to the schema in Prisma versions 2._x_ and later? +- **Prisma schema**: Can this be solved by making a non-breaking change to the schema in Prisma ORM versions 2._x_ and later? - **Breaking Prisma 1**: Do the SQL statements break the Prisma 1 setup? This is only relevant when you're choosing the gradual side-by-side [upgrade strategy](#upgrade-strategies). | Problem | SQL | Prisma schema | Breaking Prisma 1 | @@ -80,16 +82,16 @@ Here's an overview of the different columns: ## Prisma 1 Upgrade CLI -The [Prisma 1 Upgrade CLI](https://github.com/prisma/prisma1-upgrade) helps you apply the workarounds that are explained on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. It generates the SQL statements to fix the database schema and make it compatible with Prisma versions 2._x_ and later. Note that you are in full control over the operations that are executed against your database, the Upgrade CLI only generates and prints the statements for you. The Upgrade CLI also takes care of the workarounds in the Prisma schema. +The [Prisma 1 Upgrade CLI](https://github.com/prisma/prisma1-upgrade) helps you apply the workarounds that are explained on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. It generates the SQL statements to fix the database schema and make it compatible with Prisma ORM versions 2._x_ and later. Note that you are in full control over the operations that are executed against your database, the Upgrade CLI only generates and prints the statements for you. The Upgrade CLI also takes care of the workarounds in the Prisma schema. On a high-level, the upgrade workflow using the Upgrade CLI looks as follows. For the **initial setup**: -1. You set up Prisma by installing the Prisma versions 2._x_ and later CLI and running `npx prisma init`. +1. You set up Prisma ORM by installing the Prisma ORM versions 2._x_ and later CLI and running `npx prisma init`. 1. You connect to your database and introspect it with `npx prisma db pull`. -![Prisma CLI introspection flow](images/prisma-cli-introspection-flow.png) +![Prisma CLI introspection flow](./images/prisma-cli-introspection-flow.png) For **fixing the schema incompatibilities**: @@ -100,7 +102,7 @@ For **fixing the schema incompatibilities**: 1. You run the `npx prisma-upgrade` command again. 1. The Upgrade CLI adjusts the Prisma schema (version 2._x_ and later) by adding missing attributes. -![Fixing the schema incompatibilities](images/fix-schema-incompatibilities.png) +![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) Note that the Upgrade CLI is designed in a way that **you can stop and re-start the process at any time**. Once you ran a SQL command that was generated by the Upgrade CLI against your database, the SQL command will not show up the next time you invoke the Upgrade CLI. That way, you can gradually resolve all schema incompatibilities when it's convenient for you. @@ -108,30 +110,30 @@ Note that the Upgrade CLI is designed in a way that **you can stop and re-start There are two main upgrade strategies: -- **Upgrade all at once**: Entirely remove Prisma 1 from your project and move everything over to Prisma version 2._x_ or later at once. -- **Gradual upgrade side-by-side**: Add Prisma version 2._x_ and later to the existing Prisma 1 project and gradually replace existing Prisma 1 features with the newer Prisma features while running them side-by-side. +- **Upgrade all at once**: Entirely remove Prisma 1 from your project and move everything over to Prisma ORM version 2._x_ or later at once. +- **Gradual upgrade side-by-side**: Add Prisma ORM version 2._x_ and later to the existing Prisma 1 project and gradually replace existing Prisma 1 features with the newer Prisma features while running them side-by-side. -Note that if you are planning to run Prisma 1 and Prisma 2._x_ or later version side-by-side, you must not yet resolve the [schema compatibilities](#schema-incompatibilities) that are breaking the Prisma 1 setup. +Note that if you are planning to run Prisma 1 and Prisma ORM 2._x_ or later version side-by-side, you must not yet resolve the [schema compatibilities](#schema-incompatibilities) that are breaking the Prisma 1 setup. ### When to choose which strategy If your project is not yet running in production or has little traffic and user data, the **all at once** strategy is recommended. -In case your project already sees a lot of traffic and has a lot of user data stored in the database, you might want to consider the **gradual** upgrade strategy where you're running Prisma 1 and Prisma 2 or later side-by-side for a certain amount of time until you've replace all former Prisma 1 functionality with Prisma 2 or later version. +In case your project already sees a lot of traffic and has a lot of user data stored in the database, you might want to consider the **gradual** upgrade strategy where you're running Prisma 1 and Prisma ORM 2 or later side-by-side for a certain amount of time until you've replace all former Prisma 1 functionality with Prisma ORM 2 or later version. -Note that you won't be able to fix the [schema incompatibilities](#schema-incompatibilities) that require a "Breaking Prisma 1" change if you choose the gradual upgrade strategy and intend to run Prisma 1 and Prisma version 2._x_ or later side-by-side. That's because these data migrations are breaking the schema that Prisma 1 expects. This means that your Prisma Client API might not feel as idiomatic as it could, but you still get the full feature set of Prisma Client. +Note that you won't be able to fix the [schema incompatibilities](#schema-incompatibilities) that require a "Breaking Prisma 1" change if you choose the gradual upgrade strategy and intend to run Prisma 1 and Prisma ORM version 2._x_ or later side-by-side. That's because these data migrations are breaking the schema that Prisma 1 expects. This means that your Prisma Client API might not feel as idiomatic as it could, but you still get the full feature set of Prisma Client. ### Upgrade path No matter which of the strategies you choose, on a high-level the envisioned upgrade path looks as follows: -1. Install the new Prisma version 2._x_ or later CLI as a development dependency +1. Install the new Prisma ORM version 2._x_ or later CLI as a development dependency 1. Create your Prisma schema and configure the database connection URL -1. Use the Prisma version 2._x_ or later CLI to introspect your Prisma 1 database and generate your Prisma schema +1. Use the Prisma ORM version 2._x_ or later CLI to introspect your Prisma 1 database and generate your Prisma schema 1. Run the [Prisma 1 Upgrade CLI](https://github.com/prisma/prisma1-upgrade) to "fix" the Prisma schema 1. Install and generate Prisma Client version 2._x_ or later 1. Adjust your application code, specifically replace the API calls from the Prisma Client 1.0 with those of Prisma Client version 2._x_ or later ## Next steps -Once you've made the decision to upgrade, continue with the [Upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql) guide. +Once you've made the decision to upgrade, continue with the [Upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql) guide. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx new file mode 100644 index 0000000000..7f4d4e3e79 --- /dev/null +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-mysql.mdx @@ -0,0 +1,781 @@ +--- +title: 'Schema incompatibilities' +metaTitle: 'Schema Incompatibilities | MySQL' +description: 'Problems and workarounds for Prisma 1 and 2.0 schemas with MySQL' +dbSwitcher: ['postgresql', 'mysql'] +sidebar_class_name: hidden-sidebar +pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql +--- + + + +## Overview + +Each section on this page describes a potential problem when upgrading from Prisma 1 to Prisma ORM 2._x_ and later and explains the available workarounds. + +## Default values aren't represented in database + +### Problem + +When adding the `@default` directive in a Prisma 1 datamodel, the default values for this field are generated by the Prisma 1 server at runtime. There's no `DEFAULT` constraint added to the database column. Because this constraint is not reflected in the database itself, the Prisma ORM 2._x_ and later versions of introspection can't recognize it. + +### Example + +#### Prisma 1 datamodel + +```graphql +type Post { + id: ID! @id + published: Boolean @default(value: false) +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "Post" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + published BOOLEAN NOT NULL +); +``` + +#### Result of introspection in Prisma ORM versions 2._x_ and later + +```prisma file=schema.prisma showLineNumbers +model Post { + id String @id + published Boolean +} +``` + +Because the `DEFAULT` constraint has not been added to the database when mapping the Prisma 1 datamodel to the database with `prisma deploy`, Prisma ORM v2 (and later versions) doesn't recognize it during introspection. + +### Workarounds + +#### Manually add a `DEFAULT` constraint to the database column + +You can alter the column to add the `DEFAULT` constraint as follows: + +```sql +ALTER TABLE `Post` + ALTER COLUMN published SET DEFAULT false; +``` + +After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `published` field: + +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers +model Post { + id String @id + //highlight-next-line + published Boolean @default(false) +} +``` + +#### Manually add a `@default` attribute to the Prisma model + +You can add the `@default` attribute to the Prisma model: + +```prisma line-number file=schema.prisma highlight=3;add showLineNumbers +model Post { + id String + //add-next-line + published Boolean @default(false) +} +``` + +If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). + +## Generated CUIDs as ID values aren't represented in database + +### Problem + +Prisma 1 auto-generates ID values as CUIDs for `ID` fields when they're annotated with the `@id` directive. These CUIDs are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. + +### Example + +#### Prisma 1 datamodel + +```graphql +type Post { + id: ID! @id +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "Post" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); +``` + +#### Result of introspection in Prisma ORM versions 2._x_ and later + +```prisma file=schema.prisma showLineNumbers +model Post { + id String @id +} +``` + +Because there's no indication of the CUID behavior in the database, Prisma ORM's introspection doesn't recognize it. + +### Workaround + +As a workaround, you can manually add the `@default(cuid())` attribute to the Prisma model: + +```prisma line-number file=schema.prisma highlight=2;add showLineNumbers +model Post { + //add-next-line + id String @id @default(cuid()) +} +``` + +If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). + +Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! + +## `@createdAt` isn't represented in database + +### Problem + +Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@createdAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. + +### Example + +#### Prisma 1 datamodel + +```graphql line-number highlight=3;normal +type Post { + id: ID! @id + createdAt: DateTime! @createdAt +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "Post" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + "createdAt" TIMESTAMP NOT NULL +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model Post { + id String @id + createdAt DateTime +} +``` + +### Workarounds + +#### Manually add `DEFAULT CURRENT_TIMESTAMP` to the database column + +You can alter the column to add the `DEFAULT` constraint as follows: + +```sql +ALTER TABLE "Post" + ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; +``` + +After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `createdAt` field: + +```prisma file=schema.prisma showLineNumbers +model Post { + id String + createdAt DateTime @default(now()) +} +``` + +#### Manually add the `@default(now())` attribute to the Prisma model + +As a workaround, you can manually add the `@default(now())` attribute to the Prisma model: + +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers +model Post { + id String @id + //highlight-next-line + createdAt DateTime @default(now()) +} +``` + +If the `@default` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will generate the specified default values at runtime (similar to what the Prisma 1 server did in Prisma 1). + +Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! + +## `@updatedAt` isn't represented in database + +### Problem + +Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@updatedAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it.. + +### Example + +#### Prisma 1 datamodel + +```graphql +type Post { + id: ID! @id + updatedAt: DateTime! @updatedAt +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "Post" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + updatedAt TIMESTAMP +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model Post { + id String @id + updatedAt DateTime +} +``` + +### Workarounds + +#### Manually add the `@updatedAt` attribute to the Prisma model + +As a workaround, you can manually add the `@updatedAt` attribute to the Prisma model: + +```prisma line-number file=schema.prisma highlight=3;add showLineNumbers +model Post { + id String @id + //add-next-line + updatedAt DateTime @updatedAt +} +``` + +If the `@updatedAt` attribute is set in the Prisma schema and you run `prisma generate`, the resulting Prisma Client code will automatically generate values for this column when an existing record is updated (similar to what the Prisma 1 server did in Prisma 1). + +Note that you'll have to re-add the attribute after each introspection because introspection removes it (as the previous version of the Prisma schema is overwritten)! + +## Inline 1-1 relations are recognized as 1-n (missing `UNIQUE` constraint) + +### Problem + +In the [datamodel v1.1](https://www.prisma.io/blog/datamodel-v11-lrzqy1f56c90) that was introduced in Prisma ORM v1.31, 1-1 relations can be declared as _inline_. In that case, the relation will not be maintained via a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) but via a single foreign key on one of the two tables involved. + +When this approach is used, Prisma ORM doesn't add a `UNIQUE` constraint to the foreign key column which means that after introspection in Prisma ORM version 2._x_ and later, this former 1-1 relation will be added as a 1-n relation to the Prisma schema. + +### Example + +#### Prisma ORM datamodel v1.1 (available from Prisma ORM v1.31) + +```graphql +type User { + id: ID! @id + profile: Profile @relation(link: INLINE) +} + +type Profile { + id: ID! @id + user: User +} +``` + +Note that omitting the `@relation` directive in this case would result in the same behavior because `link: INLINE` is the _default_ for 1-1 relations. + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); + +CREATE TABLE "Profile" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + "user" VARCHAR(25), + FOREIGN KEY ("user") REFERENCES "User"(id) +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + Profile Profile[] +} + +model Profile { + id String @id + user String? + User User? @relation(fields: [user], references: [id]) +} +``` + +Because there's no `UNIQUE` constraint defined on the `user` column (which represents the foreign key in this relation), Prisma ORM's introspection recognizes the relation as 1-n. + +### Workaround + +#### Manually add `UNIQUE` constraint to the foreign key column + +You can alter the foreign key column to add the `UNIQUE` constraint as follows: + +```sql +ALTER TABLE `Profile` + ADD CONSTRAINT userId_unique UNIQUE (`user`); +``` + +After this adjustment, you can re-introspect your database and the 1-1 relation will be properly recognized: + +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers +model User { + id String @id + //highlight-next-line + Profile Profile? +} + +model Profile { + id String @id + user String? @unique + User User? @relation(fields: [user], references: [id]) +} +``` + +## _All_ non-inline relations are recognized as m-n + +### Problem + +Prisma 1 represents relations as relation tables most of the time: + +- All relations in the Prisma 1 **datamodel v1.0** are represented as relation tables +- In **datamodel v1.1**, all m-n relations as well as the 1-1 and 1-n relations declared as `link: TABLE` are represented as relation tables. + +Because of this representation, introspection in Prisma ORM version 2._x_ and later will recognize all these relations as m-n relations, even though they might have been declared as 1-1 or 1-n in Prisma 1. + +### Example + +#### Prisma 1 datamodel + +```graphql +type User { + id: ID! @id + posts: [Post!]! +} + +type Post { + id: ID! @id + author: User! @relation(link: TABLE) +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); + +CREATE TABLE "Post" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); + +CREATE TABLE "_PostToUser" ( + "A" VARCHAR(25) NOT NULL REFERENCES "Post"(id) ON DELETE CASCADE, + "B" VARCHAR(25) NOT NULL REFERENCES "User"(id) ON DELETE CASCADE +); +CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON "_PostToUser"("A" text_ops,"B" text_ops); +CREATE INDEX "_PostToUser_B" ON "_PostToUser"("B" text_ops); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + Post Post[] @relation(references: [id]) +} + +model Post { + id String @id + User User[] @relation(references: [id]) +} +``` + +Because the relation table that was created by Prisma 1 uses the same [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations) as in Prisma ORM version 2._x_ and later, the relation now gets recognized as a m-n relation. + +### Workaround + +As a workaround, you can migrate the data into a structure that's compatible with Prisma ORM's 1-n relation: + +1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: + ```sql + ALTER TABLE `Post` ADD COLUMN `authorId` VARCHAR(25); + ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`); + ``` +1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: + 1. Finds the respective `Post` record by looking up the value from column `A` + 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record + ```sql + UPDATE Post, _PostToUser + SET Post.authorId = _PostToUser.B + WHERE Post.id = _PostToUser.A + ``` +1. Delete the `_PostToUser` relation table + ```sql + DROP TABLE `_PostToUser`; + ``` + +After that you can introspect your database and the relation will now be recognized as 1-n: + +```prisma line-number file=schema.prisma highlight=3,8,9;normal showLineNumbers +model User { + id String @id + //highlight-next-line + Post Post[] +} + +model Post { + id String @id + //highlight-start + User User @relation(fields: [authorId], references: [id]) + authorId String + //highlight-end +} +``` + +## `Json` type is represented as `TEXT` in database + +### Problem + +Prisma 1 supports the `Json` data type in its datamodel. However, in the underlying database, fields of type `Json` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any parsing and validation of the stored JSON data is done by the Prisma 1 server at runtime. + +### Example + +#### Prisma 1 datamodel + +```graphql +type User { + id: ID! @id + jsonData: Json +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + jsonData TEXT +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + jsonData String? +} +``` + +### Workaround + +You can manually change the type of the column to `JSON` + +```sql +ALTER TABLE User MODIFY COLUMN jsonData JSON; +``` + +After this adjustment, you can re-introspect your database and the field will now be recognized as `Json`: + +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers +model User { + id String @id + //highlight-next-line + jsonData Json? +} +``` + +## Enums are represented as `TEXT` in database + +### Problem + +Prisma 1 supports the `enum` data type in its datamodel. However, in the underlying database, types declared as `enum` are actually stored as plain strings using the `TEXT` data type of the underlying database. Any validation of the stored `enum` data is done by the Prisma 1 server at runtime. + +### Example + +#### Prisma 1 datamodel + +```graphql +type User { + id: ID! @id + role: Role +} + +enum Role { + ADMIN + CUSTOMER +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL, + role TEXT +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + role String? +} +``` + +### Workaround + +You can manually turn the `role` column into an enum with your desired values: + +1. Create an `enum` in your database that mirrors the `enum` you defined in the Prisma 1 datamodel: + ```sql + CREATE TYPE "Role" AS ENUM ('CUSTOMER', 'ADMIN'); + ``` +1. Change the type from `TEXT` to your new `enum`: + ```sql + ALTER TABLE "User" ALTER COLUMN "role" TYPE "Role" + USING "role"::text::"Role"; + ``` + +After introspection, the type is now properly recognized as an enum: + +```prisma line-number file=schema.prisma highlight=3,6-9;normal showLineNumbers +model User { + id String @id + //highlight-next-line + role Role? +} + +//highlight-start +enum Role { + ADMIN + CUSTOMER +} +//highlight-end +``` + +## Mismatching CUID length + +### Problem + +Prisma 1 uses CUIDs as ID values for all database records. In the underlying database, these IDs are represented as strings with a maximum size of 25 characters (as `VARCHAR(25)`). However, when configuring default CUIDs in your Prisma ORM 2._x_ (or later versions) schema with `@default(cuid())` the generated ID values might exceed the limit of 25 characters (the maximum length might be 30 characters). To make your IDs proof for Prisma ORM 2._x_ (or later versions), you therefore need to adjust the column type to `VARCHAR(30)`. + +### Example + +#### Prisma 1 datamodel + +```graphql +type User { + id: ID! @id +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); +``` + +#### Result of introspection in Prisma ORM 2._x_ and later versions + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id +} +``` + +### Workaround + +You can manually turn the `VARCHAR(25)` columns into `VARCHAR(30)`: + +```sql +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; +SET FOREIGN_KEY_CHECKS=1; +``` + +> **Note**: When fixing this issue with the [Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli), the generated SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. + +## Scalar lists (arrays) are maintained with extra table + +### Problem + +In Prisma 1, you can define lists of _scalar_ types on your models. Under the hood, this is implemented with an extra table that keeps track of the values in the list. + +To remove the approach with the extra table which incurred hidden performance costs, Prisma ORM 2._x_ and later versions only support scalar lists only when they're natively supported by the database you use. At the moment, only [PostgreSQL supports scalar lists (arrays) natively](https://www.postgresql.org/docs/9.1/arrays.html). + +With PostgreSQL, you therefore can keep using scalar lists in Prisma ORM 2._x_ and later versions, but you'll need to perform a data migration to transfer the data from the extra table from Prisma 1 into an actual PostgreSQL array. + +### Example + +#### Prisma 1 datamodel + +```graphql +type User { + id: ID! @id + coinflips: [Boolean!]! @scalarList(strategy: RELATION) +} +``` + +#### Prisma 1 generated SQL migration + +```sql +CREATE TABLE "User" ( + id VARCHAR(25) PRIMARY KEY NOT NULL +); + +CREATE TABLE "User_coinflips" ( + "nodeId" VARCHAR(25) REFERENCES "User"(id), + position INTEGER, + value BOOLEAN NOT NULL, + CONSTRAINT "User_coinflips_pkey" PRIMARY KEY ("nodeId", position) +); +CREATE UNIQUE INDEX "User_coinflips_pkey" ON "User_coinflips"("nodeId" text_ops,position int4_ops); +``` + +#### Result of Prisma ORM 2 introspection + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + User_coinflips User_coinflips[] +} + +model User_coinflips { + nodeId String + position Int + value Boolean + User User @relation(fields: [nodeId], references: [id]) + + @@id([nodeId, position]) +} +``` + +Note that you can now generate Prisma Client and you'll be able to access the data from the scalar lists through the extra table. PostgreSQL users can alternatively migrate the data into a native PostgreSQL array and continue to benefit from the slicker Prisma Client API for scalar lists (read the section below for more info). + +
+ +Expand for sample Prisma Client API calls + +To access the coinflips data, you will now have to always [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) it in your queries: + +```ts +const user = await prisma.user.findUnique({ + where: { id: 1 }, + include: { + coinflips: { + orderBy: { position: 'asc' }, + }, + }, +}) +``` + +> **Note**: The `orderBy` is important to retain the order of the list. + +This is the `result of the query: + +```js +{ + id: 1, + name: 'Alice', + coinflips: [ + { id: 1, position: 1000, value: false }, + { id: 2, position: 2000, value: true }, + { id: 3, position: 3000, value: false }, + { id: 4, position: 4000, value: true }, + { id: 5, position: 5000, value: true }, + { id: 6, position: 6000, value: false } + ] +} +``` + +To access just the boolean values from the list, you can `map` over the `coinflips` on `user` as follows: + +```ts +const currentCoinflips = user!.coinflips.map((cf) => cf.value) +``` + +> **Note**: The exclamation mark above means that you're _force unwrapping_ the `user` value. This is necessary because the `user` returned from the previous query might be `null`. + +Here's the value of `currentCoinflips` after the call to `map`: + +```json +[false, true, false, true, true, false] +``` + +
+ +### Workaround + +The following workaround is only available for PostgreSQL users! + +As scalar lists (i.e. [arrays](https://www.postgresql.org/docs/9.1/arrays.html)) are available as a native PostgreSQL feature, you can keep using the same notation of `coinflips: Boolean[]` in your Prisma schema. + +However, in order to do so you need to manually migrate the underlying data from the `User_coinflips` table into a PostgreSQL array. Here's how you can do that: + +1. Add the new `coinflips` column to the `User` tables: + ```sql + ALTER TABLE "User" ADD COLUMN coinflips BOOLEAN[]; + ``` +1. Migrate the data from `"User_coinflips".value` to `"User.coinflips"`: + ```sql + UPDATE "User" + SET coinflips = t.flips + FROM ( + SELECT "nodeId", array_agg(VALUE ORDER BY position) AS flips + FROM "User_coinflips" + GROUP BY "nodeId" + ) t + where t."nodeId" = "User"."id"; + ``` +1. To cleanup, you can delete the `User_coinflips` table: + ```sql + DROP TABLE "User_coinflips"; + ``` + +You can now introspect your database and the `coinflips` field will be represented as an array in your new Prisma schema: + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + coinflips Boolean[] +} +``` + +You can keep using Prisma Client as before: + +```ts +const user = await prisma.user.findUnique({ + where: { id: 1 }, +}) +``` + +This is the result from the API call: + +```js +{ + id: 1, + name: 'Alice', + coinflips: [ false, true, false, true, true, false ] +} +``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx similarity index 74% rename from content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities.mdx rename to content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx index 174b9c3471..a87b49f381 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/02-schema-incompatibilities-postgresql.mdx @@ -1,35 +1,26 @@ --- title: 'Schema incompatibilities' -# metaTitle: 'Problems and workarounds for Prisma 1 and 2.x and later schemas' -# metaDescription: 'Learn about the schema incompatibilities between Prisma 1 and Prisma versions 2 and later, and how to resolve them with several workarounds.' +metaTitle: 'Schema Incompatibilities | PostgreSQL' +description: 'Problems and workarounds for Prisma 1 and 2.0 schemas with PostgreSQL' dbSwitcher: ['postgresql', 'mysql'] -techMetaTitles: - [ - { name: 'mysql', value: 'Schema Incompatibilities | MySQL' }, - { name: 'postgresql', value: 'Schema Incompatibilities | PostgreSQL' }, - ] -techMetaDescriptions: - [ - { - name: 'mysql', - value: 'Problems and workarounds for Prisma 1 and 2.0 schemas with MySQL', - }, - { - name: 'postgresql', - value: 'Problems and workarounds for Prisma 1 and 2.0 schemas with PostgreSQL', - }, - ] +pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql --- + + ## Overview -Each section on this page describes a potential problem when upgrading from Prisma 1 to Prisma 2._x_ and later and explains the available workarounds. +Each section on this page describes a potential problem when upgrading from Prisma 1 to Prisma ORM 2._x_ and later and explains the available workarounds. ## Default values aren't represented in database ### Problem -When adding the `@default` directive in a Prisma 1 datamodel, the default values for this field are generated by the Prisma 1 server at runtime. There's no `DEFAULT` constraint added to the database column. Because this constraint is not reflected in the database itself, the Prisma 2._x_ and later versions of introspection can't recognize it. +When adding the `@default` directive in a Prisma 1 datamodel, the default values for this field are generated by the Prisma 1 server at runtime. There's no `DEFAULT` constraint added to the database column. Because this constraint is not reflected in the database itself, the Prisma ORM 2._x_ and later versions of introspection can't recognize it. ### Example @@ -51,16 +42,16 @@ CREATE TABLE "Post" ( ); ``` -#### Result of introspection in Prisma versions 2._x_ and later +#### Result of introspection in Prisma ORM versions 2._x_ and later -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id String @id published Boolean } ``` -Because the `DEFAULT` constraint has not been added to the database when mapping the Prisma 1 datamodel to the database with `prisma deploy`, Prisma v2 (and later versions) doesn't recognize it during introspection. +Because the `DEFAULT` constraint has not been added to the database when mapping the Prisma 1 datamodel to the database with `prisma deploy`, Prisma ORM v2 (and later versions) doesn't recognize it during introspection. ### Workarounds @@ -68,29 +59,17 @@ Because the `DEFAULT` constraint has not been added to the database when mapping You can alter the column to add the `DEFAULT` constraint as follows: - - ```sql ALTER TABLE "Post" ALTER COLUMN published SET DEFAULT false; ``` - - - - -```sql -ALTER TABLE `Post` - ALTER COLUMN published SET DEFAULT false; -``` - - - After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `published` field: -```prisma line-number file=schema.prisma highlight=3;normal +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers model Post { id String @id + //highlight-next-line published Boolean @default(false) } ``` @@ -99,9 +78,10 @@ model Post { You can add the `@default` attribute to the Prisma model: -```prisma line-number file=schema.prisma highlight=3;add +```prisma line-number file=schema.prisma highlight=3;add showLineNumbers model Post { id String + //add-next-line published Boolean @default(false) } ``` @@ -112,7 +92,7 @@ If the `@default` attribute is set in the Prisma schema and you run `prisma gene ### Problem -Prisma 1 auto-generates ID values as CUIDs for `ID` fields when they're annotated with the `@id` directive. These CUIDs are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma 2._x_ and later can't recognize it. +Prisma 1 auto-generates ID values as CUIDs for `ID` fields when they're annotated with the `@id` directive. These CUIDs are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. ### Example @@ -132,22 +112,23 @@ CREATE TABLE "Post" ( ); ``` -#### Result of introspection in Prisma versions 2._x_ and later +#### Result of introspection in Prisma ORM versions 2._x_ and later -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id String @id } ``` -Because there's no indication of the CUID behavior in the database, Prisma's introspection doesn't recognize it. +Because there's no indication of the CUID behavior in the database, Prisma ORM's introspection doesn't recognize it. ### Workaround As a workaround, you can manually add the `@default(cuid())` attribute to the Prisma model: -```prisma line-number file=schema.prisma highlight=2;add +```prisma line-number file=schema.prisma highlight=2;add showLineNumbers model Post { + //add-next-line id String @id @default(cuid()) } ``` @@ -160,7 +141,7 @@ Note that you'll have to re-add the attribute after each introspection because i ### Problem -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@createdAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma 2._x_ and later can't recognize it. +Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@createdAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it. ### Example @@ -182,9 +163,9 @@ CREATE TABLE "Post" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id String @id createdAt DateTime @@ -204,7 +185,7 @@ ALTER TABLE "Post" After this adjustment, you can re-introspect your database and the `@default` attribute will be added to the `createdAt` field: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id String createdAt DateTime @default(now()) @@ -218,6 +199,7 @@ As a workaround, you can manually add the `@default(now())` attribute to the Pri ```prisma line-number file=schema.prisma highlight=3;normal model Post { id String @id + //highlight-next-line createdAt DateTime @default(now()) } ``` @@ -230,7 +212,7 @@ Note that you'll have to re-add the attribute after each introspection because i ### Problem -Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@updatedAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma 2._x_ and later can't recognize it.. +Prisma 1 auto-generates values for `DateTime` fields when they're annotated with the `@updatedAt` directive. These values are generated by the Prisma 1 server at runtime. Because this behavior is not reflected in the database itself, the introspection in Prisma ORM 2._x_ and later can't recognize it.. ### Example @@ -252,9 +234,9 @@ CREATE TABLE "Post" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Post { id String @id updatedAt DateTime @@ -270,6 +252,7 @@ As a workaround, you can manually add the `@updatedAt` attribute to the Prisma m ```prisma line-number file=schema.prisma highlight=3;add model Post { id String @id + //add-next-line updatedAt DateTime @updatedAt } ``` @@ -282,13 +265,13 @@ Note that you'll have to re-add the attribute after each introspection because i ### Problem -In the [datamodel v1.1](https://www.prisma.io/blog/datamodel-v11-lrzqy1f56c90) that was introduced in Prisma v1.31, 1-1 relations can be declared as _inline_. In that case, the relation will not be maintained via a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) but via a single foreign key on one of the two tables involved. +In the [datamodel v1.1](https://www.prisma.io/blog/datamodel-v11-lrzqy1f56c90) that was introduced in Prisma ORM v1.31, 1-1 relations can be declared as _inline_. In that case, the relation will not be maintained via a [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) but via a single foreign key on one of the two tables involved. -When this approach is used, Prisma doesn't add a `UNIQUE` constraint to the foreign key column which means that after introspection in Prisma version 2._x_ and later, this former 1-1 relation will be added as a 1-n relation to the Prisma schema. +When this approach is used, Prisma ORM doesn't add a `UNIQUE` constraint to the foreign key column which means that after introspection in Prisma ORM version 2._x_ and later, this former 1-1 relation will be added as a 1-n relation to the Prisma schema. ### Example -#### Prisma datamodel v1.1 (available from Prisma v1.31) +#### Prisma ORM datamodel v1.1 (available from Prisma ORM v1.31) ```graphql type User { @@ -318,9 +301,9 @@ CREATE TABLE "Profile" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id Profile Profile[] @@ -333,7 +316,7 @@ model Profile { } ``` -Because there's no `UNIQUE` constraint defined on the `user` column (which represents the foreign key in this relation), Prisma's introspection recognizes the relation as 1-n. +Because there's no `UNIQUE` constraint defined on the `user` column (which represents the foreign key in this relation), Prisma ORM's introspection recognizes the relation as 1-n. ### Workaround @@ -341,29 +324,17 @@ Because there's no `UNIQUE` constraint defined on the `user` column (which repre You can alter the foreign key column to add the `UNIQUE` constraint as follows: - - ```sql ALTER TABLE "Profile" ADD CONSTRAINT userId_unique UNIQUE ("user"); ``` - - - - -```sql -ALTER TABLE `Profile` - ADD CONSTRAINT userId_unique UNIQUE (`user`); -``` - - - After this adjustment, you can re-introspect your database and the 1-1 relation will be properly recognized: ```prisma line-number file=schema.prisma highlight=3;normal model User { id String @id + //highlight-next-line Profile Profile? } @@ -383,7 +354,7 @@ Prisma 1 represents relations as relation tables most of the time: - All relations in the Prisma 1 **datamodel v1.0** are represented as relation tables - In **datamodel v1.1**, all m-n relations as well as the 1-1 and 1-n relations declared as `link: TABLE` are represented as relation tables. -Because of this representation, introspection in Prisma version 2._x_ and later will recognize all these relations as m-n relations, even though they might have been declared as 1-1 or 1-n in Prisma 1. +Because of this representation, introspection in Prisma ORM version 2._x_ and later will recognize all these relations as m-n relations, even though they might have been declared as 1-1 or 1-n in Prisma 1. ### Example @@ -420,9 +391,9 @@ CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON "_PostToUser"("A" text_ops,"B" te CREATE INDEX "_PostToUser_B" ON "_PostToUser"("B" text_ops); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id Post Post[] @relation(references: [id]) @@ -434,13 +405,11 @@ model Post { } ``` -Because the relation table that was created by Prisma 1 uses the same [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations) as in Prisma version 2._x_ and later, the relation now gets recognized as a m-n relation. +Because the relation table that was created by Prisma 1 uses the same [conventions for relation tables](/orm/prisma-schema/data-model/relations/many-to-many-relations#conventions-for-relation-tables-in-implicit-m-n-relations) as in Prisma ORM version 2._x_ and later, the relation now gets recognized as a m-n relation. ### Workaround -As a workaround, you can migrate the data into a structure that's compatible with Prisma's 1-n relation: - - +As a workaround, you can migrate the data into a structure that's compatible with Prisma ORM's 1-n relation: 1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: ```sql @@ -464,42 +433,21 @@ As a workaround, you can migrate the data into a structure that's compatible wit DROP TABLE "_PostToUser"; ``` - - - - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql - ALTER TABLE `Post` ADD COLUMN `authorId` VARCHAR(25); - ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql - UPDATE Post, _PostToUser - SET Post.authorId = _PostToUser.B - WHERE Post.id = _PostToUser.A - ``` -1. Delete the `_PostToUser` relation table - ```sql - DROP TABLE `_PostToUser`; - ``` - - - After that you can introspect your database and the relation will now be recognized as 1-n: ```prisma line-number file=schema.prisma highlight=3,8,9;normal model User { id String @id + //highlight-next-line Post Post[] } model Post { id String @id + //highlight-start User User @relation(fields: [authorId], references: [id]) authorId String + //highlight-end } ``` @@ -529,9 +477,9 @@ CREATE TABLE "User" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id jsonData String? @@ -542,27 +490,16 @@ model User { You can manually change the type of the column to `JSON` - - ```sql ALTER TABLE "User" ALTER COLUMN "jsonData" TYPE JSON USING "jsonData"::json; ``` - - - - -```sql -ALTER TABLE User MODIFY COLUMN jsonData JSON; -``` - - - After this adjustment, you can re-introspect your database and the field will now be recognized as `Json`: -```prisma line-number file=schema.prisma highlight=3;normal +```prisma line-number file=schema.prisma highlight=3;normal showLineNumbers model User { id String @id + //highlight-next-line jsonData Json? } ``` @@ -598,9 +535,9 @@ CREATE TABLE "User" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id role String? @@ -623,23 +560,26 @@ You can manually turn the `role` column into an enum with your desired values: After introspection, the type is now properly recognized as an enum: -```prisma line-number file=schema.prisma highlight=3,6-9;normal +```prisma line-number file=schema.prisma highlight=3,6-9;normal showLineNumbers model User { id String @id + //highlight-next-line role Role? } +//highlight-start enum Role { ADMIN CUSTOMER } +//highlight-end ``` ## Mismatching CUID length ### Problem -Prisma 1 uses CUIDs as ID values for all database records. In the underlying database, these IDs are represented as strings with a maximum size of 25 characters (as `VARCHAR(25)`). However, when configuring default CUIDs in your Prisma 2._x_ (or later versions) schema with `@default(cuid())` the generated ID values might exceed the limit of 25 characters (the maximum length might be 30 characters). To make your IDs proof for Prisma 2._x_ (or later versions), you therefore need to adjust the column type to `VARCHAR(30)`. +Prisma 1 uses CUIDs as ID values for all database records. In the underlying database, these IDs are represented as strings with a maximum size of 25 characters (as `VARCHAR(25)`). However, when configuring default CUIDs in your Prisma ORM 2._x_ (or later versions) schema with `@default(cuid())` the generated ID values might exceed the limit of 25 characters (the maximum length might be 30 characters). To make your IDs proof for Prisma ORM 2._x_ (or later versions), you therefore need to adjust the column type to `VARCHAR(30)`. ### Example @@ -659,9 +599,9 @@ CREATE TABLE "User" ( ); ``` -#### Result of introspection in Prisma 2._x_ and later versions +#### Result of introspection in Prisma ORM 2._x_ and later versions -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id } @@ -671,24 +611,10 @@ model User { You can manually turn the `VARCHAR(25)` columns into `VARCHAR(30)`: - - ```sql ALTER TABLE "User" ALTER COLUMN "id" SET DATA TYPE character varying(30); ``` - - - - -```sql -SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -SET FOREIGN_KEY_CHECKS=1; -``` - - - > **Note**: When fixing this issue with the [Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli), the generated SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. ## Scalar lists (arrays) are maintained with extra table @@ -697,9 +623,9 @@ SET FOREIGN_KEY_CHECKS=1; In Prisma 1, you can define lists of _scalar_ types on your models. Under the hood, this is implemented with an extra table that keeps track of the values in the list. -To remove the approach with the extra table which incurred hidden performance costs, Prisma 2._x_ and later versions only support scalar lists only when they're natively supported by the database you use. At the moment, only [PostgreSQL supports scalar lists (arrays) natively](https://www.postgresql.org/docs/9.1/arrays.html). +To remove the approach with the extra table which incurred hidden performance costs, Prisma ORM 2._x_ and later versions only support scalar lists only when they're natively supported by the database you use. At the moment, only [PostgreSQL supports scalar lists (arrays) natively](https://www.postgresql.org/docs/9.1/arrays.html). -With PostgreSQL, you therefore can keep using scalar lists in Prisma 2._x_ and later versions, but you'll need to perform a data migration to transfer the data from the extra table from Prisma 1 into an actual PostgreSQL array. +With PostgreSQL, you therefore can keep using scalar lists in Prisma ORM 2._x_ and later versions, but you'll need to perform a data migration to transfer the data from the extra table from Prisma 1 into an actual PostgreSQL array. ### Example @@ -728,9 +654,9 @@ CREATE TABLE "User_coinflips" ( CREATE UNIQUE INDEX "User_coinflips_pkey" ON "User_coinflips"("nodeId" text_ops,position int4_ops); ``` -#### Result of Prisma 2 introspection +#### Result of Prisma ORM 2 introspection -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id User_coinflips User_coinflips[] @@ -748,7 +674,9 @@ model User_coinflips { Note that you can now generate Prisma Client and you'll be able to access the data from the scalar lists through the extra table. PostgreSQL users can alternatively migrate the data into a native PostgreSQL array and continue to benefit from the slicker Prisma Client API for scalar lists (read the section below for more info). -
Expand for sample Prisma Client API calls +
+ +Expand for sample Prisma Client API calls To access the coinflips data, you will now have to always [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields) it in your queries: @@ -792,7 +720,7 @@ const currentCoinflips = user!.coinflips.map((cf) => cf.value) Here's the value of `currentCoinflips` after the call to `map`: -```json5 +```json [false, true, false, true, true, false] ``` @@ -828,7 +756,7 @@ However, in order to do so you need to manually migrate the underlying data from You can now introspect your database and the `coinflips` field will be represented as an array in your new Prisma schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id coinflips Boolean[] diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx new file mode 100644 index 0000000000..6f81997fac --- /dev/null +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-mysql.mdx @@ -0,0 +1,1316 @@ +--- +title: 'Upgrading the Prisma ORM layer' +metaTitle: 'Upgrading the Prisma ORM layer to Prisma ORM 2 | MySQL' +description: 'Learn how to upgrade the Prisma ORM layer to Prisma ORM 2 and create your Prisma schema with MySQL' +dbSwitcher: ['postgresql', 'mysql'] +sidebar_class_name: hidden-sidebar +pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus +--- + + + +## Overview + +This page explains the first step of your upgrade process: Taking your Prisma 1 configuration and upgrading it to Prisma ORM 2. Concretely, you will learn how to: + +1. Add the Prisma ORM 2 CLI as a development dependency +1. Create your Prisma ORM 2 schema +1. Determine your connection URL and connect to your database +1. Introspect your database (that was so far managed with Prisma 1) +1. Use the [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) to resolve the [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) in the new Prisma ORM 2 data model +1. Install and generate Prisma Client + +Once done with these steps, you can move on to the next guide that explains how you can upgrade the application layer to use Prisma Client for your database queries. + +> **Note**: During the upgrade process it can be helpful to get a graphical view on your database. It is therefore recommended to use a graphical database client to connect to your database, such as [TablePlus](https://tableplus.com/) or [Postico](https://eggerapps.at/postico/). + +## 1. Install Prisma ORM 2 CLI + +The Prisma ORM 2 CLI is available as the [`prisma`](https://www.npmjs.com/package/prisma) package on npm and is invoked via the `prisma` command. + +Note that the former `prisma` command for Prisma 1 has been renamed to `prisma1`. You can learn more about this [here](https://www.prisma.io/blog/prisma-2-beta-b7bcl0gd8d8e#renaming-the-prisma2-cli). + +You can install the Prisma ORM 2 CLI in your Node.js project as follows (be sure to invoke this command in the directory where your `package.json` is located): + +```terminal copy +npm install prisma --save-dev +``` + +> **Note**: With Prisma 1, it was usually recommended to install the CLI globally. We now recommend to [install the Prisma CLI locally](/orm/tools/prisma-cli#installation) to prevent version conflicts. + +You can now use the local installation of the `prisma` CLI by prefixing it with `npx`: + +```terminal +npx prisma +``` + +If you're upgrading your entire project [all at once](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can now also uninstall the Prisma 1 CLI (otherwise expand below): + +```terminal +# remove global installation +npm uninstall -g prisma1 + +# remove local installation +npm uninstall prisma1 +``` + +
+ +
+ +Expand if you want to keep using your Prisma 1 CLI side-by-side + +If you want to keep using the Prisma 1 CLI, it is recommend to remove your global installation of it and add the `prisma1` CLI as a development dependency: + +```terminal +# installs v1.34 of the Prisma 1 CLI +npm uninstall -g prisma +npm install prisma1 --save-dev +``` + +You can now invoke it as follows: + +```terminal +npx prisma1 +``` + +Note that if you need a CLI version smaller than 1.34 (e.g. 1.30), you can install it as follows: + +```terminal +# installs v1.30 of the Prisma 1 CLI +npm uninstall -g prisma@1.30 +npm install prisma@1.30 --save-dev +``` + +You can now invoke it as follows: + +```terminal +npx prisma +``` + +
+ +## 2. Create your Prisma ORM 2 schema + +For this guide, you'll first create a new Prisma schema using the `prisma init` command and then "fill" it with a data model using [introspection](/orm/prisma-schema/introspection). + +Run the following command to create your Prisma schema (note that this throws an error if you already have a folder called `prisma`): + +```terminal copy +npx prisma init +``` + +If you're seeing the following error, you need to rename your current `prisma` directory: + +```no-lines +ERROR A folder called prisma already exists in your project. + Please try again in a project that is not yet using Prisma. +``` + +You can rename the current `prisma` directory to `prisma1` to make it clear that this holds the former Prisma 1 configuration: + +```terminal copy +mv prisma prisma1 +``` + +Now you can run `init` and it will succeed: + +```terminal copy +npx prisma init +``` + +It should print the following output: + +```no-lines wrap +✔ Your Prisma schema was created at prisma/schema.prisma. + You can now open it in your favorite editor. + +Next steps: +1. Set the `DATABASE_URL` in the `.env` file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started +2. Set the `provider` of your `datasource` block in `schema.prisma` to match your database: `postgresql`, `mysql` or `sqlite`. +3. Run `prisma db pull` to turn your database schema into a Prisma data model. +4. Run `prisma generate` to install Prisma Client. You can then start querying your database. + +More information in our documentation: +https://pris.ly/d/getting-started +``` + +The command created a new folder called `prisma`, and two files: + +- `prisma/schema.prisma`: Your Prisma schema file that specifies the [data source](/orm/prisma-schema/overview/data-sources), [generator](/orm/prisma-schema/overview/generators) and [data model](/orm/prisma-schema/data-model/models) (note that the data model doesn't exist yet, it will be generated via introspection). +- `.env`: A [dotenv](https://github.com/motdotla/dotenv#readme) file to configure your database [connection URL](/orm/reference/connection-urls). + +Your initial Prisma schema looks as follows: + +```prisma file=schema.prisma showLineNumbers +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} +``` + +With Prisma 1, you specify which language variant of Prisma Client you wanted to use in your `prisma.yml`. With Prisma ORM 2, this information is now specified inside the Prisma schema via a `generator` block. + +> **Note**: Unlike Prisma 1, the TypeScript and JavaScript variants of Prisma Client 2.0 use the _same_ generator called `prisma-client-js`. The generated types in `index.d.ts` are _always_ included, even in plain JavaScript projects. This enables feature like autocompletion in VS Code even when not using TypeScript. + +## 3. Determine your connection URL and connect to your database + +With Prisma 1, the database connection is configured in the Docker Compose file that's used to launch the Prisma ORM server. The Prisma ORM server then exposes a GraphQL endpoint (via HTTP) that proxies all database requests from the Prisma Client application code. That HTTP endpoint is specified in your `prisma.yml`. + +With Prisma ORM 2, the HTTP layer isn't exposed any more and Prisma Client 2.0 is configured to run requests "directly" against the database (that is, requests are proxied by Prisma ORM's [query engine](/orm/more/under-the-hood/engines), but there isn't an extra server any more). + +So, as a next step you'll need to tell Prisma ORM 2 _what_ kind of database you use (MySQL or PostgreSQL) and _where_ it is located. + +First, you need to ensure that that `provider` field on the `datasource` block inside `schema.prisma` is configured to use the right database: + +- If you're using PostgreSQL, it needs to define the value `"postgresql"` in the `provider` field. +- If you're using MySQL, it needs to define the value `"mysql"` in the `provider` field. + +Switch around with the tabs in the code block to see examples of both: + + + + +```prisma +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} +``` + + + + +```prisma +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} +``` + + + + +With the `provider` field set, you can go ahead and configure the connection URL inside the `.env` file. + +Assume the database configuration in your Docker Compose file that you used to deploy your Prisma ORM server looks as follows: + +```yml file=docker-compose.yml +PRISMA_CONFIG: | + port: 4466 + databases: + default: + connector: mysql + host: mysql + port: 3306 + user: root + password: randompassword +``` + +Also assume your `endpoint` in `prisma.yml` is configured as follows: + +```yml file=prisma.yml +endpoint: http://localhost:4466/myproject/dev +``` + +Based on these connection details, you need to configure the `DATABASE_URL` environment variable inside your `.env` file as follows: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/myproject@dev" +``` + +Note that the _database name_ in the connection URL is typically composed of your _service name_ and _service stage_ (which are part of the `endpoint` in `prisma.yml`), separated by the `@` character. + +Sometimes no service name and stage are specified in `prisma.yml`: + +```yml file=prisma.yml +endpoint: http://localhost:4466/ +``` + +In that case, the database name must be specified as follows: + +```bash file=.env +DATABASE_URL="mysql://root:randompassword@localhost:3306/default@default" +``` + +Learn more on the [Connection URLs](/orm/reference/connection-urls) page. + +## 4. Introspect your database + +For the purpose of this guide, we'll use the following Prisma 1 data model (select the **SQL** tab below to see what the data model maps to in SQL): + + + + +```graphql +type User { + id: ID! @id + email: String @unique + name: String! + role: Role! @default(value: CUSTOMER) + jsonData: Json + profile: Profile + posts: [Post!]! +} + +type Post { + id: ID! @id + createdAt: DateTime! @createdAt + updatedAt: DateTime! @updatedAt + title: String! + content: String + published: Boolean! @default(value: false) + author: User @relation(link: TABLE) + categories: [Category!]! +} + +type Profile { + id: ID! @id + bio: String + user: User! @relation(link: INLINE) +} + +type Category { + id: ID! @id + name: String! + posts: [Post!]! +} + +enum Role { + ADMIN + CUSTOMER +} +``` + + + + +```sql +CREATE TABLE"User" ( + id character varying(25) PRIMARY KEY, + email text, + name text NOT NULL, + role text NOT NULL, + "jsonData" text +); +CREATE UNIQUE INDEX "User_pkey" ON"User"(id text_ops); +CREATE UNIQUE INDEX "default$default.User.email._UNIQUE" ON"User"(email text_ops); + +CREATE TABLE"Post" ( + id character varying(25) PRIMARY KEY, + title text NOT NULL, + published boolean NOT NULL, + "createdAt" timestamp(3) without time zone NOT NULL, + "updatedAt" timestamp(3) without time zone NOT NULL, + content text +); +CREATE UNIQUE INDEX "Post_pkey" ON"Post"(id text_ops); + +CREATE TABLE"Profile" ( + id character varying(25) PRIMARY KEY, + bio text, + user character varying(25) REFERENCES"User"(id) ON DELETE SET NULL +); +CREATE UNIQUE INDEX "Profile_pkey" ON"Profile"(id text_ops); + +CREATE TABLE"Category" ( + id character varying(25) PRIMARY KEY, + name text NOT NULL +); +CREATE UNIQUE INDEX "Category_pkey" ON"Category"(id text_ops); + +CREATE TABLE"_PostToUser" ( + "A" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE, + "B" character varying(25) NOT NULL REFERENCES"User"(id) ON DELETE CASCADE +); +CREATE UNIQUE INDEX "_PostToUser_AB_unique" ON"_PostToUser"("A" text_ops,"B" text_ops); +CREATE INDEX "_PostToUser_B" ON"_PostToUser"("B" text_ops); + +CREATE TABLE"_CategoryToPost" ( + "A" character varying(25) NOT NULL REFERENCES"Category"(id) ON DELETE CASCADE, + "B" character varying(25) NOT NULL REFERENCES"Post"(id) ON DELETE CASCADE +); +CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON"_CategoryToPost"("A" text_ops,"B" text_ops); +CREATE INDEX "_CategoryToPost_B" ON"_CategoryToPost"("B" text_ops); +``` + + + + +Note that this data model has three [relations](/orm/prisma-schema/data-model/relations): + +- 1-1: `User` ↔ `Profile` +- 1-n: `User` ↔ `Post` (maintained via the `_PostToUser` relation table) +- m-n: `Post` ↔ `Category` (maintained via the `_CategoryToPost` relation table) + +Now you can run Prisma ORM's introspection against your database with the following command: + +```terminal copy +npx prisma db pull +``` + +Here's a graphical illustration for what happens when `db pull` is invoked: + +![Introspect your database](/img/orm/prisma-db-pull-generate-schema.png) + +For the above Prisma 1 datamodel, this results in the following Prisma ORM 2 schema (note that the models have been reordered to match the initial order of the Prisma 1 datamodel): + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id @default(cuid()) + email String? @unique + name String + role String + jsonData String? + Profile Profile[] + Post Post[] +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime + updatedAt DateTime + title String + content String? + published Boolean + Category Category[] + User User[] +} + +model Profile { + id String @id @default(cuid()) + bio String? + user String? @unique + User User? @relation(fields: [user], references: [id]) +} + +model Category { + id String @id @default(cuid()) + name String + Post Post[] +} +``` + +While this is already a valid Prisma ORM 2 schema, it lacks a number of _features_ that were part of its Prisma 1 equivalent: + +- no auto-generated date values for the `createdAt` and `updatedAt` fields on `Post` +- no default value for the `role` field on `User` +- no default value for the `published` field on `Post` + +There further are a number of inconsistencies which result in a less idiomatic/ergonomic Prisma Client API: + +- `User` ↔ `Profile` is a 1-n instead of 1-1 relation +- `User` ↔ `Post` is a m-n instead of 1-n relation +- relation fields are uppercased (e.g. `Profile` and `Post` on `User`) +- the `jsonData` field on `User` is of type `String` instead of `Json` +- the `role` field on `User` is of type `String` instead of `Role`, the `enum` definition for role is missing altogether + +While these inconsistencies don't actually impact the "feature set" you'll have available in your Prisma Client API, they make you lose certain constraints/guarantees that were present before. + +For example, Prisma ORM now won't guarantee that a `User` is connected to _at most_ one `Profile` because the relation between the tables was recognized as 1-n during introspection, so one `User` record _could_ now get connected to multiple `Profile` records. + +Another issue is that you can store whatever text for the `jsonData` and `role` fields, regardless of whether it's valid JSON or represents a value of the `Role` enum. + +To learn more about these inconsistencies check out the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) page. + +In the following, we'll go through these incompatibilities and fix them one by one using the Prisma schema upgrade CLI. + +## 5. Use the Prisma schema upgrade CLI to resolve schema incompatibilities + +The [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) is an interactive tool that helps you upgrading your Prisma schema and ironing out most of the inconsistencies listed above. + +The Prisma 1 Upgrade CLI works in two major phases: + +1. Fix the database schema via plain SQL +1. Add missing attributes to the Prisma ORM 2 schema and other schema fixes + +During the first phase, it will generate and print a number of SQL statements that you should run against your database to adjust the database schema. You can either run all of the statements or a subset of them before continuing to the second phase. + +During the second phase, you don't need to do anything manually. The Upgrade CLI will make changes to your Prisma schema by adding certain Prisma ORM-level attributes (like `@default(cuid))` or `@updatedAt`), adjusting the names of relation fields to match the ones from your Prisma 1 datamodel and ensure 1-1-relations that were required on both sides in your Prisma 1 datamodel are also required in the Prisma ORM 2 schema. + +Note that **you can start over at any time during the process** and go back from the second to the first phase. + +In this illustration, the green area shows the first phase, the blue area shows the second phase. Note that you can optionally run `prisma db pull` in between the phases to update your Prisma ORM data model: + +![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) + +To use the Upgrade CLI, you can either install it locally in your project, or invoke it once without installation using `npx` as done here: + +```terminal copy +npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma +``` + +The CLI will greet you with the following message: + +```no-lines wrap +◮ Welcome to the interactive Prisma Upgrade CLI that helps with the +upgrade process from Prisma 1 to Prisma ORM 2. + +Please read the docs to learn more about the upgrade process: +https://pris.ly/d/how-to-upgrade + +➤ Goal +The Upgrade CLI helps you resolve the schema incompatibilities +between Prisma 1 and Prisma ORM 2. Learn more in the docs: +https://pris.ly/d/schema-incompatibilities + +➤ How it works +Throughout the process, you'll need to adjust your database schema by sending +SQL statements to it. The SQL statements are provided by the Upgrade CLI. + +Note that the Upgrade CLI never makes changes to your database, +you are in full control over any operations that are executed against it. + +You can stop and re-run the Upgrade CLI at any time. + +These are the different steps of the upgrade process: + + 1. The Upgrade CLI generates SQL commands for you to run on your database. + 2. You run the SQL commands against your database. + 3. You run the `npx prisma db pull` command again. + 4. You run the `npx prisma-upgrade` command again. + 5. The Upgrade CLI adjusts the Prisma ORM 2 schema by adding missing attributes. + +➤ Note +It is recommended that you make a full backup of your existing data before starting +the upgrade process. If possible, the migration should be performed in a staging +environment before executed against a production environment. + +➤ Help +If you have any questions or run into any problems along the way, +please create an issue at: +https://github.com/prisma/upgrade/issues/new + +Are you ready? [Y/n] +``` + +Press the Y button, then confirm by hitting RETURN on your keyboard to continue. + +Once you confirmed, the CLI outputs the SQL statements you should be running against your database: + +```no-lines wrap +➤ Adjust your database schema +Run the following SQL statements against your database: + + Fix columns with ENUM data types + https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database + + ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; + + + Add missing `DEFAULT` constraints to the database + https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database + + ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; + ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; + + + Fix columns with JSON data types + https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database + + ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; + + + Replicate `@createdAt` behavior in Prisma ORM 2.0 + https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database + + ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; + + + Fix 1-1 relations by adding `UNIQUE` constraints + https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint + + ALTER TABLE `Profile` ADD UNIQUE (`user`); + + + Migrate IDs from varchar(25) to varchar(30) + https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length + + SET FOREIGN_KEY_CHECKS=0; + ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; + ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; + ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; + ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; + ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; + SET FOREIGN_KEY_CHECKS=1; + +➤ Breaking changes detected + +In order to fully optimize your database schema, you'll need to run a few SQL +statements that can break your Prisma 1 setup. Note that these changes are optional +and if you are upgrading gradually and running Prisma 1 and Prisma ORM 2 side-by-side, +you should not perform these changes yet. Instead, you can perform them whenever +you are ready to completely remove Prisma 1 from your project. +If you are upgrading all at once, you can safely perform these changes now. + +Learn more in the docs: +https://pris.ly/d/how-to-upgrade' +``` + +> **Note**: If you're seeing the note about breaking changes, you can ignore it for now. We'll discuss it later. + +The shown SQL statements are categorized into a number of "buckets", all aiming to resolve a certain [schema incompatibility](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql): + +- Fix columns with ENUM data types +- Add missing `DEFAULT` constraints to the database +- Fix columns with JSON data types +- Replicate `@createdAt` behavior in Prisma 2 +- Fix 1-1 relations by adding `UNIQUE` constraints + +As a next step, you can start sending the SQL statements to your database. Note that all of these changes are non-breaking and you'll be able to continue using Prisma 1 side-by-side with Prisma ORM 2. + +The next sections cover the different kinds of SQL statements to be sent to your database individually. + +### 5.1. Fix the database schema via plain SQL (non-breaking) + +In this section, we'll walk through the printed SQL statements and run them against the database one by one. + +### 5.1.1. Fix columns with ENUM data types + +The first thing the tool does is help you ensure that `enum` definitions in your Prisma 1 datamodel will be represented as actual `ENUM` types in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). + +The CLI currently shows the following output: + +```no-lines wrap +Fix columns with ENUM data types +https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database + + ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; +``` + +Go ahead and run these statements against your database now. + +![Altering columns to use ENUM with SQL](./images/altering-columns-to-use-enum.png) + +### 5.1.2. Add missing `DEFAULT` constraints to the database + +Next, the Upgrade CLI helps you resolve the issue that [default values aren't represented in the database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#default-values-arent-represented-in-database) by generating SQL statements that add the respective `DEFAULT` constraints directly to the database. + +In this case, two `DEFAULT` constraints are missing which are suggested by the tool: + +```no-lines wrap +Add missing `DEFAULT` constraints to the database +https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database + + ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; + ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; +``` + +You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: + +![TablePlus GUI](./images/TablePlus-GUI.png) + +### 5.1.3. Fix columns with JSON data types + +Next, the tool helps you ensure that `Json` fields in your Prisma 1 datamodel will be represented as `JSON` columns in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). + +Changing the column type to `JSON` will ensure that the field is properly recognized as `Json` during Prisma ORM 2 introspection. + +The CLI currently shows the following output: + +```no-lines wrap +Fix columns with JSON data types +https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database + + ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; +``` + +You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: + +![TablePlus GUI](./images/fix-columns-with-json-data-types.png) + +### 5.1.4. Replicate `@createdAt` behavior in Prisma ORM 2 + +The next thing the tools does is help you resolve the issue that the behavior of [`@createdAt` isn't represented in database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#default-values-arent-represented-in-database) + +The CLI currently shows the following output: + +```no-lines wrap +Replicate `@createdAt` behavior in Prisma ORM 2.0 +https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database + + ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; +``` + +You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. + +### 5.1.5. Fix 1-1 relations by adding `UNIQUE` constraints + +Now, the tool will help you [turn the current 1-n relation between `User` ↔ `Profile` back into a 1-1 relation](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. + +The CLI currently shows the following output: + +```no-lines wrap +Fix 1-1 relations by adding `UNIQUE` constraints +https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint + + ALTER TABLE `Profile` ADD UNIQUE (`user`); +``` + +You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. + +### 5.1.6. Fix mismatch of CUID length + +> **Note**: These SQL statements will keep appearing in the Upgrade CLI even after you have changed the column types in the underlying database. This is a currently a limitation in the Upgrade CLI. + +Finally, the tool will help you [turn the current ID columns of type `VARCHAR(25)` into `VARCHAR(30)`](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#mismatching-cuid-length) by adding a `UNIQUE` constraint to the foreign key column called `user` (named after the relation field in the Prisma 1 datamodel) in the database. + +The CLI currently shows the following output: + +```no-lines wrap +Migrate IDs from varchar(25) to varchar(30) +https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length + +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; +ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; +SET FOREIGN_KEY_CHECKS=1; +``` + +You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. + +### 5.1.7. Breaking changes detected + +In case the Upgrade CLI has printed a note about breaking changes, your database schema needs some adjustments that will break Prisma 1 compatibility in order to be fully optimized. + +If there are no breaking changes detected, you can [skip forward to section 5.2](#52-re-introspect-your-database-to-update-your-prisma-schema) + +Depending on your [upgrade strategy](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), you can either perform these changes now or skip to the next phase of the Upgrade CLI: + +- If you are following the gradual side-by-side upgrade strategy, do not perform these changes yet since they will break your Prisma 1 setup. In that case, you can continue to the next phase of the Upgrade CLI by typing n and hitting RETURN. +- If you are following the all at once upgrade strategy, you can perform these changes now. In that case, continue by typing Y and hitting RETURN. + +### 5.2. Fix the database schema via plain SQL (breaking) + +In this section, you'll resolve the schema incompatibilities that are breaking your Prisma 1 setup. Do not perform these changes if you are still running Prisma 1 in your project! + +### 5.2.1. Fix incorrect m-n relations + +Now, the Upgrade CLI helps you fix all 1-1 and 1-n relations that Prisma 1 represents with relation tables and that [currently only exist as m-n relations](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#all-non-inline-relations-are-recognized-as-m-n) in your new Prisma ORM 2 schema. Concretely, this is the case for the `User` ↔ `Post` relation which currently is defined as m-n but _should_ really be a 1-n relation. + +To fix this, you'll need to perform the following migration: + +1. Create a new foreign key column on `Post` to link directly to the `User` table. +1. Migrate the foreign key values from the relation table into the new foreign key column on `Post`. +1. Delete the relation table. + +These instructions are now printed by the CLI: + +```no-lines wrap +➤ Adjust your database schema +Run the following SQL statements against your database: + + Fix one-to-many table relations + https://pris.ly/d/schema-incompatibilities#all-non-inline-relations-are-recognized-as-m-n + + ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; + ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); + UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; + DROP TABLE `_PostToUser`; + + +➤ Next Steps + +After you executed one or more of the above SQL statements against your database, +please run the following two commands to refresh your Prisma ORM 2 Schema and check +the changes. + + 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. + 2. Run `npx prisma-upgrade` again. + +If you can't or don't want to execute the remaining SQL statements right now, you can +skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 +schema that are not picked up by introspection. + +Skip to the last step? [Y/n]? +``` + +For this fix, you'll need to run three SQL statements: + +1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: + ```sql no-lines + ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; + ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); + ``` +1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: + 1. Finds the respective `Post` record by looking up the value from column `A` + 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record + ```sql no-lines + UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; + ``` +1. Delete the `_PostToUser` relation table + ```sql no-lines + DROP TABLE `_PostToUser`; + ``` + +![Fixing incorrect m-n relations with SQL](./images/fix-incorrect-m-n-relations-sql.png) + +After these commands, the user ID values of the records from column `B` of the relation table are migrated to the new `authorId` column. + +### 5.2. Re-introspect your database to update your Prisma schema + +At this point, you've resolved the schema incompatibilities with the Upgrade CLI. You can now exit the Upgrade CLI for now by typing n and hitting RETURN. + +In this section, you'll update your Prisma schema with another introspection round. This time, the previous flaws of the Prisma schema will be resolved because the database schema has been adjusted: + +```terminal copy +npx prisma db pull +``` + +This time, the resulting Prisma schema looks as follows: + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id + name String + email String? @unique + jsonData Json? + role Role @default(CUSTOMER) + Post Post[] + Profile Profile? +} + +model Post { + id String @id + createdAt DateTime @default(now()) + updatedAt DateTime + title String + content String? + published Boolean @default(false) + authorId String? + User User? @relation(fields: [authorId], references: [id]) + Category Category[] @relation(references: [id]) +} + +model Category { + id String @id + name String + Post Post[] @relation(references: [id]) +} + +model Profile { + bio String? + id String @id + user String? @unique + User User? @relation(fields: [user], references: [id]) +} + +enum Role { + ADMIN + CUSTOMER +} +``` + +This schema has most issues resolved, but it still lacks the following: + +### 5.2. Add missing attributes to the Prisma 2 schema and other schema fixes + +The CLI now prints the following: + +```no-lines wrap +➤ What happens next +As a last step, some final adjustments will be made to your Prisma ORM 2 schema +to carry over some Prisma ORM-level attributes that aren't picked up by introspection. + +As a last step, some final adjustments will be made to your Prisma ORM 2.0 +schema to carry over some Prisma ORM-level attributes that aren't picked +up by introspection. + +Warning +Your current Prisma ORM 2.0 schema will be overwritten, so please +make sure you have a backup! + +Are you ready? [Y/n] +``` + +At this point, you either ran all the SQL statement that were printed by the CLI or you skipped some of them. Either way, you can now move on the last step and let the Upgrade CLI add the missing Prisma ORM 2 attributes. Typically these are the following: + +- `@default(cuid())` for your `@id` fields +- `@updatedAt` for any fields that were using this attribute in Prisma 1 +- `@map` and `@@map` as replacements for `@db` and `@@db` from Prisma 1 + +In that step, the Upgrade CLI also fixes other issues that occurred in the transition to Prisma ORM 2: + +- it makes sure that 1-1-relations that were required on both sides in Prisma 1 are also required in your Prisma ORM 2 schema +- it renames relation fields to the same names they had in your Prisma 1 datamodel ([coming soon](https://github.com/prisma/upgrade/issues/25)) + +To apply these changes, you can re-run the Upgrade CLI: + +```terminal copy +npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma +``` + +If you did not resolve all schema incompatibilities, the Upgrade CLI now prints the remaining SQL statements (as well as the ones for migrating IDs). You can just ignore them at this point and continue to the last step by continuously typing Y and hitting RETURN when prompted. + +If you did resolve all schema incompatibilities, no SQL statements will be printed and the Upgrade CLI only outputs the following: + +```no-lines wrap +$ npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma + +➤ Next Steps + +After you executed one or more of the previous SQL statements against your database, +please run the following two commands to refresh your Prisma ORM 2 schema and check +the changes. + + 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. + 2. Run `npx prisma-upgrade` again. + +If you can't or don't want to execute the remaining SQL statements right now, you can +skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 +schema that are not picked up by introspection. + +Skip to the last step? [Y/n]? +``` + +One more time, type Y and hit RETURN to confirm. + +The final prompt of the Upgrade CLI now asks you to confirm the above mentioned changes it will make to your Prisma schema: + +```no-lines wrap +➤ What happens next +As a last step, some final adjustments will be made to your Prisma ORM 2 schema +to carry over some Prisma ORM-level attributes that aren't picked up by introspection. + +As a last step, some final adjustments will be made to your Prisma ORM 2.0 +schema to carry over some Prisma ORM-level attributes that aren't picked +up by introspection. + +Warning +Your current Prisma ORM 2.0 schema will be overwritten, so please +make sure you have a backup! + +Are you ready? [Y/n] +``` + +One last time, type Y and hit RETURN to confirm. + +This is the final output of the Upgrade CLI: + +```no-lines +Updating prisma/schema.prisma... +Done updating prisma/schema.prisma! + +✔ Congratulations, you're all set! + +➤ Note +If you didn't execute all generated SQL commands against your database, +you can re-run the Upgrade CLI at any time. + +Note that the Upgrade CLI doesn't resolve all of the schema incompatibilities +between Prisma 1 and Prisma ORM 2. If you want to resolve the remaining ones, +you can do so manually by following this guide: +https://pris.ly/d/upgrading-the-prisma-layer + +➤ Next steps +Otherwise you can continue your upgrade process by installing Prisma Client 2: +npm install @prisma/client + +You can find guides for different upgrade scenarios in the docs: +https://pris.ly/d/upgrade-from-prisma-1 +``` + +### 5.3. Final result + +The final version of the Prisma schema should look as follows: + +```prisma file=schema.prisma showLineNumbers +model User { + id String @id @default(cuid()) + name String + email String? @unique + jsonData Json? + role Role @default(CUSTOMER) + Post Post[] + Profile Profile? +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String + content String? + published Boolean @default(false) + authorId String? + User User? @relation(fields: [authorId], references: [id]) + Category Category[] @relation(references: [id]) +} + +model Profile { + id String @id @default(cuid()) + bio String? + user String? @unique + User User? @relation(fields: [user], references: [id]) +} + +model Category { + id String @id @default(cuid()) + name String + Post Post[] @relation(references: [id]) +} + +enum Role { + ADMIN + CUSTOMER +} +``` + +### 5.4. Rename relation fields + +One thing you'll notice with this version of the Prisma ORM 2 schema is that all [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are named after their respective models, e.g: + +```prisma file=schema.prisma showLineNumbers +model User { + Post Post[] + Profile Profile? +} + +model Post { + User User? @relation(fields: [authorId], references: [id]) + Category Category[] @relation(references: [id]) +} + +model Profile { + User User? @relation(fields: [user], references: [id]) +} + +model Category { + Post Post[] @relation(references: [id]) +} +``` + +This is not ideal and you can in fact manually rename all of them to their previous versions! + +Because all relation fields are _virtual_, meaning they don't _manifest_ in the database, you can name them whatever you like. In this case, all relation fields are lowercased and sometimes pluralized. + +Here's what they look like after the rename: + +```prisma file=schema.prisma showLineNumbers +model User { + posts Post[] + profile Profile? +} + +model Post { + author User? @relation(fields: [authorId], references: [id]) + categories Category[] @relation(references: [id]) +} + +model Profile { + user String? @unique + owner User? @relation(fields: [user], references: [id]) +} + +model Category { + posts Post[] @relation(references: [id]) +} +``` + +> **Note**: For the 1-1-relation between `User` and `Profile` it was not possible to set the old name `user` for the relation field. This is because there'd be a naming conflict with the already existing [relation scalar](/orm/prisma-schema/data-model/relations#annotated-relation-fields) field that holds the foreign key. In that case, you can choose a different name or alternatively rename the foreign key column directly in the database via SQL. + +### 5.5. Resolving remaining schema incompatibilities + +There are a few schema incompatibilities that were not yet resolved by the Upgrade CLI. At this point you still haven't fixed [scalar lists](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql#scalar-lists-arrays-are-maintained-with-extra-table). You can find the recommended workarounds for this and others on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql) page. + +## 6. Install and generate Prisma Client + +Now that you have your Prisma ORM 2 schema ready, you can install Prisma Client with the following command: + +```terminal copy +npm install @prisma/client +``` + +## 7. Next steps + +Congratulations, you have now upgraded your Prisma ORM layer to Prisma ORM 2! From here on, you can move on to update your application code using one of the following guides: + +- [Old to new Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus): Choose this guide if you're currently running Prisma 1 with GraphQL Nexus. +- [prisma-binding to Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to [Nexus](https://www.nexusjs.org/#/) (and TypeScript). +- [prisma-binding to SDL-first](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) GraphQL server. +- [REST API](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api): Choose this guide if you're currently running Prisma 1 using Prisma Client 1 and are building a REST API. + +## Bonus: Prisma Client API comparison + +This section contains a high-level and side-by-side comparison of the Prisma Client APIs of Prisma 1 and Prisma ORM 2. For more details about the new Prisma Client API, you can explore the [Prisma Client](/orm/prisma-client) docs. + +### Reading single records + + + + + +```ts +const user = await prisma.user({ id: 1 }) +``` + + + + + +```ts +await prisma.user.findUnique({ + where: { id: 1 }, +}) +``` + + + + + +### Reading lists of records + + + + + +```ts +const user = await prisma.users() +``` + + + + + +```ts +await prisma.user.findMany() +``` + + + + + +### Filtering lists + + + + + +```ts +const users = await prisma.users({ + where: { + name: 'Alice', + }, +}) +``` + + + + + +```ts +await prisma.user.findMany({ + where: { + name: 'Alice', + }, +}) +``` + + + + + +### Paginating lists + + + + + +```ts +const posts = await prisma.posts({ + skip: 5, + first: 10, +}) +``` + + + + + +```ts +await prisma.user.findMany({ + skip: 5, + take: 10, +}) +``` + + + + + +> **Note**: You can learn more about the new pagination API in the respective [release notes](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7) or the [Pagination](/orm/prisma-client/queries/pagination) page in the docs. + +### Sorting lists + + + + + +```ts +await prisma.posts({ + orderBy: 'title_ASC', +}) +``` + + + + + +```ts +await prisma.posts({ + orderBy: { + title: 'asc', + }, +}) +``` + + + + + +### Creating records + + + + + +```ts +await prisma.createUser({ + name: 'Alice', +}) +``` + + + + + +```ts +await prisma.user.create({ + data: { + name: 'Alice', + }, +}) +``` + + + + + +### Updating records + + + + + +```ts +await prisma.updateUser({ + where: { id: 1 }, + data: { + name: 'James', + email: 'james@prisma.io', + }, +}) +``` + + + + + +```ts +await prisma.user.update({ + where: { id: 1 }, + data: { + name: 'James', + email: 'james@prisma.io', + }, +}) +``` + + + + + +### Deleting records + + + + + +```ts +await prisma.deleteUser({ id: 1 }) +``` + + + + + +```ts +await prisma.user.delete({ + where: { id: 1 }, +}) +``` + + + + + +### Selecting fields & loading relations + +In Prisma 1, the only ways to select specific fields and/or load relations of an object was by using the string-based `$fragment` and `$graphql` functions. With Prisma ORM 2, this is now done in a clean and type-safe manner using [`select`](/orm/prisma-client/queries/select-fields#select-specific-fields) and [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields). + +Another benefit of this approach is that you can use `select` and `include` on _any_ Prisma Client query, e.g. `findUnique`, `findMany`, `create`, `update`, `delete`, ... + + + + + +```ts +await prisma.user({ id: 1 }).$fragment(` + fragment NameAndEmail on User { id email }` +`) +``` + + + + + +```ts +await prisma.user.findUnique({ + where: { id: 1 }, + select: { + id: true, + email: true, + }, +}) +``` + + + + + +As an example, creating a new record and only retrieving the `id` in the returned object was not possible in Prisma 1. With Prisma ORM 2 you can achieve this as follows: + +```ts +await prisma.user.create({ + data: { + name: 'Alice', + }, + select: { + id: true, + }, +}) +``` diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx similarity index 68% rename from content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer.mdx rename to content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx index b3c8629f39..f9fb0db0d5 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/03-upgrading-the-prisma-layer-postgresql.mdx @@ -1,51 +1,39 @@ --- -title: 'Upgrading the Prisma layer' -# metaTitle: 'Upgrading the Prisma layer to Prisma 2' -# metaDescription: 'Learn how to upgrade the Prisma layer to Prisma 2 and create your Prisma schema.' +title: 'Upgrading the Prisma ORM layer' +metaTitle: 'Upgrading the Prisma ORM layer to Prisma ORM 2 | PostgreSQL' +description: 'Learn how to upgrade the Prisma ORM layer to Prisma ORM 2 and create your Prisma schema with PostgreSQL' dbSwitcher: ['postgresql', 'mysql'] -techMetaTitles: - [ - { name: 'mysql', value: 'Upgrading the Prisma layer to Prisma 2 | MySQL' }, - { - name: 'postgresql', - value: 'Upgrading the Prisma layer to Prisma 2 | PostgreSQL', - }, - ] -techMetaDescriptions: - [ - { - name: 'mysql', - value: 'Learn how to upgrade the Prisma layer to Prisma 2 and create your Prisma schema with MySQL', - }, - { - name: 'postgresql', - value: 'Learn how to upgrade the Prisma layer to Prisma 2 and create your Prisma schema with PostgreSQL', - }, - ] +pagination_next: orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus --- + + ## Overview -This page explains the first step of your upgrade process: Taking your Prisma 1 configuration and upgrading it to Prisma 2. Concretely, you will learn how to: +This page explains the first step of your upgrade process: Taking your Prisma 1 configuration and upgrading it to Prisma ORM 2. Concretely, you will learn how to: -1. Add the Prisma 2 CLI as a development dependency -1. Create your Prisma 2 schema +1. Add the Prisma ORM 2 CLI as a development dependency +1. Create your Prisma ORM 2 schema 1. Determine your connection URL and connect to your database 1. Introspect your database (that was so far managed with Prisma 1) -1. Use the [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) to resolve the [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) in the new Prisma 2 data model +1. Use the [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#prisma-1-upgrade-cli) to resolve the [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) in the new Prisma ORM 2 data model 1. Install and generate Prisma Client Once done with these steps, you can move on to the next guide that explains how you can upgrade the application layer to use Prisma Client for your database queries. > **Note**: During the upgrade process it can be helpful to get a graphical view on your database. It is therefore recommended to use a graphical database client to connect to your database, such as [TablePlus](https://tableplus.com/) or [Postico](https://eggerapps.at/postico/). -## 1. Install Prisma 2 CLI +## 1. Install Prisma ORM 2 CLI -The Prisma 2 CLI is available as the [`prisma`](https://www.npmjs.com/package/prisma) package on npm and is invoked via the `prisma` command. +The Prisma ORM 2 CLI is available as the [`prisma`](https://www.npmjs.com/package/prisma) package on npm and is invoked via the `prisma` command. Note that the former `prisma` command for Prisma 1 has been renamed to `prisma1`. You can learn more about this [here](https://www.prisma.io/blog/prisma-2-beta-b7bcl0gd8d8e#renaming-the-prisma2-cli). -You can install the Prisma 2 CLI in your Node.js project as follows (be sure to invoke this command in the directory where your `package.json` is located): +You can install the Prisma ORM 2 CLI in your Node.js project as follows (be sure to invoke this command in the directory where your `package.json` is located): ```terminal copy npm install prisma --save-dev @@ -70,7 +58,10 @@ npm uninstall prisma1 ```
-
Expand if you want to keep using your Prisma 1 CLI side-by-side + +
+ +Expand if you want to keep using your Prisma 1 CLI side-by-side If you want to keep using the Prisma 1 CLI, it is recommend to remove your global installation of it and add the `prisma1` CLI as a development dependency: @@ -102,7 +93,7 @@ npx prisma
-## 2. Create your Prisma 2 schema +## 2. Create your Prisma ORM 2 schema For this guide, you'll first create a new Prisma schema using the `prisma init` command and then "fill" it with a data model using [introspection](/orm/prisma-schema/introspection). @@ -154,7 +145,7 @@ The command created a new folder called `prisma`, and two files: Your initial Prisma schema looks as follows: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema @@ -168,17 +159,17 @@ generator client { } ``` -With Prisma 1, you specify which language variant of Prisma Client you wanted to use in your `prisma.yml`. With Prisma 2, this information is now specified inside the Prisma schema via a `generator` block. +With Prisma 1, you specify which language variant of Prisma Client you wanted to use in your `prisma.yml`. With Prisma ORM 2, this information is now specified inside the Prisma schema via a `generator` block. > **Note**: Unlike Prisma 1, the TypeScript and JavaScript variants of Prisma Client 2.0 use the _same_ generator called `prisma-client-js`. The generated types in `index.d.ts` are _always_ included, even in plain JavaScript projects. This enables feature like autocompletion in VS Code even when not using TypeScript. ## 3. Determine your connection URL and connect to your database -With Prisma 1, the database connection is configured in the Docker Compose file that's used to launch the Prisma server. The Prisma server then exposes a GraphQL endpoint (via HTTP) that proxies all database requests from the Prisma Client application code. That HTTP endpoint is specified in your `prisma.yml`. +With Prisma 1, the database connection is configured in the Docker Compose file that's used to launch the Prisma ORM server. The Prisma ORM server then exposes a GraphQL endpoint (via HTTP) that proxies all database requests from the Prisma Client application code. That HTTP endpoint is specified in your `prisma.yml`. -With Prisma 2, the HTTP layer isn't exposed any more and Prisma Client 2.0 is configured to run requests "directly" against the database (that is, requests are proxied by Prisma's [query engine](/orm/more/under-the-hood/engines), but there isn't an extra server any more). +With Prisma ORM 2, the HTTP layer isn't exposed any more and Prisma Client 2.0 is configured to run requests "directly" against the database (that is, requests are proxied by Prisma ORM's [query engine](/orm/more/under-the-hood/engines), but there isn't an extra server any more). -So, as a next step you'll need to tell Prisma 2 _what_ kind of database you use (MySQL or PostgreSQL) and _where_ it is located. +So, as a next step you'll need to tell Prisma ORM 2 _what_ kind of database you use (MySQL or PostgreSQL) and _where_ it is located. First, you need to ensure that that `provider` field on the `datasource` block inside `schema.prisma` is configured to use the right database: @@ -187,7 +178,8 @@ First, you need to ensure that that `provider` field on the `datasource` block i Switch around with the tabs in the code block to see examples of both: - + + ```prisma datasource db { @@ -196,6 +188,9 @@ datasource db { } ``` + + + ```prisma datasource db { provider = "mysql" @@ -203,15 +198,14 @@ datasource db { } ``` - + + With the `provider` field set, you can go ahead and configure the connection URL inside the `.env` file. -Assume the database configuration in your Docker Compose file that you used to deploy your Prisma server looks as follows: +Assume the database configuration in your Docker Compose file that you used to deploy your Prisma ORM server looks as follows: - - -```yml file=docker-compose.yml +```yml file=docker-compose.yml showLineNumbers PRISMA_CONFIG: | port: 4466 databases: @@ -249,57 +243,14 @@ In that case, the `schema` must be specified as follows: DATABASE_URL="postgresql://janedoe:randompassword@localhost:5432/prisma?schema=default$default" ``` - - - - -```yml file=docker-compose.yml -PRISMA_CONFIG: | - port: 4466 - databases: - default: - connector: mysql - host: mysql - port: 3306 - user: root - password: randompassword -``` - -Also assume your `endpoint` in `prisma.yml` is configured as follows: - -```yml file=prisma.yml -endpoint: http://localhost:4466/myproject/dev -``` - -Based on these connection details, you need to configure the `DATABASE_URL` environment variable inside your `.env` file as follows: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/myproject@dev" -``` - -Note that the _database name_ in the connection URL is typically composed of your _service name_ and _service stage_ (which are part of the `endpoint` in `prisma.yml`), separated by the `@` character. - -Sometimes no service name and stage are specified in `prisma.yml`: - -```yml file=prisma.yml -endpoint: http://localhost:4466/ -``` - -In that case, the database name must be specified as follows: - -```bash file=.env -DATABASE_URL="mysql://root:randompassword@localhost:3306/default@default" -``` - - - Learn more on the [Connection URLs](/orm/reference/connection-urls) page. ## 4. Introspect your database For the purpose of this guide, we'll use the following Prisma 1 data model (select the **SQL** tab below to see what the data model maps to in SQL): - + + ```graphql type User { @@ -341,6 +292,9 @@ enum Role { } ``` + + + ```sql CREATE TABLE"User" ( id character varying(25) PRIMARY KEY, @@ -390,7 +344,8 @@ CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON"_CategoryToPost"("A" text_ops CREATE INDEX "_CategoryToPost_B" ON"_CategoryToPost"("B" text_ops); ``` - + + Note that this data model has three [relations](/orm/prisma-schema/data-model/relations): @@ -398,7 +353,7 @@ Note that this data model has three [relations](/orm/prisma-schema/data-model/re - 1-n: `User` ↔ `Post` (maintained via the `_PostToUser` relation table) - m-n: `Post` ↔ `Category` (maintained via the `_CategoryToPost` relation table) -Now you can run Prisma's introspection against your database with the following command: +Now you can run Prisma ORM's introspection against your database with the following command: ```terminal copy npx prisma db pull @@ -406,11 +361,11 @@ npx prisma db pull Here's a graphical illustration for what happens when `db pull` is invoked: -![Introspect your database with Prisma](../../../../doc-images/prisma-db-pull-generate-schema.png) +![Introspect your database](/img/orm/prisma-db-pull-generate-schema.png) -For the above Prisma 1 datamodel, this results in the following Prisma 2 schema (note that the models have been reordered to match the initial order of the Prisma 1 datamodel): +For the above Prisma 1 datamodel, this results in the following Prisma ORM 2 schema (note that the models have been reordered to match the initial order of the Prisma 1 datamodel): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id @default(cuid()) email String? @unique @@ -446,7 +401,7 @@ model Category { } ``` -While this is already a valid Prisma 2 schema, it lacks a number of _features_ that were part of its Prisma 1 equivalent: +While this is already a valid Prisma ORM 2 schema, it lacks a number of _features_ that were part of its Prisma 1 equivalent: - no auto-generated date values for the `createdAt` and `updatedAt` fields on `Post` - no default value for the `role` field on `User` @@ -462,7 +417,7 @@ There further are a number of inconsistencies which result in a less idiomatic/e While these inconsistencies don't actually impact the "feature set" you'll have available in your Prisma Client API, they make you lose certain constraints/guarantees that were present before. -For example, Prisma now won't guarantee that a `User` is connected to _at most_ one `Profile` because the relation between the tables was recognized as 1-n during introspection, so one `User` record _could_ now get connected to multiple `Profile` records. +For example, Prisma ORM now won't guarantee that a `User` is connected to _at most_ one `Profile` because the relation between the tables was recognized as 1-n during introspection, so one `User` record _could_ now get connected to multiple `Profile` records. Another issue is that you can store whatever text for the `jsonData` and `role` fields, regardless of whether it's valid JSON or represents a value of the `Role` enum. @@ -477,17 +432,17 @@ The [Prisma 1 Upgrade CLI](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to The Prisma 1 Upgrade CLI works in two major phases: 1. Fix the database schema via plain SQL -1. Add missing attributes to the Prisma 2 schema and other schema fixes +1. Add missing attributes to the Prisma ORM 2 schema and other schema fixes During the first phase, it will generate and print a number of SQL statements that you should run against your database to adjust the database schema. You can either run all of the statements or a subset of them before continuing to the second phase. -During the second phase, you don't need to do anything manually. The Upgrade CLI will make changes to your Prisma schema by adding certain Prisma-level attributes (like `@default(cuid))` or `@updatedAt`), adjusting the names of relation fields to match the ones from your Prisma 1 datamodel and ensure 1-1-relations that were required on both sides in your Prisma 1 datamodel are also required in the Prisma 2 schema. +During the second phase, you don't need to do anything manually. The Upgrade CLI will make changes to your Prisma schema by adding certain Prisma ORM-level attributes (like `@default(cuid))` or `@updatedAt`), adjusting the names of relation fields to match the ones from your Prisma 1 datamodel and ensure 1-1-relations that were required on both sides in your Prisma 1 datamodel are also required in the Prisma ORM 2 schema. Note that **you can start over at any time during the process** and go back from the second to the first phase. -In this illustration, the green area shows the first phase, the blue area shows the second phase. Note that you can optionally run `prisma db pull` in between the phases to update your Prisma data model: +In this illustration, the green area shows the first phase, the blue area shows the second phase. Note that you can optionally run `prisma db pull` in between the phases to update your Prisma ORM data model: -![Fixing the schema incompatibilities](images/fix-schema-incompatibilities.png) +![Fixing the schema incompatibilities](./images/fix-schema-incompatibilities.png) To use the Upgrade CLI, you can either install it locally in your project, or invoke it once without installation using `npx` as done here: @@ -499,14 +454,14 @@ The CLI will greet you with the following message: ```no-lines wrap ◮ Welcome to the interactive Prisma Upgrade CLI that helps with the -upgrade process from Prisma 1 to Prisma 2. +upgrade process from Prisma 1 to Prisma ORM 2. Please read the docs to learn more about the upgrade process: https://pris.ly/d/how-to-upgrade ➤ Goal The Upgrade CLI helps you resolve the schema incompatibilities -between Prisma 1 and Prisma 2. Learn more in the docs: +between Prisma 1 and Prisma ORM 2. Learn more in the docs: https://pris.ly/d/schema-incompatibilities ➤ How it works @@ -524,7 +479,7 @@ These are the different steps of the upgrade process: 2. You run the SQL commands against your database. 3. You run the `npx prisma db pull` command again. 4. You run the `npx prisma-upgrade` command again. - 5. The Upgrade CLI adjusts the Prisma 2 schema by adding missing attributes. + 5. The Upgrade CLI adjusts the Prisma ORM 2 schema by adding missing attributes. ➤ Note It is recommended that you make a full backup of your existing data before starting @@ -543,8 +498,6 @@ Press the Y button, then confirm by hitting RETURN on your Once you confirmed, the CLI outputs the SQL statements you should be running against your database: - - ```no-lines wrap ➤ Adjust your database schema Run the following SQL statements against your database: @@ -569,7 +522,7 @@ Run the following SQL statements against your database: ALTER TABLE "default$default"."User" ALTER COLUMN "jsonData" SET DATA TYPE JSONB USING "jsonData"::TEXT::JSONB; - Replicate `@createdAt` behavior in Prisma 2 + Replicate `@createdAt` behavior in Prisma ORM 2 https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database ALTER TABLE "default$default"."Post" ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; @@ -594,7 +547,7 @@ Run the following SQL statements against your database: In order to fully optimize your database schema, you'll need to run a few SQL statements that can break your Prisma 1 setup. Note that these changes are optional -and if you are upgrading gradually and running Prisma 1 and Prisma 2 side-by-side, +and if you are upgrading gradually and running Prisma 1 and Prisma ORM 2 side-by-side, you should not perform these changes yet. Instead, you can perform them whenever you are ready to completely remove Prisma 1 from your project. If you are upgrading all at once, you can safely perform these changes now. @@ -603,71 +556,6 @@ Learn more in the docs: https://pris.ly/d/how-to-upgrade' ``` - - - - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix columns with ENUM data types - https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; - - - Add missing `DEFAULT` constraints to the database - https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; - ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; - - - Fix columns with JSON data types - https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; - - - Replicate `@createdAt` behavior in Prisma 2.0 - https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; - - - Fix 1-1 relations by adding `UNIQUE` constraints - https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE `Profile` ADD UNIQUE (`user`); - - - Migrate IDs from varchar(25) to varchar(30) - https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - - SET FOREIGN_KEY_CHECKS=0; - ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; - ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; - SET FOREIGN_KEY_CHECKS=1; - -➤ Breaking changes detected - -In order to fully optimize your database schema, you'll need to run a few SQL -statements that can break your Prisma 1 setup. Note that these changes are optional -and if you are upgrading gradually and running Prisma 1 and Prisma 2 side-by-side, -you should not perform these changes yet. Instead, you can perform them whenever -you are ready to completely remove Prisma 1 from your project. -If you are upgrading all at once, you can safely perform these changes now. - -Learn more in the docs: -https://pris.ly/d/how-to-upgrade' -``` - - - > **Note**: If you're seeing the note about breaking changes, you can ignore it for now. We'll discuss it later. The shown SQL statements are categorized into a number of "buckets", all aiming to resolve a certain [schema incompatibility](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql): @@ -678,7 +566,7 @@ The shown SQL statements are categorized into a number of "buckets", all aiming - Replicate `@createdAt` behavior in Prisma 2 - Fix 1-1 relations by adding `UNIQUE` constraints -As a next step, you can start sending the SQL statements to your database. Note that all of these changes are non-breaking and you'll be able to continue using Prisma 1 side-by-side with Prisma 2. +As a next step, you can start sending the SQL statements to your database. Note that all of these changes are non-breaking and you'll be able to continue using Prisma 1 side-by-side with Prisma ORM 2. The next sections cover the different kinds of SQL statements to be sent to your database individually. @@ -692,8 +580,6 @@ The first thing the tool does is help you ensure that `enum` definitions in your The CLI currently shows the following output: - - ```no-lines wrap Fix columns with ENUM data types https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database @@ -702,24 +588,11 @@ https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-data ALTER TABLE "default$default"."User" ALTER COLUMN "role" SET DATA TYPE "default$default"."Role" using "role"::"default$default"."Role"; ``` -> **⚠️ Warning**: If you are running Prisma 1 and Prisma 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/upgrade/issues/74). The docs will be updated to reflect this soon. - - - - - -```no-lines wrap -Fix columns with ENUM data types -https://pris.ly/d/schema-incompatibilities#enums-are-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL; -``` - - +> **⚠️ Warning**: If you are running Prisma 1 and Prisma ORM 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/upgrade/issues/74). The docs will be updated to reflect this soon. Go ahead and run these statements against your database now. -![Altering columns to use ENUM with SQL](images/altering-columns-to-use-enum.png) +![Altering columns to use ENUM with SQL](./images/altering-columns-to-use-enum.png) ### 5.1.2. Add missing `DEFAULT` constraints to the database @@ -727,8 +600,6 @@ Next, the Upgrade CLI helps you resolve the issue that [default values aren't re In this case, two `DEFAULT` constraints are missing which are suggested by the tool: - - ```no-lines wrap Add missing `DEFAULT` constraints to the database https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database @@ -739,36 +610,16 @@ https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-d You can now run these SQL statements against your database either using a command line client or a GUI like Postico: -![Adding missing `DEFAULT` constraints to columns](images/add-missing-default-constraints-to-columns.png) - - - - - -```no-lines wrap -Add missing `DEFAULT` constraints to the database -https://pris.ly/d/schema-incompatibilities#default-values-arent-represented-in-database - - ALTER TABLE `User` CHANGE `role` `role` ENUM('ADMIN', 'CUSTOMER') NOT NULL DEFAULT 'CUSTOMER'; - ALTER TABLE `Post` CHANGE `published` `published` TINYINT(1) NOT NULL DEFAULT 0; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: - -![TablePlus GUI](images/TablePlus-GUI.png) - - +![Adding missing `DEFAULT` constraints to columns](./images/add-missing-default-constraints-to-columns.png) ### 5.1.3. Fix columns with JSON data types Next, the tool helps you ensure that `Json` fields in your Prisma 1 datamodel will be represented as `JSON` columns in the underlying database, right now they are represented as plain strings (e.g. as `MEDIUMTEXT` in MySQL). -Changing the column type to `JSON` will ensure that the field is properly recognized as `Json` during Prisma 2 introspection. +Changing the column type to `JSON` will ensure that the field is properly recognized as `Json` during Prisma ORM 2 introspection. The CLI currently shows the following output: - - ```no-lines wrap Fix columns with JSON data types https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database @@ -776,39 +627,21 @@ https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-d ALTER TABLE "default$default"."User" ALTER COLUMN "jsonData" TYPE JSON USING "jsonData"::json; ``` -> **⚠️ Warning**: If you are running Prisma 1 and Prisma 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/upgrade/issues/73). The docs will be updated to reflect this soon. +> **⚠️ Warning**: If you are running Prisma 1 and Prisma ORM 2 [side-by-side](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#upgrade-strategies), these [SQL statements will break your Prisma 1 setup](https://github.com/prisma/upgrade/issues/73). The docs will be updated to reflect this soon. You can now run these SQL statements against your database either using a command line client or a GUI like Postico: -![Adding missing `DEFAULT` constraints to columns](images/fix-columns-with-json-data-types.png) - - +![Adding missing `DEFAULT` constraints to columns](./images/fix-columns-with-json-data-types.png) - -```no-lines wrap -Fix columns with JSON data types -https://pris.ly/d/schema-incompatibilities#json-type-is-represented-as-text-in-database - - ALTER TABLE `User` CHANGE `jsonData` `jsonData` JSON ; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus: - -![TablePlus GUI](images/fix-columns-with-json-data-types.png) - - - -### 5.1.4. Replicate `@createdAt` behavior in Prisma 2 +### 5.1.4. Replicate `@createdAt` behavior in Prisma ORM 2 The next thing the tools does is help you resolve the issue that the behavior of [`@createdAt` isn't represented in database](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#default-values-arent-represented-in-database) The CLI currently shows the following output: - - ```no-lines wrap -Replicate `@createdAt` behavior in Prisma 2.0 +Replicate `@createdAt` behavior in Prisma ORM 2.0 https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database ALTER TABLE "default$default"."Post" ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP; @@ -816,22 +649,7 @@ https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-databas You can now run these SQL statements against your database either using a command line client or a GUI like Postico: -![Running an SQL command to alter a column](images/run-sql-command-to-alter-column.png) - - - - - -```no-lines wrap -Replicate `@createdAt` behavior in Prisma 2.0 -https://pris.ly/d/schema-incompatibilities#createdat-isnt-represented-in-database - - ALTER TABLE `Post` CHANGE `createdAt` `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - - +![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) ### 5.1.5. Fix 1-1 relations by adding `UNIQUE` constraints @@ -839,8 +657,6 @@ Now, the tool will help you [turn the current 1-n relation between `User` ↔ `P The CLI currently shows the following output: - - ```no-lines wrap Fix 1-1 relations by adding `UNIQUE` constraints https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint @@ -850,22 +666,7 @@ https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-a You can now run these SQL statements against your database either using a command line client or a GUI like Postico: -![Running an SQL command to alter a column](images/run-sql-command-to-alter-column.png) - - - - - -```no-lines wrap -Fix 1-1 relations by adding `UNIQUE` constraints -https://pris.ly/d/schema-incompatibilities#inline-1-1-relations-are-recognized-as-1-n-missing-unique-constraint - - ALTER TABLE `Profile` ADD UNIQUE (`user`); -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - - +![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) ### 5.1.6. Fix mismatch of CUID length @@ -875,8 +676,6 @@ Finally, the tool will help you [turn the current ID columns of type `VARCHAR(25 The CLI currently shows the following output: - - ```no-lines wrap wrap Migrate IDs from varchar(25) to varchar(30) https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length @@ -890,28 +689,7 @@ https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length You can now run these SQL statements against your database either using a command line client or a GUI like Postico: -![Running an SQL command to alter a column](images/run-sql-command-to-alter-column.png) - - - - - -```no-lines wrap -Migrate IDs from varchar(25) to varchar(30) -https://pris.ly/d/schema-incompatibilities#mismatching-cuid-length - -SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE `Category` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Post` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Profile` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -ALTER TABLE `Profile` CHANGE `user` `user` char(30) CHARACTER SET utf8 ; -ALTER TABLE `User` CHANGE `id` `id` char(30) CHARACTER SET utf8 NOT NULL; -SET FOREIGN_KEY_CHECKS=1; -``` - -You can now run these SQL statements against your database either using a command line client or a GUI like TablePlus. - - +![Running an SQL command to alter a column](./images/run-sql-command-to-alter-column.png) ### 5.1.7. Breaking changes detected @@ -930,7 +708,7 @@ In this section, you'll resolve the schema incompatibilities that are breaking y ### 5.2.1. Fix incorrect m-n relations -Now, the Upgrade CLI helps you fix all 1-1 and 1-n relations that Prisma 1 represents with relation tables and that [currently only exist as m-n relations](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#all-non-inline-relations-are-recognized-as-m-n) in your new Prisma 2 schema. Concretely, this is the case for the `User` ↔ `Post` relation which currently is defined as m-n but _should_ really be a 1-n relation. +Now, the Upgrade CLI helps you fix all 1-1 and 1-n relations that Prisma 1 represents with relation tables and that [currently only exist as m-n relations](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#all-non-inline-relations-are-recognized-as-m-n) in your new Prisma ORM 2 schema. Concretely, this is the case for the `User` ↔ `Post` relation which currently is defined as m-n but _should_ really be a 1-n relation. To fix this, you'll need to perform the following migration: @@ -940,8 +718,6 @@ To fix this, you'll need to perform the following migration: These instructions are now printed by the CLI: - - ```no-lines wrap ➤ Adjust your database schema Run the following SQL statements against your database: @@ -958,14 +734,14 @@ Run the following SQL statements against your database: ➤ Next Steps After you executed one or more of the previous SQL statements against your database, -please run the following two commands to refresh your Prisma 2 schema and check +please run the following two commands to refresh your Prisma ORM 2 schema and check the changes. - 1. Run `npx prisma db pull` again to refresh your Prisma 2 schema. + 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. 2. Run `npx prisma-upgrade` again. If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma 2 +skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 schema that are not picked up by introspection. Skip to the last step? [Y/n]? @@ -991,62 +767,7 @@ For this fix, you'll need to run three SQL statements: DROP TABLE `_PostToUser`; ``` -![Fixing incorrect m-n relations with SQL](images/fix-incorrect-m-n-relations-sql.png) - - - - - -```no-lines wrap -➤ Adjust your database schema -Run the following SQL statements against your database: - - Fix one-to-many table relations - https://pris.ly/d/schema-incompatibilities#all-non-inline-relations-are-recognized-as-m-n - - ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; - ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); - UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; - DROP TABLE `_PostToUser`; - - -➤ Next Steps - -After you executed one or more of the above SQL statements against your database, -please run the following two commands to refresh your Prisma 2 Schema and check -the changes. - - 1. Run `npx prisma db pull` again to refresh your Prisma 2 schema. - 2. Run `npx prisma-upgrade` again. - -If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma 2 -schema that are not picked up by introspection. - -Skip to the last step? [Y/n]? -``` - -For this fix, you'll need to run three SQL statements: - -1. Create new column `authorId` on the `Post` table. This column should be a _foreign key_ that references the `id` field of the `User` table: - ```sql no-lines - ALTER TABLE `Post` ADD COLUMN `authorId` char(25) CHARACTER SET utf8 ; - ALTER TABLE `Post` ADD CONSTRAINT author FOREIGN KEY (`authorId`) REFERENCES `User`(`id`); - ``` -1. Write a SQL query that reads all the rows from the `_PostToUser` relation table and for each row: - 1. Finds the respective `Post` record by looking up the value from column `A` - 1. Inserts the value from column `B` as the value for `authorId` into that `Post` record - ```sql no-lines - UPDATE `Post`, `_PostToUser` SET `Post`.`authorId` = `_PostToUser`.B where `_PostToUser`.A = `Post`.`id`; - ``` -1. Delete the `_PostToUser` relation table - ```sql no-lines - DROP TABLE `_PostToUser`; - ``` - -![Fixing incorrect m-n relations with SQL](images/fix-incorrect-m-n-relations-sql.png) - - +![Fixing incorrect m-n relations with SQL](./images/fix-incorrect-m-n-relations-sql.png) After these commands, the user ID values of the records from column `B` of the relation table are migrated to the new `authorId` column. @@ -1062,7 +783,7 @@ npx prisma db pull This time, the resulting Prisma schema looks as follows: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id name String @@ -1110,31 +831,31 @@ This schema has most issues resolved, but it still lacks the following: The CLI now prints the following: -```no-lines wrap +``` wrap ➤ What happens next -As a last step, some final adjustments will be made to your Prisma 2 schema -to carry over some Prisma-level attributes that aren't picked up by introspection. +As a last step, some final adjustments will be made to your Prisma ORM 2 schema +to carry over some Prisma ORM-level attributes that aren't picked up by introspection. -As a last step, some final adjustments will be made to your Prisma 2.0 -schema to carry over some Prisma-level attributes that aren't picked +As a last step, some final adjustments will be made to your Prisma ORM 2.0 +schema to carry over some Prisma ORM-level attributes that aren't picked up by introspection. Warning -Your current Prisma 2.0 schema will be overwritten, so please +Your current Prisma ORM 2.0 schema will be overwritten, so please make sure you have a backup! Are you ready? [Y/n] ``` -At this point, you either ran all the SQL statement that were printed by the CLI or you skipped some of them. Either way, you can now move on the last step and let the Upgrade CLI add the missing Prisma 2 attributes. Typically these are the following: +At this point, you either ran all the SQL statement that were printed by the CLI or you skipped some of them. Either way, you can now move on the last step and let the Upgrade CLI add the missing Prisma ORM 2 attributes. Typically these are the following: - `@default(cuid())` for your `@id` fields - `@updatedAt` for any fields that were using this attribute in Prisma 1 - `@map` and `@@map` as replacements for `@db` and `@@db` from Prisma 1 -In that step, the Upgrade CLI also fixes other issues that occurred in the transition to Prisma 2: +In that step, the Upgrade CLI also fixes other issues that occurred in the transition to Prisma ORM 2: -- it makes sure that 1-1-relations that were required on both sides in Prisma 1 are also required in your Prisma 2 schema +- it makes sure that 1-1-relations that were required on both sides in Prisma 1 are also required in your Prisma ORM 2 schema - it renames relation fields to the same names they had in your Prisma 1 datamodel ([coming soon](https://github.com/prisma/upgrade/issues/25)) To apply these changes, you can re-run the Upgrade CLI: @@ -1153,14 +874,14 @@ $ npx prisma-upgrade prisma1/prisma.yml prisma/schema.prisma ➤ Next Steps After you executed one or more of the previous SQL statements against your database, -please run the following two commands to refresh your Prisma 2 schema and check +please run the following two commands to refresh your Prisma ORM 2 schema and check the changes. - 1. Run `npx prisma db pull` again to refresh your Prisma 2 schema. + 1. Run `npx prisma db pull` again to refresh your Prisma ORM 2 schema. 2. Run `npx prisma-upgrade` again. If you can't or don't want to execute the remaining SQL statements right now, you can -skip to the last step where the Upgrade CLI adds missing attributes to your Prisma 2 +skip to the last step where the Upgrade CLI adds missing attributes to your Prisma ORM 2 schema that are not picked up by introspection. Skip to the last step? [Y/n]? @@ -1172,15 +893,15 @@ The final prompt of the Upgrade CLI now asks you to confirm the above mentioned ```no-lines wrap ➤ What happens next -As a last step, some final adjustments will be made to your Prisma 2 schema -to carry over some Prisma-level attributes that aren't picked up by introspection. +As a last step, some final adjustments will be made to your Prisma ORM 2 schema +to carry over some Prisma ORM-level attributes that aren't picked up by introspection. -As a last step, some final adjustments will be made to your Prisma 2.0 -schema to carry over some Prisma-level attributes that aren't picked +As a last step, some final adjustments will be made to your Prisma ORM 2.0 +schema to carry over some Prisma ORM-level attributes that aren't picked up by introspection. Warning -Your current Prisma 2.0 schema will be overwritten, so please +Your current Prisma ORM 2.0 schema will be overwritten, so please make sure you have a backup! Are you ready? [Y/n] @@ -1201,7 +922,7 @@ If you didn't execute all generated SQL commands against your database, you can re-run the Upgrade CLI at any time. Note that the Upgrade CLI doesn't resolve all of the schema incompatibilities -between Prisma 1 and Prisma 2. If you want to resolve the remaining ones, +between Prisma 1 and Prisma ORM 2. If you want to resolve the remaining ones, you can do so manually by following this guide: https://pris.ly/d/upgrading-the-prisma-layer @@ -1217,7 +938,7 @@ https://pris.ly/d/upgrade-from-prisma-1 The final version of the Prisma schema should look as follows: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { id String @id @default(cuid()) name String @@ -1261,9 +982,9 @@ enum Role { ### 5.4. Rename relation fields -One thing you'll notice with this version of the Prisma 2 schema is that all [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are named after their respective models, e.g: +One thing you'll notice with this version of the Prisma ORM 2 schema is that all [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) are named after their respective models, e.g: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { Post Post[] Profile Profile? @@ -1289,7 +1010,7 @@ Because all relation fields are _virtual_, meaning they don't _manifest_ in the Here's what they look like after the rename: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model User { posts Post[] profile Profile? @@ -1314,11 +1035,11 @@ model Category { ### 5.5. Resolving remaining schema incompatibilities -There are a few schema incompatibilities that were not yet resolved by the Upgrade CLI. At this point you still haven't fixed [scalar lists](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#scalar-lists-arrays-are-maintained-with-extra-table) and [cascading deletes](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#cascading-deletes-are-not-supported-in-prisma-2). You can find the recommended workarounds for these on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. +There are a few schema incompatibilities that were not yet resolved by the Upgrade CLI. At this point you still haven't fixed [scalar lists](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql#scalar-lists-arrays-are-maintained-with-extra-table). You can find the recommended workarounds for this and others on the [Schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) page. ## 6. Install and generate Prisma Client -Now that you have your Prisma 2 schema ready, you can install Prisma Client with the following command: +Now that you have your Prisma ORM 2 schema ready, you can install Prisma Client with the following command: ```terminal copy npm install @prisma/client @@ -1326,7 +1047,7 @@ npm install @prisma/client ## 7. Next steps -Congratulations, you have now upgraded your Prisma layer to Prisma 2! From here on, you can move on to update your application code using one of the following guides: +Congratulations, you have now upgraded your Prisma ORM layer to Prisma ORM 2! From here on, you can move on to update your application code using one of the following guides: - [Old to new Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus): Choose this guide if you're currently running Prisma 1 with GraphQL Nexus. - [prisma-binding to Nexus](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus): Choose this guide if you're currently running Prisma 1 with `prisma-binding` and want to upgrade to [Nexus](https://www.nexusjs.org/#/) (and TypeScript). @@ -1335,21 +1056,21 @@ Congratulations, you have now upgraded your Prisma layer to Prisma 2! From here ## Bonus: Prisma Client API comparison -This section contains a high-level and side-by-side comparison of the Prisma Client APIs of Prisma 1 and Prisma 2. For more details about the new Prisma Client API, you can explore the [Prisma Client](/orm/prisma-client) docs. +This section contains a high-level and side-by-side comparison of the Prisma Client APIs of Prisma 1 and Prisma ORM 2. For more details about the new Prisma Client API, you can explore the [Prisma Client](/orm/prisma-client) docs. ### Reading single records -}> + -```ts +```ts const user = await prisma.user({ id: 1 }) ``` -}> + ```ts await prisma.user.findUnique({ @@ -1365,7 +1086,7 @@ await prisma.user.findUnique({ -}> + ```ts const user = await prisma.users() @@ -1373,7 +1094,7 @@ const user = await prisma.users() -}> + ```ts await prisma.user.findMany() @@ -1387,7 +1108,7 @@ await prisma.user.findMany() -}> + ```ts const users = await prisma.users({ @@ -1399,7 +1120,7 @@ const users = await prisma.users({ -}> + ```ts await prisma.user.findMany({ @@ -1417,7 +1138,7 @@ await prisma.user.findMany({ -}> + ```ts const posts = await prisma.posts({ @@ -1428,7 +1149,7 @@ const posts = await prisma.posts({ -}> + ```ts await prisma.user.findMany({ @@ -1447,7 +1168,7 @@ await prisma.user.findMany({ -}> + ```ts await prisma.posts({ @@ -1457,7 +1178,7 @@ await prisma.posts({ -}> + ```ts await prisma.posts({ @@ -1475,7 +1196,7 @@ await prisma.posts({ -}> + ```ts await prisma.createUser({ @@ -1485,7 +1206,7 @@ await prisma.createUser({ -}> + ```ts await prisma.user.create({ @@ -1503,7 +1224,7 @@ await prisma.user.create({ -}> + ```ts await prisma.updateUser({ @@ -1517,7 +1238,7 @@ await prisma.updateUser({ -}> + ```ts await prisma.user.update({ @@ -1537,7 +1258,7 @@ await prisma.user.update({ -}> + ```ts await prisma.deleteUser({ id: 1 }) @@ -1545,7 +1266,7 @@ await prisma.deleteUser({ id: 1 }) -}> + ```ts await prisma.user.delete({ @@ -1559,13 +1280,13 @@ await prisma.user.delete({ ### Selecting fields & loading relations -In Prisma 1, the only ways to select specific fields and/or load relations of an object was by using the string-based `$fragment` and `$graphql` functions. With Prisma 2, this is now done in a clean and type-safe manner using [`select`](/orm/prisma-client/queries/select-fields#select-specific-fields) and [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields). +In Prisma 1, the only ways to select specific fields and/or load relations of an object was by using the string-based `$fragment` and `$graphql` functions. With Prisma ORM 2, this is now done in a clean and type-safe manner using [`select`](/orm/prisma-client/queries/select-fields#select-specific-fields) and [`include`](/orm/prisma-client/queries/select-fields#include-relations-and-select-relation-fields). Another benefit of this approach is that you can use `select` and `include` on _any_ Prisma Client query, e.g. `findUnique`, `findMany`, `create`, `update`, `delete`, ... -}> + ```ts await prisma.user({ id: 1 }).$fragment(` @@ -1575,7 +1296,7 @@ await prisma.user({ id: 1 }).$fragment(` -}> + ```ts await prisma.user.findUnique({ @@ -1591,7 +1312,7 @@ await prisma.user.findUnique({ -As an example, creating a new record and only retrieving the `id` in the returned object was not possible in Prisma 1. With Prisma 2 you can achieve this as follows: +As an example, creating a new record and only retrieving the `id` in the returned object was not possible in Prisma 1. With Prisma ORM 2 you can achieve this as follows: ```ts await prisma.user.create({ diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx index 0393e3d34a..df301487bf 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/04-upgrading-nexus-prisma-to-nexus.mdx @@ -1,9 +1,11 @@ --- title: 'Old to new Nexus' metaTitle: 'Upgrade Prisma 1 with nexus-prisma to @nexus/schema' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with nexus-prisma to Prisma 2 and Nexus.' +description: 'Learn how to upgrade existing Prisma 1 projects with nexus-prisma to Prisma ORM 2 and Nexus.' --- + + ## Overview > **Note**: This guide is not fully up-to-date as it currently uses the [deprecated](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) version of the [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). While this is still functional, it is recommended to use the new [`nexus-prisma`](https://github.com/prisma/nexus-prisma/) library or an alternative code-first GraphQL library like [Pothos](https://pothos-graphql.dev/) going forward. If you have any questions, feel free to drop them in the [`#prisma1-community`](https://app.slack.com/client/T0MQBS8JG/C0152UA4DH9) channel in the [Prisma Slack](https://slack.prisma.io). @@ -12,10 +14,10 @@ This upgrade guide describes how to upgrade a project that's based on [Prisma 1] The code will be upgraded to the latest version of `@nexus/schema`. Further, the `nexus-prisma` package will be replaced with the new [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). -The guide assumes that you already went through the [guide for upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: +The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: -- installed the Prisma 2 CLI -- created your Prisma 2 schema +- installed the Prisma ORM 2 CLI +- created your Prisma ORM 2 schema - introspected your database and resolved potential [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) - installed and generated Prisma Client @@ -42,7 +44,7 @@ The guide further assumes that you have a file setup that looks similar to this: The important parts are: -- A folder called with `prisma` with your Prisma 2 schema +- A folder called with `prisma` with your Prisma ORM 2 schema - A folder called `src` with your application code If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. @@ -61,19 +63,19 @@ Then, you can install the latest `@nexus/schema` dependency in your project: npm install @nexus/schema ``` -Next, install the Prisma plugin for Nexus which will allow you to expose Prisma models in your GraphQL API (this is the new equivalent of the former `nexus-prisma` package): +Next, install the Prisma ORM plugin for Nexus which will allow you to expose Prisma ORM models in your GraphQL API (this is the new equivalent of the former `nexus-prisma` package): ```copy npm install nexus-plugin-prisma ``` -The `nexus-plugin-prisma` dependency bundles all required Prisma dependencies. You should therefore remove the dependencies that you added installed when you upgraded the Prisma layer of your app: +The `nexus-plugin-prisma` dependency bundles all required Prisma ORM dependencies. You should therefore remove the dependencies that you added installed when you upgraded the Prisma ORM layer of your app: ```copy npm uninstall @prisma/cli @prisma/client ``` -Note however that you can still invoke the Prisma 2 CLI with the familiar command: +Note however that you can still invoke the Prisma ORM 2 CLI with the familiar command: ```copy npx prisma -v @@ -81,43 +83,53 @@ npx prisma -v > **Note**: If you see the output of the Prisma 1 CLI when running `npx prisma -v`, be sure to delete your `node_modules` folder and re-run `npm install`. -## 2. Update the configuration of Nexus and Prisma +## 2. Update the configuration of Nexus and Prisma ORM To get started, you can remove the old imports that are not needed any more with your new setup: ```ts line-number highlight=1-3;delete +//delete-start import { makePrismaSchema, prismaObjectType } from 'nexus-prisma' import datamodelInfo from './generated/nexus-prisma' import { prisma } from './generated/prisma-client' +//delete-end ``` Instead, you now import the following into your application: ```ts line-number highlight=1-3;add +//add-start import { nexusSchemaPrisma } from 'nexus-plugin-prisma/schema' import { objectType, makeSchema, queryType, mutationType } from '@nexus/schema' import { PrismaClient } from '@prisma/client' +//add-end ``` -Next you need to adjust the code where you currently create your `GraphQLSchema`, most likely this is currently happening via the `makePrismaSchema` function in your code. Since this function was imported from the removed `nexus-prisma` package, you'll need to replace it with the `makeSchema` function from the `@nexus/schema` package. The way how the Prisma plugin for Nexus is used also changes in the latest version. +Next you need to adjust the code where you currently create your `GraphQLSchema`, most likely this is currently happening via the `makePrismaSchema` function in your code. Since this function was imported from the removed `nexus-prisma` package, you'll need to replace it with the `makeSchema` function from the `@nexus/schema` package. The way how the Prisma ORM plugin for Nexus is used also changes in the latest version. Here's an example for such a configuration: -```ts file=./src/index.ts line-number highlight=2,12-14;add|1,8-11;delete +```ts file=./src/index.ts line-number highlight=2,12-14;add|1,8-11;delete showLineNumbers +//delete-next-line const schema = makePrismaSchema({ +//add-next-line const schema = makeSchema({ // Provide all the GraphQL types we've implemented types: [Query, Mutation, UserUniqueInput, User, Post, Category, Profile], // Configure the interface to Prisma + //delete-start prisma: { datamodelInfo, client: prisma, }, + //delete-end + //add-start plugins: [nexusSchemaPrisma({ experimentalCRUD: true, })], + //add-end // Specify where Nexus should put the generated files outputs: { @@ -146,12 +158,16 @@ Here's an example for such a configuration: If you previously typed the GraphQL `context` object that's passed through your resolver chain, you need to adjust the type like so: -```ts file=./src/types.ts highlight=2,6;add|1,5;delete +```ts file=./src/types.ts highlight=2,6;add|1,5;delete showLineNumbers +//delete-next-line import { Prisma } from './generated/prisma-client' +//add-next-line import { PrismaClient } from '@prisma/client' export interface Context { + //delete-next-line prisma: Prisma + //add-next-line prisma: PrismaClient } ``` @@ -217,6 +233,7 @@ Note that `t.model` looks at the `name` attribute in the object that's passed as At this point, you might see errors on the relation fields `posts` and `profile`, e.g.: ```bash highlight=1;delete +//delete-next-line Missing type Post, did you forget to import a type to the root query? ``` @@ -313,7 +330,7 @@ const Category = prismaObjectType({ }) ``` -The asterisk in `prismaFields` means that _all_ Prisma fields are exposed. +The asterisk in `prismaFields` means that _all_ Prisma ORM fields are exposed. #### Type definition with the latest version of `@nexus/schema` and the `nexus-plugin-prisma` @@ -424,7 +441,7 @@ queryType({ }) ``` -The only thing that needs to be updated for this query is the call to Prisma since the new Prisma Client API looks a bit different from the one used in Prisma 1. +The only thing that needs to be updated for this query is the call to Prisma ORM since the new Prisma Client API looks a bit different from the one used in Prisma 1. ```ts line-number highlight=6,9,12,13;normal queryType({ @@ -493,18 +510,21 @@ const Query = queryType({ t.field('user', { type: 'User', args: { + //highlight-next-line userUniqueInput: arg({ type: 'UserUniqueInput', nullable: false, }), }, resolve: (_, args, context) => { + //highlight-start return context.prisma.user.findUnique({ where: { id: args.userUniqueInput?.id, email: args.userUniqueInput?.email, }, }) + //highlight-end }, }) }, @@ -583,6 +603,7 @@ const Mutation = mutationType({ authorId: stringArg({ nullable: false }), }, resolve: (_, args, context) => { + //highlight-start return context.prisma.post.create({ data: { title: args.title, @@ -592,6 +613,7 @@ const Mutation = mutationType({ }, }, }) + //highlight-end }, }) }, @@ -647,6 +669,7 @@ const Mutation = mutationType({ bio: stringArg(), }, resolve: (_, args, context) => { + //highlight-start return context.prisma.user.update({ where: { id: args.userUniqueInput?.id, @@ -658,6 +681,7 @@ const Mutation = mutationType({ }, }, }) + //highlight-end }, }) }, @@ -712,6 +736,7 @@ const Mutation = mutationType({ }, resolve: (_, args, context) => { const ids = args.categoryIds.map((id) => ({ id })) + //highlight-start return context.prisma.post.update({ where: { id: args.postId, @@ -720,6 +745,7 @@ const Mutation = mutationType({ categories: { connect: ids }, }, }) + //highlight-end }, }) }, @@ -745,6 +771,6 @@ rm -rf src/generated rm -rf prisma1 ``` -### 5.3. Stop the Prisma server +### 5.3. Stop the Prisma ORM server -Finally, you can stop running your Prisma server. +Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx index 5449b5dd11..a0279e8be2 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/05-upgrading-prisma-binding-to-nexus.mdx @@ -1,9 +1,11 @@ --- title: 'prisma-binding to Nexus' metaTitle: 'Upgrading from Prisma 1 with prisma-binding to Nexus' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma 2.0 and Nexus.' +description: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma ORM 2.0 and Nexus.' --- + + ## Overview > **Note**: This guide is not fully up-to-date as it currently uses the [deprecated](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) version of the [`nexus-plugin-prisma`](https://github.com/graphql-nexus/nexus-plugin-prisma). While this is still functional, it is recommended to use the new [`nexus-prisma`](https://github.com/prisma/nexus-prisma/) library or an alternative code-first GraphQL library like [Pothos](https://pothos-graphql.dev/) going forward. If you have any questions, feel free to drop them in the [`#prisma1-community`](https://app.slack.com/client/T0MQBS8JG/C0152UA4DH9) channel in the [Prisma Slack](https://slack.prisma.io). @@ -14,10 +16,10 @@ The code will be migrated to [`@nexus/schema`](https://github.com/graphql-nexus/ This guide also explains how to migrate from JavaScript to TypeScript, it therefore basically assumes a **full rewrite** of your existing app. If you want to keep running your application in JavaScript, you can ignore the instructions that relate to the TypeScript setup keep using JavaScript as before. -The guide assumes that you already went through the [guide for upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: +The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: -- installed the Prisma 2.0 CLI -- created your Prisma 2.0 schema +- installed the Prisma ORM 2.0 CLI +- created your Prisma ORM 2.0 schema - introspected your database and resolved potential [schema incompatibilities](/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql) - installed and generated Prisma Client @@ -41,7 +43,7 @@ The guide further assumes that you have a file setup that looks similar to this: The important parts are: -- A folder called with `prisma` with your Prisma 2.0 schema +- A folder called with `prisma` with your Prisma ORM 2.0 schema - A folder called `src` with your application code and a schema called `schema.graphql` If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. @@ -56,19 +58,19 @@ The first step is to install the Nexus dependency in your project: npm install @nexus/schema ``` -Next, install the the Prisma plugin for Nexus which will allow you to expose Prisma models in your GraphQL API: +Next, install the the Prisma ORM plugin for Nexus which will allow you to expose Prisma models in your GraphQL API: ```terminal copy npm install nexus-plugin-prisma ``` -The `nexus-plugin-prisma` dependency bundles all required Prisma dependencies. You should therefore remove the dependencies that you installed when you upgraded the Prisma layer of your app: +The `nexus-plugin-prisma` dependency bundles all required Prisma ORM dependencies. You should therefore remove the dependencies that you installed when you upgraded the Prisma ORM layer of your app: ```terminal copy npm uninstall @prisma/cli @prisma/client ``` -Note however that you can still invoke the Prisma 2.0 CLI with the familiar command: +Note however that you can still invoke the Prisma ORM 2.0 CLI with the familiar command: ```terminal npx prisma @@ -90,7 +92,7 @@ touch tsconfig.json Now add the following contents to the new file: -```json copy file=tsconfig.json +```json copy file=tsconfig.json showLineNumbers { "compilerOptions": { "skipLibCheck": true, @@ -114,7 +116,7 @@ Note that for this guide, you'll write the entire application inside of `index.t For some basic setup, add this code to `index.ts`: -```ts file=index.ts +```ts file=index.ts showLineNumbers import { queryType, makeSchema } from '@nexus/schema' import { nexusSchemaPrisma } from 'nexus-plugin-prisma/schema' import { GraphQLServer } from 'graphql-yoga' @@ -155,7 +157,7 @@ new GraphQLServer({ schema, context: createContext() }).start(() => ) ``` -Note that this setup already contains the configuration of the Prisma plugin for Nexus. This will enable the `t.model` and `t.crud` functionality that you'll get to know later in this guide. +Note that this setup already contains the configuration of the Prisma ORM plugin for Nexus. This will enable the `t.model` and `t.crud` functionality that you'll get to know later in this guide. In the `typegenAutoConfig` setting, you're providing additional types that help your editor to provide your autocompletion as you develop your app. Right now it references a file named `context.ts` that you don't have in your project yet. This file will contain the type of your `context` object that's passed through your GraphQL resolver chain. @@ -227,7 +229,7 @@ The next step of the upgrade process is to create your _GraphQL types_. In this For the purpose of this guide, you'll keep all the code in a single file. However, you can structure the files to your personal preference and `import` accordingly. -In Nexus, GraphQL types are defined via the `objectType` function. Import `objectType` and then start with the skeleton for your first GraphQL type. In this case, we're starting by mapping Prisma's `User` model to GraphQL: +In Nexus, GraphQL types are defined via the `objectType` function. Import `objectType` and then start with the skeleton for your first GraphQL type. In this case, we're starting by mapping Prisma schema's `User` model to GraphQL: ```ts copy import { objectType } from 'nexus' @@ -242,7 +244,7 @@ const User = objectType({ With this code in place, you can start exposing the _fields_ of the `User` model one by one. You can use your editor's autocompletion to save some typing. Inside the body of the `definition` function, type `t.model.` and then hit CTRL+SPACE. This will bring up the autocompletion and suggest all fields that are defined on the `User` model: -![Exposing Prisma model fields with t.model](images/expose-prisma-model-fields-with-t-model.png) +![Exposing Prisma model fields with t.model](./images/expose-prisma-model-fields-with-t-model.png) Note that the `model` property on `t` is provided by the `nexus-plugin-prisma`. It leverages the type information from your Prisma schema and lets you expose your Prisma models via GraphQL. @@ -279,10 +281,12 @@ const User = objectType({ t.model.jsonData() t.model.role() t.model.profile() + //add-start t.model.posts({ filtering: true, ordering: true, }) + //add-end }, }) ``` @@ -310,7 +314,9 @@ export const schema = makeSchema({ Once you're done with the first type, you can start defining the remaining ones. -
Expand to view the full version of the sample data model +
+ +Expand to view the full version of the sample data model To expose all sample Prisma models with Nexus, the following code is needed: @@ -378,6 +384,7 @@ Be sure to include all newly defined types in the `types` option that's provided ```ts line-number highlight=2;normal export const schema = makeSchema({ + //highlight-next-line types: [Query, User, Post, Profile, Category], plugins: [nexusSchemaPrisma()], outputs: { @@ -459,7 +466,7 @@ To mirror the same behaviour with Nexus, you can use the `crud` property on the Similar to `model`, this property is available because you're using the `nexus-prisma-plugin` which leverages type information from your Prisma models and auto-generates resolvers under the hood. The `crud` property also supports autocompletion, so you can explore all available queries in your editor again: -![Using t.crud to generate resolvers](images/use-t-crud-to-generate-resolvers.png) +![Using t.crud to generate resolvers](./images/use-t-crud-to-generate-resolvers.png) ##### Forwarding the query with the `nexus-prisma-plugin` @@ -468,10 +475,12 @@ To add the `users` query to your GraphQL API, add the following lines to the que ```ts line-number highlight=3-6;add const Query = queryType({ definition(t) { + //add-start t.crud.users({ filtering: true, ordering: true, }) + //add-end }, }) ``` @@ -507,7 +516,7 @@ You can now write your first query against the new API, e.g.: } ``` -If your application exposes all CRUD operations from Prisma using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" queries can be defined and resolved using Nexus, move on to the next sections. +If your application exposes all CRUD operations from Prisma ORM using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" queries can be defined and resolved using Nexus, move on to the next sections. #### 3.1.2. Migrate the `posts(searchString: String): [Post!]!` query @@ -554,11 +563,13 @@ const Query = queryType({ definition(t) { // ... previous queries + //add-start t.list.field('posts', { type: 'Post', nullable: false, args: { searchString: stringArg() }, }) + //add-end }, }) ``` @@ -567,6 +578,7 @@ Although this code gives probably gives you a type error in your editor, you can ```graphql line-number type Query { +//highlight-next-line | posts(searchString: String): [Post!]! users(after: UserWhereUniqueInput, before: UserWhereUniqueInput, first: Int, last: Int, orderBy: Enumerable, skip: Int, where: UserWhereInput): [User!]! } @@ -587,6 +599,7 @@ const Query = queryType({ type: 'Post', nullable: false, args: { searchString: stringArg() }, + //add-start resolve: (_, args, context) => { return context.prisma.post.findMany({ where: { @@ -600,6 +613,7 @@ const Query = queryType({ ], }, }) + //add-end }, }) }, @@ -664,8 +678,10 @@ const resolvers = { To get the same behavior with Nexus, you'll need to add a `t.field` definition to the `queryType` and define an `inputObjectType` that includes the two `@unique` fields of your `User` model: ```ts line-number highlight=1,3-9,15-23;add +//add-next-line import { inputObjectType, arg } from '@nexus/schema' +//add-start const UserUniqueInput = inputObjectType({ name: 'UserUniqueInput', definition(t) { @@ -673,11 +689,13 @@ const UserUniqueInput = inputObjectType({ t.string('email') }, }) +//add-end const Query = queryType({ definition(t) { // ... previous queries + //add-start t.field('user', { type: 'User', args: { @@ -687,6 +705,7 @@ const Query = queryType({ }), }, }) + //add-end }, }) ``` @@ -695,6 +714,7 @@ Since `UserUniqueInput` is a new type in your GraphQL schema, you again need to ```ts line-number highlight=2;normal export const schema = makeSchema({ + //highlight-next-line types: [Query, User, Post, Profile, Category, UserUniqueInput], plugins: [nexusSchemaPrisma()], outputs: { @@ -717,14 +737,17 @@ If you look at the generated SDL version of your GraphQL schema inside `schema.g ```graphql line-number highlight=3,7-10;normal type Query { posts(searchString: String): [Post!] + //highlight-next-line user(userUniqueInput: UserUniqueInput!): User users(after: UserWhereUniqueInput, before: UserWhereUniqueInput, first: Int, last: Int, orderBy: Enumerable, skip: Int, where: UserWhereInput): [User!]! } +//highlight-start input UserUniqueInput { email: String id: String } +//highlight-end ``` You can even send the respective query via the GraphQL Playground already: @@ -766,6 +789,7 @@ const Query = queryType({ nullable: false, }), }, + //add-start resolve: (_, args, context) => { return context.prisma.user.findUnique({ where: { @@ -774,6 +798,7 @@ const Query = queryType({ }, }) }, + //add-end }) }, }) @@ -803,6 +828,7 @@ In order to make sure that the new `Mutation` type is picked by up Nexus, you ne ```ts line-number highlight=2;normal export const schema = makeSchema({ + //highlight-next-line types: [Query, User, Post, Profile, Category, UserUniqueInput, Mutation], plugins: [nexusSchemaPrisma()], outputs: { @@ -848,7 +874,7 @@ Similar to forwarding GraphQL queries, you can use the `crud` property on the `t Similar to `model`, this property is available because you're using the `nexus-prisma-plugin` which leverages type information from your Prisma models and auto-generates resolvers under the hood. The `crud` property supports autocompletion when defining mutations as well, so you can explore all available operations in your editor again: -![Generating resolvers with t.crud](images/regenerate-resolvers-with-t-crud.png) +![Generating resolvers with t.crud](./images/regenerate-resolvers-with-t-crud.png) ##### Forwarding the mutation with the `nexus-prisma-plugin` @@ -857,9 +883,11 @@ To add the `createUser` mutation to your GraphQL API, add the following lines to ```ts line-number highlight=3-5;add const Mutation = mutationType({ definition(t) { + //add-start t.crud.createOneUser({ alias: 'createUser', }) + //add-end }, }) ``` @@ -884,7 +912,7 @@ mutation { } ``` -If your application exposes all CRUD operations from Prisma using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" mutations can be defined and resolved using Nexus, move on to the next sections. +If your application exposes all CRUD operations from Prisma Client using `forwardTo`, you can now continue adding all remaining ones using the same approach via `t.crud`. To learn how "custom" mutations can be defined and resolved using Nexus, move on to the next sections. #### 3.2.3. Migrate the `createDraft(title: String!, content: String, authorId: String!): Post!` query @@ -934,6 +962,7 @@ const Mutation = mutationType({ definition(t) { // ... previous mutations + //add-start t.field('createDraft', { type: 'Post', args: { @@ -942,6 +971,7 @@ const Mutation = mutationType({ authorId: stringArg({ nullable: false }), }, }) + //add-end }, }) ``` @@ -951,6 +981,7 @@ If you look at the generated SDL version of your GraphQL schema inside `schema.g ```graphql line-number highlight=3;normal type Mutation { createUser(data: UserCreateInput!): User! + //highlight-next-line createDraft(title: String!, content: String, authorId: String!): Post! } ``` @@ -988,6 +1019,7 @@ const Mutation = mutationType({ content: stringArg(), authorId: stringArg({ nullable: false }), }, + //add-start resolve: (_, args, context) => { return context.prisma.post.create({ data: { @@ -999,6 +1031,7 @@ const Mutation = mutationType({ }, }) }, + //add-end }) }, }) @@ -1051,6 +1084,7 @@ const Mutation = mutationType({ definition(t) { // ... previous mutations + //add-start t.field('updateBio', { type: 'User', args: { @@ -1061,6 +1095,7 @@ const Mutation = mutationType({ bio: stringArg({ nullable: false }), }, }) + //add-end }, }) ``` @@ -1071,6 +1106,7 @@ If you look at the generated SDL version of your GraphQL schema inside `schema.g type Mutation { createUser(data: UserCreateInput!): User! createDraft(title: String!, content: String, authorId: String!): Post! + //highlight-next-line updateBio(bio: String!, userUniqueInput: UserUniqueInput!): User } ``` @@ -1113,6 +1149,7 @@ const Mutation = mutationType({ }), bio: stringArg() }, + //add-start resolve: (_, args, context) => { return context.prisma.user.update({ where: { @@ -1126,6 +1163,7 @@ const Mutation = mutationType({ } }) } + //add-end } } }) @@ -1181,6 +1219,7 @@ const Mutation = mutationType({ definition(t) { // ... mutations from before + //add-start t.field('addPostToCategories', { type: 'Post', args: { @@ -1191,6 +1230,7 @@ const Mutation = mutationType({ }), }, }) + //add-end }, }) ``` @@ -1202,6 +1242,7 @@ type Mutation { createUser(data: UserCreateInput!): User! createDraft(title: String!, content: String, authorId: String!): Post! updateBio(bio: String, userUniqueInput: UserUniqueInput!): User + //highlight-next-line addPostToCategories(postId: String!, categoryIds: [String!]!): Post } ``` @@ -1243,6 +1284,7 @@ const Mutation = mutationType({ nullable: false, }), }, + //add-start resolve: (_, args, context) => { const ids = args.categoryIds.map((id) => ({ id })) return context.prisma.post.update({ @@ -1254,6 +1296,7 @@ const Mutation = mutationType({ }, }) }, + //add-end }) }, }) @@ -1263,7 +1306,7 @@ If you're re-sending the same query from before, you'll find that it now returns ## 4. Cleaning up -Since the entire app has now been upgrade to Prisma 2.0 and Nexus, you can delete all unnecessary files and remove the no longer needed dependencies. +Since the entire app has now been upgrade to Prisma ORM 2.0 and Nexus, you can delete all unnecessary files and remove the no longer needed dependencies. ### 4.1. Clean up npm dependencies @@ -1283,6 +1326,6 @@ rm prisma1/datamodel.prisma prisma1/prisma.yml You can also delete any remaining `.js` files, the old `schema.graphql` and `prisma.graphql` files. -### 4.3. Stop the Prisma server +### 4.3. Stop the Prisma ORM server -Finally, you can stop running your Prisma server. +Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx index 2fcb2b323c..3ba6fe8669 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/06-upgrading-prisma-binding-to-sdl-first.mdx @@ -1,19 +1,21 @@ --- title: 'prisma-binding to SDL-first' metaTitle: 'Upgrading from Prisma 1 with prisma-binding to SDL-first' -metaDescription: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma 2 (SDL-first).' +description: 'Learn how to upgrade existing Prisma 1 projects with prisma-binding to Prisma ORM 2 (SDL-first).' --- + + ## Overview This upgrade guide describes how to migrate a Node.js project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses `prisma-binding` to implement a GraphQL server. The code will keep the [SDL-first approach](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3) for constructing the GraphQL schema. When migrating from `prisma-binding` to Prisma Client, the main difference is that the `info` object can't be used to resolve relations automatically any more, instead you'll need to implement your _type resolvers_ to ensure that relations get resolved properly. -The guide assumes that you already went through the [guide for upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: +The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: -- installed the Prisma 2 CLI -- created your Prisma 2 schema +- installed the Prisma ORM 2 CLI +- created your Prisma ORM 2 schema - introspected your database and resolved potential schema incompatibilities - installed and generated Prisma Client @@ -37,7 +39,7 @@ The guide further assumes that you have a file setup that looks similar to this: The important parts are: -- A folder called with `prisma` with your Prisma 2 schema +- A folder called with `prisma` with your Prisma ORM 2 schema - A folder called `src` with your application code and a schema called `schema.graphql` If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. @@ -46,11 +48,11 @@ If this is not what your project structure looks like, you'll need to adjust the With `prisma-binding`, your approach for defining your GraphQL schema (sometimes called [application schema](https://v1.prisma.io/docs/1.20/data-model-and-migrations/data-model-knul/#a-note-on-the-application-schema)) is based on _importing_ GraphQL types from the generated `prisma.graphql` file (in Prisma 1, this is typically called [Prisma GraphQL schema](https://v1.prisma.io/docs/1.20/data-model-and-migrations/data-model-knul/#the-prisma-graphql-schema)). These types mirror the types from your Prisma 1 datamodel and serve as foundation for your GraphQL API. -With Prisma 2, there's no `prisma.graphql` file any more that you could import from. Therefore, you have to spell out all the types of your GraphQL schema directly inside your `schema.graphql` file. +With Prisma ORM 2, there's no `prisma.graphql` file any more that you could import from. Therefore, you have to spell out all the types of your GraphQL schema directly inside your `schema.graphql` file. The easiest way to do so is by downloading the full GraphQL schema from the GraphQL Playground. To do so, open the **SCHEMA** tab and click the **DOWNLOAD** button in the top-right corner, then select **SDL**: -![Downloading the GraphQL schema with GraphQL Playground](images/download-graphql-schema.png) +![Downloading the GraphQL schema with GraphQL Playground](./images/download-graphql-schema.png) Alternatively, you can use the `get-schema` command of the [GraphQL CLI](https://github.com/Urigo/graphql-cli) to download your full schema: @@ -64,7 +66,8 @@ Once you obtained the `schema.graphql` file, replace your current version in `sr Here's a comparison of these two versions of the sample GraphQL schema that we'll migrate in this guide (you can use the tabs to switch between the two versions): - + + ```graphql # import Post from './generated/prisma.graphql' @@ -93,6 +96,9 @@ type Mutation { } ``` + + + ```graphql type Query { posts(searchString: String): [Post!]! @@ -755,17 +761,18 @@ input UserWhereInput { } ``` - + + You'll notice that the new version of your GraphQL schema not only defines the _models_ that were imported directly, but also additional types (e.g. `input` types) that were not present in the schema before. ## 2. Set up your `PrismaClient` instance -`PrismaClient` is your new interface to the database in Prisma 2. It lets you invoke various methods which build SQL queries and send them to the database, returning the results as plain JavaScript objects. +`PrismaClient` is your new interface to the database in Prisma ORM 2. It lets you invoke various methods which build SQL queries and send them to the database, returning the results as plain JavaScript objects. The `PrismaClient` query API is inspired by the initial `prisma-binding` API, so a lot of the queries you send with Prisma Client will feel familiar. -Similar to the `prisma-binding` instance from Prisma 1, you also want to attach your `PrismaClient` from Prisma 2 to GraphQL's `context` so that in can be accessed inside your resolvers: +Similar to the `prisma-binding` instance from Prisma 1, you also want to attach your `PrismaClient` from Prisma ORM 2 to GraphQL's `context` so that in can be accessed inside your resolvers: ```js line-number highlight=10-13;delete|14;add const { PrismaClient } = require('@prisma/client') @@ -777,16 +784,19 @@ const server = new GraphQLServer({ resolvers, context: (req) => ({ ...req, + //delete-start prisma: new Prisma({ typeDefs: 'src/generated/prisma.graphql', endpoint: 'http://localhost:4466', }), + //delete-end + //add-next-line prisma: new PrismaClient(), }), }) ``` -In the code block above, the _red_ lines are the lines to be removed from your current setup, the _green_ lines are the ones that you should add. Of course, it's possible that your previous setup differed from this one (e.g. it's unlikely that your Prisma `endpoint` was `http://localhost:4466` if you're running your API in production), this is just a sample to indicate what it _could_ look like. +In the code block above, the _red_ lines are the lines to be removed from your current setup, the _green_ lines are the ones that you should add. Of course, it's possible that your previous setup differed from this one (e.g. it's unlikely that your Prisma ORM `endpoint` was `http://localhost:4466` if you're running your API in production), this is just a sample to indicate what it _could_ look like. When you're now accessing `context.prisma` inside of a resolver, you now have access to Prisma Client queries. @@ -837,6 +847,7 @@ const resolvers = { Mutation: { // ... your mutation resolvers }, + //add-start User: { posts: (parent, args, context) => { return context.prisma.user @@ -853,6 +864,7 @@ const resolvers = { .profile() }, }, + //add-end } ``` @@ -924,6 +936,7 @@ const resolvers = { User: { // ... your type resolvers for `User` from before }, + //add-start Post: { author: (parent, args, context) => { return context.prisma.post @@ -940,6 +953,7 @@ const resolvers = { .categories() }, }, + //add-end } ``` @@ -998,6 +1012,7 @@ const resolvers = { Post: { // ... your type resolvers for `Post` from before }, + //add-start Profile: { user: (parent, args, context) => { return context.prisma.profile @@ -1007,6 +1022,7 @@ const resolvers = { .owner() }, }, + //add-end } ``` @@ -1057,6 +1073,7 @@ const resolvers = { Profile: { // ... your type resolvers for `User` from before }, + //add-start Category: { posts: (parent, args, context) => { return context.prisma @@ -1066,6 +1083,7 @@ const resolvers = { .posts() }, }, + //add-end } ``` @@ -1166,7 +1184,7 @@ const resolvers = { } ``` -The last remaining issue with this are the pagination arguments. Prisma 2 introduces a [new pagination API](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7): +The last remaining issue with this are the pagination arguments. Prisma ORM 2 introduces a [new pagination API](https://github.com/prisma/prisma/releases/tag/2.0.0-beta.7): - The `first`, `last`, `before` and `after` arguments are removed - The new `cursor` argument replaces `before` and `after` @@ -1255,6 +1273,7 @@ To get the same behavior with the new Prisma Client, you'll need to adjust your ```js line-number highlight=3-11;normal const resolvers = { Query: { + //highlight-start posts: (_, args, context) => { return context.prisma.post.findMany({ where: { @@ -1264,6 +1283,7 @@ const resolvers = { ], }, }) + //highlight-end }, // ... other resolvers }, @@ -1328,11 +1348,13 @@ To get the same behavior with the new Prisma Client, you'll need to adjust your ```js line-number highlight=3-7;normal const resolvers = { Query: { + //highlight-start user: (_, args, context) => { return context.prisma.user.findUnique({ where: args.userUniqueInput, }) }, + //highlight-end // ... other resolvers }, } @@ -1384,11 +1406,13 @@ To get the same behavior with the new Prisma Client, you'll need to adjust your ```js line-number highlight=3-7;normal const resolvers = { Mutation: { + //highlight-start createUser: (_, args, context, info) => { return context.prisma.user.create({ data: args.data, }) }, + //highlight-end // ... other resolvers }, } @@ -1450,6 +1474,7 @@ To get the same behavior with the new Prisma Client, you'll need to adjust your ```js line-number highlight=3-15;normal const resolvers = { Mutation: { + //highlight-start createDraft: (_, args, context, info) => { return context.prisma.post.create({ data: { @@ -1463,6 +1488,7 @@ const resolvers = { }, }) }, + //highlight-end // ... other resolvers }, } @@ -1526,6 +1552,7 @@ To get the same behavior with Prisma Client, you'll need to adjust your resolver ```js line-number highlight=3-12;normal const resolvers = { Mutation: { + //highlight-start updateBio: (_, args, context, info) => { return context.prisma.user.update({ data: { @@ -1536,6 +1563,7 @@ const resolvers = { where: args.userUniqueInput, }) }, + //highlight-end // ... other resolvers }, } @@ -1605,6 +1633,7 @@ To get the same behavior with Prisma Client, you'll need to adjust your resolver ```js line-number highlight=3-13;normal const resolvers = { Mutation: { + //highlight-start addPostToCategories: (_, args, context, info) => { const ids = args.categoryIds.map((id) => ({ id })) return context.prisma.post.update({ @@ -1616,6 +1645,7 @@ const resolvers = { }, }) }, + //highlight-end // ... other resolvers }, } @@ -1641,7 +1671,7 @@ mutation { ## 4. Cleaning up -Since the entire app has now been upgraded to Prisma 2, you can delete all unnecessary files and remove the no longer needed dependencies. +Since the entire app has now been upgraded to Prisma ORM 2, you can delete all unnecessary files and remove the no longer needed dependencies. ### 4.1. Clean up npm dependencies @@ -1659,6 +1689,6 @@ Next, delete the files of your Prisma 1 setup: rm prisma1/datamodel.prisma prisma1/prisma.yml ``` -### 4.3. Stop the Prisma server +### 4.3. Stop the Prisma ORM server -Finally, you can stop running your Prisma server. +Finally, you can stop running your Prisma ORM server. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx index 5e120e3f15..21eceb6206 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/07-upgrading-a-rest-api.mdx @@ -1,17 +1,19 @@ --- title: 'REST API' -metaTitle: 'Upgrading a REST API from Prisma 1 to Prisma 2' -metaDescription: 'Learn how to upgrade a REST API from Prisma 1 to Prisma 2.' +metaTitle: 'Upgrading a REST API from Prisma 1 to Prisma ORM 2' +description: 'Learn how to upgrade a REST API from Prisma 1 to Prisma ORM 2.' --- + + ## Overview This upgrade guide describes how to migrate a Node.js project that's based on [Prisma 1](https://github.com/prisma/prisma1) and uses the [Prisma 1 client](https://v1.prisma.io/docs/1.34/prisma-client/) to implement a REST API. -The guide assumes that you already went through the [guide for upgrading the Prisma layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: +The guide assumes that you already went through the [guide for upgrading the Prisma ORM layer](/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql). This means you already: -- installed the Prisma 2 CLI -- created your Prisma 2 schema +- installed the Prisma ORM 2 CLI +- created your Prisma ORM 2 schema - introspected your database and resolved potential schema incompatibilities - installed and generated Prisma Client @@ -39,7 +41,7 @@ The guide further assumes that you have a file setup that looks similar to this: The important parts are: -- A folder called with `prisma` with your Prisma 2 schema +- A folder called with `prisma` with your Prisma ORM 2 schema - A folder called `src` with your application code If this is not what your project structure looks like, you'll need to adjust the instructions in the guide to match your own setup. diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx index 55316c7110..7f6a0d5b90 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/08-upgrade-from-mongodb-beta.mdx @@ -1,12 +1,14 @@ --- title: 'Upgrade from MongoDB Beta' -metaTitle: 'Upgrade from the Prisma 1 MongoDB Beta to Prisma 2 or later' -metaDescription: 'Learn how to upgrade your MongoDB application running Prisma 1 to Prisma 2 or later.' +metaTitle: 'Upgrade from the Prisma 1 MongoDB Beta to Prisma ORM 2 or later' +description: 'Learn how to upgrade your MongoDB application running Prisma 1 to Prisma ORM 2 or later.' --- + + ## Introduction -This guide helps you migrate from the Prisma 1 MongoDB Beta to MongoDB on Prisma 2 or later. To learn more about the differences between Prisma 1 and Prisma 2.x and later, refer to [this document](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#main-differences-between-prisma-1-and-prisma-version-2x-and-later). +This guide helps you migrate from the Prisma 1 MongoDB Beta to MongoDB on Prisma ORM 2 or later. To learn more about the differences between Prisma 1 and Prisma ORM 2.x and later, refer to [this document](/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade#main-differences-between-prisma-1-and-prisma-orm-version-2x-and-later). The scope of this guide is to give you the workflow necessary to perform the migration and highlight some of the problems you might encounter. @@ -23,7 +25,7 @@ We unfortunately can't cover all possible scenarios or changes required, but thi - Node.js: see [system requirements](/orm/reference/system-requirements) - TypeScript: see [system requirements](/orm/reference/system-requirements) -## Installing Prisma 3.12.0 or later +## Installing Prisma ORM 3.12.0 or later In your project directory run the following commands: @@ -108,9 +110,9 @@ The generated Prisma Client from a freshly introspected Prisma 1 based MongoDB d Take caution in doing these renames because you need to make sure the Prisma Schema still maps properly to the underlying database collections and field names. -Unlike SQL databases, MongoDB doesn't have an explicit understanding of relationships between data. This means that Prisma's introspection is unable to infer those relationships for you. +Unlike SQL databases, MongoDB doesn't have an explicit understanding of relationships between data. This means that Prisma ORM's introspection is unable to infer those relationships for you. -We typically recommend adding the relationships by hand with the help of [this documentation](/orm/overview/databases/mongodb#how-to-add-in-missing-relations-after-introspection). However, Prisma 1 stores foreign keys is different than where Prisma 2 and later expects foreign keys, so if you want to take advantage of relationships, you'll need to shift where the foreign keys are on your database before adding the relationships. +We typically recommend adding the relationships by hand with the help of [this documentation](/orm/overview/databases/mongodb#how-to-add-in-missing-relations-after-introspection). However, Prisma 1 stores foreign keys is different than where Prisma ORM 2 and later expects foreign keys, so if you want to take advantage of relationships, you'll need to shift where the foreign keys are on your database before adding the relationships. @@ -225,7 +227,7 @@ This means that your MongoDB database isn't running as a replica set. Refer to [ ## Upgrading your Application -Now that you have a working Prisma Client, you can start replacing Prisma 1 queries with the latest Prisma queries. The [Prisma Client Reference](/orm/reference/prisma-client-reference#filter-conditions-and-operators) is a helpful resource for learning how to use the latest Prisma Client. +Now that you have a working Prisma Client, you can start replacing Prisma Client 1 queries with the latest Prisma Client queries. The [Prisma Client Reference](/orm/reference/prisma-client-reference#filter-conditions-and-operators) is a helpful resource for learning how to use the latest Prisma Client. ## Conclusion diff --git a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx index 5c40823d57..4ab7b4bc6f 100644 --- a/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/800-upgrade-from-prisma-1/index.mdx @@ -1,10 +1,12 @@ --- title: 'Upgrade from Prisma 1' -metaTitle: 'Upgrade from Prisma 1 to Prisma 2' +metaTitle: 'Upgrade from Prisma 1 to Prisma ORM 2' staticLink: false -toc: false +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/800-more/300-upgrade-guides/index.mdx b/content/200-orm/800-more/300-upgrade-guides/index.mdx index 8e2a37d6ef..48f2f461ed 100644 --- a/content/200-orm/800-more/300-upgrade-guides/index.mdx +++ b/content/200-orm/800-more/300-upgrade-guides/index.mdx @@ -1,10 +1,12 @@ --- title: 'Upgrade guides' metaTitle: 'Upgrade guides' -metaDescription: 'Learn how to upgrade Prisma versions.' -toc: false +description: 'Learn how to upgrade Prisma ORM versions.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/800-more/400-comparisons/01-prisma-and-typeorm.mdx b/content/200-orm/800-more/400-comparisons/01-prisma-and-typeorm.mdx index d8405c0194..09a5044328 100644 --- a/content/200-orm/800-more/400-comparisons/01-prisma-and-typeorm.mdx +++ b/content/200-orm/800-more/400-comparisons/01-prisma-and-typeorm.mdx @@ -1,42 +1,42 @@ --- title: 'TypeORM' -metaTitle: 'Prisma vs TypeORM' -metaDescription: 'Learn how Prisma compares to TypeORM.' +metaTitle: 'Prisma ORM vs TypeORM' +description: 'Learn how Prisma compares to TypeORM.' --- -This page compares Prisma and [TypeORM](https://typeorm.io/#/). If you want to learn how to migrate from TypeORM to Prisma, check out this [guide](/orm/more/migrating-to-prisma/migrate-from-typeorm). +This page compares Prisma ORM and [TypeORM](https://typeorm.io/#/). If you want to learn how to migrate from TypeORM to Prisma ORM, check out this [guide](/orm/more/migrating-to-prisma/migrate-from-typeorm). -## TypeORM vs Prisma +## TypeORM vs Prisma ORM -While Prisma and TypeORM solve similar problems, they work in very different ways. +While Prisma ORM and TypeORM solve similar problems, they work in very different ways. **TypeORM** is a traditional ORM which maps _tables_ to _model classes_. These model classes can be used to generate SQL migrations. Instances of the model classes then provide an interface for CRUD queries to an application at runtime. -**Prisma** is a new kind of ORM that mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. +**Prisma ORM** is a new kind of ORM that mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. It uses the [Prisma schema](/orm/prisma-schema) to define application models in a declarative way. Prisma Migrate then allows to generate SQL migrations from the Prisma schema and executes them against the database. CRUD queries are provided by Prisma Client, a lightweight and entirely type-safe database client for Node.js and TypeScript. ## API design & Level of abstraction -TypeORM and Prisma operate on different levels of abstraction. TypeORM is closer to mirroring SQL in its API while Prisma Client provides a higher-level abstraction that was carefully designed with the common tasks of application developers in mind. Prisma's API design heavily leans on the idea of [making the right thing easy](https://jason.energy/right-thing-easy-thing/). +TypeORM and Prisma ORM operate on different levels of abstraction. TypeORM is closer to mirroring SQL in its API while Prisma Client provides a higher-level abstraction that was carefully designed with the common tasks of application developers in mind. Prisma ORM's API design heavily leans on the idea of [making the right thing easy](https://jason.energy/right-thing-easy-thing/). While Prisma Client operates on a higher-level of abstraction, it strives to expose the full power of the underlying database and lets you drop down to [raw SQL](/orm/prisma-client/queries/raw-database-access/raw-queries) at any time if your use case requires it. -The following sections examine a few examples for how Prisma's and TypeORM's APIs differ in certain scenarios and what the rationale of Prisma's API design is in these cases. +The following sections examine a few examples for how Prisma ORM's and TypeORM's APIs differ in certain scenarios and what the rationale of Prisma ORM's API design is in these cases. ### Filtering -TypeORM primarily leans on SQL operators for filtering lists or records, e.g. with the `find` method. Prisma on the other hand, provides a more [generic set of operators](/orm/prisma-client/queries/filtering-and-sorting#filter-conditions-and-operators) that are intuitive to use. It should also be noted that, as explained in the type-safety section [below](#filtering-1), TypeORM loses type-safety in filter queries in many scenarios. +TypeORM primarily leans on SQL operators for filtering lists or records, e.g. with the `find` method. Prisma ORM on the other hand, provides a more [generic set of operators](/orm/prisma-client/queries/filtering-and-sorting#filter-conditions-and-operators) that are intuitive to use. It should also be noted that, as explained in the type-safety section [below](#filtering-1), TypeORM loses type-safety in filter queries in many scenarios. -A good example of how the filtering APIs of both TypeORM and Prisma differ is by looking at `string` filters. While TypeORM primarily provides the filter based on the `ILike` operator which comes directly from SQL, Prisma provides more specific operators that developers can use, e.g.: `contains`, `startsWith` and `endsWith`. +A good example of how the filtering APIs of both TypeORM and Prisma ORM differ is by looking at `string` filters. While TypeORM primarily provides the filter based on the `ILike` operator which comes directly from SQL, Prisma ORM provides more specific operators that developers can use, e.g.: `contains`, `startsWith` and `endsWith`. - + ```ts const posts = await prisma.post.findMany({ @@ -64,7 +64,7 @@ const posts = await postRepository.find({ - + ```ts const posts = await prisma.post.findMany({ @@ -92,7 +92,7 @@ const posts = await postRepository.find({ - + ```ts const posts = await prisma.post.findMany({ @@ -120,7 +120,7 @@ const posts = await postRepository.find({ - + ```ts const posts = await prisma.post.findMany({ @@ -148,11 +148,11 @@ const posts = await postRepository.find({ ### Pagination -TypeORM only offers limit-offset pagination while Prisma conveniently provides dedicated APIs for both limit-offset but also cursor-based. You can learn more about both approaches in the [Pagination](/orm/prisma-client/queries/pagination) section of the docs or in the API comparison [below](#pagination-1). +TypeORM only offers limit-offset pagination while Prisma ORM conveniently provides dedicated APIs for both limit-offset but also cursor-based. You can learn more about both approaches in the [Pagination](/orm/prisma-client/queries/pagination) section of the docs or in the API comparison [below](#pagination-1). ### Relations -Working with records that are connected via foreign keys can become very complex in SQL. Prisma's concept of [virtual relation field](/orm/prisma-schema/data-model/relations#relation-fields) enables an intuitive and convenient way for application developers to work with related data. Some benefits of Prisma's approach are: +Working with records that are connected via foreign keys can become very complex in SQL. Prisma ORM's concept of [virtual relation field](/orm/prisma-schema/data-model/relations#relation-fields) enables an intuitive and convenient way for application developers to work with related data. Some benefits of Prisma ORM's approach are: - traversing relationships via the fluent API ([docs](/orm/prisma-client/queries/relation-queries#fluent-api)) - nested writes that enable updating/creating connected records ([docs](/orm/prisma-client/queries/relation-queries#nested-writes)) @@ -166,13 +166,13 @@ Working with records that are connected via foreign keys can become very complex Prisma models are defined in the [Prisma schema](/orm/prisma-schema) while TypeORM uses classes and experimental TypeScript decorators for model definitions. With the Active Record ORM pattern, TypeORM's approach often leads to complex model instances that are becoming hard to maintain as an application grows. -Prisma on the other hand generates a lightweight database client that exposes a tailored and fully type-safe API to read and write data for the models that are defined in the Prisma schema, following the DataMapper ORM pattern rather than Active Record. +Prisma ORM on the other hand generates a lightweight database client that exposes a tailored and fully type-safe API to read and write data for the models that are defined in the Prisma schema, following the DataMapper ORM pattern rather than Active Record. -Prisma's DSL for data modeling is lean, simple and intuitive to use. When modeling data in VS Code, you can further take advantage of Prisma's powerful VS Code extension with features like autocompletion, quick fixes, jump to definition and other benefits that increase developer productivity. +Prisma ORM's DSL for data modeling is lean, simple and intuitive to use. When modeling data in VS Code, you can further take advantage of Prisma ORM's powerful VS Code extension with features like autocompletion, quick fixes, jump to definition and other benefits that increase developer productivity. - + ```prisma model User { @@ -243,13 +243,13 @@ export class Post { -Migrations work in similar fashions in TypeORM and Prisma. Both tools follow the approach of generating SQL files based on the provided model definitions and provide a CLI to execute them against the database. The SQL files can be modified before the migrations are executed so that any custom database operation can be performed with either migration system. +Migrations work in similar fashions in TypeORM and Prisma ORM. Both tools follow the approach of generating SQL files based on the provided model definitions and provide a CLI to execute them against the database. The SQL files can be modified before the migrations are executed so that any custom database operation can be performed with either migration system. ## Type safety TypeORM has been one of the first ORMs in the Node.js ecosystem to fully embrace TypeScript and has done a great job in enabling developers to get a certain level of type safety for their database queries. -However, there are numerous situations where the type safety guarantees of TypeORM fall short. The following sections describe the scenarios where Prisma can provide stronger guarantees for the types of query results. +However, there are numerous situations where the type safety guarantees of TypeORM fall short. The following sections describe the scenarios where Prisma ORM can provide stronger guarantees for the types of query results. ### Selecting fields @@ -259,9 +259,9 @@ This section explains the differences in type safety when selecting a subset of TypeORM provides a `select` option for its [`find`](https://typeorm.io/#/find-options) methods (e.g. `find`, `findByIds`, `findOne`, ...), for example: -, ]}> + - + ```ts const postRepository = getManager().getRepository(Post) @@ -271,9 +271,9 @@ const publishedPosts: Post[] = await postRepository.find({ }) ``` - + - + ```ts @Entity() @@ -295,7 +295,7 @@ export class Post { } ``` - + @@ -318,15 +318,15 @@ TypeError: Cannot read property 'length' of undefined The TypeScript compiler only sees the `Post` type of the returned objects, but it doesn't know about the fields that these objects _actually_ carry at runtime. It therefore can't protect you from accessing fields that have not been retrieved in the database query, resulting in a runtime error. -#### Prisma +#### Prisma ORM Prisma Client can guarantee full type safety in the same situation and protects you from accessing fields that were not retrieved from the database. Consider the same example with a Prisma Client query: -, ]}> + - + ```ts const publishedPosts = await prisma.post.findMany({ @@ -344,9 +344,9 @@ if (post.content.length > 0) { } ``` - + - + ```prisma model Post { @@ -359,7 +359,7 @@ model Post { } ``` - + @@ -393,9 +393,9 @@ TypeORM allows to eagerly load relations from the database via the `relations` o Consider this example: -, ]}> + - + ```ts const postRepository = getManager().getRepository(Post) @@ -405,9 +405,9 @@ const publishedPosts: Post[] = await postRepository.find({ }) ``` - + - + ```ts @Entity() @@ -446,7 +446,7 @@ export class User { } ``` - + @@ -466,13 +466,13 @@ This subtle typo would now lead to the following runtime error: UnhandledPromiseRejectionWarning: Error: Relation "authors" was not found; please check if it is correct and really exists in your entity. ``` -#### Prisma +#### Prisma ORM -Prisma protects you from mistakes like this and thus eliminates a whole class of errors that can occur in your application at runtime. When using `include` to load a relation in a Prisma Client query, you can not only take advantage of autocompletion to specify the query, but the result of the query will also be properly typed: +Prisma ORM protects you from mistakes like this and thus eliminates a whole class of errors that can occur in your application at runtime. When using `include` to load a relation in a Prisma Client query, you can not only take advantage of autocompletion to specify the query, but the result of the query will also be properly typed: -, ]}> + - + ```ts const publishedPosts = await prisma.post.findMany({ @@ -481,9 +481,9 @@ const publishedPosts = await prisma.post.findMany({ }) ``` - + - + ```ts model User { @@ -503,7 +503,7 @@ model Post { } ``` - + @@ -517,12 +517,12 @@ const publishedPosts: (Post & { For reference, this is what the `User` and `Post` types look like that Prisma Client generates for your Prisma models: -, ]}> + - + ```ts -// Generated by Prisma +// Generated by Prisma ORM export type User = { id: number name: string | null @@ -530,12 +530,12 @@ export type User = { } ``` - + - + ```ts -// Generated by Prisma +// Generated by Prisma ORM export type Post = { id: number title: string @@ -545,7 +545,7 @@ export type Post = { } ``` - + @@ -561,9 +561,9 @@ TypeORM allows to pass a `where` option to its [`find`](https://typeorm.io/#/fin Consider this example: -, ]}> + - + ```ts const postRepository = getManager().getRepository(Post) @@ -576,9 +576,9 @@ const publishedPosts: Post[] = await postRepository.find({ }) ``` - + - + ```ts @Entity() @@ -603,7 +603,7 @@ export class Post { } ``` - + @@ -648,13 +648,13 @@ In this case, your application again fails at runtime with the following error: EntityColumnNotFound: No entity column "viewCount" was found. ``` -#### Prisma +#### Prisma ORM -Both filtering scenarios that are problematic with TypeORM in terms of type-safety are covered by Prisma in a fully type-safe way. +Both filtering scenarios that are problematic with TypeORM in terms of type-safety are covered by Prisma ORM in a fully type-safe way. ##### Type-safe usage of operators -With Prisma, the TypeScript compiler enforces the correct usage of an operator per field: +With Prisma ORM, the TypeScript compiler enforces the correct usage of an operator per field: ```ts const publishedPosts = await prisma.post.findMany({ @@ -694,7 +694,7 @@ src/index.ts:39:5 - error TS2322: Type '{ gt: string; }' is not assignable to ty With TypeORM, you are able to specify a property on the `where` option that doesn't map to a model's field. In the above example, filtering for `viewCount` therefore led to a runtime error because the field actually is called `views`. -With Prisma, the TypeScript compiler will not allow to reference any properties inside of `where` that don't exist on the model: +With Prisma ORM, the TypeScript compiler will not allow to reference any properties inside of `where` that don't exist on the model: ```ts const publishedPosts = await prisma.post.findMany({ @@ -726,9 +726,9 @@ With TypeORM, there are two main ways to create new records in the database: `in Consider this example: -, , ]}> + - + ```ts const userRepository = getManager().getRepository(User) @@ -737,9 +737,9 @@ newUser.name = 'Alice' userRepository.save(newUser) ``` - + - + ```ts const userRepository = getManager().getRepository(User) @@ -748,9 +748,9 @@ userRepository.insert({ }) ``` - + - + ```ts @Entity() @@ -769,7 +769,7 @@ export class User { } ``` - + @@ -781,15 +781,15 @@ QueryFailedError: null value in column "email" of relation "user" violates not-n The `email` field is defined as required on the `User` entity (which is enforced by a `NOT NULL` constraint in the database). -### Prisma +### Prisma ORM -Prisma protects you from these kind of mistakes by enforcing that you submit values for _all_ required fields of a model. +Prisma ORM protects you from these kind of mistakes by enforcing that you submit values for _all_ required fields of a model. For example, the following attempt to create a new `User` where the required `email` field is missing would be caught by the TypeScript compiler: -, ]}> + - + ```ts const newUser = await prisma.user.create({ @@ -799,9 +799,9 @@ const newUser = await prisma.user.create({ }) ``` - + - + ```prisma model User { @@ -811,7 +811,7 @@ model User { } ``` - + @@ -826,7 +826,7 @@ src/index.ts:39:5 - error TS2741: Property 'email' is missing in type '{ name: s ### Fetching single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -845,7 +845,7 @@ const user = await userRepository.findOne(id) ### Fetching selected scalars of single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -869,9 +869,10 @@ const user = await userRepository.findOne(id, { ### Fetching relations -**Prisma** +**Prisma ORM** - + + ```ts const posts = await prisma.user.findUnique({ @@ -884,6 +885,9 @@ const posts = await prisma.user.findUnique({ }) ``` + + + ```ts const posts = await prisma.user .findUnique({ @@ -894,13 +898,15 @@ const posts = await prisma.user .post() ``` - + + > **Note**: `select` return a `user` object that includes a `post` array, whereas the fluent API only returns a `post` array. **TypeORM** - + + ```ts const userRepository = getRepository(User) @@ -909,6 +915,9 @@ const user = await userRepository.findOne(id, { }) ``` + + + ```ts const userRepository = getRepository(User) const user = await userRepository.findOne(id, { @@ -921,16 +930,20 @@ const user = await userRepository.findOne(id, { }) ``` + + + ```ts const userRepository = getRepository(User) const user = await userRepository.findOne(id) ``` - + + ### Filtering for concrete values -**Prisma** +**Prisma ORM** ```ts const posts = await prisma.post.findMany({ @@ -955,9 +968,9 @@ const users = await userRepository.find({ ### Other filter criteria -**Prisma** +**Prisma ORM** -Prisma generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. +Prisma ORM generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. **TypeORM** @@ -965,9 +978,9 @@ TypeORM provides [built-in operators](https://typeorm.io/#/find-options/advanced ### Relation filters -**Prisma** +**Prisma ORM** -Prisma lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. +Prisma ORM lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. For example, the following query returns users with one or more posts with "Hello" in the title: @@ -991,7 +1004,7 @@ TypeORM doesn't offer a dedicated API for relation filters. You can get similar ### Pagination -**Prisma** +**Prisma ORM** Cursor-style pagination: @@ -1025,7 +1038,7 @@ const posts = await postRepository.find({ ### Creating objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.create({ @@ -1037,7 +1050,8 @@ const user = await prisma.user.create({ **TypeORM** - + + ```ts const user = new User() @@ -1046,6 +1060,9 @@ user.email = 'alice@prisma.io' await user.save() ``` + + + ```ts const userRepository = getRepository(User) const user = await userRepository.create({ @@ -1055,6 +1072,9 @@ const user = await userRepository.create({ await user.save() ``` + + + ```ts const userRepository = getRepository(User) await userRepository.insert({ @@ -1063,11 +1083,12 @@ await userRepository.insert({ }) ``` - + + ### Updating objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.update({ @@ -1092,7 +1113,7 @@ const updatedUser = await userRepository.update(id, { ### Deleting objects -**Prisma** +**Prisma ORM** ```ts const deletedUser = await prisma.user.delete({ @@ -1104,23 +1125,28 @@ const deletedUser = await prisma.user.delete({ **TypeORM** - + + ```ts const userRepository = getRepository(User) await userRepository.delete(id) ``` + + + ```ts const userRepository = getRepository(User) const deletedUser = await userRepository.remove(user) ``` - + + ### Batch updates -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.updateMany({ @@ -1143,7 +1169,7 @@ You can use the [query builder to update entities in your database](https://type ### Batch deletes -**Prisma** +**Prisma ORM** ```ts const users = await prisma.user.deleteMany({ @@ -1157,23 +1183,28 @@ const users = await prisma.user.deleteMany({ **TypeORM** - + + ```ts const userRepository = getRepository(User) await userRepository.delete([id1, id2, id3]) ``` + + + ```ts const userRepository = getRepository(User) const deleteUsers = await userRepository.remove([user1, user2, user3]) ``` - + + ### Transactions -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.create({ diff --git a/content/200-orm/800-more/400-comparisons/02-prisma-and-sequelize.mdx b/content/200-orm/800-more/400-comparisons/02-prisma-and-sequelize.mdx index 93436111f6..6f83216b28 100644 --- a/content/200-orm/800-more/400-comparisons/02-prisma-and-sequelize.mdx +++ b/content/200-orm/800-more/400-comparisons/02-prisma-and-sequelize.mdx @@ -1,22 +1,22 @@ --- title: 'Sequelize' -metaTitle: 'Prisma vs Sequelize' -metaDescription: 'Learn how Prisma compares to Sequelize.' +metaTitle: 'Prisma ORM vs Sequelize' +description: 'Learn how Prisma ORM compares to Sequelize.' --- -This page compares the Prisma and [Sequelize](https://sequelize.org/master/) APIs. +This page compares the Prisma ORM and [Sequelize](https://sequelize.org/master/) APIs. -## Sequelize vs Prisma +## Sequelize vs Prisma ORM -While Prisma and Sequelize solve similar problems, they work in very different ways. +While Prisma ORM and Sequelize solve similar problems, they work in very different ways. **Sequelize** is a traditional ORM which maps _tables_ to _model classes_. Instances of the model classes then provide an interface for CRUD queries to an application at runtime. -**Prisma** is a new kind of ORM that mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. +**Prisma ORM** is a new kind of ORM that mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. It uses the [Prisma schema](/orm/prisma-schema) to define application models in a declarative way. Prisma Migrate then allows to generate SQL migrations from the Prisma schema and executes them against the database. CRUD queries are provided by Prisma Client, a lightweight and entirely type-safe database client for Node.js and TypeScript. @@ -24,7 +24,7 @@ It uses the [Prisma schema](/orm/prisma-schema) to define application models in ### Fetching single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -42,7 +42,7 @@ const user = await User.findByPk(id) ### Fetching selected scalars of single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -61,17 +61,18 @@ const user = await prisma.user.findUnique({ const user = await User.findByPk(1, { attributes: ['name'], raw: true }) ``` - +:::tip Use the `raw: true` query option to return plain JavaScript objects. - +::: ### Fetching relations -**Prisma** +**Prisma ORM** - + + ```ts const posts = await prisma.user.findUnique({ @@ -84,6 +85,9 @@ const posts = await prisma.user.findUnique({ }) ``` + + + ```ts const posts = await prisma.user .findUnique({ @@ -94,7 +98,8 @@ const posts = await prisma.user .post() ``` - + + > **Note**: `select` returns a `user` object that includes a `post` array, whereas the fluent API only returns a `post` array. @@ -110,15 +115,15 @@ const user = await User.findByPk(id, { }) ``` - +:::tip Use `model: Post as "Post"` if you used an alias to define the relationship between `User` and `Post` - for example: `User.hasMany(Post, { as: "Post", foreignKey: "authorId" });` - +::: ### Filtering for concrete values -**Prisma** +**Prisma ORM** ```ts const posts = await prisma.post.findMany({ @@ -145,9 +150,9 @@ const post = await Post.findAll({ ### Other filter criteria -**Prisma** +**Prisma ORM** -Prisma generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. +Prisma ORM generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. **Sequelize** @@ -155,9 +160,9 @@ Sequelize has an [extensive set of operators](https://sequelize.org/master/manua ### Relation filters -**Prisma** +**Prisma ORM** -Prisma lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. +Prisma ORM lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. For example, the following query returns users with one or more posts with "Hello" in the title: @@ -181,7 +186,7 @@ Sequelize [doesn't offer a dedicated API for relation filters](https://github.co ### Pagination -**Prisma** +**Prisma ORM** Cursor-style pagination: @@ -231,7 +236,7 @@ const posts = await Post.findAll({ ### Creating objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.create({ @@ -243,8 +248,8 @@ const user = await prisma.user.create({ **Sequelize** - - + + ```ts const user = User.build({ name: 'Alice', @@ -252,19 +257,20 @@ const user = User.build({ }) await user.save() ``` - + + ```ts const user = await User.create({ name: 'Alice', email: 'alice@prisma,io', }) ``` - - + + ### Updating objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.update({ @@ -279,26 +285,27 @@ const user = await prisma.user.update({ **Sequelize** - - + + ```ts user.name = 'James' user.email = ' alice@prisma.com' await user.save() ``` - + + ```ts await User.update({ name: 'James', email: 'james@prisma.io', }) ``` - - + + ### Deleting objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.delete({ @@ -316,7 +323,7 @@ await user.destroy() ### Batch updates -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.updateMany({ @@ -346,7 +353,7 @@ const updatedUsers = await User.update({ ### Batch deletes -**Prisma** +**Prisma ORM** ```ts const users = await prisma.user.deleteMany({ @@ -372,7 +379,7 @@ await User.destroy({ ### Transactions -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.create({ @@ -391,8 +398,8 @@ const user = await prisma.user.create({ **Sequelize** - - + + ```ts return sequelize.$transaction(async (t) => { const user = await User.create( @@ -423,7 +430,8 @@ return sequelize.$transaction(async (t) => { await user.setPosts([post1, post2]) }) ``` - + + ```ts return sequelize.$transaction(async (transaction) => { try { @@ -443,5 +451,5 @@ return sequelize.$transaction(async (transaction) => { } }) ``` - - + + diff --git a/content/200-orm/800-more/400-comparisons/03-prisma-and-mongoose.mdx b/content/200-orm/800-more/400-comparisons/03-prisma-and-mongoose.mdx index 8e447267f2..02963258b7 100644 --- a/content/200-orm/800-more/400-comparisons/03-prisma-and-mongoose.mdx +++ b/content/200-orm/800-more/400-comparisons/03-prisma-and-mongoose.mdx @@ -1,18 +1,18 @@ --- title: 'Mongoose' -metaTitle: 'Prisma vs Mongoose' -metaDescription: 'Learn how Prisma compares to Mongoose.' +metaTitle: 'Prisma ORM vs Mongoose' +description: 'Learn how Prisma ORM compares to Mongoose.' --- -This page compares the Prisma and [Mongoose](https://mongoosejs.com/docs/guide.html) APIs. If you want to learn how to migrate from Mongoose to Prisma, check out this [guide](/orm/more/migrating-to-prisma/migrate-from-mongoose). +This page compares the Prisma ORM and [Mongoose](https://mongoosejs.com/docs/guide.html) APIs. If you want to learn how to migrate from Mongoose to Prisma, check out this [guide](/orm/more/migrating-to-prisma/migrate-from-mongoose). ## Fetching single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -30,7 +30,7 @@ const result = await User.findById(1) ## Fetching selected scalars of single objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.findUnique({ @@ -51,10 +51,10 @@ const user = await User.findById(1).select(['name']) ## Fetching relations -**Prisma** - - +**Prisma ORM** + + ```ts const userWithPost = await prisma.user.findUnique({ where: { @@ -65,7 +65,8 @@ const userWithPost = await prisma.user.findUnique({ }, }) ``` - + + ```ts const userWithPost = await prisma.user .findUnique({ @@ -75,8 +76,8 @@ const userWithPost = await prisma.user }) .post() ``` - - + + **Mongoose** @@ -86,7 +87,7 @@ const userWithPost = await User.findById(2).populate('post') ## Filtering for concrete values -**Prisma** +**Prisma ORM** ```ts const posts = await prisma.post.findMany({ @@ -108,9 +109,9 @@ const posts = await Post.find({ ## Other filter criteria -**Prisma** +**Prisma ORM** -Prisma generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. +Prisma ORM generates many [additional filters](/orm/prisma-client/queries/filtering-and-sorting) that are commonly used in modern application development. **Mongoose** @@ -118,9 +119,9 @@ Mongoose exposes the [MongoDB query selectors](https://docs.mongodb.com/manual/r ## Relation filters -**Prisma** +**Prisma ORM** -Prisma lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. +Prisma ORM lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a _relation_ of that model. For example, the following query returns users with one or more posts with "Hello" in the title: @@ -144,7 +145,7 @@ Mongoose doesn't offer a dedicated API for relation filters. You can get similar ## Pagination -**Prisma** +**Prisma ORM** Cursor-style pagination: @@ -177,7 +178,7 @@ const posts = await Post.find({ ## Creating objects -**Prisma** +**Prisma ORM** ```ts const user = await prisma.user.create({ @@ -190,15 +191,16 @@ const user = await prisma.user.create({ **Mongoose** - - + + ```ts const user = await User.create({ name: 'Alice', email: 'alice@prisma.io', }) ``` - + + ```ts const user = new User({ name: 'Alice', @@ -206,12 +208,12 @@ const user = new User({ }) await user.save() ``` - - + + ## Updating objects -**Prisma** +**Prisma ORM ** ```ts const user = await prisma.user.update({ @@ -226,8 +228,8 @@ const user = await prisma.user.update({ **Mongoose** - - + + ```ts const updatedUser = await User.findOneAndUpdate( { _id: 2 }, @@ -238,17 +240,18 @@ const updatedUser = await User.findOneAndUpdate( } ) ``` - + + ```ts user.name = 'Alicia' await user.save() ``` - - + + ## Deleting objects -**Prisma** +**Prisma ORM** ```ts const user = prisma.user.delete({ @@ -266,7 +269,7 @@ await User.deleteOne({ _id: 10 }) ## Batch deletes -**Prisma** +**Prisma ORM** ```ts const users = await prisma.user.deleteMany({ diff --git a/content/200-orm/800-more/400-comparisons/04-prisma-and-drizzle.mdx b/content/200-orm/800-more/400-comparisons/04-prisma-and-drizzle.mdx index 7f906ff804..853bd5ef73 100644 --- a/content/200-orm/800-more/400-comparisons/04-prisma-and-drizzle.mdx +++ b/content/200-orm/800-more/400-comparisons/04-prisma-and-drizzle.mdx @@ -1,30 +1,30 @@ --- title: 'Drizzle' -metaTitle: 'Prisma vs Drizzle' -metaDescription: 'Learn how Prisma compares to Drizzle.' +metaTitle: 'Prisma ORM vs Drizzle' +description: 'Learn how Prisma ORM compares to Drizzle.' --- -This page compares Prisma and Drizzle. +This page compares Prisma ORM and Drizzle. -## Drizzle vs Prisma +## Drizzle vs Prisma ORM -While Prisma and Drizzle solve similar problems, they work in very different ways and have individual pros and cons. Which one to choose will depend on the needs of your project and the exact tradeoffs that are important for it. +While Prisma ORM and Drizzle solve similar problems, they work in very different ways and have individual pros and cons. Which one to choose will depend on the needs of your project and the exact tradeoffs that are important for it. **Drizzle** is a traditional SQL query builder that lets you compose SQL queries with JavaScript/TypeScript functions. It can be used to query a database or run migrations. Drizzle also offers a Queries API, which offers a higher level abstraction from SQL and can be used to read nested relations. Drizzle schema is defined in TypeScript files, which are used to generate SQL migrations and are then executed against a database. -**Prisma** ORM mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. It uses the [Prisma schema](/orm/prisma-schema) to define application models in a declarative way. Prisma Migrate then allows the generation of SQL migrations from the Prisma schema and executes them against the database. CRUD queries are provided by Prisma Client, a lightweight and entirely type-safe database client for Node.js and TypeScript. +**Prisma ORM** mitigates many problems of traditional ORMs, such as bloated model instances, mixing business with storage logic, lack of type-safety or unpredictable queries caused e.g. by lazy loading. It uses the [Prisma schema](/orm/prisma-schema) to define application models in a declarative way. Prisma Migrate then allows the generation of SQL migrations from the Prisma schema and executes them against the database. CRUD queries are provided by Prisma Client, a lightweight and entirely type-safe database client for Node.js and TypeScript. ## API design & Level of abstraction -Drizzle and Prisma operate on different levels of abstraction. Drizzle's philosophy is "If you know SQL, you know Drizzle ORM". It mirrors SQL in its API while Prisma Client provides a higher-level abstraction that was designed with the common tasks of application developers in mind. Prisma's API design heavily leans on the idea of [making the right thing easy](https://www.jason.af/right-thing-easy-thing/). +Drizzle and Prisma ORM operate on different levels of abstraction. Drizzle's philosophy is "If you know SQL, you know Drizzle ORM". It mirrors SQL in its API while Prisma Client provides a higher-level abstraction that was designed with the common tasks of application developers in mind. Prisma ORM's API design heavily leans on the idea of [making the right thing easy](https://www.jason.af/right-thing-easy-thing/). -While Prisma Client operates on a higher level of abstraction, you are able to drop down to [raw SQL](/orm/prisma-client/queries/raw-database-access/raw-queries) at any time. However, full use of Prisma ORM and development of your application does not require SQL knowledge. Prisma's goal is to construct a query syntax focused on developer experience and productivity that feels familiar to developers. You can learn more about this here: [Why Prisma](/orm/overview/introduction/why-prisma#application-developers-should-care-about-data--not-sql). +While Prisma Client operates on a higher level of abstraction, you are able to drop down to [raw SQL](/orm/prisma-client/queries/raw-database-access/raw-queries) at any time. However, full use of Prisma ORM and development of your application does not require SQL knowledge. Prisma ORM's goal is to construct a query syntax focused on developer experience and productivity that feels familiar to developers. You can learn more about this here: [Why Prisma](/orm/overview/introduction/why-prisma#application-developers-should-care-about-data--not-sql). -The following sections examine a few examples of how Prisma's and Drizzle's APIs differ in certain scenarios and what the rationale of Prisma's API design is in these cases. +The following sections examine a few examples of how Prisma ORM's and Drizzle's APIs differ in certain scenarios and what the rationale of Prisma ORM's API design is in these cases. ### Data modeling @@ -32,11 +32,11 @@ Prisma models are defined in the [Prisma schema](/orm/prisma-schema), while Driz Prisma generates a lightweight database client that exposes a tailored and fully type-safe API to read and write data for the models that are defined in the Prisma schema, following the DataMapper ORM pattern. -Prisma's DSL for data modeling is lean, simple and intuitive to use. When modeling data in VS Code, you can further take advantage of Prisma's powerful [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) with features like autocompletion, quick fixes, jump to definition and other benefits that increase developer productivity. On the other hand, Drizzle's use of TypeScript means that you can lean on the power of TypeScript for additional flexibility (via reused code, for example). +Prisma ORM's DSL for data modeling is lean, simple and intuitive to use. When modeling data in VS Code, you can further take advantage of Prisma ORM's powerful [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) with features like autocompletion, quick fixes, jump to definition and other benefits that increase developer productivity. On the other hand, Drizzle's use of TypeScript means that you can lean on the power of TypeScript for additional flexibility (via reused code, for example). - + ```prisma model User { @@ -92,15 +92,15 @@ export const posts = pgTable('posts', { ### Migrations -Migrations work similarly between Drizzle and Prisma. Both tools follow the approach of generating SQL files based on the provided model definitions and provide a CLI to execute them against the database. The SQL files can be modified before the migrations are executed so that any custom database operation can be performed with either migration system. +Migrations work similarly between Drizzle and Prisma ORM. Both tools follow the approach of generating SQL files based on the provided model definitions and provide a CLI to execute them against the database. The SQL files can be modified before the migrations are executed so that any custom database operation can be performed with either migration system. ### Querying -Plain queries are natural to construct in both Drizzle and Prisma. Using Drizzle's Queries API, the two approaches are very similar: +Plain queries are natural to construct in both Drizzle and Prisma ORM. Using Drizzle's Queries API, the two approaches are very similar: - + ```ts // find all users @@ -146,7 +146,7 @@ When performing a mutation, a `create`, `update`, or `delete`, the Drizzle Queri - + ```ts // create a user @@ -200,7 +200,7 @@ const deletedUser = await db ### Relations -Working with records that are connected via foreign keys can become very complex in SQL. Prisma's concept of [virtual relation field](/orm/prisma-schema/data-model/relations#relation-fields) enables an intuitive and convenient way for application developers to work with related data. Some benefits of Prisma's approach are: +Working with records that are connected via foreign keys can become very complex in SQL. Prisma ORM's concept of [virtual relation field](/orm/prisma-schema/data-model/relations#relation-fields) enables an intuitive and convenient way for application developers to work with related data. Some benefits of Prisma ORM's approach are: - traversing relationships via the fluent API ([docs](/orm/prisma-client/queries/relation-queries#fluent-api)) - nested writes that enable updating/creating connected records ([docs](/orm/prisma-client/queries/relation-queries#nested-writes)) @@ -212,7 +212,7 @@ Working with records that are connected via foreign keys can become very complex - + ```ts const posts = await prisma.post.findMany({ @@ -240,13 +240,13 @@ const posts = await db.query.posts.findMany({ ### Filtering -Drizzle exposes the underlying filter and conditional operators for a given SQL dialect. Prisma on the other hand, provides a more [generic set of operators](/orm/prisma-client/queries/filtering-and-sorting#filter-conditions-and-operators) that are intuitive to use. +Drizzle exposes the underlying filter and conditional operators for a given SQL dialect. Prisma ORM on the other hand, provides a more [generic set of operators](/orm/prisma-client/queries/filtering-and-sorting#filter-conditions-and-operators) that are intuitive to use. -A good example of how the filtering APIs of both Drizzle and Prisma differ is by looking at `string` filters. While Drizzle provides filters for `like` and `ilike`, Prisma provides more specific operators that developers can use, e.g.: `contains`, `startsWith` and `endsWith`. +A good example of how the filtering APIs of both Drizzle and Prisma ORM differ is by looking at `string` filters. While Drizzle provides filters for `like` and `ilike`, Prisma ORM provides more specific operators that developers can use, e.g.: `contains`, `startsWith` and `endsWith`. - + ```ts // case sensitive filter @@ -289,7 +289,7 @@ const posts = await db - + ```ts const posts = await prisma.post.findMany({ @@ -318,7 +318,7 @@ const posts = await db - + ```ts const posts = await prisma.post.findMany({ @@ -347,7 +347,7 @@ const posts = await db - + ```ts const posts = await prisma.post.findMany({ @@ -376,11 +376,11 @@ const posts = await db ### Pagination -Drizzle only offers limit-offset pagination while Prisma conveniently provides dedicated APIs for both limit-offset but also cursor-based. You can learn more about both approaches in the [Pagination](/orm/prisma-client/queries/pagination) section of the docs. +Drizzle only offers limit-offset pagination while Prisma ORM conveniently provides dedicated APIs for both limit-offset but also cursor-based. You can learn more about both approaches in the [Pagination](/orm/prisma-client/queries/pagination) section of the docs. - + ```ts // limit-offset pagination @@ -422,9 +422,9 @@ const postPage = await db ### Observability -Both Drizzle and Prisma have the ability to log queries and the underlying SQL generated. +Both Drizzle and Prisma ORM have the ability to log queries and the underlying SQL generated. -Prisma has additional features built into the client that help teams get a better understanding of their data usage. [Metrics](/orm/prisma-client/observability-and-logging/metrics) and [tracing](/orm/prisma-client/observability-and-logging/opentelemetry-tracing) are two features that can be enabled at any time and give you per query information. This information can be integrated with external tools so that you can track performance over time. +Prisma ORM has additional features built into the client that help teams get a better understanding of their data usage. [Metrics](/orm/prisma-client/observability-and-logging/metrics) and [tracing](/orm/prisma-client/observability-and-logging/opentelemetry-tracing) are two features that can be enabled at any time and give you per query information. This information can be integrated with external tools so that you can track performance over time. ## Additional products @@ -439,11 +439,11 @@ These products work hand-in-hand with Prisma ORM to offer comprehensive data too ## Ecosystem -Both Drizzle and Prisma have cases where users want to do something not directly supported by the library. Drizzle relies on the expressiveness of SQL to avoid these cases, while Prisma has built [Prisma Client extensions](/orm/prisma-client/client-extensions) to allow any user to add additional behaviors to their instance of Prisma Client. These extensions are also shareable, meaning teams can develop them for use across their projects or even for use by other teams. +Both Drizzle and Prisma ORM have cases where users want to do something not directly supported by the library. Drizzle relies on the expressiveness of SQL to avoid these cases, while Prisma ORM has [Prisma Client extensions](/orm/prisma-client/client-extensions) to allow any user to add additional behaviors to their instance of Prisma Client. These extensions are also shareable, meaning teams can develop them for use across their projects or even for use by other teams. -While Drizzle is a relatively new product, Prisma ORM was [released in 2021](https://www.prisma.io/blog/prisma-the-complete-orm-inw24qjeawmb) and is well established in the JavaScript/TypeScript space. It has proven value , many companies trust [Prisma in production](http://prisma.io/showcase). +While Drizzle is a relatively new product, Prisma ORM was [released in 2021](https://www.prisma.io/blog/prisma-the-complete-orm-inw24qjeawmb) and is well established in the JavaScript/TypeScript space. It has proven value , many companies trust [Prisma ORM in production](http://prisma.io/showcase). -Prisma is also included as the data layer tool of choice in many meta-frameworks and development platforms like [Amplication](https://amplication.com/), [Wasp](https://wasp-lang.dev/), [RedwoodJS](https://redwoodjs.com/), [KeystoneJS](https://keystonejs.com/), [Remix](https://remix.run/) and the [t3 stack](https://create.t3.gg/). +Prisma ORM is also included as the data layer tool of choice in many meta-frameworks and development platforms like [Amplication](https://amplication.com/), [Wasp](https://wasp-lang.dev/), [RedwoodJS](https://redwoodjs.com/), [KeystoneJS](https://keystonejs.com/), [Remix](https://remix.run/) and the [t3 stack](https://create.t3.gg/). Thanks to its maturity, Prisma's community has developed a [plethora of useful tools](https://www.prisma.io/ecosystem) that helps with various Prisma workflows. Here are a few highlights: @@ -454,19 +454,20 @@ Thanks to its maturity, Prisma's community has developed a [plethora of useful t - [`jest-prisma`](https://github.com/Quramy/jest-prisma): Environment for Prisma integrated testing with [Jest](https://jestjs.io/). - [`prisma-pothos-types`](https://github.com/hayes/pothos/tree/main/packages/plugin-prisma): Creates GraphQL types based on Prisma models when using [GraphQL Pothos](https://github.com/hayes/pothos/tree/main). - [`prisma-trpc-generator`](https://github.com/omar-dulaimi/prisma-trpc-generator): Creates [tRPC](https://trpc.io/) routers from your Prisma schema. +- [`@cerbos/orm-prisma`](https://github.com/cerbos/query-plan-adapters/tree/main/prisma): Filter data based on authorization policies from [Cerbos](https://cerbos.dev). ## Database support -Both Drizzle and Prisma support multiple and different kinds of databases. Drizzle achieves this support through driver implementations created by Drizzle, which integrate with existing third-party database drivers. +Both Drizzle and Prisma ORM support multiple and different kinds of databases. Drizzle achieves this support through driver implementations created by Drizzle, which integrate with existing third-party database drivers. -Prisma has begun adding support for [third-party database drivers](https://www.prisma.io/blog/serverless-database-drivers-KML1ehXORxZV), but primarily uses [built-in drivers](/orm/more/under-the-hood/engines#the-query-engine-at-runtime) to communicate with an underlying database. Prisma also defaults connections to TLS, which improves security. +Prisma ORM has begun adding support for [third-party database drivers](https://www.prisma.io/blog/serverless-database-drivers-KML1ehXORxZV), but primarily uses [built-in drivers](/orm/more/under-the-hood/engines#the-query-engine-at-runtime) to communicate with an underlying database. Prisma also defaults connections to TLS, which improves security. -Additionally, Prisma supports CockroachDB, Microsoft SQL Server, and MongoDB, which Drizzle does not currently support. Prisma also offers the [relation mode](/orm/prisma-schema/data-model/relations/relation-mode) that allows Prisma to emulate foreign key constraints for those database engines that do not support it. Drizzle currently supports Cloudflare D1, `bun:sqlite`, and SQLite via HTTP Proxy, which Prisma does not. +Additionally, Prisma ORM supports CockroachDB, Microsoft SQL Server, and MongoDB, which Drizzle does not currently support. Prisma ORM also offers the [relation mode](/orm/prisma-schema/data-model/relations/relation-mode) that allows Prisma ORM to emulate foreign key constraints for those database engines that do not support it. Drizzle currently supports Cloudflare D1, `bun:sqlite`, and SQLite via HTTP Proxy, which Prisma ORM currently does not. ## Conclusion -Both Drizzle ORM and Prisma ORM are tools for data access and migrations. Drizzle is focused on being a thin wrapper around a SQL-like syntax while Prisma is focused on a convenient and expressive API. Other important differences include Prisma's support of MSSQL and MongoDB, support for additional features via [Prisma Client extensions](/orm/prisma-client/client-extensions), additional cloud-ready products, and a robust ecosystem. +Both Drizzle ORM and Prisma ORM are tools for data access and migrations. Drizzle is focused on being a thin wrapper around a SQL-like syntax while Prisma is focused on a convenient and expressive API. Other important differences include Prisma ORM's support of MSSQL and MongoDB, support for additional features via [Prisma Client extensions](/orm/prisma-client/client-extensions), additional cloud-ready products, and a robust ecosystem. -For teams that use SQL daily, Drizzle offers a convenient wrapper that will feel familiar and is type-safe. Prisma's `$queryRaw` feature, while available, does not provide the same level of type safety. However, the experience of writing raw SQL in Prisma ORM can be enhanced using the [SafeQL](https://safeql.dev/compatibility/prisma.html) community plugin for Prisma, offering syntax highlighting and type-checking in your editor as well. +For teams that use SQL daily, Drizzle offers a convenient wrapper that will feel familiar and is type-safe. Prisma ORM's `$queryRaw` feature, while available, does not provide the same level of type safety. However, the experience of writing raw SQL in Prisma ORM can be enhanced using the [SafeQL](https://safeql.dev/compatibility/prisma.html) community plugin for Prisma ORM, offering syntax highlighting and type-checking in your editor as well. -On the other hand, for teams that are a mix of developers (front-end, back-end, and full-stack) that have varying levels of experience with databases, Prisma offers a comprehensive and easy-to-learn approach for data access and managing database schemas. +On the other hand, for teams that are a mix of developers (front-end, back-end, and full-stack) that have varying levels of experience with databases, Prisma ORM offers a comprehensive and easy-to-learn approach for data access and managing database schemas. diff --git a/content/200-orm/800-more/400-comparisons/index.mdx b/content/200-orm/800-more/400-comparisons/index.mdx index 115bb88b9f..d3d41a207e 100644 --- a/content/200-orm/800-more/400-comparisons/index.mdx +++ b/content/200-orm/800-more/400-comparisons/index.mdx @@ -1,12 +1,13 @@ --- -title: 'Comparing Prisma' -metaTitle: 'Comparing Prisma to other ORMs and ODMs.' -metaDescription: 'Learn how Prisma compares to other ORMs, ORMs and database libraries, like TypeORM, Sequelize and Mongoose.' +title: 'Comparing Prisma ORM' +metaTitle: 'Comparing Prisma ORM to other ORMs and ODMs.' +description: 'Learn how Prisma ORM compares to other ORMs, ODMs, and database libraries, like TypeORM, Sequelize and Mongoose.' +hide_table_of_contents: true --- -Find out how Prisma compares to ORMs and ODMs in the Node.js and TypeScript ecosystem. +Find out how Prisma ORM compares to ORMs and ODMs in the Node.js and TypeScript ecosystem. For a comprehensive overview of the most popular database libraries, read this article: [Top Node.js ORMs, Query Builders & Database Libraries in 2022](https://www.prisma.io/dataguide/database-tools/top-nodejs-orms-query-builders-and-database-libraries). diff --git a/content/200-orm/800-more/450-migrating-to-prisma/01-migrate-from-typeorm.mdx b/content/200-orm/800-more/450-migrating-to-prisma/01-migrate-from-typeorm.mdx index db80991907..d857b9ef17 100644 --- a/content/200-orm/800-more/450-migrating-to-prisma/01-migrate-from-typeorm.mdx +++ b/content/200-orm/800-more/450-migrating-to-prisma/01-migrate-from-typeorm.mdx @@ -1,22 +1,22 @@ --- title: 'Migrate from TypeORM' -metaTitle: 'How to migrate from TypeORM to Prisma' -metaDescription: 'Learn how to migrate from TypeORM to Prisma' +metaTitle: 'How to migrate from TypeORM to Prisma ORM' +description: 'Learn how to migrate from TypeORM to Prisma ORM' --- -This guide describes how to migrate from TypeORM to Prisma. It uses an extended version of the [TypeORM Express example](https://github.com/typeorm/typescript-express-example/) as a [sample project](https://github.com/prisma/migrate-from-typeorm-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-typeorm-to-prisma). +This guide describes how to migrate from TypeORM to Prisma ORM. It uses an extended version of the [TypeORM Express example](https://github.com/typeorm/typescript-express-example/) as a [sample project](https://github.com/prisma/migrate-from-typeorm-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-typeorm-to-prisma). -This migration guide uses PostgreSQL as the example database, but it equally applies to any other relational database that's [supported by Prisma](/orm/reference/supported-databases). +This migration guide uses PostgreSQL as the example database, but it equally applies to any other relational database that's [supported by Prisma ORM](/orm/reference/supported-databases). -You can learn how Prisma compares to TypeORM on the [Prisma vs TypeORM](/orm/more/comparisons/prisma-and-typeorm) page. +You can learn how Prisma ORM compares to TypeORM on the [Prisma ORM vs TypeORM](/orm/more/comparisons/prisma-and-typeorm) page. ## Overview of the migration process -Note that the steps for migrating from TypeORM to Prisma are always the same, no matter what kind of application or API layer you're building: +Note that the steps for migrating from TypeORM to Prisma ORM are always the same, no matter what kind of application or API layer you're building: 1. Install the Prisma CLI 1. Introspect your database @@ -26,15 +26,15 @@ Note that the steps for migrating from TypeORM to Prisma are always the same, no These steps apply, no matter if you're building a REST API (e.g. with Express, koa or NestJS), a GraphQL API (e.g. with Apollo Server, TypeGraphQL or Nexus) or any other kind of application that uses TypeORM for database access. -Prisma lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from TypeORM to Prisma at once, but rather you can _step-by-step_ move your database queries from TypeORM to Prisma. +Prisma ORM lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from TypeORM to Prisma ORM at once, but rather you can _step-by-step_ move your database queries from TypeORM to Prisma ORM. ## Overview of the sample project -For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-typeorm-to-prisma) to migrate to Prisma. It has four models/entities: +For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-typeorm-to-prisma) to migrate to Prisma ORM. It has four models/entities: -, , , ]}> + - + ```ts @Entity() @@ -56,9 +56,9 @@ export class User { } ``` - + - + ```ts @Entity() @@ -84,9 +84,9 @@ export class Post { } ``` - + - + ```ts @Entity() @@ -103,9 +103,9 @@ export class Profile { } ``` - + - + ```ts @Entity() @@ -121,7 +121,7 @@ export class Category { } ``` - + @@ -133,7 +133,9 @@ The models have the following relations: The corresponding tables have been created using a generated TypeORM migration. -
Expand to view details of the migration +
+ +Expand to view details of the migration The migration has been created using @@ -240,7 +242,7 @@ As mentioned before, this guide is an extended variation of the TypeORM Express ## Step 1. Install the Prisma CLI -The first step to adopt Prisma is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: +The first step to adopt Prisma ORM is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: ```terminal copy npm install prisma --save-dev @@ -248,7 +250,7 @@ npm install prisma --save-dev ## Step 2. Introspect your database -### 2.1. Set up Prisma +### 2.1. Set up Prisma ORM Before you can introspect your database, you need to set up your [Prisma schema](/orm/prisma-schema) and connect Prisma to your database. Run the following command in your terminal to create a basic Prisma schema file: @@ -263,7 +265,7 @@ This command created a new directory called `prisma` with the following files fo The Prisma schema file currently looks as follows: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema @@ -277,73 +279,78 @@ generator client { } ``` - +:::tip If you're using VS Code, be sure to install the [Prisma VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) for syntax highlighting, formatting, auto-completion and a lot more cool features. - +::: ### 2.2. Connect your database If you're not using PostgreSQL, you need to adjust the `provider` field on the `datasource` block to the database you currently use: -, , , ]}> - - + + +
-```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") } ``` -
+ - + +
-```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "mysql" url = env("DATABASE_URL") } ``` -
+ - + +
-```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlserver" url = env("DATABASE_URL") } ``` -
+ - + +
-```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "sqlite" url = env("DATABASE_URL") } ``` -
+
-Once that's done, you can configure your [database connection URL](/orm/reference/connection-urls) in the `.env` file. Here's how the database connection from TypeORM maps to the connection URL format used by Prisma: +Once that's done, you can configure your [database connection URL](/orm/reference/connection-urls) in the `.env` file. Here's how the database connection from TypeORM maps to the connection URL format used by Prisma ORM: -, , , ]}> + - + +
Assume you have the following database connection details in `ormconfig.json`: +
-```json file=ormconfig.json +```json file=ormconfig.json showLineNumbers { "type": "postgres", "host": "localhost", @@ -353,28 +360,36 @@ Assume you have the following database connection details in `ormconfig.json`: "database": "blog-typeorm" } ``` +
-The respective connection URL would look as follows in Prisma: +The respective connection URL would look as follows in Prisma ORM: +
-```env file=.env +```env file=.env showLineNumbers DATABASE_URL="postgresql://alice:myPassword42@localhost:5432/blog-typeorm" ``` +
Note that you can optionally configure the PostgreSQL [schema](https://www.postgresql.org/docs/9.1/ddl-schemas.html) by appending the `schema` argument to the connection URL: +
-```env file=.env +```env file=.env showLineNumbers DATABASE_URL="postgresql://alice:myPassword42@localhost:5432/blog-typeorm?schema=myschema" ``` +
If not provided, the default schema called `public` is being used. +
-
+ - + +
Assume you have the following database connection details in `ormconfig.json`: +
-```json file=ormconfig.json +```json file=ormconfig.json showLineNumbers { "type": "mysql", "host": "localhost", @@ -384,20 +399,24 @@ Assume you have the following database connection details in `ormconfig.json`: "database": "blog-typeorm" } ``` +
The respective connection URL would look as follows in Prisma: +
-```env file=.env +```env file=.env showLineNumbers DATABASE_URL="mysql://alice:myPassword42@localhost:3306/blog-typeorm" ``` -
+ - + +
Assume you have the following database connection details in `ormconfig.json`: +
-```json file=ormconfig.json +```json file=ormconfig.json showLineNumbers { "type": "mssql", "host": "localhost", @@ -407,37 +426,43 @@ Assume you have the following database connection details in `ormconfig.json`: "database": "blog-typeorm" } ``` +
The respective connection URL would look as follows in Prisma: +
-```env file=.env +```env file=.env showLineNumbers DATABASE_URL="sqlserver://localhost:1433;database=blog-typeorm;user=alice;password=myPassword42;trustServerCertificate=true" ``` -
+ - + +
Assume you have the following database connection details in `ormconfig.json`: +
-```json file=ormconfig.json +```json file=ormconfig.json showLineNumbers { "type": "sqlite", "database": "blog-typeorm" } ``` +
The respective connection URL would look as follows in Prisma: +
-```env file=.env +```env file=.env showLineNumbers DATABASE_URL="file:./blog-typeorm.db" ``` -
+
-### 2.3. Introspect your database using Prisma +### 2.3. Introspect your database using Prisma ORM With your connection URL in place, you can [introspect](/orm/prisma-schema/introspection) your database to generate your Prisma models: @@ -447,7 +472,7 @@ npx prisma db pull This creates the following Prisma models: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model typeorm_migrations { id Int @id @default(autoincrement()) timestamp Int @@ -535,11 +560,11 @@ You now have a baseline for your current database schema. To make further change ### 2.5. Adjust the Prisma schema (optional) -The models that were generated via introspection currently _exactly_ map to your database tables. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). +The models that were generated via introspection currently _exactly_ map to your database tables. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma ORM's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). All of these adjustment are entirely optional and you are free to skip to the next step already if you don't want to adjust anything for now. You can go back and make the adjustments at any later point. -As opposed to the current snake_case notation of TypeORM models, Prisma's naming conventions are: +As opposed to the current snake_case notation of TypeORM models, Prisma ORM's naming conventions are: - PascalCase for model names - camelCase for field names @@ -552,7 +577,7 @@ You can further completely remove model that represents the TypeORM migrations t Here's an adjusted version of the Prisma schema that addresses these points: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model Category { id Int @id @default(autoincrement()) name String @@ -625,7 +650,7 @@ touch src/prisma.ts Now, instantiate `PrismaClient` and export it from the file so you can use it in your route handlers later: -```ts copy file=src/prisma.ts +```ts copy file=src/prisma.ts showLineNumbers import { PrismaClient } from '@prisma/client' export const prisma = new PrismaClient() @@ -645,7 +670,7 @@ Let's dive into the route handlers that implement these requests. The `/feed` handler is currently implemented as follows: -```ts file=src/controllers/FeedAction.ts +```ts file=src/controllers/FeedAction.ts showLineNumbers import { getManager } from 'typeorm' import { Post } from '../entity/Post' @@ -665,7 +690,7 @@ Note that each returned `Post` object includes the relation to the `author` it's Here is how the same route is implemented using Prisma Client: -```ts file=src/controllers/FeedAction.ts +```ts file=src/controllers/FeedAction.ts showLineNumbers import { prisma } from '../prisma' export async function feedAction(req, res) { @@ -684,7 +709,7 @@ Note that the way how Prisma Client includes the `author` relation is absolutely The `/filterPosts` handler is currently implemented as follows: -```ts file=src/controllers/FilterPostsActions.ts +```ts file=src/controllers/FilterPostsActions.ts showLineNumbers import { getManager, Like } from 'typeorm' import { Post } from '../entity/Post' @@ -703,9 +728,9 @@ export async function filterPostsAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/FilterPostsActions.ts +```ts file=src/controllers/FilterPostsActions.ts showLineNumbers import { prisma } from '../prisma' export async function filterPostsAction(req, res) { @@ -728,13 +753,13 @@ export async function filterPostsAction(req, res) { } ``` -Note that TypeORM by default combines several `where` conditions with an implicit `OR` operator. Prisma on the other hand [combines several `where` conditions with an implicit `AND` operator](/orm/reference/prisma-client-reference#get-all-post-records-where-the-content-field-contains-prisma-and-published-is-false-no-and), so in this case the Prisma query needs to make the `OR` explicit. +Note that TypeORM by default combines several `where` conditions with an implicit `OR` operator. Prisma ORM on the other hand [combines several `where` conditions with an implicit `AND` operator](/orm/reference/prisma-client-reference#get-all-post-records-where-the-content-field-contains-prisma-and-published-is-false-no-and), so in this case the Prisma Client query needs to make the `OR` explicit. #### `/post/:postId` The `/post/:postId` handler is currently implemented as follows: -```ts file=src/controllers/GetPostByIdAction.ts +```ts file=src/controllers/GetPostByIdAction.ts showLineNumbers import { getManager } from 'typeorm' import { Post } from '../entity/Post' @@ -748,9 +773,9 @@ export async function getPostByIdAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/GetPostByIdAction.ts +```ts file=src/controllers/GetPostByIdAction.ts showLineNumbers import { prisma } from '../prisma' export async function getPostByIdAction(req, res) { @@ -776,7 +801,7 @@ The REST API has three routes that accept `POST` requests: The `/user` handler is currently implemented as follows: -```ts file=src/controllers/CreateUserAction.ts +```ts file=src/controllers/CreateUserAction.ts showLineNumbers import { getManager } from 'typeorm' import { User } from '../entity/User' @@ -794,9 +819,9 @@ export async function createUserAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/CreateUserAction.ts +```ts file=src/controllers/CreateUserAction.ts showLineNumbers import { prisma } from '../prisma' export async function createUserAction(req, res) { @@ -840,9 +865,9 @@ export async function createDraftAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/CreateDraftAction.ts +```ts file=src/controllers/CreateDraftAction.ts showLineNumbers import { prisma } from '../prisma' export async function createDraftAction(req, res) { @@ -862,13 +887,13 @@ export async function createDraftAction(req, res) { } ``` -Note that Prisma Client's nested write here save an initial query where first the `User` record needs to be retrieved by its `email`. That's because, with Prisma you can connect records in relations using any unique property. +Note that Prisma Client's nested write here save an initial query where first the `User` record needs to be retrieved by its `email`. That's because, with Prisma Client you can connect records in relations using any unique property. #### `/user/:userId/profile` The `/user/:userId/profile` handler is currently implemented as follows: -```ts file=src/controllers/SetBioForUserAction.ts.ts +```ts file=src/controllers/SetBioForUserAction.ts.ts showLineNumbers import { getManager } from 'typeorm' import { Profile } from '../entity/Profile' import { User } from '../entity/User' @@ -891,9 +916,9 @@ export async function setBioForUserAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/SetBioForUserAction.ts.ts +```ts file=src/controllers/SetBioForUserAction.ts.ts showLineNumbers import { prisma } from '../prisma' export async function setBioForUserAction(req, res) { @@ -927,7 +952,7 @@ Let's dive into the route handlers that implement these requests. The `/addPostToCategory?postId=POST_ID&categoryId=CATEGORY_ID` handler is currently implemented as follows: -```ts file=src/controllers/AddPostToCategoryAction.ts +```ts file=src/controllers/AddPostToCategoryAction.ts showLineNumbers import { getManager } from 'typeorm' import { Post } from '../entity/Post' import { Category } from '../entity/Category' @@ -950,9 +975,9 @@ export async function addPostToCategoryAction(req, res) { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```ts file=src/controllers/AddPostToCategoryAction.ts +```ts file=src/controllers/AddPostToCategoryAction.ts showLineNumbers import { prisma } from '../prisma' export async function addPostToCategoryAction(req, res) { @@ -979,7 +1004,7 @@ export async function addPostToCategoryAction(req, res) { Note that this Prisma Client can be made less verbose by modeling the relation as an [implicit many-to-many relation](#implicit-many-to-many-relations) instead. In that case, the query would look as follows: -```ts file=src/controllers/AddPostToCategoryAction.ts +```ts file=src/controllers/AddPostToCategoryAction.ts showLineNumbers const post = await prisma.post.update({ data: { categories: { @@ -994,7 +1019,7 @@ const post = await prisma.post.update({ ### Implicit many-to-many relations -Similar to the `@manyToMany` decorator in TypeORM, Prisma allows you to [model many-to-many relations _implicitly_](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). That is, a many-to-many relation where you do not have to manage the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) (also sometimes called JOIN table) _explicitly_ in your schema. Here is an example with TypeORM: +Similar to the `@manyToMany` decorator in TypeORM, Prisma ORM allows you to [model many-to-many relations _implicitly_](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). That is, a many-to-many relation where you do not have to manage the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) (also sometimes called JOIN table) _explicitly_ in your schema. Here is an example with TypeORM: ```ts import { @@ -1047,7 +1072,7 @@ CREATE INDEX "IDX_93b566d522b73cb8bc46f7405b" ON post_categories_category("postI CREATE INDEX "IDX_a5e63f80ca58e7296d5864bd2d" ON post_categories_category("categoryId" int4_ops); ``` -If you introspect the database with Prisma, you'll get the following result in the Prisma schema (note that some relation field names have been adjusted to look friendlier compared to the raw version from introspection): +If you introspect the database with Prisma ORM, you'll get the following result in the Prisma schema (note that some relation field names have been adjusted to look friendlier compared to the raw version from introspection): ```prisma file=schema.prisma model Category { @@ -1085,9 +1110,9 @@ model PostToCategories { In this Prisma schema, the many-to-many relation is modeled _explicitly_ via the relation table `PostToCategories`. -By adhering to the conventions for Prisma relation tables, the relation could look as follows: +By adhering to the conventions for Prisma ORM relation tables, the relation could look as follows: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers model Category { id Int @id @default(autoincrement()) name String @@ -1114,7 +1139,5 @@ This would also result in a more ergonomic and less verbose Prisma Client API to If your database provider requires tables to have primary keys then you have to use explicit syntax, and manually create the join model with a primary key. - This is because relation tables (JOIN tables) created by Prisma (expressed via - `@relation`) for many-to-many relations using implicit syntax do not have - primary keys. + This is because relation tables (JOIN tables) created by Prisma ORM (expressed via `@relation`) for many-to-many relations using implicit syntax do not have primary keys. diff --git a/content/200-orm/800-more/450-migrating-to-prisma/02-migrate-from-sequelize.mdx b/content/200-orm/800-more/450-migrating-to-prisma/02-migrate-from-sequelize.mdx index 4e9a5ffa54..5c531f1b0b 100644 --- a/content/200-orm/800-more/450-migrating-to-prisma/02-migrate-from-sequelize.mdx +++ b/content/200-orm/800-more/450-migrating-to-prisma/02-migrate-from-sequelize.mdx @@ -1,22 +1,22 @@ --- title: 'Migrate from Sequelize' -metaTitle: 'How to migrate from Sequelize to Prisma' -metaDescription: 'Learn how to migrate from Sequelize to Prisma' +metaTitle: 'How to migrate from Sequelize to Prisma ORM' +description: 'Learn how to migrate from Sequelize to Prisma ORM' --- -This guide describes how to migrate from Sequelize to Prisma. It uses an extended version of the [Sequelize Express example](https://github.com/sequelize/express-example) as a [sample project](https://github.com/prisma/migrate-from-sequelize-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-sequelize-to-prisma). +This guide describes how to migrate from Sequelize to Prisma ORM. It uses an extended version of the [Sequelize Express example](https://github.com/sequelize/express-example) as a [sample project](https://github.com/prisma/migrate-from-sequelize-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-sequelize-to-prisma). This migration guide uses PostgreSQL as the example database, but it equally applies to any other relational database that's [supported by Prisma](/orm/reference/supported-databases). -You can learn how Prisma compares to Sequelize on the [Prisma vs Sequelize](/orm/more/comparisons/prisma-and-sequelize) page. +You can learn how Prisma ORM compares to Sequelize on the [Prisma ORM vs Sequelize](/orm/more/comparisons/prisma-and-sequelize) page. ## Overview of the migration process -Note that the steps for migrating from Sequelize to Prisma are always the same, no matter what kind of application or API layer you're building: +Note that the steps for migrating from Sequelize to Prisma ORM are always the same, no matter what kind of application or API layer you're building: 1. Install the Prisma CLI 1. Introspect your database @@ -26,15 +26,15 @@ Note that the steps for migrating from Sequelize to Prisma are always the same, These steps apply, no matter if you're building a REST API (e.g. with Express, koa or NestJS), a GraphQL API (e.g. with Apollo Server, TypeGraphQL or Nexus) or any other kind of application that uses Sequelize for database access. -Prisma lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from Sequelize to Prisma at once, but rather you can _step-by-step_ move your database queries from Sequelize to Prisma. +Prisma ORM lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from Sequelize to Prisma ORM at once, but rather you can _step-by-step_ move your database queries from Sequelize to Prisma ORM. ## Overview of the sample project -For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-sequelize-to-prisma) to migrate to Prisma. It has four models/entities: +For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-sequelize-to-prisma) to migrate to Prisma ORM. It has four models/entities: -, , , ]}> + - + ```js module.exports = (sequelize, DataTypes) => { @@ -63,9 +63,9 @@ module.exports = (sequelize, DataTypes) => { } ``` - + - + ```js module.exports = (sequelize, DataTypes) => { @@ -96,9 +96,9 @@ module.exports = (sequelize, DataTypes) => { } ``` - + - + ```js module.exports = (sequelize, DataTypes) => { @@ -118,9 +118,9 @@ module.exports = (sequelize, DataTypes) => { } ``` - + - + ```js module.exports = (sequelize, DataTypes) => { @@ -140,7 +140,7 @@ module.exports = (sequelize, DataTypes) => { } ``` - + @@ -172,7 +172,7 @@ In this guide, the route handlers are located in the `src/controllers` directory ## Step 1. Install the Prisma CLI -The first step to adopt Prisma is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: +The first step to adopt Prisma ORM is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: ```terminal copy npm install prisma --save-dev @@ -180,9 +180,9 @@ npm install prisma --save-dev ## Step 2. Introspect your database -### 2.1. Set up Prisma +### 2.1. Set up Prisma ORM -Before you can introspect your database, you need to set up your [Prisma schema](/orm/prisma-schema) and connect Prisma to your database. Run the following command in your terminal to create a basic Prisma schema file: +Before you can introspect your database, you need to set up your [Prisma schema](/orm/prisma-schema) and connect Prisma ORM to your database. Run the following command in your terminal to create a basic Prisma schema file: ```terminal copy npx prisma init @@ -195,7 +195,7 @@ This command created a new directory called `prisma` with the following files fo The Prisma schema file currently looks as follows: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema @@ -209,19 +209,19 @@ generator client { } ``` - +:::tip If you're using VS Code, be sure to install the [Prisma VS Code extension](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma) for syntax highlighting, formatting, auto-completion and a lot more cool features. - +::: ### 2.2. Connect your database If you're not using PostgreSQL, you need to adjust the `provider` field on the `datasource` block to the database you currently use: -, , , ]}> + - + ```prisma datasource db { @@ -230,9 +230,9 @@ datasource db { } ``` - + - + ```prisma datasource db { @@ -241,9 +241,9 @@ datasource db { } ``` - + - + ```prisma datasource db { @@ -252,9 +252,9 @@ datasource db { } ``` - + - + ```prisma datasource db { @@ -263,17 +263,19 @@ datasource db { } ``` - + -Once that's done, you can configure your [database connection URL](/orm/reference/connection-urls) in the `.env` file. Here's how the database connection from Sequelize maps to the connection URL format used by Prisma: +Once that's done, you can configure your [database connection URL](/orm/reference/connection-urls) in the `.env` file. Here's how the database connection from Sequelize maps to the connection URL format used by Prisma ORM: -, , , ]}> + - + +
Assume you have the following database connection details in `src/models/index.js`: +
```js file=src/models/index.js const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { @@ -281,26 +283,33 @@ const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { dialect: 'postgres', }) ``` - -The respective connection URL would look as follows in Prisma: +
+The respective connection URL would look as follows in Prisma ORM: +
```env file=.env DATABASE_URL="postgresql://alice:myPassword42@localhost:5432/blog-sequelize" ``` +
Note that you can optionally configure the PostgreSQL [schema](https://www.postgresql.org/docs/9.1/ddl-schemas.html) by appending the `schema` argument to the connection URL: +
```env file=.env DATABASE_URL="postgresql://alice:myPassword42@localhost:5432/blog-sequelize?schema=myschema" ``` +
If not provided, the default schema called `public` is being used. +
-
+ - + +
Assume you have the following database connection details in `src/models/index.js`: +
```js file=src/models/index.js const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { @@ -308,18 +317,22 @@ const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { dialect: 'postgres', }) ``` +
The respective connection URL would look as follows in Prisma: +
```env file=.env DATABASE_URL="mysql://alice:myPassword42@localhost:3306/blog-sequelize" ``` -
+ - + +
Assume you have the following database connection details in `src/models/index.js`: +
```js file=src/models/index.js const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { @@ -327,18 +340,22 @@ const sequelize = new Sequelize('blog-sequelize', 'alice', 'myPassword42', { dialect: 'mssql', }) ``` +
The respective connection URL would look as follows in Prisma: +
```env file=.env DATABASE_URL="sqlserver://localhost:1433;database=blog-sequelize;user=alice;password=myPassword42;trustServerCertificate=true" ``` -
+ - + +
Assume you have the following database connection details in `src/models/index.js`: +
```js file=src/models/index.js const sequelize = new Sequelize({ @@ -346,18 +363,20 @@ const sequelize = new Sequelize({ storage: '../../blog-sequelize.sqlite', }) ``` +
The respective connection URL would look as follows in Prisma: +
```env file=.env DATABASE_URL="file:./blog-sequelize.db" ``` -
+
-### 2.3. Introspect your database using Prisma +### 2.3. Introspect your database using Prisma ORM With your connection URL in place, you can [introspect](/orm/prisma-schema/introspection) your database to generate your Prisma models: @@ -367,7 +386,7 @@ npx prisma db pull This creates the following Prisma models: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model Categories { id Int @id @default(autoincrement()) name String @@ -460,10 +479,10 @@ You now have a baseline for your current database schema. To make further change The generated Prisma models represent your database tables and are the foundation for your programmatic Prisma Client API which allows you to send queries to your database. You'll adjust the `createdAt` and `updatedAt` fields in our models. Sequelize doesn't add the `DEFAULT` constraint to `createdAt` when creating the tables in the database. Therefore, you'll add `@default(now())` and `@updatedAt` attributes to the `createdAt` and `updatedAt` columns respectively. -To learn more how Prisma does this, you can read more [`@default(now())`](/orm/reference/prisma-schema-reference#now) and [`@updatedAt`](/orm/reference/prisma-schema-reference#updatedat) here. +To learn more how Prisma ORM does this, you can read more [`@default(now())`](/orm/reference/prisma-schema-reference#now) and [`@updatedAt`](/orm/reference/prisma-schema-reference#updatedat) here. Our updated schema will be as follows: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers model Categories { id Int @id @default(autoincrement()) name String @@ -521,11 +540,11 @@ model Users { ### 2.6. Adjust the Prisma schema (optional) -The models that were generated via introspection currently _exactly_ map to your database tables. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). +The models that were generated via introspection currently _exactly_ map to your database tables. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma ORM's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). All of these adjustment are entirely optional and you are free to skip to the next step already if you don't want to adjust anything for now. You can go back and make the adjustments at any later point. -As opposed to the current snake_case notation of Prisma models, Prisma's naming conventions are: +As opposed to the current snake_case notation of Prisma models, Prisma ORM's naming conventions are: - PascalCase for model names - camelCase for field names @@ -538,7 +557,7 @@ Sequelize generates a `SequelizeMeta` model that is used internally by the libra Here's an adjusted version of the Prisma schema that addresses these points: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } @@ -628,7 +647,7 @@ touch src/prisma.js Now, instantiate `PrismaClient` and export it from the file so you can use it in your route handlers later: -```js copy file=src/prisma.js +```js copy file=src/prisma.js showLineNumbers const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() @@ -638,22 +657,22 @@ module.exports = prisma The imports in our controller files are as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const { Post, User, Category } = require('../models') const { Op } = require('sequelize') ``` -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const { User } = require('../models') ``` You'll update the controller imports as you migrate from Sequelize to Prisma: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const prisma = require('../prisma') ``` -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const prisma = require('../prisma') ``` @@ -672,7 +691,7 @@ Let's dive into the route handlers that implement these requests. The `/feed` handler is currently implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const feed = async (req, res) => { try { const feed = await Post.findAll({ @@ -710,7 +729,7 @@ Note that the way how Prisma Client includes the `author` relation is absolutely The `/filterPosts` handler is currently implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const filterPosts = async (req, res) => { const { searchString } = req.query @@ -740,9 +759,9 @@ const filterPosts = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const filterPosts = async (req, res) => { const { searchString } = req.query @@ -767,13 +786,13 @@ const filterPosts = async (req, res) => { } ``` -Note that Sequelize provides [Operator symbols](https://sequelize.org/master/variable/index.html#static-variable-Op) - `Op` - to be used when querying data. Prisma on the other hand [combines several `where` conditions with an implicit `AND` operator](/orm/reference/prisma-client-reference#get-all-post-records-where-the-content-field-contains-prisma-and-published-is-false-no-and), so in this case the Prisma query needs to make the `OR` explicit. +Note that Sequelize provides [Operator symbols](https://sequelize.org/master/variable/index.html#static-variable-Op) - `Op` - to be used when querying data. Prisma ORM on the other hand [combines several `where` conditions with an implicit `AND` operator](/orm/reference/prisma-client-reference#get-all-post-records-where-the-content-field-contains-prisma-and-published-is-false-no-and), so in this case the Prisma Client query needs to make the `OR` explicit. #### `/post/:postId` The `/post/:postId` handler is currently implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const getPostById = async (req, res) => { const { postId } = req.params @@ -790,9 +809,9 @@ const getPostById = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const getPostById = async (req, res) => { const { postId } = req.params @@ -838,7 +857,7 @@ const createUser = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: ```js file=src/controllers/user.js const createUser = async (req, res) => { @@ -863,7 +882,7 @@ const createUser = async (req, res) => { The `/post` handler is currently implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const createDraft = async (req, res) => { const { title, content, authorEmail } = req.body @@ -883,9 +902,9 @@ const createDraft = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const createDraft = async (req, res) => { const { title, content, authorEmail } = req.body @@ -907,7 +926,7 @@ const createDraft = async (req, res) => { } ``` -Note that Prisma Client's nested write here save an initial query where first the `User` record needs to be retrieved by its `email`. That's because, with Prisma you can connect records in relations using any unique property. +Note that Prisma Client's nested write here save an initial query where first the `User` record needs to be retrieved by its `email`. That's because, with Prisma Client you can connect records in relations using any unique property. #### `/user/:userId/profile` @@ -934,7 +953,7 @@ const setUserBio = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: ```js file=src/controllers/user.js const setUserBio = async (req, res) => { @@ -970,7 +989,7 @@ Let's dive into the route handlers that implement these requests. The `/addPostToCategory?postId=POST_ID&categoryId=CATEGORY_ID` handler is currently implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const addPostToCategory = async (req, res) => { const { postId, categoryId } = req.query @@ -992,9 +1011,9 @@ const addPostToCategory = async (req, res) => { } ``` -With Prisma, the route is implemented as follows: +With Prisma ORM, the route is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const addPostToCategory = async (req, res) => { const { postId, categoryId } = req.query @@ -1023,7 +1042,7 @@ const addPostToCategory = async (req, res) => { Note that this Prisma Client can be made less verbose by modeling the relation as an [implicit many-to-many relation](#implicit-many-to-many-relations) instead. In that case, the query would look as follows: -```js file=src/controllers/posts.js +```js file=src/controllers/posts.js showLineNumbers const post = await prisma.post.update({ data: { category: { @@ -1068,7 +1087,7 @@ module.exports = (sequelize, DataTypes) => { ### Table name inference Sequelize infers table names from the model name. When the name of a table isn't provided Sequelize automatically pluralizes the model name and uses that as the table name using a library called [inflection](https://www.npmjs.com/package/inflection). -Prisma on the other hand maps the model name to the table name in your database [modelling your data](/orm/prisma-schema/data-model/models). +Prisma ORM on the other hand maps the model name to the table name in your database [modelling your data](/orm/prisma-schema/data-model/models). If you wish to change this default behaviour in Sequelize, you can either enforce the table name to be equal to the model name or provide the table name directly: ```js @@ -1119,7 +1138,7 @@ sequelize.define( ) ``` -Prisma offers you the flexibility to define these fields in your model. You add the `createdAt` and [`updatedAt`](/orm/reference/prisma-schema-reference#updatedat) fields by defining them explicitly in your model. +Prisma ORM offers you the flexibility to define these fields in your model. You add the `createdAt` and [`updatedAt`](/orm/reference/prisma-schema-reference#updatedat) fields by defining them explicitly in your model. To set the `createdAt` field in your model, add the `default(now())` attribute to the column. In order to set the `updatedAt` column, update your model by adding the `@updatedAt` attribute to the column. ```prisma @@ -1134,7 +1153,7 @@ model User { ### Implicit many-to-many relations -Similar to the `belongsToMany()` association method in Sequelize, Prisma allows you to [model many-to-many relations _implicitly_](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). That is, a many-to-many relation where you do not have to manage the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) (also sometimes called JOIN table) _explicitly_ in your schema. Here is an example with Sequelize: +Similar to the `belongsToMany()` association method in Sequelize, Prisma ORM allows you to [model many-to-many relations _implicitly_](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations). That is, a many-to-many relation where you do not have to manage the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) (also sometimes called JOIN table) _explicitly_ in your schema. Here is an example with Sequelize: ```js module.exports = (sequelize, DataTypes) => { @@ -1192,7 +1211,7 @@ Executing (default): CREATE TABLE IF NOT EXISTS "PostCategories" "PostId" INTEGER REFERENCES "Posts" ("id") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("CategoryId","PostId")); ``` -If you introspect the database with Prisma, you'll get the following result in the Prisma schema (note that some relation field names have been adjusted to look friendlier compared to the raw version from introspection): +If you introspect the database with Prisma ORM, you'll get the following result in the Prisma schema (note that some relation field names have been adjusted to look friendlier compared to the raw version from introspection): ```prisma model Categories { diff --git a/content/200-orm/800-more/450-migrating-to-prisma/03-migrate-from-mongoose.mdx b/content/200-orm/800-more/450-migrating-to-prisma/03-migrate-from-mongoose.mdx index 2cd81c368f..6077bb8472 100644 --- a/content/200-orm/800-more/450-migrating-to-prisma/03-migrate-from-mongoose.mdx +++ b/content/200-orm/800-more/450-migrating-to-prisma/03-migrate-from-mongoose.mdx @@ -1,20 +1,20 @@ --- title: 'Migrate from Mongoose' -metaTitle: 'How to migrate from Mongoose to Prisma' -metaDescription: 'Learn how to migrate from Mongoose to Prisma' +metaTitle: 'How to migrate from Mongoose to Prisma ORM' +description: 'Learn how to migrate from Mongoose to Prisma ORM' --- -This guide describes how to migrate from Mongoose to Prisma. It uses an extended version of the [Mongoose Express example](https://github.com/Automattic/mongoose/tree/master/examples/express) as a [sample project](https://github.com/prisma/migrate-from-mongoose-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-mongoose-to-prisma). +This guide describes how to migrate from Mongoose to Prisma ORM. It uses an extended version of the [Mongoose Express example](https://github.com/Automattic/mongoose/tree/master/examples/express) as a [sample project](https://github.com/prisma/migrate-from-mongoose-to-prisma) to demonstrate the migration steps. You can find the example used for this guide on [GitHub](https://github.com/prisma/migrate-from-mongoose-to-prisma). -You can learn how Prisma compares to Mongoose on the [Prisma vs Mongoose](/orm/more/comparisons/prisma-and-mongoose) page. +You can learn how Prisma ORM compares to Mongoose on the [Prisma ORM vs Mongoose](/orm/more/comparisons/prisma-and-mongoose) page. ## Overview of the migration process -Note that the steps for migrating from Mongoose to Prisma are always the same, no matter what kind of application or API layer you're building: +Note that the steps for migrating from Mongoose to Prisma ORM are always the same, no matter what kind of application or API layer you're building: 1. [Install the Prisma CLI](/orm/tools/prisma-cli#installation) 1. [Introspect your database](/orm/prisma-schema/introspection) @@ -23,15 +23,15 @@ Note that the steps for migrating from Mongoose to Prisma are always the same, n These steps apply whether you're building a REST API (e.g. with Express, koa or NestJS), a GraphQL API (e.g. with Apollo Server, TypeGraphQL or Nexus) or any other kind of application that uses Mongoose for database access. -Prisma lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from Mongoose to Prisma at once, but rather you can _step-by-step_ move your database queries from Mongoose to Prisma. +Prisma ORM lends itself really well for **incremental adoption**. This means, you don't have migrate your entire project from Mongoose to Prisma ORM at once, but rather you can _step-by-step_ move your database queries from Mongoose to Prisma ORM. ## Overview of the sample project -For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-mongoose-to-prisma) to migrate to Prisma. It has three documents and one sub-document (embedded document): +For this guide, we'll use a REST API built with Express as a [sample project](https://github.com/prisma/migrate-from-mongoose-to-prisma) to migrate to Prisma ORM. It has three documents and one sub-document (embedded document): -, , ]}> + - + ```js const mongoose = require('mongoose') @@ -61,9 +61,9 @@ const PostSchema = new Schema({ module.exports = mongoose.model('Post', PostSchema) ``` - + - + ```js const mongoose = require('mongoose') @@ -94,9 +94,9 @@ const UserSchema = new Schema({ module.exports = mongoose.model('User', UserSchema) ``` - + - + ```js const mongoose = require('mongoose') @@ -113,7 +113,7 @@ const CategorySchema = new Schema({ module.exports = mongoose.model('Category', CategorySchema) ``` - + @@ -147,7 +147,7 @@ Run `npm run seed` to populate your database with the sample data in the `./src/ ## Step 1. Install the Prisma CLI -The first step to adopt Prisma is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: +The first step to adopt Prisma ORM is to [install the Prisma CLI](/orm/tools/prisma-cli#installation) in your project: ```terminal copy npm install prisma --save-dev @@ -155,11 +155,11 @@ npm install prisma --save-dev ## Step 2. Introspect your database -Introspection is a process of inspecting the structure of a database, used in Prisma to generate a [data model](/orm/prisma-schema/data-model/models) in your [Prisma schema](/orm/prisma-schema). +Introspection is a process of inspecting the structure of a database, used in Prisma ORM to generate a [data model](/orm/prisma-schema/data-model/models) in your [Prisma schema](/orm/prisma-schema). ### 2.1. Set up Prisma -Before you can introspect your database, you need to set up your [Prisma schema](/orm/prisma-schema) and connect Prisma to your database. Run the following command in your terminal to create a basic Prisma schema file: +Before you can introspect your database, you need to set up your [Prisma schema](/orm/prisma-schema) and connect Prisma ORM to your database. Run the following command in your terminal to create a basic Prisma schema file: ```terminal copy npx prisma init --datasource-provider mongodb @@ -172,7 +172,7 @@ This command creates: The Prisma schema file currently looks as follows: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema @@ -185,18 +185,19 @@ generator client { provider = "prisma-client-js" } ``` +
- +:::tip -For an optimal development experience when working with Prisma, refer to [editor setup](/orm/more/development-environment/editor-setup) to learn about syntax highlighting, formatting, auto-completion, and many more cool features. +For an optimal development experience when working with Prisma ORM, refer to [editor setup](/orm/more/development-environment/editor-setup) to learn about syntax highlighting, formatting, auto-completion, and many more cool features. - +::: ### 2.2. Connect your database Configure your [database connection URL](/orm/reference/connection-urls#mongodb) in the `.env` file. -The format of the connection URL that Mongoose uses is similar to the one Prisma uses. +The format of the connection URL that Mongoose uses is similar to the one Prisma ORM uses. ```bash file=.env DATABASE_URL="mongodb://alice:myPassword43@localhost:27017/blog-mongoose" @@ -204,11 +205,11 @@ DATABASE_URL="mongodb://alice:myPassword43@localhost:27017/blog-mongoose" Refer to the [MongoDB connection URL specification](https://www.mongodb.com/docs/manual/reference/connection-string/#connection-string-options) for further details. -### 2.3. Run Prisma's introspection +### 2.3. Run Prisma ORM's introspection With your connection URL in place, you can [introspect](/orm/prisma-schema/introspection) your database to generate your Prisma models: -> **Note**: MongoDB is a _schemaless_ database. To incrementally adopt Prisma in your project, ensure your database is populated with sample data. Prisma introspects a MongoDB schema by sampling data stored and inferring the schema from the data in the database. +> **Note**: MongoDB is a _schemaless_ database. To incrementally adopt Prisma ORM in your project, ensure your database is populated with sample data. Prisma ORM introspects a MongoDB schema by sampling data stored and inferring the schema from the data in the database. ```terminal copy npx prisma db pull @@ -216,7 +217,7 @@ npx prisma db pull This creates the following Prisma models: -```prisma file=prisma/schema.prisma +```prisma file=prisma/schema.prisma showLineNumbers type UsersProfile { bio String } @@ -252,15 +253,15 @@ The generated Prisma models represent the MongoDB collections and are the founda MongoDB doesn't support relations between different collections. However, you can create references between documents using the [`ObjectId`](/orm/overview/databases/mongodb#using-objectid) field type or from one document to many using an array of `ObjectIds` in the collection. The reference will store id(s) of the related document(s). You can use the `populate()` method that Mongoose provides to populate the reference with the data of the related document. -Update the 1-n relationship between `Post` <-> `User` as follows: +Update the 1-n relationship between `Post` \<-> `User` as follows: - Rename the existing `author` reference in the `posts` model to `authorId` and add the `@map("author")` attribute - Add the `author` relation field in the `posts` model and it's `@relation` attribute specifying the `fields` and `references` - Add the `posts` relation in the `users` model -, ]}> + - + ```prisma type UsersProfile { @@ -297,11 +298,11 @@ model users { } ``` - + - + -```prisma +```prisma file=schema.prisma type UsersProfile { bio String } @@ -335,11 +336,11 @@ model users { } ``` - + -Update the m-n between `Post` <-> `Category` references as follows: +Update the m-n between `Post` \<-\> `Category` references as follows: - Rename the `categories` field to `categoryIds` and map it using `@map("categories")` in the `posts` model - Add a new `categories` relation field in the `posts` model @@ -348,9 +349,9 @@ Update the m-n between `Post` <-> `Category` references as follows: - Add a [relation scalar](/orm/prisma-schema/data-model/relations#annotated-relation-fields) on both models - Add the `@relation` attribute specifying the `fields` and `references` arguments on both sides -, ]}> + - + ```prisma type UsersProfile { @@ -390,11 +391,11 @@ model users { } ``` - + - + -```prisma +```prisma file=schema.prisma type UsersProfile { bio String } @@ -432,30 +433,30 @@ model users { } ``` - + ### 2.5 Adjust the Prisma schema (optional) -The models that were generated via introspection currently _exactly_ map to your database collections. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). +The models that were generated via introspection currently _exactly_ map to your database collections. In this section, you'll learn how you can adjust the naming of the Prisma models to adhere to [Prisma ORM's naming conventions](/orm/reference/prisma-schema-reference#naming-conventions). Some of these adjustments are entirely optional and you are free to skip to the next step already if you don't want to adjust anything for now. You can go back and make the adjustments at any later point. -As opposed to the current snake_case notation of Prisma models, Prisma's naming conventions are: +As opposed to the current snake_case notation of Prisma models, Prisma ORM's naming conventions are: - PascalCase for model names - camelCase for field names You can adjust the naming by [_mapping_](/orm/overview/databases/mongodb#using-objectid) the Prisma model and field names to the existing table and column names in the underlying database using `@@map` and `@map`, respectively. - +:::tip You can use the [rename symbol](https://code.visualstudio.com/docs/editor/refactoring#_rename-symbol) operation to refactor model names by highlighting the model name, pressing F2, and finally typing the desired name. This will rename all instances where it is referenced and add the `@@map()` attribute to the existing model with its former name. - +::: -If your schema includes a [`versionKey`](https://mongoosejs.com/docs/guide.html#versionKey), update it by adding the `@default(0)` and `@ignore` attributes to the `v` field. This means the field will be excluded from the generated Prisma Client and will have a default value of 0. Prisma does not handle document versioning. +If your schema includes a [`versionKey`](https://mongoosejs.com/docs/guide.html#versionKey), update it by adding the `@default(0)` and `@ignore` attributes to the `v` field. This means the field will be excluded from the generated Prisma Client and will have a default value of 0. Prisma ORM does not handle document versioning. Also note that you can rename [relation fields](/orm/prisma-schema/data-model/relations#relation-fields) to optimize the Prisma Client API that you'll use later to send queries to your database. For example, the `post` field on the `user` model is a _list_, so a better name for this field would be `posts` to indicate that it's plural. @@ -465,7 +466,7 @@ You can also rename the `UserProfile` composite type to `Profile`. Here's an adjusted version of the Prisma schema that addresses these points: -```prisma file=prisma/schema.prisma highlight=10,14,17,22,25,29,30,38,41,43,46,49;normal +```prisma file=prisma/schema.prisma highlight=10,14,17,22,25,29,30,38,41,43,46,49;normal showLineNumbers generator client { provider = "prisma-client-js" } @@ -475,27 +476,34 @@ datasource db { url = env("DATABASE_URL") } +//highlight-next-line type Profile { bio String } +//highlight-next-line model Category { id String @id @default(auto()) @map("_id") @db.ObjectId name String + //highlight-next-line v Int @default(0) @map("__v") @ignore posts Post[] @relation(fields: [post_ids], references: [id]) post_ids String[] @db.ObjectId + //highlight-next-line @@map("categories") } +//highlight-next-line model Post { id String @id @default(auto()) @map("_id") @db.ObjectId title String content String + //highlight-start published Boolean @default(false) v Int @default(0) @map("__v") @ignore + //highlight-end author User @relation(fields: [authorId], references: [id]) authorId String @map("author") @db.ObjectId @@ -503,17 +511,22 @@ model Post { categories Category[] @relation(fields: [categoryIds], references: [id]) categoryIds String[] @db.ObjectId + //highlight-next-line @@map("posts") } +//highlight-next-line model User { id String @id @default(auto()) @map("_id") @db.ObjectId + //highlight-next-line v Int @default(0) @map("__v") @ignore email String @unique(map: "email_1") name String + //highlight-next-line profile Profile? posts Post[] + //highlight-next-line @@map("users") } ``` @@ -533,12 +546,12 @@ In this section, we'll show a few sample queries that are being migrated from Mo First, to set up the `PrismaClient` instance that you'll use to send database queries from the various route handlers, create a new file named `prisma.js` in the `src` directory: ```terminal copy -touch src/prisma.js +touch src/prisma.js ``` Now, instantiate `PrismaClient` and export it from the file so you can use it in your route handlers later: -```js copy file=src/prisma.js +```js copy file=src/prisma.js showLineNumbers const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() @@ -548,24 +561,24 @@ module.exports = prisma The imports in our controller files are as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const Post = require('../models/post') const User = require('../models/user') const Category = require('../models/category') ``` -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const Post = require('../models/post') const User = require('../models/user') ``` You'll update the controller imports as you migrate from Mongoose to Prisma: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const prisma = require('../prisma') ``` -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const prisma = require('../prisma') ``` @@ -587,7 +600,7 @@ Let's dive into the route handlers that implement these requests. The `/feed` handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const feed = async (req, res) => { try { const { searchString, skip, take } = req.query @@ -627,7 +640,7 @@ Note that each returned `Post` object includes the relation to the `author` and Here is how the same route handler is implemented using Prisma Client: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const feed = async (req, res) => { try { const { searchString, skip, take } = req.query @@ -664,7 +677,7 @@ Note that the way in which Prisma Client includes the `author` relation is absol The `/post/:id` handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const getPostById = async (req, res) => { const { id } = req.params @@ -682,9 +695,9 @@ const getPostById = async (req, res) => { } ``` -With Prisma, the route handler is implemented as follows: +With Prisma ORM, the route handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const getPostById = async (req, res) => { const { id } = req.params @@ -718,7 +731,7 @@ The REST API has three routes that accept `POST` requests: The `/user` handler is implemented as follows: -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const createUser = async (req, res) => { const { name, email } = req.body @@ -735,9 +748,9 @@ const createUser = async (req, res) => { } ``` -With Prisma, the route handler is implemented as follows: +With Prisma ORM, the route handler is implemented as follows: -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const createUser = async (req, res) => { const { name, email } = req.body @@ -760,7 +773,7 @@ const createUser = async (req, res) => { The `/post` handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const createDraft = async (req, res) => { const { title, content, authorEmail } = req.body @@ -782,9 +795,9 @@ const createDraft = async (req, res) => { } ``` -With Prisma, the route handler is implemented as follows: +With Prisma ORM, the route handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const createDraft = async (req, res) => { const { title, content, authorEmail } = req.body @@ -808,13 +821,13 @@ const createDraft = async (req, res) => { } ``` -Note that Prisma Client's nested write here saves the initial query where the `User` record is first retrieved by its `email`. That's because, with Prisma you can connect records in relations using any unique property. +Note that Prisma Client's nested write here saves the initial query where the `User` record is first retrieved by its `email`. That's because, with Prisma Client you can connect records in relations using any unique property. #### `/user/:id/profile` The `/user/:id/profile` handler is implemented as follows: -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const setUserBio = async (req, res) => { const { id } = req.params const { bio } = req.body @@ -839,9 +852,9 @@ const setUserBio = async (req, res) => { } ``` -With Prisma, the route handler is implemented as follows: +With Prisma ORM, the route handler is implemented as follows: -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const setUserBio = async (req, res) => { const { id } = req.params const { bio } = req.body @@ -868,7 +881,7 @@ const setUserBio = async (req, res) => { Alternatively, you can use the `set` property to update the value of an embedded document as follows: -```js file=src/controllers/user.js +```js file=src/controllers/user.js showLineNumbers const setUserBio = async (req, res) => { const { id } = req.params const { bio } = req.body @@ -906,7 +919,7 @@ Let's dive into the route handlers that implement these requests. The `/post/:id/:categoryId` handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const addPostToCategory = async (req, res) => { const { id, categoryId } = req.params @@ -932,9 +945,9 @@ const addPostToCategory = async (req, res) => { } ``` -With Prisma, the handler is implemented as follows: +With Prisma ORM, the handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const addPostToCategory = async (req, res) => { const { id, categoryId } = req.query @@ -966,7 +979,7 @@ const addPostToCategory = async (req, res) => { The `/post/:id` handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const publishDraft = async (req, res) => { const { id } = req.params @@ -983,9 +996,9 @@ const publishDraft = async (req, res) => { } ``` -With Prisma, the handler is implemented as follows: +With Prisma ORM, the handler is implemented as follows: -```js file=src/controllers/post.js +```js file=src/controllers/post.js showLineNumbers const publishDraft = async (req, res) => { const { id } = req.params @@ -1033,13 +1046,13 @@ const ProfileSchema = new Schema( ) ``` -When migrating to Prisma, mark the `versionKey` field as optional ( **?** ) in your Prisma schema and add the `@ignore` attribute to exclude it from Prisma Client. +When migrating to Prisma ORM, mark the `versionKey` field as optional ( **?** ) in your Prisma schema and add the `@ignore` attribute to exclude it from Prisma Client. ### Collection name inference Mongoose infers the collection names by automatically converting the model names to lowercase and plural form. -On the other hand, Prisma maps the model name to the table name in your database [modeling your data](/orm/prisma-schema/data-model/models). +On the other hand, Prisma ORM maps the model name to the table name in your database [modeling your data](/orm/prisma-schema/data-model/models). You can enforce the collection name in Mongoose to have the same name as the model by setting the [](https://mongoosejs.com/docs/guide.html#collection) option while creating your schema @@ -1060,7 +1073,7 @@ const PostSchema = new Schema( You can model relations in Mongoose between documents by either using [sub-documents](https://mongoosejs.com/docs/subdocs.html) or storing [a reference to other documents](https://mongoosejs.com/docs/queries.html#refs). -Prisma allows you to model different types of relations between documents when working with MongoDB: +Prisma ORM allows you to model different types of relations between documents when working with MongoDB: - [One-to-one relations](/orm/prisma-schema/data-model/relations/one-to-one-relations#mongodb) - [One-to-many relations](/orm/prisma-schema/data-model/relations/one-to-many-relations#mongodb) diff --git a/content/200-orm/800-more/450-migrating-to-prisma/index.mdx b/content/200-orm/800-more/450-migrating-to-prisma/index.mdx index f949e1bf20..a7457221db 100644 --- a/content/200-orm/800-more/450-migrating-to-prisma/index.mdx +++ b/content/200-orm/800-more/450-migrating-to-prisma/index.mdx @@ -1,9 +1,12 @@ --- -title: 'Migrate to Prisma' -metaTitle: 'Migrate to Prisma from other ORMs' -metaDescription: 'How to migrate to Prisma from other ORMs and query builders.' +title: 'Migrate to Prisma ORM' +metaTitle: 'Migrate to Prisma ORM from other ORMs' +description: 'How to migrate to Prisma ORM from other ORMs and query builders.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/800-more/500-development-environment/050-environment-variables/040-env-files.mdx b/content/200-orm/800-more/500-development-environment/050-environment-variables/040-env-files.mdx index 94d6acac28..8b6c0833bf 100644 --- a/content/200-orm/800-more/500-development-environment/050-environment-variables/040-env-files.mdx +++ b/content/200-orm/800-more/500-development-environment/050-environment-variables/040-env-files.mdx @@ -1,16 +1,16 @@ --- title: '.env files' metaTitle: '.env files' -metaDescription: 'Configure environment variables using .env files in Prisma' +description: 'Configure environment variables using .env files in Prisma' --- -Prisma creates a default `.env` file at your projects root. You can choose to replace this file or create a new one in the `prisma` folder, or if you choose to relocate your `prisma.schema` file, alongside that. +Prisma ORM creates a default `.env` file at your projects root. You can choose to replace this file or create a new one in the `prisma` folder, or if you choose to relocate your `prisma.schema` file, alongside that. -### .env file locations +### `.env` file locations The Prisma CLI looks for `.env` files, in order, in the following locations: @@ -57,7 +57,7 @@ DATABASE_URL=postgresql://test:test@localhost:5432/test DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=public ``` -This will make the environment variable `DATABASE_URL_WITH_SCHEMA` with value `postgresql://test:test@localhost:5432/test?schema=public` available for Prisma. +This will make the environment variable `DATABASE_URL_WITH_SCHEMA` with value `postgresql://test:test@localhost:5432/test?schema=public` available for Prisma ORM. You can also use environment variables in the expansion that are set _outside_ of the `.env` file, for example a database URL that is set on a PaaS like Heroku or similar: @@ -70,7 +70,7 @@ export DATABASE_URL=postgresql://test:test@localhost:5432/test DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=foo ``` -This will make the environment variable `DATABASE_URL_WITH_SCHEMA` with value `postgresql://test:test@localhost:5432/test?schema=foo` available for Prisma. +This will make the environment variable `DATABASE_URL_WITH_SCHEMA` with value `postgresql://test:test@localhost:5432/test?schema=foo` available for Prisma ORM. ### Example: Set the `DATABASE_URL` environment variable in an `.env` file diff --git a/content/200-orm/800-more/500-development-environment/050-environment-variables/100-managing-env-files-and-setting-variables.mdx b/content/200-orm/800-more/500-development-environment/050-environment-variables/100-managing-env-files-and-setting-variables.mdx index a880d23f9a..cf1539fc3e 100644 --- a/content/200-orm/800-more/500-development-environment/050-environment-variables/100-managing-env-files-and-setting-variables.mdx +++ b/content/200-orm/800-more/500-development-environment/050-environment-variables/100-managing-env-files-and-setting-variables.mdx @@ -1,15 +1,15 @@ --- title: 'Managing .env files and setting variables' metaTitle: 'Managing .env files and setting variables' -metaDescription: 'Learn how to manage .env files and set environment variables' +description: 'Learn how to manage .env files and set environment variables' tocDepth: 3 --- -[Prisma creates an `.env` file for you upon installation](/orm/more/development-environment/environment-variables#how-does-prisma-use-environment-variables). You are not limited to using that file, some other options include: +[Prisma ORM creates an `.env` file for you upon project initialization with `prisma init`](/orm/more/development-environment/environment-variables#how-does-prisma-orm-use-environment-variables). You are not limited to using that file, some other options include: -- Do not use `.env` files and let Prisma use the system environment variables directly +- Do not use `.env` files and let Prisma ORM use the system environment variables directly - Use `.env` files from a location that the Prisma CLI does not check [by default](/orm/more/development-environment/environment-variables/env-files) - [Use multiple `.env` file](/orm/more/development-environment/environment-variables/using-multiple-env-files) @@ -17,7 +17,7 @@ tocDepth: 3 ## Using the system environment directly -Because Prisma reads from the system's environment when looking for environment variables, it's possible to skip using `.env` completely and create them manually on your local system. +Because Prisma ORM reads from the system's environment when looking for environment variables, it's possible to skip using `.env` completely and create them manually on your local system. @@ -59,49 +59,49 @@ postgresql://test:test@localhost:5432/test?schema=public The following examples illustrate how to set the environment variable (for the current user) using both Command Prompt (`cmd.exe`) and PowerShell, depending on your preference. -, ]}> + - + ```terminal set DATABASE_URL="postgresql://test:test@localhost:5432/test?schema=public" ``` - + - + ```terminal [Environment]::SetEnvironmentVariable("DATABASE_URL", "postgresql://test:test@localhost:5432/test?schema=public") ``` - + Then check that it has been successfully set: -, ]}> + - + ```terminal set DATABASE_URL ``` - + - + ```terminal Get-ChildItem Env:DATABASE_URL ``` - + -## Manage .env files manually +## Manage `.env` files manually The [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) and [`dotenv`](https://www.npmjs.com/package/dotenv) packages can be used if you want to manage your `.env`files manually. @@ -110,9 +110,9 @@ They allow you to: - [Use multiple `.env` files](/orm/more/development-environment/environment-variables/using-multiple-env-files) - Use `.env` files from a location that the Prisma CLI does not check [by default](/orm/more/development-environment/environment-variables/env-files) -### Using dotenv-cli via command line +### Using `dotenv-cli` via command line -The following steps show how to use the `dotenv-cli` package to use an alternative file to contain environment variables than the [default](/orm/more/development-environment/environment-variables/env-files) created by Prisma, which is then used to run Introspection. +The following steps show how to use the `dotenv-cli` package to use an alternative file to contain environment variables than the [default](/orm/more/development-environment/environment-variables/env-files) created by Prisma ORM, which is then used to run Introspection. 1. Install [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli): @@ -122,15 +122,15 @@ The following steps show how to use the `dotenv-cli` package to use an alternati 2. Create a file - for example, `.env3` - in your project's root folder. -3. To use the `.env3` file, you can use `dotenv` when you run any Prisma command and specify which `.env` file to use. The following example uses a file named `.env3`: +3. To use the `.env3` file, you can use `dotenv` when you run any Prisma ORM command and specify which `.env` file to use. The following example uses a file named `.env3`: ``` dotenv -e .env3 -- npx prisma db pull ``` -> **Note:** dotenv doesn't pass the flags to the Prisma command by default, this is why the command includes two dashes `--` before `prisma`, making it possible to use flags like `--force`, `--schema` or `--preview-feature`. +> **Note:** dotenv doesn't pass the flags to the Prisma ORM command by default, this is why the command includes two dashes `--` before `prisma`, making it possible to use flags like `--force`, `--schema` or `--preview-feature`. -### Using dotenv via application code +### Using `dotenv` via application code The following steps show how to use the `dotenv` package to reference an alternative environment file in your project's code. diff --git a/content/200-orm/800-more/500-development-environment/050-environment-variables/200-using-multiple-env-files.mdx b/content/200-orm/800-more/500-development-environment/050-environment-variables/200-using-multiple-env-files.mdx index 3a92466ff6..b2ba159b75 100644 --- a/content/200-orm/800-more/500-development-environment/050-environment-variables/200-using-multiple-env-files.mdx +++ b/content/200-orm/800-more/500-development-environment/050-environment-variables/200-using-multiple-env-files.mdx @@ -1,7 +1,7 @@ --- title: 'Using multiple .env files' metaTitle: 'Using multiple .env files.' -metaDescription: 'Learn how to set up a dedicated testing environment using multiple .env files.' +description: 'Learn how to set up a dedicated testing environment using multiple .env files.' tocDepth: 3 --- @@ -42,7 +42,7 @@ DATABASE_URL="postgresql://prisma:prisma@localhost:5433/sample" 3. Install [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) -In order for Prisma and Jest to know which `.env` file to use, alter your package.json scripts to include and call the `dotenv` package and specify which file to use depending on what commands you are running and in which environment you want them to run. +In order for Prisma ORM and Jest to know which `.env` file to use, alter your `package.json` scripts to include and call the `dotenv` package and specify which file to use depending on what commands you are running and in which environment you want them to run. @@ -52,9 +52,9 @@ Any top-level script that is running the tests and migrations needs the `dotenv` ### Running migrations on different environments -You can use the [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) package to specify which environment file Prisma should use when running a migration. +You can use the [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) package to specify which environment file Prisma ORM should use when running a migration. -The below script uses `dotenv-cli` to pass the `.env.sample` environment file (which holds a `DATABASE_URL` connection string) to the Prisma migration script. +The below script uses `dotenv-cli` to pass the `.env.sample` environment file (which holds a `DATABASE_URL` connection string) to the Prisma ORM migration script. #### Migration script diff --git a/content/200-orm/800-more/500-development-environment/050-environment-variables/index.mdx b/content/200-orm/800-more/500-development-environment/050-environment-variables/index.mdx index 406ba7e68c..4db68bac32 100644 --- a/content/200-orm/800-more/500-development-environment/050-environment-variables/index.mdx +++ b/content/200-orm/800-more/500-development-environment/050-environment-variables/index.mdx @@ -1,7 +1,7 @@ --- title: 'Environment variables' metaTitle: 'Environment variables' -metaDescription: 'Learn how to use environment variables in your Prisma project' +description: 'Learn how to use environment variables in your Prisma ORM project' tocDepth: 3 --- @@ -23,11 +23,11 @@ Any program can read and create these environment variables. They are a cheap an -## How does Prisma use environment variables? +## How does Prisma ORM use environment variables? -Prisma always reads environment variables from the system's environment. +Prisma ORM always reads environment variables from the system's environment. -When you initialize Prisma in your project with `prisma init`, it creates a convenience `.env` file for you to set your [`connection url`](/orm/reference/connection-urls) as an environment variable. When you use Prisma CLI or Prisma Client, the `.env` file content and the variables defined in it are added to the [`process.env` object](https://nodejs.org/api/process.html#processenv), where Prisma can read it and use it. +When you initialize Prisma ORM in your project with `prisma init`, it creates a convenience `.env` file for you to set your [`connection url`](/orm/reference/connection-urls) as an environment variable. When you use Prisma CLI or Prisma Client, the `.env` file content and the variables defined in it are added to the [`process.env` object](https://nodejs.org/api/process.html#processenv), where Prisma ORM can read it and use it. diff --git a/content/200-orm/800-more/500-development-environment/100-editor-setup.mdx b/content/200-orm/800-more/500-development-environment/100-editor-setup.mdx index 3bdadf6ee9..02bcd794a6 100644 --- a/content/200-orm/800-more/500-development-environment/100-editor-setup.mdx +++ b/content/200-orm/800-more/500-development-environment/100-editor-setup.mdx @@ -1,13 +1,13 @@ --- title: 'Editor setup' metaTitle: 'Editor and IDE setup' -metaDescription: 'Learn how to configure your editor and IDEs for an optimal developer experience with Prisma.' +description: 'Learn how to configure your editor and IDEs for an optimal developer experience with Prisma ORM.' tocDepth: 3 --- -This page describes how you can configure your editor for an optimal developer experience when using Prisma. +This page describes how you can configure your editor for an optimal developer experience when using Prisma ORM. If you don't see your editor here, please [open a feature request](https://github.com/prisma/prisma/issues/new?assignees=&labels=&template=feature_request.md&title=) and ask for dedicated support for your editor (e.g. for syntax highlighting and auto-formatting). @@ -58,7 +58,7 @@ You can get IDE-style autocompletion for Prisma CLI using [`inshellisense`](http To install, run: -```shell +```bash npm install -g @microsoft/inshellisense ``` @@ -68,6 +68,6 @@ npm install -g @microsoft/inshellisense To install, run: -```shell +```bash brew install fig ``` diff --git a/content/200-orm/800-more/500-development-environment/index.mdx b/content/200-orm/800-more/500-development-environment/index.mdx index 7dd10bd168..00e39ad977 100644 --- a/content/200-orm/800-more/500-development-environment/index.mdx +++ b/content/200-orm/800-more/500-development-environment/index.mdx @@ -1,8 +1,9 @@ --- title: 'Development environment' -navTitle: Development environment +sidebar_label: Development environment metaTitle: 'Development environment' -metaDescription: 'Using env vars, editors and workspaces in your development environment' +description: 'Using env vars, editors and workspaces in your development environment' +hide_table_of_contents: true --- diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/050-creating-bug-reports.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/050-creating-bug-reports.mdx index fb5aa1dfdf..b90b54a5fb 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/050-creating-bug-reports.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/050-creating-bug-reports.mdx @@ -1,18 +1,21 @@ --- title: 'Creating bug reports' -metaTitle: 'Creating bug reports for Prisma' -metaDescription: 'This page explains best practices for creating bug reports for Prisma, including sharing additional debugging output and other recommendations.' +metaTitle: 'Creating bug reports for Prisma ORM' +description: 'This page explains best practices for creating bug reports for Prisma ORM, including sharing additional debugging output and other recommendations.' +toc_max_heading_level: 2 --- + + ## Overview -You can help us improve Prisma by creating **bug reports**. When creating a bug report, it's important that you include as much information as possible about your issue. That way, it's easier to reproduce. +You can help us improve Prisma ORM by creating **bug reports**. When creating a bug report, it's important that you include as much information as possible about your issue. That way, it's easier to reproduce. Note that you can also create **feature requests** or ask a **question** via the issue templates on GitHub. ## Where to open the bug report on GitHub? -Prisma's tools are spread across different repositories in the [`prisma`](https://github.com/prisma/) organization on GitHub. You can open a new issue in the repo of the respective tool. +Prisma ORM's tools are spread across different repositories in the [`prisma`](https://github.com/prisma/) organization on GitHub. You can open a new issue in the repo of the respective tool. If you're unsure where to open the GitHub issue, you can use the main [`prisma/prisma`](https://github.com/prisma/prisma) repo as a default. Our engineering team is regularly triaging new issues and will move the issue to another repo if necessary. @@ -32,7 +35,7 @@ Please make sure to include _any_ [logging](/orm/prisma-client/observability-and **Setting the `DEBUG` env var** -To get additional output from Prisma, you can set `DEBUG` to `*`: +To get additional output from Prisma ORM, you can set `DEBUG` to `*`: ```terminal export DEBUG="*" @@ -55,7 +58,9 @@ When describing the bug, it's helpful to include the following information: - A clear and concise description of what you expected to happen - Screenshots (if applicable) -
Expand for an example for a hypothetical bug report +
+ +Expand for an example for a hypothetical bug report **Example** @@ -116,8 +121,8 @@ I expected an exception when trying to create `user2` with the same `email` as ` Please include any information about your environment and setup. Specifically it's important to include: - Which **operating system** you use (e.g. macOS, Windows, Debian, CentOS, ...) -- Which **database** you use with Prisma (PostgreSQL, MySQL, MariaDB, SQLite or Microsoft SQL Server) -- Which **version of Prisma** you use (run `prisma -v` to see your Prisma version) +- Which **database** you use with Prisma ORM (PostgreSQL, MySQL, MariaDB, SQLite or Microsoft SQL Server) +- Which **version of Prisma ORM** you use (run `prisma -v` to see your Prisma ORM version) - Which **version of Node.js** you use (run `node -v` to see your Node.js version) Here's an example of what this could look like in your bug report: @@ -125,7 +130,7 @@ Here's an example of what this could look like in your bug report: - OS: macOS Catalina 10.15.7 - Database: PostgreSQL v11 - Node.js version: `v14.16.1` -- Prisma version: +- Prisma ORM version: ``` prisma : 2.22.0 @@ -142,7 +147,7 @@ Additionally, you can use the [`prisma debug`](/orm/reference/prisma-cli-referen -The `prisma debug` command is available from version 5.6.0 and newer. If you're using an older version of Prisma, you can use this command by running: +The `prisma debug` command is available from version 5.6.0 and newer. If you're using an older version of Prisma ORM, you can use this command by running: ```terminal npx prisma@latest debug @@ -150,7 +155,7 @@ npx prisma@latest debug -### Include relevant Prisma info (e.g. the Prisma schema, Prisma Client queries, ...) +### Include relevant Prisma ORM info (e.g. the Prisma schema, Prisma Client queries, ...) To help us reproduce your problem, it is helpful to include your Prisma schema in the bug report. **Please remove any database credentials before sharing your Prisma schema in a bug report**. If you're sure about which parts of the schema is causing the issue, please strip out the irrelevant parts of it and only show the parts that are related to the problem. If you're not sure, please include your entire schema. diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/100-autocompletion-in-graphql-resolvers-with-js.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/100-autocompletion-in-graphql-resolvers-with-js.mdx index 0e14c2f877..f7bc8b13a6 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/100-autocompletion-in-graphql-resolvers-with-js.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/100-autocompletion-in-graphql-resolvers-with-js.mdx @@ -1,9 +1,11 @@ --- title: 'Autocompletion in GraphQL resolvers with JavaScript' metaTitle: 'Autocompletion in GraphQL resolvers with JavaScript' -metaDescription: 'Learn how you can get autocompletion for Prisma Client queries in GraphQL resolvers with plain JavaScript' +description: 'Learn how you can get autocompletion for Prisma Client queries in GraphQL resolvers with plain JavaScript' --- + + ## Problem When using GraphQL with TypeScript, you always get autocompletion for the Prisma Client instance in your GraphQL resolvers because then the `context` object can be typed – no matter if folks are using Nexus, TypeGraphQL or SDL first. This immensely helps with autocompletion and preventing unwanted errors. @@ -25,7 +27,7 @@ filterPosts: (parent, args, ctx) => { Now whenever you type `ctx.` VS Code will provide unnecessary options in the autocomplete which is undesirable. -![Unwanted autocomplete values by VSCode](unwanted-autocomplete-values-in-vscode.png) +![Unwanted autocomplete values by VSCode](./unwanted-autocomplete-values-in-vscode.png) VS Code doesn't know the _type_ of the `context` object so it can't provide any intellisense for it, which is why unwanted suggestions are displayed. @@ -67,7 +69,7 @@ This will tell VS Code that the `context` has a property named `prisma` and the And voilà, autocompletion in plain JavaScript. -![The correct parameters for context are obtained](prisma-autocompletion-in-js.png) +![The correct parameters for context are obtained](./prisma-autocompletion-in-js.png) The final file should look something like: @@ -259,4 +261,4 @@ module.exports = { } ``` -So here's a simple method to get autocompletion for your all Prisma's methods in JavaScript. You can find a practical example of this approach in the [`prisma-examples`](https://github.com/prisma/prisma-examples/) repo [here](https://github.com/prisma/prisma-examples/tree/latest/javascript/graphql-sdl-first). +So here's a simple method to get autocompletion for your all Prisma Client's methods in JavaScript. You can find a practical example of this approach in the [`prisma-examples`](https://github.com/prisma/prisma-examples/) repo [here](https://github.com/prisma/prisma-examples/tree/latest/javascript/graphql-sdl-first). diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/200-working-with-many-to-many-relations.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/200-working-with-many-to-many-relations.mdx index 9828c2aa4d..65d877da0f 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/200-working-with-many-to-many-relations.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/200-working-with-many-to-many-relations.mdx @@ -1,19 +1,21 @@ --- title: 'Modeling and querying many-to-many relations' metaTitle: 'Modeling and querying many-to-many relations' -metaDescription: 'Learn how you can model and query implicit and explicit many-to-many relations with Prisma' +description: 'Learn how you can model and query implicit and explicit many-to-many relations with Prisma ORM' tocDepth: 3 --- + + ## Problem -Modeling and querying many-to-many relations in relational databases can be challenging. This article shows two examples how this can be approached with Prisma. The first example uses an [implicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) and the second one uses an [explicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations) many-to-many relation. +Modeling and querying many-to-many relations in relational databases can be challenging. This article shows two examples how this can be approached with Prisma ORM. The first example uses an [implicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#implicit-many-to-many-relations) and the second one uses an [explicit](/orm/prisma-schema/data-model/relations/many-to-many-relations#explicit-many-to-many-relations) many-to-many relation. ## Solution ### Implicit relations -This is a type of many-to-many relation where Prisma handles the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) internally. A basic example for an implicit many-to-many relation would look like this: +This is a type of many-to-many relation where Prisma ORM handles the [relation table](/orm/prisma-schema/data-model/relations/many-to-many-relations#relation-tables) internally. A basic example for an implicit many-to-many relation would look like this: ```prisma model Post { @@ -29,7 +31,7 @@ model Tag { } ``` -To create a post and its tags, one can write this with Prisma: +To create a post and its tags, one can write this with Prisma Client: ```ts await prisma.post.create({ diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/400-nextjs-prisma-client-dev-practices.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/400-nextjs-prisma-client-dev-practices.mdx index bc427f6d89..b5fc9169c2 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/400-nextjs-prisma-client-dev-practices.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/400-nextjs-prisma-client-dev-practices.mdx @@ -1,12 +1,14 @@ --- -title: 'Best practice for instantiating PrismaClient with Next.js' -metaTitle: 'Best practice for instantiating PrismaClient with Next.js' -metaDescription: 'Best practice for instantiating PrismaClient with Next.js' +title: 'Best practice for instantiating Prisma Client with Next.js' +metaTitle: 'Best practice for instantiating Prisma Client with Next.js' +description: 'Best practice for instantiating Prisma Client with Next.js' --- + + ## Problem -Lots of users have come across this warning while working with [Next.js](https://nextjs.org/) in development: +Many users have come across this warning while working with [Next.js](https://nextjs.org/) in development: ``` warn(prisma-client) There are already 10 instances of Prisma Client actively running. @@ -28,14 +30,14 @@ const prismaClientSingleton = () => { } declare global { - var prisma: undefined | ReturnType + var prismaGlobal: undefined | ReturnType } -const prisma = globalThis.prisma ?? prismaClientSingleton() +const prisma = globalThis.prismaGlobal ?? prismaClientSingleton() export default prisma -if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma +if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma ``` You can extend Prisma Client using a Prisma Client extension by appending the `$extends` client method when instantiating Prisma Client as follows: diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/425-nextjs-prisma-client-monorepo.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/425-nextjs-prisma-client-monorepo.mdx index a004be99c0..379155ee8a 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/425-nextjs-prisma-client-monorepo.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/425-nextjs-prisma-client-monorepo.mdx @@ -1,9 +1,11 @@ --- title: 'Using Prisma Client in a Next.js project in a monorepo setup' metaTitle: 'Using Prisma Client in a Next.js project in a monorepo setup' -metaDescription: 'Using Prisma Client in a Next.js project in a monorepo setup' +description: 'Using Prisma Client in a Next.js project in a monorepo setup' --- + + ## Problem If you use Prisma Client in a [Next.js](https://nextjs.org/) application within a monorepo, you may run into an error that looks similar to: diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/430-nextjs-prisma-client-dynamic.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/430-nextjs-prisma-client-dynamic.mdx new file mode 100644 index 0000000000..c35fa3e626 --- /dev/null +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/430-nextjs-prisma-client-dynamic.mdx @@ -0,0 +1,28 @@ +--- +title: 'Best practices for using Prisma Client with Next.js and Next.js Data Cache' +metaTitle: 'Best practices for using Prisma Client with Next.js and Next.js Data Cache' +description: 'Learn best practices to avoid issues with route caching in Next.js' +--- + +## Problem + +When deploying a Next.js app, you may run into an issue where your queries are not updating or displaying the correct content. Or, you may find that it takes a long time for newly created objects to show up in your queries. + +In these cases, you are most likely seeing data persisted in the [Next.js Data Cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache). Any `fetch` request has its result cached by default, leading to possibly unwanted results as Prisma uses `fetch` internally. + +## Solution + +To opt-out of the Next.js Data Cache, you can [disable caching for a specific route](https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic) using the `"force-dynamic"` config option so that up to date data is always returned and no caching happens. + +You can add `"force-dynamic"` like this: + +```ts +import { NextRequest, NextResponse } from 'next/server' +import prisma from './db' + +export const dynamic = 'force-dynamic' + +export async function GET(request: NextRequest, response: NextResponse) { + // your code would go here +} +``` diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/450-pkg-issue.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/450-pkg-issue.mdx index 918c5d4965..a03446cfe9 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/450-pkg-issue.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/450-pkg-issue.mdx @@ -1,9 +1,11 @@ --- title: 'Solve package error with vercel/pkg' metaTitle: 'Solve ENOENT package error with vercel/pkg' -metaDescription: 'Solve ENOENT package error with vercel/pkg' +description: 'Solve ENOENT package error with vercel/pkg' --- + + ## Problem If you use [vercel/pkg](https://github.com/vercel/pkg) to package your Node.js project, then you might encounter an `ENOENT` error like the following: diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/500-comparing-columns-through-raw-queries.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/500-comparing-columns-through-raw-queries.mdx index 8075e1fae7..3792ee615b 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/500-comparing-columns-through-raw-queries.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/500-comparing-columns-through-raw-queries.mdx @@ -1,9 +1,11 @@ --- title: 'Compare columns of the same table with raw queries' metaTitle: 'Compare columns of the same table with raw queries' -metaDescription: 'Compare columns with inbuilt raw query methods in Prisma' +description: 'Compare columns with inbuilt raw query methods in Prisma' --- + + ## Problem Comparing different columns from the same table is a common scenario that developers encounter. Some examples include comparing two numeric values in the same table or comparing two dates in a same table. There's an existing [GitHub Issue](https://github.com/prisma/prisma/issues/5048) regarding the same. diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/600-vercel-caching-issue.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/600-vercel-caching-issue.mdx index cdfc4b82b2..a3f1c2b994 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/600-vercel-caching-issue.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/600-vercel-caching-issue.mdx @@ -1,12 +1,14 @@ --- title: 'Vercel build dependency caching workaround' metaTitle: 'Learn to configure your build process on Vercel to avoid caching-related problems' -metaDescription: 'Learn to configure your build process on Vercel to avoid caching-related problems' +description: 'Learn to configure your build process on Vercel to avoid caching-related problems' --- + + ## Problem -If you deploy an application using Prisma to [Vercel](https://vercel.com/), you may run into the following error message on deployment: +If you deploy an application using Prisma ORM to [Vercel](https://vercel.com/), you may run into the following error message on deployment: ``` Prisma has detected that this project was built on Vercel, which caches dependencies. @@ -18,11 +20,13 @@ Learn how: https://pris.ly/d/vercel-build This occurs because Vercel caches the dependencies of your project until one of those dependencies changes. It does this to allow faster builds, and while this is typically a good thing, it causes some problems for Prisma Client. -Prisma uses a `postinstall` hook to generate Prisma Client when dependencies are installed. Because Vercel uses cached modules, this `postinstall` hook never gets run in subsequent deployments after the initial deployment. This results in Prisma Client becoming out of sync with your database schema. +Prisma ORM uses a `postinstall` hook to generate Prisma Client when dependencies are installed. Because Vercel uses cached modules, this `postinstall` hook never gets run in subsequent deployments after the initial deployment. This results in Prisma Client becoming out of sync with your database schema. This error message prevents this situation from happening and directs you here to learn how to fix the root issue. -
Prisma Client versions below 4.13.0 +
+ +Prisma Client versions below 4.13.0 On Prisma Client versions lower than 4.13.0, you may encounter error messages that look like the following: @@ -64,6 +68,7 @@ Within the `scripts` section of your project's `package.json` file, if there is { ... "scripts" { + //add-next-line "postinstall": "prisma generate" } ... @@ -78,6 +83,7 @@ Within the `scripts` section of your project's `package.json` file, within the ` { ... "scripts" { + //add-next-line "build": "prisma generate && " } ... diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/700-netlify-caching-issue.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/700-netlify-caching-issue.mdx index 8cc9775454..015592481e 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/700-netlify-caching-issue.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/700-netlify-caching-issue.mdx @@ -1,12 +1,14 @@ --- title: 'Netlify build dependency caching workaround' metaTitle: 'Learn to configure your build process on Netlify to avoid caching-related problems' -metaDescription: 'Learn to configure your build process on Netlify to avoid caching-related problems' +description: 'Learn to configure your build process on Netlify to avoid caching-related problems' --- + + ## Problem -If you deploy an application using Prisma to [Netlify](https://netlify.com/), you may run into the following error message on deployment: +If you deploy an application using Prisma ORM to [Netlify](https://netlify.com/), you may run into the following error message on deployment: ``` Prisma has detected that this project was built on Netlify, which caches dependencies. @@ -18,11 +20,13 @@ Learn how: https://pris.ly/d/netlify-build This occurs because Netlify caches the dependencies of your project until one of those dependencies changes. It does this to allow faster builds, and while this is typically a good thing, it causes some problems for Prisma Client. -Prisma uses a `postinstall` hook to generate Prisma Client when dependencies are installed. Because Netlify uses cached modules, this `postinstall` hook never gets run in subsequent deployments after the initial deployment. This results in Prisma Client becoming out of sync with your database schema. +Prisma ORM uses a `postinstall` hook to generate Prisma Client when dependencies are installed. Because Netlify uses cached modules, this `postinstall` hook never gets run in subsequent deployments after the initial deployment. This results in Prisma Client becoming out of sync with your database schema. This error message prevents this situation from happening and directs you here to learn how to fix the root issue. -
Prisma Client versions below 4.13.0 +
+ +Prisma Client versions below 4.13.0 On Prisma Client versions lower than 4.13.0, you may encounter error messages that look like the following: @@ -64,6 +68,7 @@ Within the `scripts` section of your project's `package.json` file, if there is { ... "scripts" { + //add-next-line "postinstall": "prisma generate" } ... @@ -78,6 +83,7 @@ Within the `scripts` section of your project's `package.json` file, within the ` { ... "scripts" { + //add-next-line "build": "prisma generate && " } ... diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/800-check-constraints.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/800-check-constraints.mdx index 217d6ad77d..7a07a49baf 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/800-check-constraints.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/800-check-constraints.mdx @@ -1,7 +1,7 @@ --- title: 'Data validation with CHECK constraints (PostgreSQL)' metaTitle: 'Data validation with CHECK constraints (PostgreSQL)' -metaDescription: 'Learn how to configure CHECK constraints for data validation with Prisma and PostgreSQL by following the step-by-step instructions in this practical guide.' +description: 'Learn how to configure CHECK constraints for data validation with Prisma ORM and PostgreSQL by following the step-by-step instructions in this practical guide.' --- ## Overview @@ -56,6 +56,7 @@ Windows (command line): ``` create database CheckDemo; +//delete-next-line \connect CheckDemo ``` @@ -232,7 +233,7 @@ Windows (command line): Congratulations, you just created a table called `lastproduct` in the database with a single column called `price`. You added constraint named `price_not_zero_constraint` to with a second SQL command, which ensures that the price of a product is never less than 0.01. -## 6. Introspect your database with Prisma +## 6. Introspect your database with Prisma ORM In the previous sections, you created four tables with different check constraints: @@ -252,11 +253,11 @@ npm init -y npm install prisma --save-dev ``` -In order to introspect your database, you need to tell Prisma how to connect to it. You do so by configuring a `datasource` in your Prisma schema. +In order to introspect your database, you need to tell Prisma ORM how to connect to it. You do so by configuring a `datasource` in your Prisma schema. Create a new file named `schema.prisma` and add the following code to it: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers datasource db { provider = "postgresql" url = env("DATABASE_URL") @@ -277,7 +278,7 @@ In the above code snippet, you need to replace the uppercase placeholders with y DATABASE_URL=postgresql://janedoe:mypassword@localhost:5432/CheckDemo ``` -With both the `schema.prisma` and `.env` files in place, you can run Prisma's introspection with the following command: +With both the `schema.prisma` and `.env` files in place, you can run Prisma ORM's introspection with the following command: ``` npx prisma db pull @@ -285,7 +286,7 @@ npx prisma db pull This command introspects your database and for each table adds a Prisma model to the Prisma schema: -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } @@ -325,7 +326,7 @@ To validate whether the check constraints work, you'll now generate Prisma Clien First, add a `generator` block to your Prisma schema (typically added right below the `datasource` block): -```prisma file=schema.prisma +```prisma file=schema.prisma showLineNumbers generator client { provider = "prisma-client-js" } diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/index.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/index.mdx index c6c28918a4..6214f90f5d 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/index.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/100-help-articles/index.mdx @@ -1,14 +1,14 @@ --- title: 'Help articles' metaTitle: 'Help articles' -metaDescription: 'Common problems and how to solve them.' +description: 'Common problems and how to solve them.' hidePage: false -toc: false +hide_table_of_contents: true --- -This section provides a number of common problems that developers might encounter when using Prisma and provides short, practical solutions to resolve them. +This section provides a number of common problems that developers might encounter when using Prisma ORM and provides short, practical solutions to resolve them. diff --git a/content/200-orm/800-more/600-help-and-troubleshooting/index.mdx b/content/200-orm/800-more/600-help-and-troubleshooting/index.mdx index a46f25930f..aad9032160 100644 --- a/content/200-orm/800-more/600-help-and-troubleshooting/index.mdx +++ b/content/200-orm/800-more/600-help-and-troubleshooting/index.mdx @@ -1,9 +1,12 @@ --- title: 'Help & troubleshooting' metaTitle: 'Help & troubleshooting' -metaDescription: 'Help & troubleshooting in Prisma projects.' +description: 'Help & troubleshooting in Prisma ORM projects.' +hide_table_of_contents: true --- + + ## In this section diff --git a/content/200-orm/800-more/700-releases.mdx b/content/200-orm/800-more/700-releases.mdx index 80a8505de7..d5b91dbdd8 100644 --- a/content/200-orm/800-more/700-releases.mdx +++ b/content/200-orm/800-more/700-releases.mdx @@ -1,19 +1,19 @@ --- title: 'ORM releases and maturity levels' metaTitle: 'ORM releases and maturity levels' -metaDescription: 'Learn about the release process, versioning, and maturity of Prisma components and how to deal with breaking changes that might happen throughout releases.' +description: 'Learn about the release process, versioning, and maturity of Prisma ORM components and how to deal with breaking changes that might happen throughout releases.' tocDepth: 3 --- -This page explains the release process of the Prisma ORM, how it's versioned and how to deal with breaking changes that might happen throughout releases. +This page explains the release process of Prisma ORM, how it's versioned and how to deal with breaking changes that might happen throughout releases. ## Releases -Prisma releases typically happen every three weeks. Note that this is _not_ a hard rule – releases might be postponed for internal reasons. +Prisma ORM releases typically happen every three weeks. Note that this is _not_ a hard rule – releases might be postponed for internal reasons. [Check out all the releases notes in GitHub](https://github.com/prisma/prisma/releases). @@ -62,9 +62,9 @@ You can [check out the full roadmap here](https://pris.ly/roadmap). ## Versioning -Prisma's release scheme adheres to Semantic Versioning ([SemVer](https://semver.org/)) starting with version `3.x.x`. +Prisma ORM's release scheme adheres to Semantic Versioning ([SemVer](https://semver.org/)) starting with version `3.x.x`. -### Prisma and Semantic Versioning (SemVer) +### Prisma ORM and Semantic Versioning (SemVer) #### How does SemVer versioning work? @@ -76,20 +76,20 @@ _Given a version number `MAJOR.MINOR.PATCH`, increment the:_ 1. _`MINOR` version when you add functionality in a backward compatible manner, and_ 1. _`PATCH` version when you make backward compatible bug fixes._ -#### How does Prisma versioning follow SemVer? +#### How does Prisma ORM versioning follow SemVer? -Beginning with version `3.x.x`, Prisma adheres strictly to the [SemVer](https://semver.org/) versioning scheme. +Beginning with version `3.x.x`, Prisma ORM adheres strictly to the [SemVer](https://semver.org/) versioning scheme. -Here is a brief overview of how Prisma's follows SemVer: +Here is a brief overview of how Prisma ORM's follows SemVer: - Breaking changes in stable surface (i.e. [General Availability](#generally-available-ga)) will only be introduced in new `MAJOR` releases. - Breaking changes can still be rolled out in `MINOR` but only for opt-in Preview and Early Access features that are not active by default (e.g. via a Preview feature flag or a specific opt-in option or new CLI command). - Opt-in breaking changes, i.e. Preview and Early Access, released in `MINOR`, will only be promoted to General Availability (no requirement for opt-in) in new `MAJOR` releases. -Given a version number `MAJOR.MINOR.PATCH`, Prisma's version number is incremented as follows: +Given a version number `MAJOR.MINOR.PATCH`, Prisma ORM's version number is incremented as follows: 1. `MAJOR` version is incremented when major product updates **with breaking changes** are released to General Availability. 1. `MINOR` version is incremented when product updates adding backward compatible new functionality are released. Features with breaking changes may only be introduced if they are **opt-in**, i.e. Early Access and Preview. 1. `PATCH` version is incremented when functionality bugs are fixed and are always **backward compatible**. -> **Note:** Up until version version `2.28.0`, Prisma did not follow SemVer versioning strictly. This means that releases in the `2.MINOR.PATCH` range, `MINOR` versions may have included breaking changes. To learn more about Prisma's adoption of SemVer, check out the [blog post](https://www.prisma.io/blog/prisma-adopts-semver-strictly). +> **Note:** Up until version `2.28.0`, Prisma ORM did not follow SemVer versioning strictly. This means that releases in the `2.MINOR.PATCH` range, `MINOR` versions may have included breaking changes. To learn more about Prisma ORM's adoption of SemVer, check out the [blog post](https://www.prisma.io/blog/prisma-adopts-semver-strictly). diff --git a/content/200-orm/800-more/_category_.json b/content/200-orm/800-more/_category_.json new file mode 100644 index 0000000000..a4b01cc2ff --- /dev/null +++ b/content/200-orm/800-more/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "More", + "collapsible": false, + "collapsed": false +} \ No newline at end of file diff --git a/content/200-orm/800-more/index.mdx b/content/200-orm/800-more/index.mdx index cb53782d2b..fb3ac20c96 100644 --- a/content/200-orm/800-more/index.mdx +++ b/content/200-orm/800-more/index.mdx @@ -1,9 +1,9 @@ --- title: 'More' metaTitle: 'More' -metaDescription: 'Learn more about Prisma ORM.' +description: 'Learn more about Prisma ORM.' staticLink: true -toc: false +hide_table_of_contents: true --- ## In this section diff --git a/content/200-orm/index.mdx b/content/200-orm/index.mdx index c9de440270..af0b2f0662 100644 --- a/content/200-orm/index.mdx +++ b/content/200-orm/index.mdx @@ -1,8 +1,11 @@ --- title: 'ORM' +id: 'orm-index' metaTitle: 'ORM' -metaDescription: 'ORM' -toc: false +description: 'ORM' +hide_table_of_contents: true +sidebar_position: 0 +pagination_next: 'orm/overview/index' --- @@ -13,4 +16,4 @@ toc: false ## In this section - + \ No newline at end of file diff --git a/content/300-accelerate/100-what-is-accelerate.mdx b/content/300-accelerate/100-what-is-accelerate.mdx index 164766b8e2..efad7cc59c 100644 --- a/content/300-accelerate/100-what-is-accelerate.mdx +++ b/content/300-accelerate/100-what-is-accelerate.mdx @@ -1,7 +1,7 @@ --- title: 'What is Accelerate' metaTitle: 'What is Accelerate' -metaDescription: 'Learn about Accelerate, a global cache and serverless connection pool that makes your database queries faster.' +description: 'Learn about Accelerate, a global cache and serverless connection pool that makes your database queries faster.' tocDepth: 3 toc: true --- @@ -26,4 +26,4 @@ While Accelerate is beneficial for all types of applications, being at the edge We built a small sample application, [Accelerate Speed Test](https://accelerate-speed-test.prisma.io/). The app compares the performance of cached and uncached queries side by side. The app is [open source](https://github.com/prisma/accelerate-speed-test) and you can clone it to try it yourself. -![Screenshot of the Accelerate Speed Test app showing cached query performance](./images/accelerate.png) +![Screenshot of the Accelerate Speed Test app showing cached query performance](/img/accelerate/accelerate.png) diff --git a/content/300-accelerate/200-getting-started.mdx b/content/300-accelerate/200-getting-started.mdx index d7071ce236..70cbd1fd35 100644 --- a/content/300-accelerate/200-getting-started.mdx +++ b/content/300-accelerate/200-getting-started.mdx @@ -1,7 +1,7 @@ --- title: 'Getting started' metaTitle: 'Getting started with Accelerate' -metaDescription: 'Learn how to get up and running with Accelerate.' +description: 'Learn how to get up and running with Accelerate.' tocDepth: 3 toc: true --- @@ -16,7 +16,7 @@ To get started with Accelerate, you will need the following: - A GitHub account. - A project that uses [Prisma Client](/orm/prisma-client) `4.16.1` or higher. If your project is using interactive transactions, you need to use `5.1.1` or higher. (We always recommend using the latest version of Prisma.) -- A hosted PostgreSQL, MySQL, PlanetScale, CockroachDB, or MongoDB database. +- A hosted PostgreSQL, MySQL/MariaDB, PlanetScale, CockroachDB, or MongoDB database. ## 1. Enable Accelerate in a project @@ -45,7 +45,7 @@ Most likely, as shown above, your database connection string in defined in a `.e Update that variable to use the new Accelerate connection string: -```env file=.env +```env file=.env showLineNumbers # __API_KEY__ is a unique API key that Accelerate generates and automatically assigns to a project. DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__" @@ -61,17 +61,18 @@ As of Prisma version `5.2.0` you can use Prisma Studio with the Accelerate conne -```env file=.env highlight=3;add +```env file=.env highlight=3;add showLineNumbers DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__" DIRECT_DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public" ``` Then in your Prisma schema's `datasource` block add a field named `directUrl` with the following: -```prisma highlight=4;add +```prisma datasource db { provider = "postgresql" url = env("DATABASE_URL") +//add-next-line directUrl = env("DIRECT_DATABASE_URL") } ``` @@ -133,7 +134,7 @@ import { withAccelerate } from '@prisma/extension-accelerate' const prisma = new PrismaClient().$extends(withAccelerate()) ``` -If you are going to deploy to an edge runtime (like Cloudflare Workers, Vercel Edge Functions, Deno Deploy, or Netlify Edge Functions), use our edge client instead: +If you are going to deploy to an edge runtime (like Cloudflare Workers, Vercel Edge Functions, Deno Deploy, or Supabase Edge Functions), use our edge client instead: ```ts import { PrismaClient } from '@prisma/client/edge' diff --git a/content/300-accelerate/250-connection-pooling.mdx b/content/300-accelerate/250-connection-pooling.mdx index 312da9edc6..e102ca0ebe 100644 --- a/content/300-accelerate/250-connection-pooling.mdx +++ b/content/300-accelerate/250-connection-pooling.mdx @@ -1,10 +1,10 @@ --- title: 'Connection Pooling' metaTitle: 'Accelerate: Connection Pooling' -metaDescription: "Learn about everything you need to know to use Accelerate's connection pooling." +description: "Learn about everything you need to know to use Accelerate's connection pooling." --- -## Connection pooling + A [connection pool](https://en.wikipedia.org/wiki/Connection_pool#:~:text=In%20software%20engineering%2C%20a%20connection,executing%20commands%20on%20a%20database.) is a storage of database connections that can be reused for future requests to the database. When a new connection is requested, it is retrieved from the pool if one is available. Once the connection is no longer needed, it is returned to the pool for reuse. @@ -20,6 +20,8 @@ For more information about connection pooling in Prisma, see the documentation [ + + ### Default connection pool size By default, Accelerate calculates a default connection pool size using the formula `num_physical_cpus * 2 + 1`. @@ -36,7 +38,7 @@ This means that Accelerate will create a maximum of 5 connections to the databas The connection pool size can be configured to a value other than the default via the _database connection string_. -![Update database connection string in Accelerate](./images/accelerate-update-database-connection-string.png) +![Update database connection string in Accelerate](/img/accelerate/accelerate-update-database-connection-string.png) To adjust the connection pool size, you can add the `connection_limit` parameter to the database connection string. The value of `connection_limit` is the maximum number of connections that Accelerate will open against your database. diff --git a/content/300-accelerate/300-caching.mdx b/content/300-accelerate/300-caching.mdx index 30cb276abb..781a4f5af5 100644 --- a/content/300-accelerate/300-caching.mdx +++ b/content/300-accelerate/300-caching.mdx @@ -1,9 +1,12 @@ --- title: 'Caching' metaTitle: 'Accelerate: Caching' -metaDescription: "Learn everything you need to know to use Accelerate's global database caching." +description: "Learn everything you need to know to use Accelerate's global database caching." +toc_max_heading_level: 2 --- + + ## Cache strategies For all read queries in Prisma Client, you can define the `cacheStrategy` parameter that configures cache behavior. The cache strategy allows you to define two main characteristics of the cache: @@ -20,7 +23,8 @@ Use `ttl` in `cacheStrategy` and specify the TTL of the query in seconds: ```javascript await prisma.user.findMany({ cacheStrategy: { -+ ttl: 60, + //add-next-line + ttl: 60, }, }); ``` @@ -28,7 +32,7 @@ await prisma.user.findMany({ With a specified TTL of 60 seconds, the majority of requests will result in a cache hit throughout the TTL duration: -![TTL](./images/ttl.png) +![TTL](/img/accelerate/ttl.png) TTL is useful for reducing database load and latency for data that does not require frequent updates. @@ -41,14 +45,15 @@ Use `swr` in `cacheStrategy` and specify the SWR of the query in seconds: ```javascript await prisma.user.findMany({ cacheStrategy: { -+ swr: 60, + //add-next-line + swr: 60, }, }); ``` When specifying a SWR of 60 seconds, the cache serves stale data until the cache refreshes itself in the background after each request: -![SWR](./images/swr.png) +![SWR](/img/accelerate/swr.png) ## Selecting a cache strategy @@ -79,15 +84,17 @@ Use `ttl` and `swr` in `cacheStrategy` and specify the TTL and SWR of the query ```javascript await prisma.user.findMany({ cacheStrategy: { -+ ttl: 30, -+ swr: 60, + //add-start + ttl: 30, + swr: 60, + //add-end }, }); ``` When specifying a TTL of 30 seconds and SWR of 60 seconds, the cache serves fresh data for the initial 30 seconds. Subsequently, it serves stale data until the cache refreshes itself in the background after each request: -![ttl_and_swr.png](./images/ttl_and_swr.png) +![ttl_and_swr.png](/img/accelerate/ttl_and_swr.png) #### Use case: News articles diff --git a/content/300-accelerate/400-api-reference.mdx b/content/300-accelerate/400-api-reference.mdx index a78b3d2971..d7aa9d66fe 100644 --- a/content/300-accelerate/400-api-reference.mdx +++ b/content/300-accelerate/400-api-reference.mdx @@ -1,7 +1,7 @@ --- title: 'API Reference' metaTitle: 'Accelerate: API Reference' -metaDescription: 'API reference documentation for Accelerate.' +description: 'API reference documentation for Accelerate.' tocDepth: 3 toc: true --- @@ -22,7 +22,7 @@ All example are based on the `User` model. -## cacheStrategy +## `cacheStrategy` With the Accelerate extension for Prisma Client, you can use the `cacheStrategy` parameter for model queries and use the [`ttl`](/accelerate/caching#time-to-live-ttl) and [`swr`](/accelerate/caching#stale-while-revalidate-swr) parameters to define a cache strategy for Accelerate. The Accelerate extension requires that you install Prisma Client version `4.10.0`. @@ -46,6 +46,7 @@ await prisma.user.findMany({ contains: 'alice@prisma.io', }, }, + //highlight-next-line cacheStrategy: { swr: 60, ttl: 60 }, }) ``` @@ -69,7 +70,7 @@ The `cacheStrategy` parameter is not supported on any write operations, such as -## withAccelerateInfo +## `withAccelerateInfo` Any query that supports the `cacheStrategy` can append `withAccelerateInfo()` to wrap the response data and include additional information about the Accelerate response. @@ -108,7 +109,7 @@ interface AccelerateInfo { | Property | Type | Description | | -------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `cacheStatus` | "ttl" \| "swr" \| "miss" \| "none" | The cache status of the response.
  • `ttl` indicates a cache hit within the `ttl` duration and no database query was executed
  • `swr` indicates a cache hit within the `swr` duration and the data is being refreshed by Accelerate in the background
  • `miss` indicates that both `ttl` and `swr` have expired and the database query was executed by the request
  • `none` indicates that no cache strategy was specified and the database query was executed by the request
| +| `cacheStatus` | `"ttl" \| "swr" \| "miss" \| "none" ` | The cache status of the response.
  • `ttl` indicates a cache hit within the `ttl` duration and no database query was executed
  • `swr` indicates a cache hit within the `swr` duration and the data is being refreshed by Accelerate in the background
  • `miss` indicates that both `ttl` and `swr` have expired and the database query was executed by the request
  • `none` indicates that no cache strategy was specified and the database query was executed by the request
| | `lastModified` | `Date` | The date the response was last refreshed. | | `region` | `String` | The data center region that received the request. | | `requestId` | `String` | Unique identifier of the request. Useful for troubleshooting. | diff --git a/content/300-accelerate/500-limitations.mdx b/content/300-accelerate/500-limitations.mdx index dec1b870a6..096a355bda 100644 --- a/content/300-accelerate/500-limitations.mdx +++ b/content/300-accelerate/500-limitations.mdx @@ -1,7 +1,7 @@ --- title: 'Limitations' metaTitle: 'Accelerate: Limitations' -metaDescription: 'Learn about limitations of Accelerate.' +description: 'Learn about limitations of Accelerate.' tocDepth: 3 toc: true --- @@ -16,6 +16,8 @@ Below are descriptions of known limitations when using Accelerate. If you are aw Accelerate has a global timeout of `10s` for each query. Reach out to [support@prisma.io](mailto:support@prisma.io) with your use case if your application requires a greater timeout value. +> Also see the [troubleshooting guide](/accelerate/troubleshoot#p6004-querytimeout) for more information. + ## Interactive transactions query timeout limit Accelerate has a global timeout of `15s` for each [interactive transaction](/orm/prisma-client/queries/transactions#interactive-transactions). Reach out to [support@prisma.io](mailto:support@prisma.io) with your use case if your application requires a greater timeout value. @@ -24,6 +26,8 @@ Accelerate has a global timeout of `15s` for each [interactive transaction](/orm Accelerate has a global response size limit of `5MB`. Reach out to [support@prisma.io](mailto:support@prisma.io) with your use case if your application requires a larger response size. +> Also see the [troubleshooting guide](/accelerate/troubleshoot#p6009-responsesizelimitexceeded) for more information. + ## Cannot cache raw queries At the moment, it is not possible to cache the responses of [raw queries](/orm/prisma-client/queries/raw-database-access/raw-queries). diff --git a/content/300-accelerate/550-evaluating.mdx b/content/300-accelerate/550-evaluating.mdx index dd0dd930db..74002df2a9 100644 --- a/content/300-accelerate/550-evaluating.mdx +++ b/content/300-accelerate/550-evaluating.mdx @@ -1,7 +1,7 @@ --- title: 'Evaluating' metaTitle: 'Accelerate: Evaluating' -metaDescription: 'Learn about evaluating Prisma Accelerate.' +description: 'Learn about evaluating Prisma Accelerate.' tocDepth: 3 toc: true --- diff --git a/content/300-accelerate/580-local-development.mdx b/content/300-accelerate/580-local-development.mdx index ece970a8f4..722af7a9f2 100644 --- a/content/300-accelerate/580-local-development.mdx +++ b/content/300-accelerate/580-local-development.mdx @@ -1,7 +1,7 @@ --- title: 'Local development' metaTitle: 'Accelerate: Local development' -metaDescription: 'Learn how to use Prisma Accelerate in a development environment.' +description: 'Learn how to use Prisma Accelerate in a development environment.' tocDepth: 3 toc: true --- @@ -19,7 +19,8 @@ This guide will explain how to use Prisma Accelerate client extension in a devel ## Using Prisma Accelerate client extension in development and production
- + +![](/img/accelerate/accelerate-in-dev.png) Accelerate does not work with a local database. However, in a development environment, you can still use Prisma Client with the Accelerate client extension. This setup will not provide Accelerate's connection pooling and caching features. @@ -50,7 +51,7 @@ The following steps outline how to use Prisma ORM and Prisma Accelerate with a l > The extended instance of Prisma Client will use the local database. Hence, Prisma Accelerate will not be used in your development environment to respond to your Prisma Client queries. - +![](/img/accelerate/accelerate-in-prod.png) If an Accelerate connection string is used as the `DATABASE_URL` environment variable, Prisma Client will route your queries through Accelerate. diff --git a/content/300-accelerate/600-faq.mdx b/content/300-accelerate/600-faq.mdx index 0e525c8ca5..26e136faed 100644 --- a/content/300-accelerate/600-faq.mdx +++ b/content/300-accelerate/600-faq.mdx @@ -1,7 +1,7 @@ --- title: 'FAQ' metaTitle: 'Accelerate: FAQ' -metaDescription: 'Frequently asked questions about Accelerate.' +description: 'Frequently asked questions about Accelerate.' tocDepth: 3 toc: true --- @@ -96,4 +96,20 @@ Even without using Accelerate's global cache, you can still greatly benefit from ## Can I use Accelerate with other ORMs/query builders/drivers? -No. We currently do not have any plans for supporting other ORMs/query builders or drivers. However, if you're interested in support for other libraries, feel free to reach out and let us know in our [Discord](https://pris.ly/discord) community in the `#accelerate-feedback` channel. +No. We currently do not have any plans for supporting other ORMs/query builders or drivers. However, if you're interested in support for other libraries, feel free to reach out and let us know in our [Discord](https://pris.ly/discord) community in the `#help-and-questions` channel. + +## What is the maximum allowed value for the `ttl` parameter when configuring `cacheStrategy`? + +The [Time-to-live](/accelerate/caching#time-to-live-ttl) (`ttl`) parameter can be set for up to a _year_. However, it's important to note that items within the cache may be evicted if they are not frequently accessed. + +Based on our experimentation, we’ve seen cache items persist for around 18 hours. While items may remain in the cache for an extended period if they are actively accessed, there is no guarantee. + +> **Note**: Even frequently accessed items may occasionally be evicted from the cache. It's unlikely for an item to survive for up to or longer than a month, regardless of its activity level. + +## Why doesn’t Accelerate fall back to the direct connection string during a service disruption? + +In the rare event of a service disruption, falling back to a direct connection would bypass the connection pool. This could potentially deplete the database's available connections and cause other issues on the database level. + +If there is a service disruption, it's recommended to verify on the [status page](https://pris.ly/data-platform-status). You can reach out to one of Prisma's [support channels](https://www.prisma.io/docs/platform/support) for assistance. + +> **Note:** Additionally, it's worth noting that some edge function runtime environments may not support direct connections with Prisma ORM. For further details, refer to our [Edge functions documentation](https://www.prisma.io/docs/orm/prisma-client/deployment/edge/overview). diff --git a/content/300-accelerate/650-troubleshoot.mdx b/content/300-accelerate/650-troubleshoot.mdx new file mode 100644 index 0000000000..b59e9b5a9b --- /dev/null +++ b/content/300-accelerate/650-troubleshoot.mdx @@ -0,0 +1,127 @@ +--- +title: 'Troubleshooting' +metaTitle: 'Troubleshooting: Prisma Accelerate' +description: 'Troubleshooting Prisma Accelerate.' +tocDepth: 3 +toc: true +--- + + + +When working with Prisma Accelerate, you may encounter errors often highlighted by specific error codes during development and operations. It is important to understand the meaning of these errors, why they occur, and how to resolve them in order to ensure the smooth operation of your applications. This guide aims to provide insights and steps to troubleshoot specific error codes encountered with Prisma Accelerate. + + + +## [`P6009`](/orm/reference/error-reference#p6009-responsesizelimitexceeded) (`ResponseSizeLimitExceeded`) + +This error is triggered when the response size from a database query exceeds the 5MB limit. We've implemented this restriction to safeguard your application performance, as retrieving data over 5MB can significantly slow down your application due to multiple network layers. Typically, transmitting more than 5MB of data is common when conducting ETL (Extract, Transform, Load) operations. However, for other scenarios such as transactional queries, real-time data fetching for user interfaces, bulk data updates, or aggregating large datasets for analytics outside of ETL contexts, it should generally be avoided. These use cases, while essential, can often be optimised to work within the 5MB limit, ensuring smoother performance and a better user experience. + +### Possible causes for [`P6009`](/orm/reference/error-reference#p6009-responsesizelimitexceeded) + +#### Transmitting images/files in response + +This error may arise if images or files stored within your table are being fetched, resulting in a large response size. Storing assets directly in the database is generally discouraged because it significantly impacts database performance and scalability. In addition to performance, it makes database backups slow and significantly increases the cost of storing routine backups. + +**Suggested solution:** Store the image/file in a BLOB store like [Cloudflare R2](https://developers.cloudflare.com/r2/), [AWS S3](https://aws.amazon.com/pm/serv-s3/), [Cloudinary](https://cloudinary.com/), etc. These services would allow you to store the assets optimally and return a URL through which you should be able to access the asset. You can store this URL in your table instead of storing the asset directly in database. This would substantially reduce the size of your response. + +#### Overfetching of data + +In certain cases, a large number of records or fields are unintentionally fetched, which results in exceeding the 5MB limit. This could happen when the [`where`](/orm/reference/prisma-client-reference#where) clause in the query is incorrect or entirely missing. + +**Suggested solution:** Double-check if the `where` clause is filtering the data as you expect. Consider using [pagination](/orm/prisma-client/queries/pagination) to prevent a large number of records from being fetched. Additionally, use the [`select`](/orm/reference/prisma-client-reference#select) clause to return only the fields that are being consumed to further reduce the response size. + +#### Fetching a large volume of data + +In many data processing workflows, especially those involving ETL (Extract-Transform-Load) processes or scheduled CRON jobs, there's a need to extract large amounts of data from data sources (like databases, APIs, or file systems) for analysis, reporting, or further processing. If you are running an ETL/CRON workload that fetches a huge chunk of data for analytical processing then you might run into this limit. + +**Suggested solution:** Consider splitting your query to fetch data in batches to prevent the 5MB limit from being reached. By splitting your query to retrieve data in batches, you ensure that each operation fetches only a portion of the total data volume, thereby not exceeding the size limit for a single fetch operation. + +## [`P6004`](/orm/reference/error-reference#p6004-querytimeout) (`QueryTimeout`) + +This error occurs when a database query fails to return a response within 10 seconds. The 10-second limit includes the duration of waiting for a connection from the pool, network latency to the database, and the execution time of the query itself. We enforce this limit to prevent unintentional long-running queries that can overload system resources. + +> The time for Accelerate's cross-region networking is excluded from the 10-second limit. + +### Possible causes for [`P6004`](/orm/reference/error-reference#p6004-querytimeout) + +This error could be caused by numerous reasons. Some of the prominent ones are: + +#### High traffic and insufficient connections + +If the application is receiving very high traffic and there are not a sufficient number of connections available to the database, then the queries would need to wait for a connection to become available. This situation can lead to queries waiting longer than 10 seconds for a connection, ultimately triggering a timeout error if they do not get serviced within this duration. + +**Suggested solution**: Review and possibly increase the `connection_limit` specified in the connection string parameter when setting up Accelerate in a platform environment ([reference](/accelerate/connection-pooling#configuring-the-connection-pool-size)). +This limit should align with your database's maximum number of connections. + +By default, the connection limit is set to 10 unless a +different `connection_limit` is specified in your database connection string. + +#### Long-running queries + +Queries may be slow to respond, hitting the 10-second timeout even when connections are available. This could happen if a very large amount of data is being fetched in a single query or if appropriate indexes are missing from the table. + +**Suggested solution**: Identify the slow-running queries and fetch only the required data. If you only need to use specific fields from the table, then you can use the select clause in your queries to prevent unnecessary data from being fetched. Additionally, you could consider adding appropriate indexes based on the query to ensure that data is fetched efficiently. +You can also consider isolating long running queries into separate environments, so that these long running queries would not affect the transactional queries. + +#### Database resource contention + +A common yet challenging issue is when other services operating on the same database perform heavy analytics or data processing tasks, significantly consuming database resources. These operations can monopolize database connections and processing power, leading to a scenario where even simple queries cannot be executed in a timely manner. This "busy" or "noisy" database environment can cause queries that are typically fast to run slowly or even timeout, particularly during periods of high activity from other services. + +Users often rely on CPU and memory usage metrics to gauge database load, which can be misleading. While these are important indicators, they might not fully represent the database's operational state. Direct metrics like the number of reads, writes, and wait times offer a clearer view of the database's performance and should be monitored closely. A noticeable degradation in these metrics, especially in the absence of changes to the queries or data model, suggests that external pressures are affecting database performance. + +**Suggestion solution**: If normally quick queries are intermittently slow or timing out without any modifications to them, it's probable that competing queries are exerting pressure on the same database tables. To diagnose this, adopt monitoring tools or leverage your database's inherent capabilities to observe reads, writes, and wait times. Such monitoring will unveil activity patterns or spikes that align with the observed performance dips. + +Moreover, it's crucial to periodically scrutinize and refine essential queries and verify that tables are properly indexed. This proactive approach minimizes the vulnerability of these queries to slowdowns caused by competing workloads. + +### Considerations for [`P6009`](/orm/reference/error-reference#p6009-responsesizelimitexceeded) and [`P6004`](/orm/reference/error-reference#p6004-querytimeout) errors + +For runtimes that support Prisma ORM natively, you could consider creating two `PrismaClient` Instances. One with the Accelerate connection string (prefixed with `prisma://`) and the other one with the direct database connection string (prefixed with `postgres://`, `mysql://` etc). The main idea behind this approach is to bypass Accelerate for certain specific queries. + +However, please note that the available connections would be split between both of your `PrismaClient` Instances. It's crucial to understand the implications of managing multiple instances, particularly in regards to direct database connections. Utilizing a `PrismaClient` instance with a direct database connection string means that this connection will interact directly with your database. + +This approach requires careful consideration because the direct connections and those managed by Accelerate share the same underlying database connection pool. This can lead to competition for resources, potentially affecting the performance and availability of your database services. + +Additionally, direct connections could have a significant impact on your database's performance and availability. Operations that consume a considerable amount of resources could potentially degrade the service for other users or processes that rely on the same database. + +If your application's runtime environment supports Prisma ORM natively and you're considering this strategy to circumvent P6009 and P6004 errors, you might create two `PrismaClient` instances: + +1. An instance using the Accelerate connection string (prefixed with `prisma://`) for general operations. +2. Another instance with the direct database connection string (e.g., prefixed with `postgres://`, `mysql://`, etc.) for specific operations anticipated to exceed 10 seconds in execution time or to result in responses larger than 5MB. + +```jsx +export const prisma = new PrismaClient({ + datasourceUrl: process.env.DIRECT_DB_CONNECTION, +}) + +export const prismaAccelerate = new PrismaClient({ + datasourceUrl: process.env.ACCELERATE_CONNECTION, +}).$extends(withAccelerate()) +``` + +This setup allows you to strategically direct certain operations through the direct connection, mitigating the risk of encountering the aforementioned errors. However, this decision should be made with a comprehensive understanding of the potential consequences and an assessment of whether your database infrastructure can support this additional load without compromising overall performance and availability. + +> Also see [**why doesn’t Accelerate fall back to the direct connection string during a service disruption?**](/accelerate/faq#why-doesnt-accelerate-fall-back-to-the-direct-connection-string-during-a-service-disruption) + +## [`P6008`](/orm/reference/error-reference#p6008-connectionerrorenginestarterror) (`ConnectionError|EngineStartError`) + +This error indicates that Prisma Accelerate cannot establish a connection to your database, potentially due to several reasons. + +### Possible causes for [`P6008`](/orm/reference/error-reference#p6008-connectionerrorenginestarterror) + +#### Database Not Publicly accessible + +Prisma Accelerate currently requires the database to be publicly accessible. If your database is behind a VPC, or access is restricted to specific IP addresses, this error may occur. + +**Suggested solution:** Ensure your database is publicly accessible, if not, allow public access. Please note this is only an interim requirement, Static IPs are coming soon and will alleviate the need for complete public access if that’s not desirable. + +#### Unreachable Database Host/Port + +If the database’s server address (hostname) and port are incorrect or unreachable then you may encounter this error. + +**Suggested solution:** Verify the hostname/port of the database connection string that was provided while creating the Prisma Accelerate project. Additionally, attempt to connect to the database using a Database GUI tool (e.g., [Prisma Studio](https://www.prisma.io/studio), [TablePlus](https://tableplus.com/), or [DataGrip](https://www.jetbrains.com/datagrip/)) for further investigation. + +#### Incorrect username/password/database name + +This error can happen when the wrong credentials are provided to Prisma Accelerate, preventing it from establishing a connection to your database. + +**Suggested solution:** Verify the correctness of your database's username, password, and name in the connection string provided to Prisma Accelerate. Ensure that these credentials match those required by your database. Testing the connection using a direct database GUI tool can also help in confirming if the provided credentials are correct. diff --git a/content/300-accelerate/700-feedback.mdx b/content/300-accelerate/700-feedback.mdx index 08755185e4..6e84309515 100644 --- a/content/300-accelerate/700-feedback.mdx +++ b/content/300-accelerate/700-feedback.mdx @@ -1,9 +1,9 @@ --- title: 'Feedback' metaTitle: 'Accelerate: Feedback' -metaDescription: 'Learn where to submit feedback about Accelerate.' +description: 'Learn where to submit feedback about Accelerate.' tocDepth: 3 -toc: true +hide_table_of_contents: true --- diff --git a/content/300-accelerate/images/no-cache.png b/content/300-accelerate/images/no-cache.png deleted file mode 100644 index 01c6c266ed..0000000000 Binary files a/content/300-accelerate/images/no-cache.png and /dev/null differ diff --git a/content/300-accelerate/images/speed-test.png b/content/300-accelerate/images/speed-test.png deleted file mode 100644 index 1d32a83118..0000000000 Binary files a/content/300-accelerate/images/speed-test.png and /dev/null differ diff --git a/content/300-accelerate/index.mdx b/content/300-accelerate/index.mdx index e1e11ae428..910c25cfb8 100644 --- a/content/300-accelerate/index.mdx +++ b/content/300-accelerate/index.mdx @@ -1,8 +1,11 @@ --- title: 'Accelerate' metaTitle: 'Prisma Accelerate' -metaDescription: 'Prisma Accelerate is a global database cache with built-in connection pooling that helps improve database performance in Serverless and Edge applications.' -toc: false +description: 'Prisma Accelerate is a global database cache with built-in connection pooling that helps improve database performance in Serverless and Edge applications.' +sidebar_position: 0 +hide_table_of_contents: true +pagination_next: 'accelerate/what-is-accelerate' + --- diff --git a/content/400-pulse/100-what-is-pulse.mdx b/content/400-pulse/100-what-is-pulse.mdx index 85b4266ea2..2d44770467 100644 --- a/content/400-pulse/100-what-is-pulse.mdx +++ b/content/400-pulse/100-what-is-pulse.mdx @@ -1,21 +1,38 @@ --- title: 'What is Pulse' metaTitle: 'What is Pulse' -metaDescription: 'Learn about Pulse, a managed Change Data Capture service that lets you build real-time applications with ease.' +description: 'Learn about Pulse, a managed Change Data Capture service that lets you build real-time applications with ease.' tocDepth: 3 toc: true --- -[Pulse](https://www.prisma.io/data-platform/pulse) is a managed [change data capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) service that captures change events from your database and delivers them instantly to your applications. With Pulse, you can quickly build real-time applications in a type-safe manner using [Prisma Client](/orm/prisma-client). +[Prisma Pulse](https://www.prisma.io/data-platform/pulse) is managed database-event infrastructure that captures and distributes your database events to your application. It simplifies subscribing to type-safe data changes with an extended [Prisma Client](/orm/prisma-client) to power real-time functionality. - + -Pulse is currently in [Early Access](/platform/maturity-levels#early-access). Although we already have high confidence in it, the nature of an Early Access product is that significant iterations might happen at any time. Therefore, we advise against using it in a system that requires stability.

+## How Prisma Pulse works -We strongly recommend evaluating Pulse with a dedicated database instance that is exclusively used for Pulse and where downtime and data loss would be acceptable. Prisma assumes no responsibility for downtime or data loss. +Prisma Pulse leverages Change Data Capture (CDC) to efficiently observe and capture database changes as they occur. By monitoring the database's transaction log, Prisma Pulse identifies change events like inserts, updates, and deletes without impacting the database's performance. - +The captured events are processed, evaluated, and swiftly distributed to relevant client subscriptions ensuring your applications stay synchronized with the latest database state. -
+This eliminates the need for complex polling or manual data synchronization, saving you development time and effort. + +![What is Pulse](/img/pulse/what-is-pulse.png) + +## What you can build with Prisma Pulse + +Prisma Pulse can power real-time functionality like chat, notifications, data broadcast, data synchronization, and more. It's ideal for ensuring data consistency in distributed systems, enhancing real-time user experiences. + +![Prisma Pulse use-cases](/img/pulse/pulse-usecase.png) + +## Examples + +Here are a few example projects using Prisma Pulse: + +| Project | Description | +| :--------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| [pulse-starter](https://github.com/prisma/pulse-starter) | General Pulse starter project. | +| [pulse-resend-demo](https://github.com/prisma/pulse-resend-demo) | Optimize your onboarding with Pulse by triggering welcome emails via Resend for new user sign-ups. | diff --git a/content/400-pulse/200-getting-started.mdx b/content/400-pulse/200-getting-started.mdx index 0b73cae345..51067fff46 100644 --- a/content/400-pulse/200-getting-started.mdx +++ b/content/400-pulse/200-getting-started.mdx @@ -1,8 +1,8 @@ --- title: 'Getting started' -metaTitle: 'Getting started with Pulse' -metaDescription: 'Learn how to get up and running with Pulse.' -tocDepth: 3 +metaTitle: 'Getting started with Prisma Pulse' +description: 'Learn how to get up and running with Prisma Pulse.' +tocDepth: 4 toc: true --- @@ -10,163 +10,49 @@ toc: true ## Prerequisites -To participate in Pulse's Early Access program, you need to meet the following prerequisites: - -- A GitHub account. -- Pulse requires [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `v0.2.1` or higher. -- A publicly accessible PostgreSQL database. -- Ability to use the superuser account of the database instance. In the future, we will support the ability to connect to your database from Pulse with a limited access, non-superuser account. - -You will also need a database with the following configurations: - -- PostgreSQL version 12+. -- Ensure your database is publicly accessible. -- [Set the `wal_level` setting in PostgreSQL to `logical`](/pulse/getting-started#wal_level). -- A database superuser that can be used for connections inside Pulse. -- Connect to the database using `sslmode=disable` if the database provider uses self-signed certificates. - -## 1. Database setup - -### General database configuration - -#### Required settings - -##### [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) - -Some providers may not allow direct access to this setting. If you are unable to change this setting, please refer to the provider-specific guides for further assistance. - -```sql -ALTER SYSTEM SET wal_level = logical; -``` - -You will need to restart the database after changing this setting. - -#### Optional settings - -The following increases the memory usage of the [write-ahead log](https://www.postgresql.org/docs/current/wal-intro.html) on your PostgreSQL database. We suggest setting these values initially and adjusting them if necessary. - -##### [max_replication_slots](https://www.postgresql.org/docs/current/runtime-config-replication.html) - -```sql -ALTER SYSTEM SET max_replication_slots = 20; -``` - -##### [wal_keep_size](https://www.postgresql.org/docs/current/runtime-config-replication.html) - -```sql -ALTER SYSTEM SET wal_keep_size = 2048; -``` - -### Provider specific configuration - -To learn about the database providers that Pulse supports, visit [here](/pulse/faq#what-database-providers-are-supported-with-pulse). - -#### Railway - -[Railway.app](https://railway.app) offers an excellent [templates feature](https://railway.app/templates). If you wish to quickly start with Pulse, you can use either of two templates: - -- [Prisma Pulse DB Only](https://railway.app/template/pulse-pg): Provides a fresh, pre-configured PostgreSQL database which you can use with Pulse. -- [Prisma Pulse DB & App](https://railway.app/template/pulse-starter): Provides a pre-configured PostgreSQL database and a [Pulse starter app](https://github.com/prisma/pulse-starter). - -##### Setup without using a template - -
1. Change the PostgreSQL database settings - -You can run these queries in the Railway Database **Query** tab, using the [railway cli](https://docs.railway.app/databases/postgresql), or any other way you might run queries on your database. - -1. Drop the Timescale extension: - -```sql -DROP EXTENSION timescaledb; -``` - -2. Set the [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) to `logical`: - -```sql -ALTER SYSTEM SET wal_level = logical; -``` - -3. Set the [max_replication_slots](https://www.postgresql.org/docs/current/runtime-config-replication.html) to `20`: - -```sql -ALTER SYSTEM SET max_replication_slots = 20; -``` - -4. Set the [wal_keep_size](https://www.postgresql.org/docs/current/runtime-config-replication.html) to `2048`: - -```sql -ALTER SYSTEM SET wal_keep_size = 2048; -``` - -5. Reload the PostgreSQL configuration: - -```sql -SELECT pg_reload_conf(); -``` - -
-
-2. Restart your database - -1. Click on your database. - -2. Navigate to the Deployments tab. - -3. Go into the three-dots menu on the latest deployment and click the `Restart` option. - -
- -##### SSL mode - -As Railway uses a self-signed certificate, you have to use [`sslmode=disable`](/orm/overview/databases/postgresql#configuring-an-ssl-connection) with Pulse. - -## 2. Enable Pulse in a project - -Log into the [Prisma Data Platform](https://console.prisma.io/login), create a new project and enable Pulse for that new project. - -> An API key will be created after you enable and setup Pulse in your [project](/platform/concepts/projects). - -## 3. Use Pulse in your application - -We have created an [example repository](https://github.com/prisma/pulse-starter) on GitHub to help you get started using Pulse. If you would like to start there, you can do so. +Prisma Pulse currently supports PostgreSQL. We'd love to hear [which databases](https://tally.so/r/wLbb8G) you would like to see supported next. -The following will show how you can utilize Pulse in an existing application. We will be adding Pulse to the [hello-prisma](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) example from our documentation. +You'll need the following to integrate Pulse into your application: -### 3.1. Install the Pulse Prisma Client extension +- A [Prisma Data Platform workspace](https://console.prisma.io). +- [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `1.0.1` or higher. +- A publicly accessible PostgreSQL (version 12+) database with [logical replication](https://www.postgresql.org/docs/current/logical-replication-quick-setup.html) enabled. View our [setup guide](/pulse/database-setup/general-database-instructions#enable-logical-replication) on configuring logical replication for your database. -In a project using [Prisma Client](/orm/prisma-client), run the following command to install the Pulse extension: +## 1. Enable Pulse -```terminal -npm install @prisma/extension-pulse -``` +Navigate to your Prisma Data Platform project, choose an environment, and enable Pulse. We'll connect to your database and verify connectivity during setup. -### Store your Pulse API key in your .env file +> Once enabled, you'll be prompted to generate an API key that you'll use in your extended Prisma Client to authenticate requests. Store this API key in your application's `.env` file: +> +> ```env file=.env showLineNumbers +> PULSE_API_KEY="your_secure_pulse_api_key" +> ``` -The Pulse extension requires you to use an API key. +## 2. Add Pulse to your application - +With Pulse enabled, proceed with these steps to integrate Pulse into your application. You can also utilize our [example repository](https://github.com/prisma/pulse-starter) on GitHub as a reference guide. -You should have received an API key when you added Prisma Pulse to your project in the Platform Console. +### 2.1. Install the Pulse Client extension - + -In `.env`, add a variable named `PULSE_API_KEY`: +Pulse requires [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `1.0.1` or higher + + -```env file=.env -PULSE_API_KEY="YOUR-API-KEY" +Install the latest version of Prisma Client and the Pulse Client extension -# Example: -# PULSE_API_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlfa2V5IjoiNGMxNzM0MGItMmFhYy00MGMxLWE1ZDctNzYyNmRjNjg3NjM4IiwidGVuYW50X2lkIjoiY2VhZjE0NThkZGUyYzJmNTU0ZmNkNTI2MmFmOWY1ODljMWJiZmRhNDU0N2UxMjM1ODk3MGQ2MGI1ZjRlNTU0OCIsImludGVybmFsX3NlY3JldCI6ImM1ZTcxYjJhLTE0NzdawdwDliZS1hM2IzLTczODFkNDM5ZmEwZSJ9.wCUlghC_suFBr2vnk0q_5I8iRNRDyEQo0W9rnhf6mCw" +```bash +npm install @prisma/client@latest @prisma/extension-pulse@latest ``` -### 3.2. Create a Pulse-enabled Prisma Client +### 2.2. Extend your Prisma Client instance with the Pulse extension -To use Pulse, you must extend Prisma Client with the Pulse extension. -Add the following to extend your existing Prisma Client instance with the Pulse extension: +Add the following to extend your existing Prisma Client instance with the Prisma Pulse extension: ```ts import { PrismaClient } from '@prisma/client' @@ -177,32 +63,46 @@ const prisma = new PrismaClient().$extends( ) ``` -### 3.3. Create your first Pulse subscription + + +You stored this API key in your .env file after [enabling Pulse](#1-enable-pulse). If needed, you can navigate to your respective project environment and generate a new API key. + + + +### 2.3. Create your first Pulse subscription -With the Pulse extension applied, you may now use Pulse's `subscribe()` method on any model defined in your Prisma Schema to subscribe to data change events. +With the Pulse extension applied, you can use Pulse's `subscribe()` method on any model defined in your Prisma Schema to subscribe to data change events. -In the example below, a subscription is made on a `user` table that listens for _any_ change event on that table: +In the below example, a subscription is made to a `notification` model that listens for _any_ change event on that table: ```ts const prisma = new PrismaClient().$extends(withPulse({ apiKey: apiKey })) async function main() { - const subscription = await prisma.user.subscribe({}) - - if (subscription instanceof Error) { - throw subscription - } + const subscription = await prisma.notification.subscribe() for await (const event of subscription) { - console.log('just received an event:', event) + console.log('just received a notification:', event) } } main() ``` - +All done! You've successfully added Pulse to your application. Explore next steps to learn more. -Refer to the [API Reference](/pulse/api-reference) section for more detail on the filtering options available to the `subscribe()` method. +## Next steps - +[Navigate to the API section](/pulse/api-reference) to explore available filtering options for Pulse's `subscribe()` method. + +```ts +const subscription = await prisma.notification.subscribe({ + create: { + userId: 123, // subscribe to all notifications created for the user with ID 123 + }, +}) +``` + +## Need help? + +Reach out to us in the `#help-and-questions` channel on our [Discord](https://pris.ly/discord), or connect with our community to see how others are using Pulse. diff --git a/content/400-pulse/250-database-setup/100-general-database-instructions.mdx b/content/400-pulse/250-database-setup/100-general-database-instructions.mdx new file mode 100644 index 0000000000..a364d342a7 --- /dev/null +++ b/content/400-pulse/250-database-setup/100-general-database-instructions.mdx @@ -0,0 +1,171 @@ +--- +title: 'General database instructions' +metaTitle: 'Prisma Pulse: General database instructions' +description: 'Instructions to use your database with Prisma Pulse' +tocDepth: 3 +toc_max_heading_level: 6 +toc: true +--- + + + +Prepare your database to work with Pulse. + +> Prisma Pulse requires a publicly accessible PostgreSQL (**version 12+**) database with logical replication enabled. To configure specific database providers for Prisma Pulse, visit [here](/pulse/database-setup#provider-specific-instructions). + + + +## Database Replication + +Database replication is the process of creating copies of a database and storing them across various on-premises or cloud destinations. Prisma Pulse uses logical replication to monitor your database for changes. + +### Enable logical replication + +##### [`wal_level`](https://www.postgresql.org/docs/current/runtime-config-wal.html) + +Some providers may not allow direct access to this setting. If you are unable to change this setting, please refer to the provider-specific guides for further assistance. + +```sql +ALTER SYSTEM SET wal_level = logical; +``` + +You will need to restart the database after changing this setting. + +##### Optional settings + +###### [`wal_keep_size`](https://www.postgresql.org/docs/current/runtime-config-replication.html) + +Setting `wal_keep_size` increases the memory usage of the [write-ahead log](https://www.postgresql.org/docs/current/wal-intro.html) on your PostgreSQL database. + +We recommend setting a value for `wal_keep_size` tailored to your database's storage capacity. This ensures smooth operation of both your database and Prisma Pulse. + +> We suggest setting these values initially and adjusting them if necessary. + +```sql +ALTER SYSTEM SET wal_keep_size = 2048; +``` + +###### [`max_replication_slots`](https://www.postgresql.org/docs/current/runtime-config-replication.html) + +Prisma Pulse only needs one replication slot available. You can set the `max_replication_slots` if you have other replications in use. + +> We suggest setting these values initially and adjusting them if necessary. + +```sql +ALTER SYSTEM SET max_replication_slots = 20; +``` + +###### [`REPLICA IDENTITY`](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY) + +To get the **before** values of **all fields** in the record for some events, you must set `REPLICA IDENTITY` to `FULL` on the table(s) you want to get field values for. If this is not configured, defining a filter for those events will only be possible on the primary key. + +For example, running the following SQL command will set the `REPLICA IDENTITY` to `FULL` on a table named `User`: + +```sql +ALTER TABLE public."User" REPLICA IDENTITY FULL; +``` + +### Manage your own publication slot + +If you want to enable replication for *specific models* or use a database provider that restricts superuser access for Prisma Pulse our advanced setup allows you to configure your own publication slot and use it to enable Pulse. + +#### Creating a publication slot + +You can create publications in the following ways below depending on the version of your PostgreSQL database. + +
+ +Publication for all models. +
+```sql +CREATE PUBLICATION $PUBLICATION_NAME FOR ALL TABLES; +``` + +
+ +
+ +Publication for specific fields. + +For example, create a publication that publishes all changes for table `users`, but replicates only columns `user_id` and `firstname`: + +```sql + CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname); +``` + +
+ +
+ +Publication for specific models. + +For example, create a publication that publishes all changes in two tables: + +```sql +CREATE PUBLICATION user_and_department_publication FOR TABLE users, departments; +``` + +
+ +
+ +Publication for a model with a `WHERE` clause on it’s fields. + +For example, create a publication that publishes all changes from active `departments`: + +```sql +CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE); +``` + +
+ +
+ +Publication based on DML operations.{' '} + +For example, create a publication that only publishes `INSERT` operations in one table: + +```sql +CREATE PUBLICATION insert_only FOR TABLE departments +WITH (publish = 'insert'); +``` + +> `publish` (`string`) +> +> This parameter determines which DML operations will be published by the new publication to the subscribers. The value is comma-separated list of operations. The allowed operations are `insert`, `update`, `delete`, and `truncate`. The default is to publish all actions, and so the default value for this option is `'insert, update, delete, truncate'`. + +You can learn more about the PostgreSQL's `CREATE PUBLICATION`, supported versions and see more examples [here](https://www.postgresql.org/docs/current/sql-createpublication.html). + +
+ +#### Submit your publication slot + +You can submit the publication name in the [Platform console](https://console.prisma.io/), before enabling Prisma Pulse: + +1. To view your [publications](https://www.postgresql.org/docs/current/view-pg-publication-tables.html), execute: + + ```sql + SELECT * FROM pg_publication_tables; + ``` + +2. Then you can submit the desired publication name in the Platform console: + + ![](/img/pulse/replication-slot-submission.png) + +#### Removing publications + +If you are managing your replications independently and choose to disable Prisma Pulse for a particular environment, you can refer to the following SQL queries to remove your publications. + +1. To delete a publication: + + ```sql + DROP PUBLICATION IF EXISTS "$PUBLICATION_SLOT_NAME"; + ``` + +2. View your [publications](https://www.postgresql.org/docs/current/view-pg-publication-tables.html): + + ```sql + SELECT * FROM pg_publication_tables; + ``` + +> 💡 To configure specific database providers for Prisma Pulse, visit [here](/pulse/database-setup#provider-specific-instructions). diff --git a/content/400-pulse/250-database-setup/200-aws-rds.mdx b/content/400-pulse/250-database-setup/200-aws-rds.mdx new file mode 100644 index 0000000000..28f8b1c037 --- /dev/null +++ b/content/400-pulse/250-database-setup/200-aws-rds.mdx @@ -0,0 +1,33 @@ +--- +title: 'AWS RDS' +metaTitle: 'Prisma Pulse: AWS RDS' +description: 'Instructions to use AWS RDS with Prisma Pulse' +tocDepth: 3 +toc: true +--- + + + +You have to enable logical replication on AWS RDS to make it compatible with Prisma Pulse. + + + +## Enable logical replication on AWS RDS + +The following instructions show how to create a parameter group, enable logical replication, and add the parameter group to your AWS RDS PostgreSQL database. + +1. Create a parameter group for your RDS database (`RDS` > `Parameter groups` > `Create a parameter group`). In the **Parameter group family**, select your Postgres version. Select the type **DB Parameter group** option and assign a descriptive group name and description: + + ![Create a parameter group in AWS RDS](/img/pulse/aws-rds-create-parameter-group.png) + +2. Set the `rds.logical_replication` parameter to `1`(`true`) in the parameter group. + + ![Set logical replication parameter group](/img/pulse/set-logical-replication-parameter.png) + +3. Modify **Database options** (`RDS` > `Databases` > `Modify`) to use the new DB parameter group: + + ![Add Parameter group to AWS RDS](/img/pulse/add-group.png) + + To reflect the configuration change into `wal_level`, select the **Apply immediately** option. + +4. Go to `RDS` > `Databases` > `[database name]`, then click on **Actions**, and then click on **Reboot** to restart your database. diff --git a/content/400-pulse/250-database-setup/300-railway.mdx b/content/400-pulse/250-database-setup/300-railway.mdx new file mode 100644 index 0000000000..bd34b7594d --- /dev/null +++ b/content/400-pulse/250-database-setup/300-railway.mdx @@ -0,0 +1,135 @@ +--- +title: 'Railway' +metaTitle: 'Prisma Pulse: Railway' +description: 'Instructions to use Railway with Prisma Pulse' +tocDepth: 3 +toc: true +--- + + + +Railway provides a useful feature known as [templates](https://railway.app/templates) to facilitate quick project setup. These templates allow users to package a service or a group of services into a format that can be easily reused and shared. We have two templates for Prisma Pulse that you can use: + +- [Prisma Pulse DB Only](https://railway.app/template/pulse-pg): Provides a fresh, pre-configured PostgreSQL database which you can use with Prisma Pulse. +- [Prisma Pulse DB & App](https://railway.app/template/pulse-starter): Provides a pre-configured PostgreSQL database and a [Prisma Pulse starter app](https://github.com/prisma/pulse-starter). + + + +## Setup with template: "Prisma Pulse DB Only" + +### Overview + +This section provides step-by-step instructions for setting up a Pulse-ready PostgreSQL database using the Railway template called: [Prisma Pulse DB Only](https://railway.app/template/pulse-pg). + +The template consists of two [services](https://docs.railway.app/reference/services): + +- **Postgres**: A PostgreSQL database that you'll be able to use with Prisma Pulse after going through the setup instructions. +- **restart-and-delete-me**: This service contains a [script](https://github.com/prisma/pulse-railway-pg-config/blob/main/config-db.ts) that's executed once and configures the PostgreSQL database to make it usable with Prisma Pulse. Once the script has been executed, the instructions will tell you to delete this service since it won't be needed any more. + +### Instructions + +1. Deploy the [template](https://railway.app/template/pulse-pg) on Railway. +2. Once the deployment has finished, click on the service called **restart-db-then-delete-me**. +3. You will see a list of deployments under the **Deployments** tab. +4. Click the most recent deployment's **View Logs** button. +5. Click on the **Deploy Logs** tab. If the service ran correctly, you should see a message in the logs that says: + ```terminal no-copy + All done please restart the database and delete this service. + Here is the DATABASE_URL + postgresql://postgres:password@roundhouse.proxy.rlwy.net:28606/railway + ``` + > **Note**: + > The `DATABASE_URL` can also be found by clicking on the **Postgres** Service and navigating to the **Variables** tab, then clicking the copy icon next to `DATABASE_URL` environment variable value. + > ![](/img/pulse/railway-database-url.png) +6. Copy the `DATABASE_URL` connection string and save it for later. Then restart your Railway database for the changes to be reflected: + 1. Click on the **Postgres** service that represents your deployed database. + 2. Navigate to the **Deployments** tab. + 3. Click on the three-dots menu on the latest deployment and click the **Restart** option. +7. After restarting your database, click on the **restart-db-then-delete-me** service and navigate to the **Settings** tab. +8. Scroll down to the bottom and click the red **Delete service** button. +9. You now have a Pulse-compatible PostgreSQL database running on Railway. You can now follow the instructions on the [Getting started](/pulse/getting-started) page. + +## Setup with template: "Prisma Pulse DB & App" + +### Overview + +This section provides step-by-step instructions for setting up a Pulse starter project with a Pulse-ready PostgreSQL database using the Railway template called: [Prisma Pulse DB & App](https://railway.app/template/pulse-starter). +The template consists of three [services](https://docs.railway.app/reference/services): + +- **Pulse-Starter**: A Typescript app with a basic setup for using Prisma Pulse. You can find the repo for it [on GitHub](https://github.com/prisma/pulse-starter/tree/main). +- **Postgres**: A PostgreSQL database that you'll be able to use with Prisma Pulse after going through the setup instructions. +- **restart-and-delete-me**: This service contains a [script](https://github.com/prisma/pulse-railway-pg-config/blob/main/config-db.ts) that's executed once and configures the PostgreSQL database to make it usable with Prisma Pulse. Once the script has been executed, the instructions will tell you to delete this service since it won't be needed any more. + +### Instructions + +1. Deploy the [template](https://railway.app/template/pulse-starter) on Railway. +2. You'll be navigated to a page prompting configuration for both the **restart-db-then-delete-me** and **pulse-starter** service: + ![Configure Railway template](/img/pulse/railway-template-configure.png) + 1. For the **restart-db-then-delete-me** service, click on the **Configure** button and then save the configuration by clicking on **Save Config**. + 2. On the **pulse-starter** service, locate and click the **Configure** button. Within the **Environment variables** section, you'll find an option to include the `PULSE_API_KEY` environment variable. Keep the `PULSE_API_KEY` field blank for the time being. Once you've set up the database and obtained the database URL from the [Prisma Data Platform](https://console.prisma.io/), you can then add the `PULSE_API_KEY` to the **pulse-starter** service. With the empty field for the Pulse API key, click **Save Config**. + 3. Click on the **Deploy** button. +3. To set up the database and make it Pulse-ready, complete the steps outlined in the [previous section](#setup-with-template-prisma-pulse-db-only), starting from **step 2.** till **step 8.**, then follow the instructions below. +4. Go to the [Platform Console](https://console.prisma.io/) and select the project in which you want to activate Pulse. If you don't have a project yet, create a new project via the **New project** button. +5. Navigate to the project's environment in which Pulse should be activated. If you just created a new project, the only available environment is the **Production** environment. +6. Click **Enable Pulse** on the environment's page. +7. Paste the `DATABASE_URL` that you acquired before into the **Database connection string** field. Then, finish the process by clicking **Enable Pulse**. +8. Pulse is now enabled in your project's environment. Click **Generate API key** to obtain the API key that you need in order to use Pulse in your TypeScript starter app. +9. Save the `PULSE_API_KEY` for later and click **I've securely stored my connection string**. +10. Back in the Railway UI, click on the **pulse-starter** service. + > **Note**: You'll likely find that the build failed for the **pulse-starter** service. This is because the Prisma Pulse API key wasn't provided. Do not worry, this is to be expected and not a problem for the next steps. +11. Click on the **Variables** tab. +12. Create your `PULSE_API_KEY` environment variable: Click the **New Variable** button, create the `PULSE_API_KEY` environment variable, and then paste the value of the `PULSE_API_KEY` that you obtained in the Platform Console. Then save the changes by clicking the **Add** button. +13. With the `PULSE_API_KEY` environment variable in place, you need to rebuild the **pulse-starter** service for the environment variable to take effect: +14. Click on the **Deployments** tab. +15. Click on the three-dots menu on the deployment that failed. Then click **Redeploy**. +16. When the deployment starts, click the **View Logs** button. +17. Then click on the **Deploy Logs** tab to follow the deployment of the Pulse starter app. + +Once the deployment is finished, your Pulse starter app should be running and any database events events will be logged under the **Deploy Logs** tab of the **pulse-starter** service. + +To see an event in action, you need to make changes to the `User` table. You can follow the steps below to do that from the Railway UI: + +1. Click on the **Postgres** service on your Railway project. +2. Click on the **Data** tab. +3. Select the **User** table and click **Add Row**. +4. Fill out an **email** and a **name**, then click **Insert**. +5. Return to the **Deploy Logs** of your **pulse-starter** service. +6. You should be able to see an output from Prisma Pulse for the user being created: + ```json + just received an event: { + action: "create", + created: { id: 1, email: "test", name: "test@test.io" }, + id: 03/34334, + modelName: "User" + } + ``` + +## Setup without using a template + +1. Change the PostgreSQL database settings + + You can run these queries using a tool such as [pgAdmin](https://www.pgadmin.org/), [dbeaver](https://dbeaver.io/), or any other way you might run queries on your database. + + - Set the [`wal_level`](https://www.postgresql.org/docs/current/runtime-config-wal.html) to `logical`: + ```sql + ALTER SYSTEM SET wal_level = logical; + ``` + - Set the [`max_replication_slots`](https://www.postgresql.org/docs/current/runtime-config-replication.html) to `20`: + ```sql + ALTER SYSTEM SET max_replication_slots = 20; + ``` + - Set the [`wal_keep_size`](https://www.postgresql.org/docs/current/runtime-config-replication.html) to `2048`: + ```sql + ALTER SYSTEM SET wal_keep_size = 2048; + ``` + - Reload the PostgreSQL configuration: + ```sql + SELECT pg_reload_conf(); + ``` + +2. You have to restart your database for the changes to be reflected. To restart your database using the Railway UI: + 1. Click on your database. + 2. Navigate to the **Deployments** tab. + 3. Click on the three-dots menu on the latest deployment and click the **Restart** option. +3. After setting up your Railway database, you have to use the [connection string](https://docs.railway.app/guides/postgresql#tcp-proxy-connection) provided by Railway that allows public access to your PostgreSQL database. +4. You now have a Pulse-compatible PostgreSQL database running on Railway. You can now follow the instructions on the [Getting started](/pulse/getting-started) page. diff --git a/content/400-pulse/250-database-setup/400-neon.mdx b/content/400-pulse/250-database-setup/400-neon.mdx new file mode 100644 index 0000000000..1c8d793e38 --- /dev/null +++ b/content/400-pulse/250-database-setup/400-neon.mdx @@ -0,0 +1,36 @@ +--- +title: 'Neon' +metaTitle: 'Prisma Pulse: Neon' +description: 'Instructions to use Neon for PostgreSQL with Prisma Pulse' +tocDepth: 3 +toc: true +--- + + + +To enable logical replication in Neon for Prisma Pulse, follow these steps: + + + +## Enable logical replication on Neon + +1. Enable logical replication in Neon console: + + - Navigate to your project in the Neon console. + - Access the **Project settings** from the Neon Dashboard. + - Go to the **Beta** section. + - Click on **Enable**. + + Learn more about enabling logical replication in Neon [here](https://neon.tech/docs/guides/logical-replication-neon#enabling-logical-replication-in-neon). + +2. Create publication for database events. Use the following SQL query to create a publication for all tables: + + ```sql + CREATE Publication $PUBLICATION_NAME FOR ALL TABLES; + ``` + + Additionally, you can manage specific models for which you want to listen to database events in Neon. Refer to [this](/pulse/database-setup/general-database-instructions#manage-your-own-publication-slot) section for more details on managing Publications. + +3. Before enabling Prisma Pulse, make sure to provide the publication name in the Platform Console: + + ![](/img/pulse/replication-slot-submission.png) diff --git a/content/400-pulse/250-database-setup/500-supabase.mdx b/content/400-pulse/250-database-setup/500-supabase.mdx new file mode 100644 index 0000000000..d6a231b907 --- /dev/null +++ b/content/400-pulse/250-database-setup/500-supabase.mdx @@ -0,0 +1,28 @@ +--- +title: 'Supabase' +metaTitle: 'Prisma Pulse: Supabase' +description: 'Instructions to use Supabase with Prisma Pulse' +tocDepth: 3 +toc: true +--- + + + +You have to use a direct database connection from Supabase to use it with Prisma Pulse. + + + +## Using a direct connection in Supabase + +To use a direct database connection string in Supabase: + +1. Navigate to your Project settings (`Settings` > `Configurations` > `Database`). +2. Disable the **Use connection pooling** option. + ![Supabase direct database connection](/img/pulse/supabase-direct-database-connection.png) +3. Copy the direct database connection string. + + + + ℹ️ Prisma Pulse is currently incompatible with Supabase's connection pooler. This results from the connection pooler intercepting the connection between your database and Prisma Pulse and removing the [Streaming Replication Protocol](https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION) which is used by Prisma Pulse to transmit replication commands to the database. + + diff --git a/content/400-pulse/250-database-setup/_category_.json b/content/400-pulse/250-database-setup/_category_.json new file mode 100644 index 0000000000..47ccf8cefe --- /dev/null +++ b/content/400-pulse/250-database-setup/_category_.json @@ -0,0 +1,4 @@ +{ + "collapsed": false, + "collapsible": false +} \ No newline at end of file diff --git a/content/400-pulse/250-database-setup/index.mdx b/content/400-pulse/250-database-setup/index.mdx new file mode 100644 index 0000000000..57edf67abe --- /dev/null +++ b/content/400-pulse/250-database-setup/index.mdx @@ -0,0 +1,32 @@ +--- +title: 'Prisma Pulse: Database setup' +description: 'Learn about configuring your database to use with Prisma Pulse' +sidebar_label: 'Database setup' +tocDepth: 3 +toc: true +--- + +# Database setup + + + +Prepare your database to work with Prisma Pulse. + + + +## General database instruction + +Prisma Pulse requires your database to be configured in a specific way. To get your database ready for Prisma Pulse, follow the general database instructions [here](/pulse/database-setup/general-database-instructions). + + + +Prisma Pulse requires a publicly accessible PostgreSQL (**version 12+**) database with [logical replication](/pulse/database-setup/general-database-instructions#enable-logical-replication) enabled. + + + +## Provider specific instructions + +- [AWS RDS](/pulse/database-setup/aws-rds) +- [Railway](/pulse/database-setup/railway) +- [Supabase](/pulse/database-setup/supabase) +- [Neon](/pulse/database-setup/neon) diff --git a/content/400-pulse/300-concepts.mdx b/content/400-pulse/300-concepts.mdx index 022f04ee44..1d697d32eb 100644 --- a/content/400-pulse/300-concepts.mdx +++ b/content/400-pulse/300-concepts.mdx @@ -1,7 +1,7 @@ --- title: 'Concepts' metaTitle: 'Pulse: Concepts' -metaDescription: 'Learn about the concepts that are important to understand when using Pulse.' +description: 'Learn about the concepts that are important to understand when using Pulse.' tocDepth: 3 toc: true --- @@ -10,12 +10,26 @@ toc: true ## Change data capture -[Change data capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) is a technique used to track and capture changes in a database enabling real-time updates. It allows applications to be informed about the modifications in the database, ensuring data consistency between multiple applications. +[Change data capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) refers to the process of identifying and capturing changes made to data in a database and then delivering those changes in real-time to a downstream process or system. ## Logical replication Logical replication is a method of replicating data objects and their changes based on their replication identity (usually a primary key). You can read more about logical replication and how it pertains to your database in Postgres' documentation [here](https://www.postgresql.org/docs/current/logical-replication.html). +1. Create a logical replication slot: + + ```sql + SELECT pg_create_logical_replication_slot('$REPLICATION_SLOT_NAME', 'pgoutput'); + ``` + + Learn more [here](https://pgpedia.info/p/pg_create_logical_replication_slot.html). + +2. View your logical replication slots: + + ```sql + SELECT slot_name, slot_type FROM pg_replication_slots WHERE slot_type = 'logical'; + ``` + ## Write-ahead log A [write-ahead log (WAL)](https://www.postgresql.org/docs/current/wal-intro.html) is a standard way of ensuring data integrity by only allowing updates to the data in a database _after_ a log has been written to permanent storage describing the change to take place. diff --git a/content/400-pulse/400-api-reference.mdx b/content/400-pulse/400-api-reference.mdx index c6a3246039..dbf047c7a4 100644 --- a/content/400-pulse/400-api-reference.mdx +++ b/content/400-pulse/400-api-reference.mdx @@ -1,11 +1,14 @@ --- -title: 'API Reference' -metaTitle: 'Pulse: API Reference' -metaDescription: 'API reference documentation for Pulse.' +title: 'Pulse: API reference' +description: 'API reference documentation for Pulse.' +sidebar_label: 'API reference' tocDepth: 4 +toc_max_heading_level: 4 toc: true --- +# API reference + The Pulse API reference documentation is based on the following schema: @@ -22,7 +25,7 @@ All example are based on the `User` model. -## subscribe +## `subscribe` `subscribe` returns all data change events related to the table you call this method on: @@ -42,11 +45,11 @@ const subscription = await prisma.user.subscribe({}) Inside of the `subscribe()` method you can use filters to get specific events and data. The three filter options currently supported are described below: -#### create +#### `create` You can use the `create` filter to retrieve all _create_ events on a table. A create event is triggered when a new record is created in a table. -Pulse returns the values of the new record as an object named `after`. +Pulse returns the values of the new record as an object named `created`. This represents the state of the record _after_ the create event. ##### Example @@ -65,7 +68,7 @@ const subscription = await prisma.user.subscribe({ ```ts no-copy { action: 'create', - after: { + created: { id: 1, email: 'marc@prisma.io', name: 'Marc' @@ -76,7 +79,7 @@ const subscription = await prisma.user.subscribe({ -#### update +#### `update` You can use the `update` filter to retrieve all _update_ events on a table. An update event is triggered when a value in a database record has changed. @@ -110,11 +113,11 @@ const subscription = await prisma.user.subscribe({ -#### delete +#### `delete` You can use the `delete` filter to retrieve all _delete_ events on a table. A delete event is triggered when a record has been removed from the database. -Pulse returns the values of the changed record as an object named `before`. This represents the state of the record _before_ the change event. +Pulse returns the values of the changed record as an object named `deleted`. This represents the state of the record _before_ the change event. ##### Example @@ -133,7 +136,7 @@ const subscription = await prisma.user.subscribe({ ```ts no-copy { action: 'delete', - before: { + deleted: { id: 1, email: '', name: null @@ -155,16 +158,48 @@ ALTER TABLE public."User" REPLICA IDENTITY FULL; +## `stop` + +Allows you to explicitly stop subscriptions and close the connection. This is needed to ensure that the limited number of subscriptions allowed per table is not exhausted. + +```ts +async function main() { + // Subscribe to new events on the `user` table + const subscription = await prisma.user.subscribe({}) + + // Set a timeout to the subscription after 60 seconds. + // Explicitly stopping the subscriptions and closing the connection is needed + // to not exhaust the limited number of subscriptions allowed per table. + + setTimeout(() => { + console.log('Stopping the subscription.') + subscription.stop() + }, 60000) + + // Waiting loop that prints new events when something changes in the database + for await (const event of subscription) { + console.log('new event:', event) // 'create', 'update', 'delete' + } +} + +main() +``` + ### Filter conditions and operators Pulse allows you to subscribe to change events based on filter conditions and operators. Pulse supports all of Prisma Client’s [supported filter conditions and operators](/orm/reference/prisma-client-reference#filter-conditions-and-operators) except for `search` and `mode`. You also won't be able to define filters that reference other models via relations. -You must wrap your filter criteria inside a `before` or `after` object depending on the type of event your subscription is listening for: +You may have to wrap your filter criteria inside a `after` object depending on the type of event your subscription is listening for: -- `before`: `delete` events -- `after`: `create` and `update` events +- `after`: `update` events -This makes it explicit that the specified filter criteria apply to the `before` or `after` state of the change event. +This makes it explicit that the specified filter criteria apply to the `after` state of the change event. + + + +All [`create`](#create) event results implicitly represent the `after` state of the change event. And all [`delete`](#delete) event results implicitly represent the `before` state of the change event. + + @@ -178,38 +213,6 @@ Using a filter inside of `after` will return changed records that match your fil ##### Examples -Get `create` events where the value of name is equal to `'Jim'` after the event has occurred: - - - - -```ts -const subscription = await prisma.user.subscribe({ - create: { - after: { - name: 'Jim', - }, - }, -}) -``` - - - - -```ts no-copy -{ - action: 'create', - after: { - id: 6, - email: 'test@test.com', - name: 'Jim' - } -} -``` - - - - Get `update` events where the value of name is equal to `Jim` after the event has occurred: @@ -241,47 +244,3 @@ const subscription = await prisma.user.subscribe({ - -#### Usage in the before state filter - -Using a filter inside of `before` will return changed records that match your filter criteria as applied to the state of the record before the change event. - -##### Example - -Get delete events where the value of name was equal to Marc. - - - - -```ts -const subscription = await prisma.user.subscribe({ - delete: { - before: { - name: 'Jim', - }, - }, -}) -``` - - - - -```ts no-copy -{ - action: 'update', - after: { - id: 6, - email: 'updated@test.com', - name: 'Jim', - } -} -``` - - - - - - -Specifying a filter condition for delete events only works if you’ve set the table’s `REPLICA IDENTITY` to `FULL`. See [this section](/pulse/api-reference#delete) for more details. - - diff --git a/content/400-pulse/500-current-limitations.mdx b/content/400-pulse/500-current-limitations.mdx deleted file mode 100644 index 832685c361..0000000000 --- a/content/400-pulse/500-current-limitations.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: 'Current limitations' -metaTitle: 'Pulse: Current limitations' -metaDescription: 'Learn about current limitations of Pulse.' -tocDepth: 3 -toc: true ---- - - - -Below are descriptions of known limitations when using Pulse. If you are aware of any limitations that are missing, please let us know on the [#pulse-feedback](https://prisma.slack.com/archives/C058GKE3C1E) channel in our community Slack. - - - -## Superuser account required - -You must connect to your database instance from Pulse using a superuser account. In the future, we will enable non-superuser accounts with limited access privileges to be used with Pulse. - -## Limited throughput of change events - -While in Early Access, there may be limits to the throughput of change events that can be captured and delivered. We plan to provide transparent scale-up capabilities in the future. - -## Limited to 10 active subscriptions per table - -Initially you will be limited to 10 active subscriptions per table. This limitation will be lifted in the future. - -## Change events are not persisted - -Pulse does not persist change events and does not provide delivery guarantees with regards to ordering or exact-once/at-least-once delivery. - -An application must maintain an active connection to Pulse using the `subscribe()` method to capture change events; change events that occur while a Prisma Client is not subscribed will not be delivered. - -## Front-end use is not possible - -Pulse cannot be used in the front-end portion of an application. - - - -If you would find this capability valuable, please share your thoughts on the[#pulse-feedback](https://prisma.slack.com/archives/C058GKE3C1E) channel on our community Slack. - - - -## Limited to Postgres versions 12 or higher - -Pulse is currently supported with Postgres versions 12 or higher. It should work with most Postgres providers that expose Postgres’ native logical replication feature. We plan on adding support for MySQL in our GA release. - - - -If you have questions about whether your database is supported, please reach out to us on the [#pulse-feedback](https://prisma.slack.com/archives/C058GKE3C1E) channel on our community Slack. - - - -## Pulse will not attempt a reconnect or give an indication of the network is disconnected - -Currently, if there is some type of network disconnect while Prisma Client is subscribed to Pulse, there will be no attempts to reconnect or indicate the connection has dropped. - -For example, if you are evaluating Pulse from an application running on your laptop and it goes to sleep resulting in a network disruption, it can appear as though the Prisma Client instance is still subscribed to Pulse when it is not. - -We will soon add heart-beating capability that throws an error to the Prisma Client when the connection is no longer active so the application can reconnect. - -## Self-signed certificates are not supported yet - -Prisma Pulse is not compatible with self-signed certificates yet. Cloud providers using these certificates will only work if the [`sslmode`](/orm/overview/databases/postgresql#configuring-an-ssl-connection) is set to `sslmode=disable`. Pulse works with any certificate provided the `sslmode` is set to `disable`. diff --git a/content/400-pulse/500-known-limitations.mdx b/content/400-pulse/500-known-limitations.mdx new file mode 100644 index 0000000000..342578dc79 --- /dev/null +++ b/content/400-pulse/500-known-limitations.mdx @@ -0,0 +1,62 @@ +--- +title: 'Known limitations' +metaTitle: 'Pulse: Known limitations' +description: 'Learn about known limitations of Pulse.' +tocDepth: 3 +toc: true +--- + + + +Below are descriptions of known limitations when using Prisma Pulse. If you are aware of any limitations that are missing, please let us know on the `#help-and-questions` channel in our community [Discord](https://pris.ly/discord). + + + +## Superuser role required for starter plan + +Our [Starter plan](https://www.prisma.io/pricing) requires a database role with superuser access. + +## Database events are not persisted + +Prisma Pulse does not persist database events and does not provide delivery guarantees regarding ordering or exact-once/at-least-once delivery. + +To capture database events, an application must maintain an active connection to Pulse using the  [`subscribe()`](/pulse/api-reference#subscribe) method. + +It's important to note scenarios where database events may not be delivered: + +1. **Inactive subscriptions**: If no active subscriptions match the filters of the database event. +2. **Exceeding database event size limits**: Database events surpassing predefined size limits. + +## Prisma Pulse is server-side + +Prisma Pulse subscriptions cannot be initiated directly within client-side code. + +## Limited to Postgres versions 12 or higher + +Prisma Pulse is currently supported with Postgres versions 12 or higher. It should work with most Postgres providers that expose Postgres’ native logical replication feature. + +## Subscription type limitation with custom publication slots + +Our advanced onboarding flow enables you to provide a [custom publication slot](/pulse/database-setup/general-database-instructions#manage-your-own-publication-slot). Should that custom publication slot only contains a subset of your database tables, the Prisma Client generated with the Pulse Client Extension will continue to permit subscriptions to all models based on the entirety of your Prisma Schema definitions. + +For example, if you have two models in your schema, the `User` and `Post` model. And you opt to create a publication to monitor changes in the `User` model exclusively: + +```sql +CREATE PUBLICATION user_publication FOR TABLE users; +``` + +> To learn more about creating custom publication slots, see [managing your publication slot](https://www.prisma.io/docs/pulse/database-setup/general-database-instructions#manage-your-own-publication-slot). + +Your resulting subscription code would be: + +```ts +const userSubscription = prisma.user.subscribe() +``` + +However, despite the absence of publication coverage, the generated Prisma client permits subscriptions for all models, such as the `Post` model: + +```ts +const postSubscription = prisma.post.subscribe() +``` + +> We are actively working on enhancing type generation for custom publications as part of our ongoing efforts to further refine Prisma Pulse. diff --git a/content/400-pulse/600-faq.mdx b/content/400-pulse/600-faq.mdx index 7cde2af090..42866cf098 100644 --- a/content/400-pulse/600-faq.mdx +++ b/content/400-pulse/600-faq.mdx @@ -1,48 +1,54 @@ --- title: 'FAQ' -metaTitle: 'Pulse: FAQ' -metaDescription: 'Frequently asked questions about Pulse.' +metaTitle: 'Prisma Pulse: FAQ' +description: 'Frequently asked questions about Prisma Pulse.' tocDepth: 3 toc: true --- Below are frequently asked questions about Pulse. -## Does Pulse work in a serverless environment? +## What databases are supported with Prisma Pulse? -Pulse will natively support serverless environments soon after it launches to [General Availability](/platform/maturity-levels#general-availability). - -While in [Early Access](/platform/maturity-levels#early-access), Pulse works best when it is able to maintain a long-running active connection with your application. However, many serverless runtime providers limit the duration of serverless functions. We’re actively working on improving the experience in serverless applications. +Currently, Pulse supports PostgreSQL. We plan to broaden support to include more databases soon. -Please reach out to us on the [#pulse-feedback](https://prisma.slack.com/archives/C058GKE3C1E) channel on our community Slack if having a more native serverless approach to getting data change events is important to you. +Note: Pulse compatibility with Postgres-like databases depends on their logical replication capabilities. -## How does Pulse handle schema changes in the database? + -Pulse is designed to work seamlessly with schema changes in your database by utilizing [Change data capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) techniques and combining that with the power of schema-driven data access using [Prisma Client](/orm/prisma-client). When your Prisma schema is updated, Pulse automatically adapts to the changes, ensuring that your real-time data synchronization remains consistent and reliable. +Prisma Pulse’s database compatibility list will be different from Prisma Client's database compatibility list. If you want to use Prisma Pulse with an existing application using Prisma ORM, please verify the database and hosting provider are supported. -Pulse leverages the type information generated by Prisma to create type-safe database subscriptions, allowing you to catch potential issues at compile time and maintain the integrity of your data throughout the development process. This approach allows Pulse to efficiently capture and propagate data changes while maintaining compatibility with evolving database structures. + -## What databases are supported with Pulse? +### What database providers are supported with Prisma Pulse? -The Pulse Early Access release supports PostgreSQL with plans to extend support to MySQL in the near future. +| Provider | Starter | Pro | Business | Enterprise | +| -------- | ------- | --- | -------- | ---------- | +| Railway | ✅ | ✅ | ✅ | ✅ | +| Supabase | ✅ | ✅ | ✅ | ✅ | +| Neon | ❌ | ✅ | ✅ | ✅ | +| AWS RDS | ✅ | ✅ | ✅ | ✅ | -Pulse primarily interfaces with a database's write-ahead log (Postgres) or binlog (MySQL) to efficiently capture data change events, offering a more performant solution than regular polling through scheduled queries. Note that Pulse may not work with every Postgres-compatible database, as compatibility depends on the exposure of Postgres-native logical replication capabilities required for change data capture. +## Does Pulse store my database events? - +Pulse does not persist database events and does not provide delivery guarantees regarding ordering or exact-once/at-least-once delivery. +To capture database events, an application must maintain an active connection to Pulse using the subscribe method. Any events occurring without an active subscription will be discarded. -Pulse’s database compatibility list will be different from Prisma Client's database compatibility list. If you want to use Pulse with an existing Prisma application, please verify the database and hosting provider are supported by Pulse. +## How can I increase the throughput for Prisma Pulse? - +Throughput for Prisma Pulse will increase as the Database event size decreases and the number of concurrent listeners decreases. + +While ensuring Database event size can be tricky, we recommend some best practices, such as: + +- Avoid large fields in your model, such as storing base64 image strings in the database; Instead, consider storing them in popular file storage options such as AWS S3 or Cloudflare. +- Creating publication slots for specific models rather than all the models in the database. You can learn more about managing your replication slots [here](/pulse/database-setup/general-database-instructions#max_replication_slots). +- Upgrading to use modern versions of PostgreSQL due to performance optimizations. + > ℹ️ Modern versions of PostgreSQL (`v15`+) allow you to create a publication slot for specific fields of a particular model. -## What database providers are supported with Pulse? +## Can I use Pulse in my front-end code? -| Provider | Support | Notes | -| -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Railway | ✅ | Requires [`sslmode=disable`](/orm/overview/databases/postgresql#configuring-an-ssl-connection) due to the use of a self-signed certificate for database connections by Railway. | -| Supabase | ✅ | Requires [`sslmode=disable`](/orm/overview/databases/postgresql#configuring-an-ssl-connection) due to the use of a self-signed certificate for database connections by Supabase. | -| Neon | _Coming_ | Support details coming soon. | -| AWS RDS | _Coming_ | Support details coming soon. | +No, Pulse is server-side and subscriptions cannot be initiated directly within client-side code. If you would find this feature valuable, please share your thoughts on the `#help-and-questions` channel in our community [Discord](https://pris.ly/discord). diff --git a/content/400-pulse/700-feedback.mdx b/content/400-pulse/700-feedback.mdx index defdda8d95..89f073698d 100644 --- a/content/400-pulse/700-feedback.mdx +++ b/content/400-pulse/700-feedback.mdx @@ -1,13 +1,13 @@ --- title: 'Feedback' -metaTitle: 'Pulse: Feedback' -metaDescription: 'Learn where to submit feedback about Pulse.' +metaTitle: 'Prisma Pulse: Feedback' +description: 'Learn where to submit feedback about Prisma Pulse.' tocDepth: 3 -toc: true +hide_table_of_contents: true --- -You can submit any feedback about Pulse in the [#pulse-feedback](https://prisma.slack.com/archives/C058GKE3C1E) channel in our community Slack. +You can submit any feedback about Prisma Pulse in the `#help-and-questions` channel in our community [Discord](https://pris.ly/discord). diff --git a/content/400-pulse/index.mdx b/content/400-pulse/index.mdx index c8072bcb67..c82642c61f 100644 --- a/content/400-pulse/index.mdx +++ b/content/400-pulse/index.mdx @@ -1,9 +1,11 @@ --- title: 'Pulse' metaTitle: 'Prisma Pulse' -metaDescription: 'Prisma Pulse enables real-time database events with type-safe Prisma Client subscriptions.' -toc: false -earlyaccess: true +description: 'Prisma Pulse enables real-time database events with type-safe Prisma Client subscriptions.' +hide_table_of_contents: true +sidebar_position: 0 +pagination_next: 'pulse/what-is-pulse' + --- diff --git a/content/500-platform/10-about.mdx b/content/500-platform/10-about.mdx index 430005b288..e12b920a1f 100644 --- a/content/500-platform/10-about.mdx +++ b/content/500-platform/10-about.mdx @@ -1,7 +1,8 @@ --- title: 'About' metaTitle: 'Platform Console: About' -metaDescription: '' +description: '' +displayed_sidebar: platformSidebar --- @@ -11,6 +12,6 @@ Platform Console enables you to integrate the latest Prisma Data Platform produc - [Accelerate](/accelerate/what-is-accelerate): Global database cache with scalable connection pooling - [Pulse](/pulse/what-is-pulse): A managed Change Data Capture (CDC) service that enables real-time database subscriptions -[Launch Platform Console](https://console.prisma.io) +[Go to Platform Console](https://console.prisma.io) diff --git a/content/500-platform/20-concepts/10-workspaces.mdx b/content/500-platform/20-concepts/10-workspaces.mdx index 910b3f6f04..9fb0cd71b3 100644 --- a/content/500-platform/20-concepts/10-workspaces.mdx +++ b/content/500-platform/20-concepts/10-workspaces.mdx @@ -1,9 +1,10 @@ --- title: 'Workspaces' metaTitle: 'Platform Console: Workspaces' -metaDescription: 'Learn how to manage workspaces via Platform Console.' +description: 'Learn how to manage workspaces via Platform Console.' tocDepth: 3 toc: true +displayed_sidebar: platformSidebar --- diff --git a/content/500-platform/20-concepts/20-projects.mdx b/content/500-platform/20-concepts/20-projects.mdx index 7af0f03a13..0b1dd552ff 100644 --- a/content/500-platform/20-concepts/20-projects.mdx +++ b/content/500-platform/20-concepts/20-projects.mdx @@ -1,9 +1,10 @@ --- title: 'Projects' metaTitle: 'Platform Console: Projects' -metaDescription: 'Learn how to manage projects via Platform Console.' +description: 'Learn how to manage projects via Platform Console.' tocDepth: 3 -toc: true +hide_table_of_contents: true +displayed_sidebar: platformSidebar --- @@ -11,7 +12,3 @@ toc: true Projects embody your applications integrated with our products. Each project is associated with a Workspace and can be configured independently from one another. - -## API Keys - -A project API key is required to authenticate requests from your Prisma Client to products such as Accelerate and Pulse. You may generate multiple API keys per project and manage those via the **Settings** tab of a project's page. diff --git a/content/500-platform/20-concepts/30-environments.mdx b/content/500-platform/20-concepts/30-environments.mdx new file mode 100644 index 0000000000..0532493526 --- /dev/null +++ b/content/500-platform/20-concepts/30-environments.mdx @@ -0,0 +1,40 @@ +--- +title: 'Environments' +metaTitle: 'Platform Environments' +description: 'Learn about Environments in Platform Console.' +tocDepth: 3 +toc: true +highlight: true +displayed_sidebar: platformSidebar +--- + + + +We're introducing Environments as a key component designed to enhance the way teams build, test, and grow their applications. + +By providing isolated spaces within each project, environments ensure that your development processes are agile and interference-free, allowing for more focused and productive team collaboration. + + + +## Building intuitive development workflows with environments + +Each Environment serves as an isolated space, enabling teams to build, test, and grow their projects across different stages of the development lifecycle. From initial experimentation to final production, environments facilitate a seamless progression of project development. + +## Limits + +| | Starter | Pro | Business | Enterprise | +| ---------------- | ----------- | ----------- | ------------ | ---------- | +| **Projects** | 5 | 10 | 15 | Custom | +| **Environments** | 2 / project | 6 / project | 12 / project | Custom | + +Visit Prisma Data Platform's [pricing page](https://pris.ly/pricing?utm_source=prisma-docs&utm_medium=docs-site) to learn more. + +## Leveraging the Prisma CLI for programmatic access + +The Prisma CLI enhances our platform by offering developers programmatic access to manage their environments efficiently. Ideal for integrating into CI workflows, the CLI allows for automating tasks such as configuring Prisma Accelerate or Prisma Pulse directly from the terminal. + +Read more about the Prisma CLI [here](/platform/platform-cli). + +## API Keys + +An API key is required to authenticate requests from your Prisma Client to products such as Prisma Accelerate and Prisma Pulse. You may generate multiple API keys per environment and manage those via the **API Keys** section in a project. diff --git a/content/500-platform/20-concepts/_category_.json b/content/500-platform/20-concepts/_category_.json new file mode 100644 index 0000000000..47ccf8cefe --- /dev/null +++ b/content/500-platform/20-concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "collapsed": false, + "collapsible": false +} \ No newline at end of file diff --git a/content/500-platform/20-concepts/index.mdx b/content/500-platform/20-concepts/index.mdx index 2e62e7a25e..c3c7e55f1e 100644 --- a/content/500-platform/20-concepts/index.mdx +++ b/content/500-platform/20-concepts/index.mdx @@ -1,8 +1,9 @@ --- title: 'Concepts' metaTitle: 'Platform Console: Concepts' -metaDescription: '' -tocDepth: 4 +description: '' +hide_table_of_contents: true +displayed_sidebar: platformSidebar --- diff --git a/content/500-platform/30-maturity-levels.mdx b/content/500-platform/30-maturity-levels.mdx index e878bf221a..84da9193b4 100644 --- a/content/500-platform/30-maturity-levels.mdx +++ b/content/500-platform/30-maturity-levels.mdx @@ -1,7 +1,8 @@ --- title: 'Maturity levels' metaTitle: 'Platform Console: Maturity levels' -metaDescription: '' +description: '' +displayed_sidebar: platformSidebar --- @@ -12,8 +13,6 @@ You can [check out the releases and maturity process for the Prisma ORM](/orm/mo -## - ### Early Access If a feature on the Prisma Data Platform is labeled as **Early Access**: diff --git a/content/500-platform/40-limits.mdx b/content/500-platform/40-limits.mdx index 888e642bd0..d02e7dadfc 100644 --- a/content/500-platform/40-limits.mdx +++ b/content/500-platform/40-limits.mdx @@ -2,7 +2,8 @@ title: 'Limits' metaTitle: 'Platform Console: Limits' tocDepth: 3 -toc: true +hide_table_of_contents: true +displayed_sidebar: platformSidebar --- diff --git a/content/500-platform/50-support.mdx b/content/500-platform/50-support.mdx index d058d632d7..bffe20734a 100644 --- a/content/500-platform/50-support.mdx +++ b/content/500-platform/50-support.mdx @@ -1,9 +1,10 @@ --- title: 'Support' metaTitle: 'Platform console: Support' -metaDescription: '' +description: '' tocDepth: 3 toc: true +displayed_sidebar: platformSidebar --- diff --git a/content/500-platform/60-platform-cli/10-about.mdx b/content/500-platform/60-platform-cli/10-about.mdx new file mode 100644 index 0000000000..26c2b74ba9 --- /dev/null +++ b/content/500-platform/60-platform-cli/10-about.mdx @@ -0,0 +1,15 @@ +--- +title: 'About' +metaTitle: 'Platform CLI: About' +tocDepth: 3 +hide_table_of_contents: true +displayed_sidebar: platformSidebar +--- + + + +This guide demonstrates how to access the Prisma Data Platform using the [Prisma CLI](/orm/tools/prisma-cli). Get started by ensuring you have the Prisma CLI installed, following our setup [instructions](/orm/tools/prisma-cli#installation). + +This integration, now in Early Access, expands the capabilities of the Prisma CLI, enabling management of your Platform projects directly from the command line. For a detailed overview of all the commands, please refer to the [Commands page](/platform/platform-cli/commands). + + diff --git a/content/500-platform/60-platform-cli/20-commands.mdx b/content/500-platform/60-platform-cli/20-commands.mdx new file mode 100644 index 0000000000..0ad7f43838 --- /dev/null +++ b/content/500-platform/60-platform-cli/20-commands.mdx @@ -0,0 +1,312 @@ +--- +title: 'Commands' +metaTitle: 'Platform CLI: Commands' +toc_max_heading_level: 4 +displayed_sidebar: platformSidebar +--- + + + +This document describes the Prisma Data Platform's integrated Prisma CLI commands, arguments, and options. + + + +## Getting started + +To get started, ensure you have the [Prisma CLI](/orm/tools/prisma-cli) updated to version `5.10.0` or later. This is necessary to access the Platform through the Prisma CLI. + + + +💡 When using commands, always start with `prisma platform` and include the `--early-access` flag to enable the use of the Prisma Data Platform whilst still in early access. + + + +## Authentication + +### `platform` + +#### `auth login` + +Opens a browser window that allows you to log into your Prisma Data Platform account or create a new one. + +```bash +npx prisma platform auth login --early-access +``` + +#### `auth logout` + +Logs out of your Prisma Data Platform account. + +```bash +npx prisma platform auth logout --early-access +``` + +#### `auth show` + +Displays information about the currently authenticated user. + +```bash +npx prisma platform auth show --early-access +``` + +### Workspace Management + +### `platform` + +#### `workspace show` + +Lists all workspaces available to your account. + +```bash +npx prisma platform workspace show --early-access +``` + +### Project Management + +### `platform` + +#### `project show` + +Lists all projects within the specified workspace. + +```bash +npx prisma platform project show \ +--workspace $INSERT_WORKSPACE_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ------------------ | -------- | -------- | --------------------------------------------------------------------------------------------------------------------------- | +| `--workspace` `-w` | `string` | yes | The workspace id.

**Hint:** You can view your workspace ids with the [`workspace show`](#workspace-show) command. | + +#### `project create` + +Creates a new project within the specified workspace. + +```bash +npx prisma platform project create \ +--workspace $INSERT_WORKSPACE_ID \ +--name "INSERT_PROJECT_NAME" \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ------------------ | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `--workspace` `-w` | `string` | yes | The workspace `id`.

**Hint:** You can view your workspace ids with the [`workspace show`](#workspace-show) command. | +| `--name` `-n` | `string` | no | The display name for the project.

If omitted, a default project name will be generated for you. | + +#### `project delete` + +Deletes the specified project. + +```bash +npx prisma platform project delete \ +--project $INSERT_PROJECT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ---------------- | -------- | -------- | --------------------------------------------------------------------------------------------------------------------- | +| `--project` `-p` | `string` | yes | The project `id`.

**Hint:** You can view your project ids with the [`project show`](#project-show) command. | + +### Environment Management + +### `platform` + +#### `environment show` + +Lists all environments within the specified project. + +```bash +npx prisma platform environment show \ +--project $INSERT_PROJECT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ---------------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------- | +| `--project` `-p` | `string` | yes | The project `id`.

**Hint:** You can view your project ids with the [`project show`](#project-show) command. | + +#### `environment create` + +Creates a new environment within the specified project. + +```bash +npx prisma platform environment create \ +--project $INSERT_PROJECT_ID \ +--name $INSERT_ENVIRONMENT_NAME \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ---------------- | -------- | -------- | --------------------------------------------------------------------------------------------------------------------- | +| `--project` `-p` | `string` | yes | The project `id`.

**Hint:** You can view your project ids with the [`project show`](#project-show) command. | +| `--name` `-n` | `string` | no | The display name for the environment.

If omitted, a default environment name will be generated for you. | + +#### `environment delete` + +Deletes the specified environment. + +```bash +npx prisma platform environment delete \ +--environment $INSERT_ENVIRONMENT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | + +### API Key Management + +### `platform` + +#### `apikey show` + +Lists all API keys for the specified environment. + +```bash +npx prisma platform apikey show \ +--environment $INSERT_ENVIRONMENT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | + +#### `apikey create` + +Creates a new API key for the specified project. + +```bash +npx prisma platform apikey create \ +--environment $INSERT_ENVIRONMENT_ID \ +--name $INSERT_API_KEY_NAME \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | +| `--name` `-n` | `string` | no | The display name for the API key.

If omitted, a default API key name will be generated for you. | + +#### `apikey delete` + +Deletes the specified API Key. + +```bash +npx prisma platform apikey delete \ +--apikey $INSERT_API_KEY_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| ---------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------ | +| `--apikey` | `string` | yes | The API key `id`.

**Hint**: You can view your API key ids with the [`apikey show`](#apikey-show) command. | + +### Prisma Accelerate + +### `platform` + +#### `accelerate enable` + +Enables Prisma Accelerate for the specified environment. + +```bash +npx prisma platform accelerate enable \ +--environment $INSERT_ENVIRONMENT_ID \ +--url "postgresql://username:password@host:port/database" \ +--region $INSERT_CONNECTION_POOL_REGION \ +--apikey true \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | +| `--url` | `string` | yes | Your database connection string. | +| `--region` | `string` | no | The region for Prisma Accelerate’s managed connection pool.

View the list of available regions [here](/accelerate/faq#what-regions-is-accelerates-connection-pool-available-in).

**Hint**: Select the region _nearest_ your database for optimal latency. | +| `--apikey` | `boolean` | no | If yes, a new API key will be generated for the associated environment. | + +#### `accelerate disable` + +Disables Prisma Accelerate for the specified environment. + +```bash +npx prisma platform accelerate disable \ +--environment $INSERT_ENVIRONMENT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | + +### Prisma Pulse + +### `platform` + +#### `pulse enable` + +Enables Prisma Pulse for the specified environment. + +```bash +npx prisma platform pulse enable \ +--environment $INSERT_ENVIRONMENT_ID \ +--url "postgresql://username:password@host:port/database" \ +--region $INSERT_REGION \ +--apikey true \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | +| `--url` | `string` | yes | Your database connection string. | +| `--region` | `string` | no | The region for Prisma Pulse. | +| `--apikey` | `boolean` | no | If yes, a new API key will be generated for the associated environment. | + +#### `pulse disable` + +Disables Prisma Pulse for the specified environment. + +```bash +npx prisma platform pulse disable \ +--environment $INSERT_ENVIRONMENT_ID \ +--early-access +``` + +##### Arguments + +| Argument | Type | Required | Description | +| -------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `--environment` `-e` | `string` | yes | The environment `id`.

**Hint:** You can view your environment ids with the [`environment show`](#environment-show) command. | + +## Help + +Have a question? Let us know, we’re here to help. Reach out to us on [Discord](https://pris.ly/discord). diff --git a/content/500-platform/60-platform-cli/_category_.json b/content/500-platform/60-platform-cli/_category_.json new file mode 100644 index 0000000000..b353f0c5d1 --- /dev/null +++ b/content/500-platform/60-platform-cli/_category_.json @@ -0,0 +1,7 @@ +{ + "collapsed": false, + "collapsible": false, + "customProps": { + "badge": "Early Access" + } +} \ No newline at end of file diff --git a/content/500-platform/60-platform-cli/index.mdx b/content/500-platform/60-platform-cli/index.mdx new file mode 100644 index 0000000000..abcab86b45 --- /dev/null +++ b/content/500-platform/60-platform-cli/index.mdx @@ -0,0 +1,15 @@ +--- +title: 'Platform CLI' +metaTitle: 'Platform CLI' +staticLink: true +earlyaccess: true +displayed_sidebar: platformSidebar +--- + + + +## In this section + + + + diff --git a/content/500-platform/_category_.json b/content/500-platform/_category_.json new file mode 100644 index 0000000000..cf9e804f7d --- /dev/null +++ b/content/500-platform/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": false, + "collapsible": false, + "className": "firstTitle" +} \ No newline at end of file diff --git a/content/500-platform/index.mdx b/content/500-platform/index.mdx index 05c12f5fc3..550a925f3e 100644 --- a/content/500-platform/index.mdx +++ b/content/500-platform/index.mdx @@ -1,9 +1,10 @@ --- title: 'Platform' metaTitle: 'Platform' -metaDescription: 'Get started with the Prisma Data Platform with its official documentation, and learn more about its features with reference documentation, guides, and more.' -toc: false -# earlyaccess: false +description: 'Get started with the Prisma Data Platform with its official documentation, and learn more about its features with reference documentation, guides, and more.' +hide_table_of_contents: true +sidebar_position: 0 +displayed_sidebar: platformSidebar --- diff --git a/content/600-about/200-prisma-docs/10-about-the-docs.mdx b/content/600-about/200-prisma-docs/10-about-the-docs.mdx index bc8c45948d..2eaf36a245 100644 --- a/content/600-about/200-prisma-docs/10-about-the-docs.mdx +++ b/content/600-about/200-prisma-docs/10-about-the-docs.mdx @@ -1,7 +1,7 @@ --- title: 'About the docs' metaTitle: 'About the Prisma documentation' -metaDescription: 'This page gives a meta-overview about different topics that are relevant to better understand and navigate the Prisma documentation.' +description: 'This page gives a meta-overview about different topics that are relevant to better understand and navigate the Prisma documentation.' tocDepth: 3 --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/01-writing-style.mdx b/content/600-about/200-prisma-docs/20-style-guide/01-writing-style.mdx index 299e0a0073..caae5e2f30 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/01-writing-style.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/01-writing-style.mdx @@ -1,8 +1,9 @@ --- title: 'Writing style' metaTitle: 'Prisma docs style guide: writing style' -metaDescription: 'This section of the style guide provides guidelines on tone of voice, audience, and other tonal matters.' +description: 'This section of the style guide provides guidelines on tone of voice, audience, and other tonal matters.' tocDepth: 4 +toc_max_heading_level: 4 search: false --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/02-word-choice.mdx b/content/600-about/200-prisma-docs/20-style-guide/02-word-choice.mdx index d2244e84b8..137a2f12cf 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/02-word-choice.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/02-word-choice.mdx @@ -1,8 +1,9 @@ --- title: 'Word choice' metaTitle: 'Prisma docs style guide: word choice' -metaDescription: 'This section of the style guide provides guidelines on what terms and phrase constructions to use.' +description: 'This section of the style guide provides guidelines on what terms and phrase constructions to use.' tocDepth: 4 +toc_max_heading_level: 4 search: false --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/03-spelling-punctuation-formatting.mdx b/content/600-about/200-prisma-docs/20-style-guide/03-spelling-punctuation-formatting.mdx index 80680d9ce7..6c6b0936af 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/03-spelling-punctuation-formatting.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/03-spelling-punctuation-formatting.mdx @@ -1,8 +1,9 @@ --- title: 'Spelling, punctuation, and formatting' metaTitle: 'Prisma docs style guide: spelling, punctuation, and formatting' -metaDescription: 'This section of the style guide provides guidelines on how to present the information you add.' +description: 'This section of the style guide provides guidelines on how to present the information you add.' tocDepth: 4 +toc_max_heading_level: 4 search: false --- @@ -55,7 +56,7 @@ If you're not sure about the spelling of a proper noun, check its official web s - Use sentence case for titles and headings: only the initial word is uppercase (exception: [capitalize proper nouns](#capitalize-and-spell-out-proper-nouns)) - [Avoid gerunds](/about/prisma-docs/style-guide/word-choice#avoid-gerunds-ing-verb-forms) ("Configure the database", not "Configuring the database") - Do not use punctuation at the end of a title or heading unless a question mark is required -- Use `code` for code in headings - this is required by our navigation elements +- Use ``code`` for code in headings - this is required by our navigation elements ## Tables, bullet lists, and numbered lists @@ -173,6 +174,7 @@ Use the [`highlight` property](/about/prisma-docs/docs-components/mdx-examples#c ```prisma highlight=3;normal generator client { provider = "prisma-client-js" + //highlight-next-line previewFeatures = ["namedConstraints"] } ``` @@ -302,7 +304,7 @@ When you bring the error messages into the page, remove any double quotes around Bad: ``` -#### P1008 +#### `P1008` "Operations timed out after `{time}`" ``` @@ -310,7 +312,7 @@ Bad: Good: ``` -#### P1008 +#### `P1008` Operations timed out after `{time}` ``` diff --git a/content/600-about/200-prisma-docs/20-style-guide/04-schema-models.mdx b/content/600-about/200-prisma-docs/20-style-guide/04-schema-models.mdx index 58eb43bdb5..0859eb1a90 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/04-schema-models.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/04-schema-models.mdx @@ -1,7 +1,7 @@ --- title: 'Docs example data model' metaTitle: 'Prisma docs style guide: example data model' -metaDescription: 'This page describes the data models we use in our documentation examples.' +description: 'This page describes the data models we use in our documentation examples.' tocDepth: 3 search: false --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/05-prisma-product-names.mdx b/content/600-about/200-prisma-docs/20-style-guide/05-prisma-product-names.mdx index 2b7d89b099..bd576ac7f1 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/05-prisma-product-names.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/05-prisma-product-names.mdx @@ -1,8 +1,9 @@ --- title: 'Prisma product and component names' metaTitle: 'Prisma docs style guide: Prisma product and component names' -metaDescription: 'This section of the style guide provides guidelines on how to refer to Prisma products and components.' +description: 'This section of the style guide provides guidelines on how to refer to Prisma products and components.' tocDepth: 4 +toc_max_heading_level: 4 search: false --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/06-image-guidelines.mdx b/content/600-about/200-prisma-docs/20-style-guide/06-image-guidelines.mdx index 3a9f795606..45e81a0ef2 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/06-image-guidelines.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/06-image-guidelines.mdx @@ -1,8 +1,9 @@ --- title: 'Prisma docs image guidelines' metaTitle: 'Prisma docs style guide: image guidelines' -metaDescription: 'This page provides guidelines for images in our docs.' +description: 'This page provides guidelines for images in our docs.' tocDepth: 4 +toc_max_heading_level: 4 search: false --- @@ -32,7 +33,7 @@ You can take screenshots with your favorite tool. We find it very easy to use Sn
SnagIt - Screenshot canvas shadow @@ -42,7 +43,7 @@ You can take screenshots with your favorite tool. We find it very easy to use Sn If you can, avoid annotations. If necessary, apply annotations that are minimal and similar in style to the screenshot below. Data Browser - Save multiple changes @@ -58,7 +59,7 @@ For details, see the sections below. Again, we suggest the use of SnagIt as a be - Apply a white outline on the text. This ensures that the black text will be visible in Dark mode. SnagIt - Screenshot text annotations @@ -69,7 +70,7 @@ For details, see the sections below. Again, we suggest the use of SnagIt as a be - If you have text annotations that use arrows or lines to point to an area on the screenshot, a small part of the line or arrow should appear on the canvas (and outside of the screenshot). - Apply a centered shadow on each pointer and make the shadow color white. This ensures that the part of the line that is outside of the screenshot remains visible in Dark mode. SnagIt - Screenshot arrow line annotations @@ -137,7 +138,7 @@ To decide where to save images, use the guidelines below. ```md -![image](trace-diagram.png) +![image](./trace-diagram.png) ``` ## Add images to MDX files @@ -152,7 +153,7 @@ If you need to shrink an image by width, use the `` component. ```html SnagIt - Screenshot text annotations diff --git a/content/600-about/200-prisma-docs/20-style-guide/07-user-interace-guidelines.mdx b/content/600-about/200-prisma-docs/20-style-guide/07-user-interace-guidelines.mdx index 1524aae564..1a80a91a8c 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/07-user-interace-guidelines.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/07-user-interace-guidelines.mdx @@ -1,7 +1,7 @@ --- title: 'User interface (GUI) guidelines' metaTitle: 'Prisma docs style guide: GUI guidelines' -metaDescription: 'On this page you can find information about the Prisma guidelines for documenting UI elements and steps to walk users through interfaces.' +description: 'On this page you can find information about the Prisma guidelines for documenting UI elements and steps to walk users through interfaces.' tocDepth: 3 search: false --- @@ -124,7 +124,8 @@ It can feel excessive to include the UI term for each UI element when you write To make UI steps easier to read, in most cases you can omit the UI term for each UI element. -
Example 1: drop-down menu +
+Example 1: drop-down menu @@ -136,7 +137,8 @@ From **GitHub Accounts & Organizations**, select a GitHub account or an organiza
-
Example 2: text box +
+Example 2: text box @@ -148,7 +150,8 @@ In **Display Name**, enter a name for your project.
-
Example 3: select the option +
+Example 3: select the option @@ -160,7 +163,8 @@ Select **Create a repository**.
-
Example 4: clear the checkbox +
+Example 4: clear the checkbox @@ -174,7 +178,8 @@ Clear **Include sample data** to skip seeding the database with sample data. In specific cases, calling out the UI control name brings clarity and makes it easy to document a more complex step. Use your judgement and avoid this rule in such cases. -
Example 5: UI control under a section +
+Example 5: UI control under a section ```md diff --git a/content/600-about/200-prisma-docs/20-style-guide/10-boilerplate-content.mdx b/content/600-about/200-prisma-docs/20-style-guide/10-boilerplate-content.mdx index dd405a5e42..a9b4cb9b0f 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/10-boilerplate-content.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/10-boilerplate-content.mdx @@ -1,7 +1,7 @@ --- title: 'Boilerplate content' metaTitle: 'Boilerplate content' -metaDescription: 'Boilerplate content for the Prisma docs.' +description: 'Boilerplate content for the Prisma docs.' tocDepth: 3 hidePage: false search: false @@ -24,6 +24,7 @@ To enable this feature, add `namedConstraints` to `previewFeatures` in your sche ```prisma highlight=3;normal generator client { provider = "prisma-client-js" + //highlight-next-line previewFeatures = ["namedConstraints"] } ``` diff --git a/content/600-about/200-prisma-docs/20-style-guide/save-multiple-changes.png b/content/600-about/200-prisma-docs/20-style-guide/images/save-multiple-changes.png similarity index 100% rename from content/600-about/200-prisma-docs/20-style-guide/save-multiple-changes.png rename to content/600-about/200-prisma-docs/20-style-guide/images/save-multiple-changes.png diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-arrow-line-config.png b/content/600-about/200-prisma-docs/20-style-guide/images/snagit-arrow-line-config.png similarity index 100% rename from content/600-about/200-prisma-docs/20-style-guide/snagit-arrow-line-config.png rename to content/600-about/200-prisma-docs/20-style-guide/images/snagit-arrow-line-config.png diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-screenshot-shadow-config.png b/content/600-about/200-prisma-docs/20-style-guide/images/snagit-screenshot-shadow-config.png similarity index 100% rename from content/600-about/200-prisma-docs/20-style-guide/snagit-screenshot-shadow-config.png rename to content/600-about/200-prisma-docs/20-style-guide/images/snagit-screenshot-shadow-config.png diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-text-annotation-config.png b/content/600-about/200-prisma-docs/20-style-guide/images/snagit-text-annotation-config.png similarity index 100% rename from content/600-about/200-prisma-docs/20-style-guide/snagit-text-annotation-config.png rename to content/600-about/200-prisma-docs/20-style-guide/images/snagit-text-annotation-config.png diff --git a/content/600-about/200-prisma-docs/20-style-guide/index.mdx b/content/600-about/200-prisma-docs/20-style-guide/index.mdx index 50a4108110..8ca24500b6 100644 --- a/content/600-about/200-prisma-docs/20-style-guide/index.mdx +++ b/content/600-about/200-prisma-docs/20-style-guide/index.mdx @@ -1,8 +1,9 @@ --- title: 'Prisma docs style guide' metaTitle: 'Prisma documentation style guide' -metaDescription: 'The Prisma style guide provides contributor guidelines for the Prisma docs.' +description: 'The Prisma style guide provides contributor guidelines for the Prisma docs.' tocDepth: 4 +toc_max_heading_level: 4 hidePage: false --- diff --git a/content/600-about/200-prisma-docs/20-style-guide/save-multiple-changes.snagx b/content/600-about/200-prisma-docs/20-style-guide/save-multiple-changes.snagx deleted file mode 100644 index ae9462fb9d..0000000000 Binary files a/content/600-about/200-prisma-docs/20-style-guide/save-multiple-changes.snagx and /dev/null differ diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-arrow-line-config.snagx b/content/600-about/200-prisma-docs/20-style-guide/snagit-arrow-line-config.snagx deleted file mode 100644 index f65da0f36f..0000000000 Binary files a/content/600-about/200-prisma-docs/20-style-guide/snagit-arrow-line-config.snagx and /dev/null differ diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-screenshot-shadow-config.snagx b/content/600-about/200-prisma-docs/20-style-guide/snagit-screenshot-shadow-config.snagx deleted file mode 100644 index c1d310081a..0000000000 Binary files a/content/600-about/200-prisma-docs/20-style-guide/snagit-screenshot-shadow-config.snagx and /dev/null differ diff --git a/content/600-about/200-prisma-docs/20-style-guide/snagit-text-annotation-config.snagx b/content/600-about/200-prisma-docs/20-style-guide/snagit-text-annotation-config.snagx deleted file mode 100644 index 69adeeddd1..0000000000 Binary files a/content/600-about/200-prisma-docs/20-style-guide/snagit-text-annotation-config.snagx and /dev/null differ diff --git a/content/600-about/200-prisma-docs/30-docs-components/01-mdx-examples.mdx b/content/600-about/200-prisma-docs/30-docs-components/01-mdx-examples.mdx index 5fe47e2dd1..63b90c5655 100644 --- a/content/600-about/200-prisma-docs/30-docs-components/01-mdx-examples.mdx +++ b/content/600-about/200-prisma-docs/30-docs-components/01-mdx-examples.mdx @@ -1,8 +1,8 @@ --- title: 'MDX components' metaTitle: 'MDX components in the Prisma docs' -metaDescription: 'MDX components components available on the Prisma documentation site.' -navTitle: 'MDX components' +description: 'MDX components components available on the Prisma documentation site.' +sidebar_label: 'MDX components' search: false --- @@ -10,9 +10,11 @@ search: false This page describes how to use the custom [MDX](https://mdxjs.com/) components (e.g. code blocks) in the Prisma docs. +Components not listed here are part of the [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features) + -## TopBlock +## `TopBlock` Required at the top of the page to avoid styling issues: @@ -24,14 +26,6 @@ This page describes how to use [MDX](https://mdxjs.com/) components (e.g. code b ``` -## inlinecode - -Instead of using backticks (`` ` ``) to surround code snippets in headings, you should instead surround the snippet with `` - -```md -## inlinecode -``` - ## Code blocks Example: @@ -303,138 +297,26 @@ async function main() { }``` ```` -## FootNote - -Example: - -Every¹ feature in your [data model](/orm/prisma-schema/data-model/models) maps to a corresponding feature in the underlying database. - - - -¹ Comments and Prisma-level functions (`uuid()` and `cuid()`) do not map to database features. - - - -Code: - -``` - - -¹ Footnote text. - - -``` - -## File icons - -There are 4 icons available: - -- -- -- -- -- - -``` - - - - - -``` - -## Tabbed blocks - -Example: - -, ]}> - - - -| **id** | **email** | **name** | -| :----- | :------------------ | :-------- | -| `1` | `"sarah@prisma.io"` | `"Sarah"` | -| `2` | `"maria@prisma.io"` | `"Maria"` | - - - - - -```copy bash-symbol -npm run dev -``` - - - - - -Code: - -````wrap -, ]}> - - - -| **id** | **email** | **name** | -| :----- | :------------------ | :-------- | -| `1` | `"sarah@prisma.io"` | `"Sarah"` | -| `2` | `"maria@prisma.io"` | `"Maria"` | - - - - - -```copy bash-symbol -npm run dev -``` - - - - -```` - -## Subsections - -Lists all child pages of the current page to the specified depth: - -``` - -``` - ## Expand/Collapse section Example: -
Expand if you want to view more +
+Expand if you want to view more Here's more!
``` -
Expand if you want to view more +
+Expand if you want to view more Here's more!
``` -## Button link - -Example: - - - Button text - - -Code: - -``` - - Button text - -``` - ## Code with result Example: @@ -654,128 +536,3 @@ Code: ```` - -## Quiz component - -Example: - - - -Code: - -```tsx - -``` - -## Tip component - -Example: - - - -To find out if Prisma is the right fit for your project, head on over to [What is Prisma](/orm/overview/introduction/what-is-prisma) and read all about what makes Prisma, Prisma! - - - -Code: - -``` - - - To find out if Prisma is the right fit for your project, head on over to [What is Prisma](/orm/overview/introduction/what-is-prisma) and read all about what makes Prisma, Prisma! - - -``` - -## Admonition component - -The Admonition shows a message to the user with different levels of priority. - -- `info`: The message is informational. -- `warning`: The message is a warning. -- `alert`: The message is an alert. - -### Info Example - - - -This is some information that might be of use to the reader - - - -### Warning Example - - - -This is some information we want to warn the user about, maybe they should know this before they start using a feature. - - - -### Alert Example - - - -This is some information we want to alert the user to, maybe they should be aware of some **breaking changes** - - - -```tsx - - - -This is some information that might be of use to the reader - - - - - -This is some information we want to warn the user about, maybe they should know this before they start using a feature. - - - - - -This is some information we want to alert the user to, maybe they should be aware of some **breaking changes** - - -``` diff --git a/content/600-about/200-prisma-docs/30-docs-components/03-frontmatter.mdx b/content/600-about/200-prisma-docs/30-docs-components/03-frontmatter.mdx index a85ee90ca2..3502910262 100644 --- a/content/600-about/200-prisma-docs/30-docs-components/03-frontmatter.mdx +++ b/content/600-about/200-prisma-docs/30-docs-components/03-frontmatter.mdx @@ -1,6 +1,6 @@ --- title: Front matter -metaDescription: Supported front matter variables. +description: Supported front matter variables. search: false --- @@ -10,7 +10,7 @@ search: false Front matter that informs the meta information of a page. -### title +### `title` The `

` title of the page. This title appears at the top of the page, and in the left-hand navigation. @@ -21,7 +21,7 @@ Note: - You can wrap the `title` text in single quotes, but this is not mandatory. - If you wrap the `title` text in single quotes, then you cannot include apostrophes in the text. -### metaTitle +### `metaTitle` The `` of the page - falls back to `title` (`h1`). @@ -34,67 +34,35 @@ Note: - You can wrap the `metaTitle` text in single quotes, but this is not mandatory. - If you wrap the `metaTitle` text in single quotes, then you cannot include apostrophes in the text. -## <inlinecode>navTitle</inlinecode> +## `sidebar_label` Specifies a different, usually shorter title for the left-hand navigation. -### <inlinecode>metaDescription</inlinecode> - -The `<meta name="description" content="" />` of the page. - -Note: - -- You can wrap the `metaDescription` text in single quotes, but this is not mandatory. -- If you wrap the `metaDescription` text in single quotes, then you cannot include apostrophes in the text. - ## Navigation (left sidebar) Front matter that configured the navigation. -### <inlinecode>staticLink</inlinecode> - -Accepts `true` or `false` (defaults to `false`). - -If `true`, this option turns the page into a heading in the left-hand navigation. This heading cannot be clicked by the docs user. For example on [this page](/orm/overview). - -> **Note**: The page still exists, but docs users can only navigate to it with the breadcrumb trail. We recommend that you add a [subsections](/about/prisma-docs/docs-components/mdx-examples#subsections) MDX component to the page, so that it contains useful content when a user navigates to it with the breadcrumb trail. - -### <inlinecode>duration</inlinecode> +### `duration` Accepts a string specifying the duration to read the article. Example: `duration: '15 min'` -### <inlinecode>preview</inlinecode> +### `preview` Accepts `true` or `false` (defaults to `false`). Adds a `Preview` label to a page in the left-hand navigation. -### <inlinecode>deprecated</inlinecode> +### `deprecated` Accepts `true` or `false` (defaults to `false`). Adds a `Deprecated` label to a page in the left-hand navigation. -### <inlinecode>hidePage</inlinecode> - -Accepts `true` or `false` (defaults to `false`). - -When set to `true`, hides the page from all navigation. - -``` -hidePage: true -``` - -Note: - -- A page hidden with `hidePage` is not listed by the [subsections](/about/prisma-docs/docs-components/mdx-examples#subsections) MDX component. -- A page hidden with `hidePage` is still findable by docs users with a search. To omit a page from the search results, use the [`search`](#search) tag. - ## Table of Contents (right sidebar) -### <inlinecode>toc</inlinecode> +### `toc` Enable or disable table of contents navigation on the page (defaults to `false`). For example: @@ -102,7 +70,7 @@ Enable or disable table of contents navigation on the page (defaults to `false`) toc: true ``` -### <inlinecode>tocDepth</inlinecode> +### `tocDepth` Controls the depth of headings to show in the in-page ToC: @@ -116,7 +84,7 @@ tocDepth: 2 Front matter that configures search. -### <inlinecode>search</inlinecode> +### `search` Accepts `true` or `false` (defaults to `true`). @@ -134,7 +102,7 @@ Note: Front matter that configured page content -### <inlinecode>langSwitcher</inlinecode> +### `langSwitcher` Accepts an array of languages to be shown in the page as dropdown options in order to switch the context between the pages @@ -144,7 +112,7 @@ Example: langSwitcher: ['typescript', 'node'] ``` -### <inlinecode>dbSwitcher</inlinecode> +### `dbSwitcher` Accepts an array of database options to be shown in the page as dropdown options in order to switch the context between the pages @@ -158,7 +126,7 @@ dbSwitcher: ['postgresql', 'mysql', 'sqlserver', 'planetscale', 'cockroachdb'] Front matter to configure the visual appearance of a page. -### <inlinecode>wide</inlinecode> +### `wide` Accepts `true` or `false` (defaults to `false`). diff --git a/content/600-about/200-prisma-docs/30-docs-components/index.mdx b/content/600-about/200-prisma-docs/30-docs-components/index.mdx index 29119086e3..51b5f6b4b4 100644 --- a/content/600-about/200-prisma-docs/30-docs-components/index.mdx +++ b/content/600-about/200-prisma-docs/30-docs-components/index.mdx @@ -1,9 +1,9 @@ --- title: 'Prisma docs components' metaTitle: 'Prisma documentation components' -metaDescription: 'This section describes the Prisma docs file format.' -tocDepth: 4 +description: 'This section describes the Prisma docs file format.' search: false +hide_table_of_contents: true --- ## In this section diff --git a/content/600-about/200-prisma-docs/40-template.mdx b/content/600-about/200-prisma-docs/40-template.mdx index ff92b0a08e..1a64f775e6 100644 --- a/content/600-about/200-prisma-docs/40-template.mdx +++ b/content/600-about/200-prisma-docs/40-template.mdx @@ -1,7 +1,7 @@ --- title: 'Writing template' metaTitle: 'Writing template (About)' -metaDescription: 'A template for writing Prisma Docs.' +description: 'A template for writing Prisma Docs.' tocDepth: 3 hidePage: false search: false diff --git a/content/600-about/200-prisma-docs/index.mdx b/content/600-about/200-prisma-docs/index.mdx index 1e74fa1b2f..923b18a682 100644 --- a/content/600-about/200-prisma-docs/index.mdx +++ b/content/600-about/200-prisma-docs/index.mdx @@ -1,8 +1,8 @@ --- title: 'Prisma docs' metaTitle: 'About Prisma docs' -metaDescription: 'About Prisma docs' -toc: false +description: 'About Prisma docs' +hide_table_of_contents: true staticLink: true search: false --- diff --git a/content/600-about/index.mdx b/content/600-about/index.mdx index 594a2b0e24..b531ad72fe 100644 --- a/content/600-about/index.mdx +++ b/content/600-about/index.mdx @@ -1,8 +1,8 @@ --- title: 'About' metaTitle: 'About' -metaDescription: 'About the Prisma docs.' -toc: false +description: 'About the Prisma docs.' +hide_table_of_contents: true --- <TopBlock> diff --git a/content/600-about/user-table.svg b/content/600-about/user-table.svg deleted file mode 100644 index 1bc2e636a6..0000000000 --- a/content/600-about/user-table.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="181" height="186" viewBox="-0.5 -0.5 181 186" content="<mxfile host="www.draw.io" modified="2020-02-19T08:45:21.851Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" etag="ehJuVmiVKOUOl8xOHWRN" version="12.7.2" type="github"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">7ZlrU+IwFIZ/DR/ZoS0U/GhRcZXdwcXbNyfQ0GZJk24aBPz1e9KmNysqy4qX6QzDJG9PkibnyVtCG1Y/WA0ECv0f3MW0YbbcVcM6aphmt9uCbyWsE+GgYyeCJ4ibSEYujMkD1qJu5y2Ii6NSoOScShKWxSlnDE9lSUNC8GU5bMZpedQQebgijKeIVtUb4ko/UXtmN9dPMfH8dGTDPkiuBCgN1jOJfOTyZUGyjhtWX3Auk1Kw6mOq1i5dl5vv6xs6nNuDs4voD7pyzi9/XjeTzk62aZJNQWAm/7nrh/ns5PS6/fs2HJ1cLFuDw8lZs2m3k77vEV3oBbuKsNATlut0FaMlCShiUHNmnMmxvmJAfeoT6g7Rmi/UvUUSTedpzfG5IA8Qj6gOhstCakhMuxQxVi1BboEqcAQxo3TCRiYNUSR1zJRTisKITLI7CZDwCHO4lDxIO+IL5mJX17IMxhUp+DxjQrV/5TLrdNxjIfGqAJle9gHmAZZiDSHpHtIA6R3U09VljqORan4RxZ6pt4HeAl7WczbYL9gyiHmwBNuMZj8xmmmXB0NUYsGQxI5awqiIFhQK08ylGLht4OtU4IP4Cno+ClUR8iIJovmMLUfyUCeT4lnKhdBzUuVJyoJKL6LEY1BOYh2VPwI+cajluDNnRijtc8oFKIzHwEchmhLmDZMh2q1c+qWHaoPEob8ZjenyietiFtMnkUQJoKpZyAmT8fp2HPhAFvqtb51GB6bZh7qR1+GjwoXscwagIhITiYH+JVY7wHEFDy+Bd5xNexvSi3u4XcX+eat4mft1GamXQH+MXpHzEnNbA2ZXABud7wzYpGgwT/DyKs4eQfW/mHoJGzXHjW73/CZ9nPbska1vpvRULOFQyL9l7zP93Ur6Z0RE8o6hAOqHMQYC1rz2nD14zpvZTMd8b5vpVTirTWa7pHc3JP1DmcytPV+ytud793Q+YKI5MgnVP7qLuaeotpgvZjHd3v4s5knKjApltcNsyvmz2/TzGYxZST0OEKG1uXwVczFa7Xd2F6t2l93cxdyQ84/vLtWfrrG73MF9w1kpUJtD+cyEc1q7zKd2GeuVfzu+GWoHtcvs5jK9DTn/+C5jVE9JEyKkf4SkPiW5qlQbzGc2mM4e/+59mrL6lLSjwxgf8ZgE1fwla/LuKX9TbR3/BQ==</diagram></mxfile>" style="background-color:#fff"><defs><clipPath id="mx-clip-40-31-136-26-0"><rect x="40" y="31" width="136" height="26"/></clipPath><clipPath id="mx-clip-4-31-28-26-0"><rect x="4" y="31" width="28" height="26"/></clipPath><clipPath id="mx-clip-40-57-136-26-0"><rect x="40" y="57" width="136" height="26"/></clipPath><clipPath id="mx-clip-40-83-136-26-0"><rect x="40" y="83" width="136" height="26"/></clipPath><clipPath id="mx-clip-40-109-136-26-0"><rect x="40" y="109" width="136" height="26"/></clipPath><clipPath id="mx-clip-40-135-136-26-0"><rect x="40" y="135" width="136" height="26"/></clipPath><clipPath id="mx-clip-40-161-136-26-0"><rect x="40" y="161" width="136" height="26"/></clipPath></defs><g><path d="M 0 26 L 0 0 L 180 0 L 180 26" fill="#fff" stroke="#000" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 26 L 0 182 L 180 182 L 180 26" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 26 L 180 26" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="12"><text x="89.5" y="17.5">User</text></g><path d="M 0 26 M 180 26 M 180 52 L 0 52" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" text-decoration="underline" clip-path="url(#mx-clip-40-31-136-26-0)" font-size="12"><text x="41.5" y="43.5">id</text></g><path d="M 0 26 M 36 26 L 36 52 M 0 52" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-4-31-28-26-0)" font-size="12"><text x="5.5" y="43.5">PK</text></g><path d="M 0 52 M 180 52 M 180 78 L 0 78" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-40-57-136-26-0)" font-size="12"><text x="41.5" y="69.5">first_name: string</text></g><path d="M 0 52 M 36 52 L 36 78 M 0 78" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 78 M 180 78 M 180 104 L 0 104" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-40-83-136-26-0)" font-size="12"><text x="41.5" y="95.5">last_name: string</text></g><path d="M 0 78 M 36 78 L 36 104 M 0 104" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 104 M 180 104 M 180 130 L 0 130" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-40-109-136-26-0)" font-size="12"><text x="41.5" y="121.5">email: string</text></g><path d="M 0 104 M 36 104 L 36 130 M 0 130" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 130 M 180 130 M 180 156 L 0 156" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-40-135-136-26-0)" font-size="12"><text x="41.5" y="147.5">email_confirmed: bool</text></g><path d="M 0 130 M 36 130 L 36 156 M 0 156" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 156 M 180 156 M 180 182 L 0 182" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000" font-family="Helvetica" clip-path="url(#mx-clip-40-161-136-26-0)" font-size="12"><text x="41.5" y="173.5">birthDate: date</text></g><path d="M 0 156 M 36 156 L 36 182 M 0 182" fill="none" stroke="#000" stroke-miterlimit="10" pointer-events="none"/></g></svg> \ No newline at end of file diff --git a/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.png b/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.png deleted file mode 100644 index 57ce753d70..0000000000 Binary files a/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.png and /dev/null differ diff --git a/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.snagx b/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.snagx deleted file mode 100644 index b57f8739a7..0000000000 Binary files a/content/doc-images/data-platform/data-browser/data-browser-simple-app-data.snagx and /dev/null differ diff --git a/content/doc-images/data-platform/pdp-signup.png b/content/doc-images/data-platform/pdp-signup.png deleted file mode 100644 index e73fc22afa..0000000000 Binary files a/content/doc-images/data-platform/pdp-signup.png and /dev/null differ diff --git a/content/doc-images/data-platform/pdp-signup.snagx b/content/doc-images/data-platform/pdp-signup.snagx deleted file mode 100644 index 8b3579ec9e..0000000000 Binary files a/content/doc-images/data-platform/pdp-signup.snagx and /dev/null differ diff --git a/content/doc-images/data-platform/platform/accelerate/accelerate-response.png b/content/doc-images/data-platform/platform/accelerate/accelerate-response.png deleted file mode 100644 index d071765db7..0000000000 Binary files a/content/doc-images/data-platform/platform/accelerate/accelerate-response.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/delete-account.png b/content/doc-images/data-platform/platform/delete-account.png deleted file mode 100644 index bd423abbb7..0000000000 Binary files a/content/doc-images/data-platform/platform/delete-account.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/github-permission.png b/content/doc-images/data-platform/platform/github-permission.png deleted file mode 100644 index 6965fb9cab..0000000000 Binary files a/content/doc-images/data-platform/platform/github-permission.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/logout.png b/content/doc-images/data-platform/platform/logout.png deleted file mode 100644 index 1dd0aea3a8..0000000000 Binary files a/content/doc-images/data-platform/platform/logout.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/profile-button.png b/content/doc-images/data-platform/platform/profile-button.png deleted file mode 100644 index 6df8155c13..0000000000 Binary files a/content/doc-images/data-platform/platform/profile-button.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/profile-form.png b/content/doc-images/data-platform/platform/profile-form.png deleted file mode 100644 index 555cb1bc83..0000000000 Binary files a/content/doc-images/data-platform/platform/profile-form.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/projects/api-alternate.png b/content/doc-images/data-platform/platform/projects/api-alternate.png deleted file mode 100644 index 72b4d956b3..0000000000 Binary files a/content/doc-images/data-platform/platform/projects/api-alternate.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/projects/api-keys.png b/content/doc-images/data-platform/platform/projects/api-keys.png deleted file mode 100644 index cad25e2952..0000000000 Binary files a/content/doc-images/data-platform/platform/projects/api-keys.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/projects/project-overview.png b/content/doc-images/data-platform/platform/projects/project-overview.png deleted file mode 100644 index 7115c31862..0000000000 Binary files a/content/doc-images/data-platform/platform/projects/project-overview.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/projects/projects.png b/content/doc-images/data-platform/platform/projects/projects.png deleted file mode 100644 index 768183a375..0000000000 Binary files a/content/doc-images/data-platform/platform/projects/projects.png and /dev/null differ diff --git a/content/doc-images/data-platform/platform/pulse/diagram.png b/content/doc-images/data-platform/platform/pulse/diagram.png deleted file mode 100644 index 23ca0c5834..0000000000 Binary files a/content/doc-images/data-platform/platform/pulse/diagram.png and /dev/null differ diff --git a/content/doc-images/data-platform/projects/create-01-paste-connection-string.png b/content/doc-images/data-platform/projects/create-01-paste-connection-string.png deleted file mode 100644 index d5a9d15b4e..0000000000 Binary files a/content/doc-images/data-platform/projects/create-01-paste-connection-string.png and /dev/null differ diff --git a/content/doc-images/data-platform/projects/create-01-paste-connection-string.snagx b/content/doc-images/data-platform/projects/create-01-paste-connection-string.snagx deleted file mode 100644 index a116158602..0000000000 Binary files a/content/doc-images/data-platform/projects/create-01-paste-connection-string.snagx and /dev/null differ diff --git a/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.png b/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.png deleted file mode 100644 index ac304be4f0..0000000000 Binary files a/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.png and /dev/null differ diff --git a/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.snagx b/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.snagx deleted file mode 100644 index f8f2795d28..0000000000 Binary files a/content/doc-images/data-platform/projects/create-03-copy-data-proxy-connection-string.snagx and /dev/null differ diff --git a/content/doc-images/database-setup-illustration.png b/content/doc-images/database-setup-illustration.png deleted file mode 100644 index 446ce655b4..0000000000 Binary files a/content/doc-images/database-setup-illustration.png and /dev/null differ diff --git a/content/doc-images/database-tables.png b/content/doc-images/database-tables.png deleted file mode 100644 index 850ad9a0de..0000000000 Binary files a/content/doc-images/database-tables.png and /dev/null differ diff --git a/content/doc-images/guides/deploy/create-repo.png b/content/doc-images/guides/deploy/create-repo.png deleted file mode 100644 index 8c7c8cfbfd..0000000000 Binary files a/content/doc-images/guides/deploy/create-repo.png and /dev/null differ diff --git a/content/doc-images/guides/deploy/create-repo.snagx b/content/doc-images/guides/deploy/create-repo.snagx deleted file mode 100644 index c51aee6462..0000000000 Binary files a/content/doc-images/guides/deploy/create-repo.snagx and /dev/null differ diff --git a/content/doc-images/mongodb-logo.svg b/content/doc-images/mongodb-logo.svg deleted file mode 100644 index f4828669b6..0000000000 --- a/content/doc-images/mongodb-logo.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1112.61 300"> - <defs> - <style>.cls-4{fill:#21313c}</style> - </defs> - <path d="M134.44 120.34C119.13 52.8 87.22 34.82 79.08 22.11a144.57 144.57 0 0 1-8.9-17.42c-.43 6-1.22 9.78-6.32 14.33-10.24 9.13-53.73 44.57-57.39 121.31-3.41 71.55 52.6 115.67 60 120.23 5.69 2.8 12.62.06 16-2.51 27-18.53 63.89-67.93 52-137.71" style="fill:#10aa50" /> - <path d="M72.5 222.46c-1.41 17.71-2.42 28-6 38.12 0 0 2.35 16.86 4 34.72h5.84a324.73 324.73 0 0 1 6.37-37.39c-7.56-3.72-9.92-19.91-10.21-35.45Z" style="fill:#b8c4c2" /> - <path d="M82.7 257.92c-7.64-3.53-9.85-20.06-10.19-35.46a725.83 725.83 0 0 0 1.65-76.35c-.4-13.36.19-123.74-3.29-139.9a134.29 134.29 0 0 0 8.21 15.89c8.14 12.72 40.06 30.7 55.36 98.24C146.36 190 109.67 239.27 82.7 257.92Z" style="fill:#12924f" /> - <path class="cls-4" d="M1089.7 233.5a16.59 16.59 0 1 1 16.59-16.82 16.38 16.38 0 0 1-16.59 16.82m0-31.68a15.1 15.1 0 1 0 15 15.14 14.85 14.85 0 0 0-15-15.14m4 25.58-4.28-9.23h-3.45v9.23h-2.51v-21h6.19c4.61 0 6.53 2 6.53 5.87 0 3.08-1.45 5-4.15 5.59l4.42 9.51Zm-7.63-11.4h3.63c2.94 0 4.06-1 4.06-3.68s-1.07-3.59-4.38-3.59h-3.31ZM842.79 218.38c4.49 3.59 13.46 5.07 21.37 5.07 10.25 0 20.3-1.9 30.12-10.77 10-9.09 16.88-23 16.88-45.21 0-21.34-8.12-38.66-24.78-48.8-9.4-5.91-21.58-8.24-35.47-8.24-4 0-8.12.21-10.46 1.27a5.49 5.49 0 0 0-1.93 3c-.42 3.8-.42 32.74-.42 49.85 0 17.54 0 42 .42 45 .22 2.54 1.5 7 4.27 8.87m-42.64-117.49c3.63 0 17.43.63 23.85.63 12 0 20.29-.63 42.72-.63 18.8 0 34.62 5.07 45.93 14.78 13.68 11.84 21 28.31 21 48.38 0 28.52-13 45-26.07 54.29-13 9.72-29.91 15.21-54 15.21-12.82 0-34.83-.42-53.2-.63H800c-.86-1.69 1.57-8.28 3.07-8.45 5-.56 6.32-.76 8.62-1.71 3.88-1.59 4.79-3.57 5.22-10.54.64-13.1.43-28.73.43-46.48 0-12.67.21-37.39-.21-45.21-.65-6.54-3.41-8.23-9-9.5a116.24 116.24 0 0 0-12-1.9c-.42-1.27 2.86-7 3.93-8.24M986.6 111.65c-.85.21-1.92 2.33-1.92 3.38-.22 7.61-.43 27.46-.43 41.19a1.36 1.36 0 0 0 1.07 1.06c2.77.21 9.61.43 15.38.43 8.12 0 12.82-1.06 15.38-2.33 6.84-3.38 10-10.78 10-18.8 0-18.38-12.82-25.35-31.83-25.35a57.35 57.35 0 0 0-7.69.42m48.5 84.5c0-18.59-13.68-29.15-38.68-29.15-1.06 0-9-.21-10.89.21-.64.21-1.28.63-1.28 1.06 0 13.31-.22 34.64.43 43.09.43 3.59 3 8.66 6.19 10.14 3.42 1.9 11.11 2.32 16.45 2.32 14.74 0 27.78-8.23 27.78-27.67M948 101.3c1.93 0 7.61.63 22.14.63 13.67 0 24.78-.42 38-.42 16.45 0 39.09 5.92 39.09 30.42 0 12-8.54 21.76-19.65 26.41-.64.21-.64.63 0 .84 15.81 4 29.69 13.73 29.69 32.32 0 18.17-11.32 29.58-27.77 36.76-10 4.44-22.43 5.91-35 5.91-9.61 0-35.37-1-49.69-.84-1.5-.63 1.37-7.4 2.65-8.45a39.38 39.38 0 0 0 9.69-1.52c5.12-1.26 5.73-2.91 6.37-10.52.43-6.55.43-30 .43-46.69 0-22.82.22-38.23 0-45.84-.21-5.91-2.35-7.82-6.41-8.87-3.2-.64-8.54-1.27-12.81-1.9-1.07-1.06 2.22-7.4 3.28-8.24M181.75 233.5a9.26 9.26 0 0 1-.65-4.27 5.43 5.43 0 0 1 .65-2.85 72.58 72.58 0 0 0 8.2-1.67c3.78-.94 5.2-3 5.42-7.82.62-11.39.66-32.76.44-47.78v-.44c0-1.62 0-3.82-2-5.37a42.94 42.94 0 0 0-11.33-5c-1.79-.53-2.78-1.47-2.73-2.57s1.18-2.4 3.51-2.86c6.19-.63 22.41-4.5 28.78-7.44a4.22 4.22 0 0 1 .85 3c0 .66-.1 1.36-.17 2.08-.18 2.12-.38 4.53-.38 6.93a1.58 1.58 0 0 0 2.68.91c12.13-9.51 23-12.9 28.57-12.9 9.17 0 16.31 4.38 21.84 13.4a1.47 1.47 0 0 0 1.24.73 1.42 1.42 0 0 0 1.16-.62c11.15-8.46 22.2-13.51 29.6-13.51 17.48 0 27.93 13.09 27.93 35 0 6.3-.06 14.29-.12 21.74-.05 6.54-.1 12.67-.1 16.91 0 1 1.38 3.88 3.45 4.45 2.56 1.25 6.25 1.89 10.92 2.69h.18c.35 1.26-.39 6.15-1.1 7.15-1.16 0-2.76-.1-4.76-.2-3.63-.18-8.61-.43-14.4-.43-11.62 0-17.69.22-23.49.6-.44-1.45-.59-6.13-.06-7.11a61.55 61.55 0 0 0 7.12-1.55c3.7-1.22 4.77-2.9 5-7.81.09-3.49.76-34.24-.43-41.54-1.1-7.57-6.8-16.43-19.27-16.43-4.63 0-12.1 1.93-19.22 7.33a2.8 2.8 0 0 0-.7 1.81v.15c.84 3.94.84 8.54.84 15.49 0 4 0 8.17-.05 12.34-.05 8.48-.09 16.48.05 22.53 0 4.12 2.49 5.11 4.5 5.9 1.09.24 1.95.45 2.82.65 1.67.41 3.41.83 6 1.24a11.49 11.49 0 0 1-.1 5.32 4.26 4.26 0 0 1-.75 1.81c-6.46-.22-13.09-.41-22.66-.41-2.9 0-7.63.12-11.81.23-3.39.09-6.59.18-8.41.19a8.24 8.24 0 0 1-.64-3.68 6.38 6.38 0 0 1 .67-3.44l2.57-.47c2.24-.4 4.18-.74 6-1.2 3.16-1 4.35-2.72 4.58-6.75.62-9.4 1.1-36.49-.23-43.27-2.26-10.88-8.45-16.4-18.41-16.4-5.83 0-13.2 2.81-19.22 7.32a5.86 5.86 0 0 0-1.77 4.35v11.19c0 13.6-.09 30.53.24 37.85.2 2.26 1 4.94 5.23 5.92.93.27 2.53.53 4.39.84 1.07.18 2.24.37 3.45.59a15.16 15.16 0 0 1-.57 7.15c-1.86 0-4.15-.12-6.77-.23-4-.18-9-.4-14.65-.4-6.68 0-11.33.22-15.06.4-2.51.12-4.68.22-6.85.23M396.2 154.49a18.22 18.22 0 0 0-10.2 2.87c-7.42 4.51-11.2 13.52-11.2 26.76 0 24.78 12.41 42.09 30.18 42.09A19 19 0 0 0 418 221.6c5.46-4.45 8.36-13.55 8.36-26.29 0-24.41-12.13-40.82-30.18-40.82m3.42 80.91c-32.1 0-43.53-23.55-43.53-45.58 0-15.39 6.29-27.42 18.7-35.77a57.11 57.11 0 0 1 28.89-8.54c24.49 0 41.6 17.61 41.6 42.84 0 17.14-6.83 30.68-19.76 39.14-6.21 3.8-17 7.91-25.9 7.91M723 154.49a18.17 18.17 0 0 0-10.22 2.87c-7.42 4.51-11.2 13.52-11.2 26.76 0 24.78 12.41 42.09 30.18 42.09a19 19 0 0 0 13.06-4.61c5.46-4.45 8.35-13.55 8.35-26.29 0-24.41-12.12-40.82-30.17-40.82m3.42 80.91c-32.1 0-43.53-23.55-43.53-45.57 0-15.41 6.29-27.43 18.71-35.78a57 57 0 0 1 28.88-8.54c24.49 0 41.6 17.62 41.6 42.83 0 17.16-6.83 30.69-19.76 39.14-6.21 3.81-17 7.92-25.9 7.92M614.92 153.65c-9.89 0-16.29 7.81-16.29 19.9s5.51 26.46 21 26.46c2.66 0 7.48-1.18 9.87-3.81 3.6-3.31 6-10.15 6-17.37 0-15.77-7.68-25.18-20.53-25.18m-1.28 83.44a16.29 16.29 0 0 0-8 2c-7.83 5-11.46 10-11.46 15.81 0 5.44 2.11 9.77 6.65 13.61 5.5 4.66 12.92 6.93 22.67 6.93 19.19 0 27.79-10.32 27.79-20.54 0-7.12-3.57-11.89-10.92-14.59-5.66-2.07-15.12-3.21-26.7-3.21m1.28 49c-11.52 0-19.82-2.43-26.91-7.89-6.9-5.32-10-13.22-10-18.68a14.61 14.61 0 0 1 3.78-9.5c2-2.28 6.65-6.55 17.4-13.94a.92.92 0 0 0 .56-.85.89.89 0 0 0-.68-.88c-8.85-3.39-11.52-9-12.33-12 0-.11 0-.28-.09-.47-.25-1.18-.49-2.3 1.12-3.45 1.24-.88 3.22-2.06 5.34-3.31a71.89 71.89 0 0 0 8.59-5.59 1.41 1.41 0 0 0-.36-2.2c-13.1-4.4-19.7-14.13-19.7-29a28.83 28.83 0 0 1 12.1-23.73c5.27-4.17 18.5-9.18 27.07-9.18h.5c8.81.21 13.78 2.06 20.66 4.6a32.84 32.84 0 0 0 12.22 1.94c7.29 0 10.48-2.31 13.22-5a11.47 11.47 0 0 1 .7 3.78 14.22 14.22 0 0 1-2.38 8.68c-1.49 2.07-5 3.57-8.21 3.57-.33 0-.65 0-1-.05a26.94 26.94 0 0 1-5-.83l-.82.29c-.26.38-.09.8.12 1.34a1.7 1.7 0 0 1 .12.33 58.52 58.52 0 0 1 1.19 8.1c0 15.55-6.13 22.32-12.76 27.34a43.56 43.56 0 0 1-22 8.52c-.17 0-1 .07-2.56.21-1 .09-2.3.21-2.49.21h-.19c-1.44.4-5.2 2.19-5.2 5.52 0 2.76 1.7 6.19 9.83 6.81l5.26.37c10.72.75 24.11 1.68 30.41 3.81a21.06 21.06 0 0 1 14.07 20.27c0 13.95-9.92 27.07-26.53 35.09a57.66 57.66 0 0 1-25.09 5.63M565.86 226.06c-4.7-.63-8.13-1.27-12.18-3.17a5.6 5.6 0 0 1-1.5-3c-.43-6.55-.43-25.56-.43-38 0-10.15-1.7-19-6-25.35-5.13-7.19-12.39-11.41-21.79-11.41-8.33 0-19.44 5.7-28.62 13.52-.22.21-1.63 1.55-1.6-.53s.35-6.3.55-9a4.63 4.63 0 0 0-1.4-3.92c-6 3-22.83 7-29.06 7.61-4.54.88-5.69 5.25-.84 6.76h.07a41.46 41.46 0 0 1 11 4.84c1.92 1.48 1.71 3.59 1.71 5.28.21 14.15.21 35.91-.43 47.74-.21 4.65-1.5 6.34-4.92 7.19l.32-.11a66.46 66.46 0 0 1-7.91 1.48c-1.07 1.05-1.07 7.18 0 8.45 2.14 0 13-.63 22-.63 12.38 0 18.79.63 22 .63 1.29-1.48 1.71-7.18.86-8.45a45 45 0 0 1-8.77-1.27c-3.41-.84-4.27-2.54-4.48-6.33-.42-9.94-.42-31.06-.42-45.43 0-4 1.06-5.91 2.34-7 4.27-3.8 11.33-6.33 17.52-6.33 6 0 10 1.9 13 4.43A18.1 18.1 0 0 1 533 176c.85 8 .63 24.09.63 38 0 7.61-.63 9.52-3.41 10.36-1.28.63-4.7 1.27-8.76 1.69-1.28 1.27-.86 7.18 0 8.45 5.55 0 12-.63 21.36-.63 11.75 0 19.23.63 22.22.63 1.28-1.48 1.71-7 .86-8.45" /> -</svg> \ No newline at end of file diff --git a/content/doc-images/new-query.png b/content/doc-images/new-query.png deleted file mode 100644 index a8d949f8ee..0000000000 Binary files a/content/doc-images/new-query.png and /dev/null differ diff --git a/content/doc-images/prisma-introspection-development-workflow.png b/content/doc-images/prisma-introspection-development-workflow.png deleted file mode 100644 index c852ab8f90..0000000000 Binary files a/content/doc-images/prisma-introspection-development-workflow.png and /dev/null differ diff --git a/docusaurus.config.ts b/docusaurus.config.ts new file mode 100644 index 0000000000..80ddda4cb2 --- /dev/null +++ b/docusaurus.config.ts @@ -0,0 +1,484 @@ +import { themes as prismThemes } from 'prism-react-renderer'; +import type { Config } from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; + +const DOCUSAURUS_BASE_URL = process.env.DOCUSAURUS_BASE_URL ?? '/'; + +const config: Config = { + title: 'Prisma Documentation', + tagline: 'Get started with Prisma in the official documentation, and learn more about all Prisma\'s features with reference documentation, guides, and more.', + favicon: 'img/favicon.png', + + // Set the production url of your site here + url: 'https://docs-cloudflare.prisma.io', + // Set the /<baseUrl>/ pathname under which your site is served + // For GitHub pages deployment, it is often '/<projectName>/' + baseUrl: DOCUSAURUS_BASE_URL ?? '/', + + trailingSlash: false, + onBrokenLinks: 'throw', + onBrokenAnchors: 'throw', + onBrokenMarkdownLinks: 'throw', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + customFields: { + 'BREVO_API_KEY': process.env.BREVO_API_KEY + }, + scripts: [ + // kapa.ai script + { + src: 'https://widget.kapa.ai/kapa-widget.bundle.js', + defer: true, + 'data-website-id': '1b51bb03-43cc-4ef4-95f1-93288a91b560', + 'data-project-name': 'Prisma', + 'data-project-color': '#2D3748', + 'data-project-logo': 'https://www.prisma.io/docs/ai_logo.png', + 'data-button-text': 'Ask AI', + 'data-modal-example-questions': + "How can I setup relations in my schema file?,What is the difference between the 'migrate dev' and 'db push' commands?,Which cache strategy should I use for my query with Prisma Accelerate?,How can I subscribe to database events with Prisma Pulse?", + 'data-button-image': 'https://www.prisma.io/docs/ai_button.svg', + 'data-button-text-color': '#71E8DF', + 'data-button-bg-color': '#2D3748', + 'data-button-border': '2px', + 'data-button-border-color': '#71e8df', + 'data-button-border-style': 'solid', + 'data-button-box-shadow': + 'drop-shadow(0px 0.724px 1.251px rgba(14, 18, 28, 0.02)) drop-shadow(0px 1.608px 2.909px rgba(14, 18, 28, 0.04)) drop-shadow(0px 2.793px 5.225px rgba(14, 18, 28, 0.06)) drop-shadow(0px 4.55px 8.671px rgba(14, 18, 28, 0.07)) drop-shadow(0px 7.485px 14.285px rgba(14, 18, 28, 0.08)) drop-shadow(0px 13.358px 24.966px rgba(14, 18, 28, 0.09)) drop-shadow(0px 33px 54px rgba(14, 18, 28, 0.07))', + }, + // OneTrust Cookies Consent Notice start for prisma.io + { + src: 'https://cdn.cookielaw.org/scripttemplates/otSDKStub.js', + 'data-document-language': 'true', + 'data-domain-script': '22c2e2c0-3df0-4958-8672-1194370ee230', + }, + ], + plugins: ['docusaurus-plugin-sass'], + presets: [ + [ + 'classic', + { + gtag: { + trackingID: 'G-YS7QHR40SL', + anonymizeIP: true, + }, + googleTagManager: { + containerId: 'GTM-KCGZPWB', + }, + sitemap: { + // @ts-ignore + changefreq: 'daily', + priority: 0.7, + ignorePatterns: [ + '/search', + // Remove these from sitemap for SEO purposes as they're redirected + '/getting-started/quickstart', + '/getting-started/setup-prisma/add-to-existing-project', + '/getting-started/setup-prisma/start-from-scratch-prisma-migrate', + '/getting-started/setup-prisma/start-from-scratch-sql', + ], + filename: 'sitemap.xml', + }, + docs: { + routeBasePath: '/', + path: 'content', + sidebarPath: './sidebars.ts', + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/prisma/docs', + }, + blog: false, + theme: { + customCss: [ + './src/css/custom.css', + './src/css/admonition.css', + './src/css/docsearch.css', + './src/css/all.css', + './src/css/theming.css', + './src/css/prism.css' + ], + }, + } satisfies Preset.Options + ], + ], + + themeConfig: { + image: '/docs/social/docs-social.png', + navbar: { + logo: { + srcDark: 'img/logo-white.svg', + alt: 'Prisma logo', + src: 'img/logo.svg', + href: "https://www.prisma.io/", + target: "_self" + }, + items: [ + { + to: DOCUSAURUS_BASE_URL, + position: 'left', + label: '/docs', + className: 'logo-link', + }, + { + type: 'docSidebar', + sidebarId: 'gettingStarted', + position: 'left', + label: 'Get Started', + className: 'indigo first-item', + }, + { + type: 'docSidebar', + sidebarId: 'ormSidebar', + position: 'left', + className: 'indigo', + label: 'ORM', + }, + { + type: 'docSidebar', + sidebarId: 'accelerateSidebar', + position: 'left', + className: 'teal', + label: 'Accelerate', + }, + { + type: 'docSidebar', + sidebarId: 'pulseSidebar', + position: 'left', + className: 'teal', + label: 'Pulse', + }, + { + href: 'https://github.com/prisma/', + position: 'right', + className: 'header-github-link', + 'aria-label': 'GitHub repository', + }, + { + href: 'https://console.prisma.io/login?utm_source=docs&utm_medium=login', + position: 'right', + label: "Login", + className: 'navbar-login-btn internal teal-btn', + }, + ], + }, + algolia: { + appId: 'MF58UJZ648', + apiKey: 'fd3d0a05bfe5d280348060ca5ea416be', + indexName: 'prisma', + contextualSearch: false, + replaceSearchResultPathname: { + from: '/docs/', + to: DOCUSAURUS_BASE_URL + } + }, + footer: { + style: 'dark', + links: [ + { + title: 'Product', + items: [ + { + label: 'ORM', + href: 'https://www.prisma.io/orm', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Accelerate', + href: 'https://www.prisma.io/accelerate', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Pulse', + href: 'https://www.prisma.io/pulse', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Pricing', + href: 'https://www.prisma.io/pricing', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Changelog', + href: 'https://www.prisma.io/changelog', + target: "_self", + customProps: { + internal: true + } + }, + ], + }, + { + title: 'Resources', + items: [ + { + label: 'Docs', + to: '/', + }, + { + label: 'Get started', + to: '/getting-started', + }, + { + label: 'prisma-examples', + href: 'https://github.com/prisma/prisma-examples', + }, + { + label: 'Prisma in your stack', + href: 'https://www.prisma.io/stack', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Ecosystem', + href: 'https://www.prisma.io/ecosystem', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Tutorials', + href: 'https://www.prisma.io/learn', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Playground', + href: 'https://playground.prisma.io/', + }, + { + label: 'Customer stories', + href: 'https://www.prisma.io/showcase', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Data guide', + href: 'https://www.prisma.io/dataguide', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Data Platform status', + href: 'https://www.prisma-status.com/', + }, + { + label: 'VS Code extension', + href: 'https://marketplace.visualstudio.com/items?itemName=Prisma.prisma', + }, + ], + }, + { + title: 'Contact us', + items: [ + { + label: 'Community', + href: 'https://www.prisma.io/community', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Support', + href: 'https://www.prisma.io/support', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Enterprise', + href: 'https://www.prisma.io/enterprise', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Partners', + href: 'https://www.prisma.io/partners', + target: "_self", + customProps: { + internal: true + } + }, + ], + }, + { + title: 'Company', + items: [ + { + label: 'About', + href: 'https://www.prisma.io/about', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Blog', + to: 'https://www.prisma.io/blog', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Data DX', + href: 'https://www.datadx.io/', + }, + { + label: 'Careers', + to: 'https://www.prisma.io/careers', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Events', + to: 'https://www.prisma.io/events', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Causes', + href: 'https://prismaio.notion.site/Prisma-Causes-0c9e1ddc0f5942edaba355692cfee69f', + }, + { + label: 'OSS Friends', + to: 'https://www.prisma.io/oss-friends', + target: "_self", + customProps: { + internal: true + } + }, + { + label: 'Terms & Privacy', + href: 'https://prismaio.notion.site/Terms-Privacy-5b5b9938b3a941ccb2ad97eaf5524c07', + }, + { + label: 'Service Level Agreement', + href: 'https://pris.ly/sla', + }, + ], + }, + { + items: [ + { + label: ' ', + href: "https://discord.gg/KQyTW2H5ca", + customProps: { + icon: "fa-brands fa-discord", + internal: true, + } + }, + { + label: ' ', + href: "https://x.com/prisma", + customProps: { + icon: "fa-brands fa-x-twitter", + internal: true, + } + }, + { + label: ' ', + href: "https://www.youtube.com/prismadata", + customProps: { + icon: "fa-brands fa-youtube", + internal: true, + } + }, + { + label: ' ', + href: "https://pris.ly/whatsapp", + customProps: { + icon: "fa-brands fa-whatsapp", + internal: true, + } + }, + { + label: ' ', + href: "https://github.com/prisma", + customProps: { + icon: "fa-brands fa-github", + internal: true, + } + }, + ] + } + ], + logo: { + srcDark: 'img/logo-white.svg', + alt: 'Prisma logo', + src: 'img/logo-white.svg', + href: "https://www.prisma.io/", + target: "_self", + }, + copyright: `© ${new Date().getFullYear()} Prisma Data, Inc.`, + }, + docs: { + sidebar: { + autoCollapseCategories: true + }, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ['json', 'bash'], + magicComments: [ + // Remember to extend the default highlight class name as well! + { + className: 'theme-code-block-added-line added-line code-highlight', + line: 'add-next-line', + block: { start: 'add-start', end: 'add-end' }, + }, + { + className: 'theme-code-block-deleted-line deleted-line code-highlight', + line: 'delete-next-line', + block: { start: 'delete-start', end: 'delete-end' }, + }, + { + className: 'theme-code-block-edited-line edited-line code-highlight', + line: 'edit-next-line', + block: { start: 'edit-start', end: 'edit-end' }, + }, + { + className: 'theme-code-block-highlighted-line highlighted-line', + line: 'highlight-next-line', + block: { start: 'highlight-start', end: 'highlight-end' }, + } + ] + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/gatsby-browser.tsx b/gatsby-browser.tsx deleted file mode 100644 index b765c1b9dd..0000000000 --- a/gatsby-browser.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { goToNav } from './src/utils/goToNavItem' -import { trackPage, init } from './src/utils/stats' -import docsConfig from './config' - -export const onClientEntry = () => { - init() -} - -export const onRouteUpdate = ({ location }) => { - trackPage(location.pathname) - goToNav(location.pathname) // This may not work anymore due to the new scroll behavior of the sidebar - const isRedirectablePath = docsConfig.redirects.filter((redirect) => { - const redirectFromSplit = redirect.from.split('#') - if (redirectFromSplit.length > 1) { - const isHashPath = - location.href.includes(redirectFromSplit[0]) && location.hash === `#${redirectFromSplit[1]}` - return isHashPath - } - return location.href.includes(redirect.from) - }) - if (isRedirectablePath[0]) { - const fromPathWithoutHash = isRedirectablePath[0].from.split('#') - const toPathWithoutHash = isRedirectablePath[0].to.split('#') - if (fromPathWithoutHash[0] === toPathWithoutHash[0]) { - window.location.hash = toPathWithoutHash[1] - } else { - const newpath = location.href.replace(isRedirectablePath[0].from, isRedirectablePath[0].to) - window.location.replace(newpath) - } - } -} diff --git a/gatsby-config.ts b/gatsby-config.ts deleted file mode 100644 index 6db8ab9a12..0000000000 --- a/gatsby-config.ts +++ /dev/null @@ -1,186 +0,0 @@ -import type { GatsbyConfig } from 'gatsby' -import docsConfig from './config' -require('dotenv').config({ - path: `.env`, -}) - -let plugins: any = [ - 'gatsby-plugin-image', - 'gatsby-plugin-sharp', - 'gatsby-transformer-sharp', - 'gatsby-plugin-styled-components', - 'gatsby-plugin-smoothscroll', - 'gatsby-plugin-catch-links', - { - resolve: `gatsby-plugin-mdx`, - options: { - extensions: ['.mdx', '.md'], - gatsbyRemarkPlugins: [ - 'gatsby-remark-sectionize', - 'gatsby-remark-normalize-paths', - { - resolve: `gatsby-remark-autolink-headers`, - options: { - icon: `<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M1.5 6.33337H15.5" stroke="#CBD5E0" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/> - <path d="M1.5 11.6666H15.5" stroke="#CBD5E0" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/> - <path d="M6.75 1L5 17" stroke="#CBD5E0" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/> - <path d="M12 1L10.25 17" stroke="#CBD5E0" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/> - </svg>`, - className: `title-link`, - enableCustomId: true, - }, - }, - { - resolve: `gatsby-remark-image-custom`, - options: { - disableBgImageOnAlpha: true, - quality: 100, - }, - }, - { - resolve: 'gatsby-remark-to-absoluteurl', - options: { - redirects: docsConfig.redirects, - }, - }, - { - resolve: 'gatsby-remark-check-links-numberless', - options: { - // Do not surface links to these pages as broken: - exceptions: [ - '/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql', - '/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql', - '/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql', - '/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql', - '/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-planetscale', - '/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-planetscale', - '/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-planetscale', - '/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-planetscale', - '/getting-started/setup-prisma/add-to-existing-project/mongodb-typescript-mongodb', - '/getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb', - '/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-cockroachdb', - '/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-cockroachdb', - '/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-cockroachdb', - ], - }, - }, - { - resolve: 'gatsby-remark-copy-linked-files', - options: { - destinationDir: 'static', - }, - }, - ], - }, - }, - { - resolve: 'gatsby-plugin-google-tagmanager', - options: { - id: 'GTM-KCGZPWB', - includeInDevelopment: false, - defaultDataLayer: { website: 'docs' }, - }, - }, - { - resolve: `gatsby-plugin-sitemap`, - options: { - entryLimit: 5000, - excludes: [ - // Remove these from sitemap for SEO purposes as they're redirected - `/getting-started/quickstart`, - `/getting-started/setup-prisma/add-to-existing-project`, - `/getting-started/setup-prisma/start-from-scratch-prisma-migrate`, - `/getting-started/setup-prisma/start-from-scratch-sql`, - ], - resolvePagePath: (page: any) => { - return page.path.replace(/\/$/, '') - }, - }, - }, - { - resolve: 'gatsby-plugin-robots-txt', - options: { - policy: [ - { - userAgent: '*', - disallow: ['/', '/*?query=*', '/*?page=*', '/*&query=*', '/*&page=*'], - }, - ], - }, - }, - { - resolve: 'gatsby-source-filesystem', - options: { - name: 'images', - path: `${__dirname}/src/images/`, - }, - __key: 'images', - }, - { - resolve: 'gatsby-source-filesystem', - options: { - name: `docs`, - path: `${__dirname}/content`, - }, - __key: 'pages', - }, - 'gatsby-plugin-meta-redirect', - 'gatsby-plugin-page-list', - 'gatsby-plugin-lost-pixel', -] - -if (process.env.INDEX_ALGOLIA === 'true') { - if (process.env.GATSBY_ALGOLIA_APP_ID) { - // only set this up when we actually need it - const algoliaPlugin = { - resolve: 'gatsby-algolia-indexer', - options: { - appId: process.env.GATSBY_ALGOLIA_APP_ID, - adminKey: process.env.GATSBY_ALGOLIA_ADMIN_API_KEY, - searchKey: process.env.GATSBY_ALGOLIA_SEARCH_KEY, - indexName: process.env.GATSBY_ALGOLIA_INDEX_NAME, - types: [`Mdx`], - }, - __key: 'search', - } - - plugins.push(algoliaPlugin) - - console.log( - 'INDEX_ALGOLIA is `true`, and GATSBY_ALGOLIA_APP_ID is set, so pushing algoliaPlugin to list of plugins to trigger search indexing.' - ) - } else { - console.warn('INDEX_ALGOLIA === true, but GATSBY_ALGOLIA_APP_ID is undefined.') - } -} else { - console.log('INDEX_ALGOLIA not `true`, not pushing algoliaPlugin to skip any search indexing.') -} - -const config: GatsbyConfig = { - pathPrefix: process.env.ADD_PREFIX === 'true' ? docsConfig.gatsby.pathPrefix : '/', - // trailingSlash: 'never', - siteMetadata: { - pathPrefix: docsConfig.gatsby.pathPrefix, - title: docsConfig.siteMetadata.title, - titlePrefix: docsConfig.gatsby.titlePrefix, - titleSuffix: docsConfig.gatsby.titleSuffix, - description: docsConfig.siteMetadata.description, - keywords: docsConfig.siteMetadata.keywords, - twitter: docsConfig.siteMetadata.twitter, - og: docsConfig.siteMetadata.og, - header: docsConfig.header, - siteUrl: docsConfig.gatsby.siteUrl, - footer: docsConfig.footer, - docsLocation: docsConfig.siteMetadata.docsLocation, - redirects: docsConfig.redirects, - homepage: docsConfig.homepage, - }, - // More easily incorporate content into your pages through automatic TypeScript type generation and better GraphQL IntelliSense. - // If you use VSCode you can also use the GraphQL plugin - // Learn more at: https://gatsby.dev/graphql-typegen - graphqlTypegen: true, - plugins, -} - -export default config diff --git a/gatsby-node.ts b/gatsby-node.ts deleted file mode 100644 index 23134b52da..0000000000 --- a/gatsby-node.ts +++ /dev/null @@ -1,227 +0,0 @@ -const path = require('path') -// const docTemplate = path.resolve(`./src/templates/docs.tsx`); - -exports.onCreateNode = ({ node, getNode, actions }: any) => { - const { createNodeField } = actions - if (node.internal.type === `Mdx`) { - const parent = getNode(node.parent) - let value = parent.relativePath.replace(parent.ext, '') - if (value === 'index') { - value = '' - } - - createNodeField({ - node, - name: `slug`, - value: `/${value}`, - }) - createNodeField({ - node, - name: 'id', - value: node.id, - }) - createNodeField({ - node, - name: 'modSlug', - value: `/${value.replace('/index', '')}`, - }) - } -} - -const getTitle = (frontmatter: any, lang?: any, db?: any) => { - let pageSeoTitle = frontmatter.metaTitle || frontmatter.title - if (lang || db) { - const queryParam = `${lang ? `${lang}${db ? '-' : ''}` : ''}${db ? `${db}` : ''}` - const titleEntry = frontmatter.techMetaTitles - ? frontmatter.techMetaTitles.find((item: any) => item.name === queryParam) - : null - pageSeoTitle = titleEntry ? titleEntry.value : `${pageSeoTitle} : ${queryParam}` - } - return pageSeoTitle -} - -const getDesc = (frontmatter: any, lang?: any, db?: any) => { - let pageSeoDesc = frontmatter.metaDescription || frontmatter.title - if (lang || db) { - const queryParam = `${lang ? `${lang}${db ? '-' : ''}` : ''}${db ? `${db}` : ''}` - const descEntry = frontmatter.techMetaDescriptions - ? frontmatter.techMetaDescriptions.find((item: any) => item.name === queryParam) - : null - pageSeoDesc = descEntry ? descEntry.value : pageSeoDesc - } - - return pageSeoDesc -} - -exports.createPages = async ({ graphql, actions, reporter }: any) => { - const { createPage, createRedirect } = actions - - const result = await graphql(` - query { - allMdx { - nodes { - id - fields { - slug - id - modSlug - } - frontmatter { - title - metaTitle - metaDescription - langSwitcher - dbSwitcher - techMetaTitles { - name - value - } - techMetaDescriptions { - name - value - } - } - internal { - contentFilePath - } - } - } - site { - siteMetadata { - redirects { - from - to - } - } - } - } - `) - - if (result.errors) { - reporter.panicOnBuild('Error loading MDX result', result.errors) - } - - // Create blog post pages. - const posts = result.data.allMdx.nodes - const redirects = result.data.site.siteMetadata.redirects - - // you'll call `createPage` for each result - posts.forEach((node: any) => { - // createPage({ - // // As mentioned above you could also query something else like frontmatter.title above and use a helper function - // // like slugify to create a slug - // path: node.fields.modSlug - // ? node.fields.modSlug.replace(/\d{2,}-/g, "") - // : "/", - // // Provide the path to the MDX content file so webpack can pick it up and transform it into JSX - // component: `${docTemplate}?__contentFilePath=${node.internal.contentFilePath}`, - // // You can use the values in this context in - // // our page layout component - // context: { - // id: node.id, - // seoTitle: getTitle(node.frontmatter), - // seoDescription: getDesc(node.frontmatter), - // }, - // }); - const { langSwitcher, dbSwitcher } = node.frontmatter - if (langSwitcher && dbSwitcher) { - langSwitcher.forEach((lang: any) => - dbSwitcher.forEach((db: any) => { - createPage({ - path: `${node.fields.modSlug.replace(/\d{2,}-/g, '')}-${lang}-${db}`, - component: path.resolve('./src/templates/docs.tsx'), - context: { - id: node.fields.id, - seoTitle: getTitle(node.frontmatter, lang, db), - seoDescription: getDesc(node.frontmatter, lang, db), - }, - }) - }) - ) - } else if (langSwitcher && !dbSwitcher) { - langSwitcher.forEach((lang: any) => - createPage({ - path: `${node.fields.modSlug.replace(/\d{2,}-/g, '')}-${lang}`, - component: path.resolve('./src/templates/docs.tsx'), - context: { - id: node.fields.id, - seoTitle: getTitle(node.frontmatter, lang, null), - seoDescription: getDesc(node.frontmatter, lang, null), - }, - }) - ) - } else if (!langSwitcher && dbSwitcher) { - node.frontmatter.dbSwitcher.forEach((db: any) => - createPage({ - path: `${node.fields.modSlug.replace(/\d{2,}-/g, '')}-${db}`, - component: path.resolve('./src/templates/docs.tsx'), - context: { - id: node.fields.id, - seoTitle: getTitle(node.frontmatter, null, db), - seoDescription: getDesc(node.frontmatter, null, db), - }, - }) - ) - } else if (!langSwitcher && !dbSwitcher) { - createPage({ - path: node.fields.modSlug ? node.fields.modSlug.replace(/\d{2,}-/g, '') : '/', - component: path.resolve('./src/templates/docs.tsx'), - context: { - id: node.fields.id, - seoTitle: getTitle(node.frontmatter), - seoDescription: getDesc(node.frontmatter), - }, - }) - } - }) - - redirects - .filter((redirect: any) => !redirect.from.includes('#')) - .map((redirect: any) => - createRedirect({ - fromPath: redirect.from, - toPath: redirect.to, - statusCode: 301, - }) - ) -} - -exports.createSchemaCustomization = ({ actions }: any) => { - const { createTypes } = actions - const typeDefs = ` - type MarkdownRemark implements Node { - frontmatter: Frontmatter - } - type Frontmatter { - title: String! - navTitle: String - metaTitle: String - metaDescription: String - langSwitcher: [String!] - dbSwitcher: [String!] - staticLink: Boolean - duration: String - preview: Boolean - deprecated: Boolean - earlyaccess: Boolean - toc: Boolean - hidePage: Boolean - tocDepth: Int - codeStyle: Boolean - } - ` - createTypes(typeDefs) -} - -exports.onCreateWebpackConfig = ({ stage, actions }: any) => { - actions.setWebpackConfig({ - devtool: false, - resolve: { - modules: [path.resolve(__dirname, 'src'), 'node_modules'], - alias: { - $components: path.resolve(__dirname, 'src/components'), - buble: '@philpl/buble', // to reduce bundle size - }, - }, - }) -} diff --git a/gatsby-ssr.js b/gatsby-ssr.js deleted file mode 100644 index dee081b740..0000000000 --- a/gatsby-ssr.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from 'react' - -export const onRenderBody = ({ setHeadComponents }) => { - setHeadComponents([ - <link - rel="preload" - href="/docs/fonts/Inter-Regular.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Inter-Medium.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Inter-Italic.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Inter-Bold.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Inter-SemiBold.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Inter-SemiBoldItalic.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/Barlow-Bold.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/JetBrainsMono-Regular.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/fa-brands-400.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/fa-light-300.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/fa-regular-400.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - <link - rel="preload" - href="/docs/fonts/fa-solid-900.woff2" - as="font" - type="font/woff2" - crossOrigin="anonymous" - key="interFont" - />, - ]) -} diff --git a/images.d.ts b/images.d.ts deleted file mode 100644 index f6a4076480..0000000000 --- a/images.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.png' -declare module '*.jpg' -declare module '*.jpeg' -declare module '*.gif' diff --git a/lostpixel.config.js b/lostpixel.config.ts similarity index 80% rename from lostpixel.config.js rename to lostpixel.config.ts index 520c684259..e81dc64626 100644 --- a/lostpixel.config.js +++ b/lostpixel.config.ts @@ -1,8 +1,10 @@ -module.exports = { +import { CustomProjectConfig } from 'lost-pixel'; + +export const config: CustomProjectConfig = { pageShots: { - pagesJsonUrl: 'http://172.17.0.1:9000/lost-pixel.json', - baseUrl: 'http://172.17.0.1:9000', - mask: [{ selector: 'span.gatsby-resp-image-background-image' }], + pages: [], + pagesJsonUrl: './lost-pixel-pages.json', + baseUrl: 'http://172.17.0.1:3000', }, lostPixelProjectId: 'clb5ek3mm1772001qqg7yban38', apiKey: process.env.LOST_PIXEL_API_KEY, @@ -29,12 +31,12 @@ module.exports = { #onetrust-consent-sdk { display: none; } - + /* reset menu item alignment */ #sidebar-holder li a { vertical-align: baseline; } `, }) - }, -} + } +}; diff --git a/package-lock.json b/package-lock.json index 11aa58e605..cee02ef43c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,161 +1,149 @@ { - "name": "prisma2-docs", - "version": "1.0.0", - "lockfileVersion": 2, + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "prisma2-docs", - "version": "1.0.0", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@mdx-js/loader": "1.6.22", - "@mdx-js/mdx": "1.6.22", - "@mdx-js/react": "1.6.22", - "@philpl/buble": "0.19.7", - "@prisma/client": "^4.8.1", - "@react-aria/overlays": "^3.20.0", - "@react-aria/tooltip": "^3.7.0", - "@react-aria/utils": "^3.23.0", - "@react-stately/tooltip": "^3.4.6", - "algoliasearch": "4.14.2", - "babel-plugin-styled-components": "2.0.7", - "gatsby": "4.22.1", - "gatsby-plugin-algolia": "^1.0.3", - "gatsby-plugin-catch-links": "4.22.0", - "gatsby-plugin-google-tagmanager": "4.22.0", - "gatsby-plugin-image": "2.22.0", - "gatsby-plugin-mdx": "3.15.2", - "gatsby-plugin-meta-redirect": "1.1.1", - "gatsby-plugin-robots-txt": "1.7.1", - "gatsby-plugin-sharp": "4.22.0", - "gatsby-plugin-sitemap": "5.22.0", - "gatsby-plugin-smoothscroll": "1.2.0", - "gatsby-plugin-styled-components": "5.22.0", - "gatsby-remark-autolink-headers": "5.22.0", - "gatsby-remark-copy-linked-files": "5.22.0", - "gatsby-remark-normalize-paths": "1.1.0", - "gatsby-remark-rewrite-relative-links": "1.0.8", - "gatsby-remark-sectionize": "1.0.0", - "gatsby-source-filesystem": "4.22.0", - "gatsby-transformer-remark": "5.25.1", - "gatsby-transformer-sharp": "4.22.0", - "normalize.css": "^8.0.1", - "parse-numeric-range": "1.3.0", - "prop-types": "15.7.2", - "qs": "6.11.2", - "react": "17.0.2", - "react-copy-to-clipboard": "5.1.0", - "react-dom": "17.0.2", - "react-feather": "2.0.10", - "react-ga": "3.3.1", - "react-instantsearch-dom": "6.32.1", - "react-refresh": "^0.14.0", - "react-select": "5.4.0", - "react-sticky-box": "1.0.2", - "react-toastify": "9.0.8", - "styled-components": "5.3.11", - "write": "2.0.0" + "name": "docs", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "^3.2.1", + "@docusaurus/preset-classic": "^3.2.1", + "@mdx-js/react": "^3.0.0", + "@react-aria/overlays": "^3.21.1", + "@react-aria/tooltip": "^3.7.2", + "@react-aria/utils": "^3.23.2", + "clsx": "^2.0.0", + "docusaurus-plugin-sass": "^0.2.5", + "lost-pixel": "^3.16.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-select": "^5.8.0", + "sass": "^1.72.0" }, "devDependencies": { - "@percy/cli": "^1.11.0", - "@types/node": "17.0.45", - "@types/react": "18.2.28", - "@types/react-dom": "18.2.13", - "@types/react-instantsearch-dom": "6.12.4", - "@types/styled-components": "5.1.28", - "gatsby-plugin-webpack-bundle-analyser-v2": "^1.1.31", - "husky": "7.0.4", - "is-absolute-url": "4.0.1", - "lint-staged": "11.2.6", - "path-browserify": "1.0.1", - "prettier": "2.8.8", - "prettier-plugin-prisma": "4.13.0", - "prism-react-renderer": "1.2.1", - "prisma": "^4.8.1", - "react-is": "18.2.0", - "tslint": "6.1.3", - "typescript": "4.9.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "@docusaurus/module-type-aliases": "^3.2.1", + "@docusaurus/tsconfig": "^3.2.1", + "@docusaurus/types": "^3.2.1", + "typescript": "~5.2.2", + "wrangler": "^3.48.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "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", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "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", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", + "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", + "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", + "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", + "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", + "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", + "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", "dependencies": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", + "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", + "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/events": { @@ -164,190 +152,114 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", + "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", + "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", + "dependencies": { + "@algolia/logger-common": "4.23.2" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", + "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", "dependencies": { - "@algolia/logger-common": "4.14.2" + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", + "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", + "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", + "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", + "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", "dependencies": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/requester-common": "4.23.2" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ardatan/relay-compiler": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", - "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", - "dependencies": { - "@babel/core": "^7.14.0", - "@babel/generator": "^7.14.0", - "@babel/parser": "^7.14.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.4.0", - "chalk": "^4.0.0", - "fb-watchman": "^2.0.0", - "fbjs": "^3.0.0", - "glob": "^7.1.1", - "immutable": "~3.7.6", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "relay-runtime": "12.0.0", - "signedsource": "^1.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "relay-compiler": "bin/relay-compiler" - }, - "peerDependencies": { - "graphql": "*" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@ardatan/relay-compiler/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@ardatan/relay-compiler/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -362,31 +274,22 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", - "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dependencies": { - "@babel/types": "^7.23.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -416,13 +319,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -430,17 +333,25 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -452,6 +363,14 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", @@ -468,56 +387,18 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "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/@babel/helper-create-regexp-features-plugin/node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { - "regjsparser": "bin/parser" + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -572,11 +453,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -612,9 +493,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { "node": ">=6.9.0" } @@ -636,12 +517,12 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -685,9 +566,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } @@ -701,9 +582,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } @@ -722,35 +603,100 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", - "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.4", - "@babel/types": "^7.23.4" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "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", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -758,12 +704,13 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", + "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -772,29 +719,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -803,88 +733,35 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@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-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { @@ -956,26 +833,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -985,11 +848,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1021,11 +884,14 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1126,11 +992,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1155,11 +1021,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1169,12 +1035,12 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -1186,12 +1052,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { @@ -1202,11 +1068,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1216,11 +1082,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1230,12 +1096,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1245,12 +1111,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1261,17 +1127,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1283,12 +1148,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1298,11 +1163,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1312,12 +1177,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1327,11 +1192,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1341,11 +1206,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1356,12 +1221,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1371,11 +1236,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1385,27 +1250,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1415,13 +1266,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1431,11 +1282,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1446,11 +1297,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1460,11 +1311,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1475,11 +1326,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1489,12 +1340,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1504,12 +1355,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1520,13 +1371,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -1537,12 +1388,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1567,11 +1418,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1581,11 +1432,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1596,11 +1447,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1611,15 +1462,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1629,12 +1479,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1644,11 +1494,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1659,11 +1509,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1675,11 +1525,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1689,12 +1539,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1704,13 +1554,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1721,11 +1571,25 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1735,11 +1599,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1780,27 +1644,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1810,11 +1660,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1825,11 +1675,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1839,15 +1689,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz", - "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "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": { @@ -1857,12 +1707,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1872,11 +1730,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1887,11 +1745,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1901,11 +1759,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1915,11 +1773,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1929,14 +1787,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz", - "integrity": "sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", + "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1946,11 +1804,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1960,12 +1818,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1975,12 +1833,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1990,12 +1848,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2005,25 +1863,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", + "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "dependencies": { + "@babel/compat-data": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@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.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@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", @@ -2035,58 +1894,58 @@ "@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.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "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.31.0", "semver": "^6.3.1" }, @@ -2097,6 +1956,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -2111,16 +1978,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2130,29 +1997,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2167,9 +2020,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2177,33 +2030,45 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/runtime-corejs3": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2211,9 +2076,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2223,4172 +2088,3315 @@ "node": ">=6.9.0" } }, - "node_modules/@builder.io/partytown": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.5.4.tgz", - "integrity": "sha512-qnikpQgi30AS01aFlNQV6l8/qdZIcP76mp90ti+u4rucXHsn4afSKivQXApqxvrQG9+Ibv45STyvHizvxef/7A==", - "bin": { - "partytown": "bin/partytown.cjs" + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", + "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "bin": { + "mime": "cli.js" + }, "engines": { "node": ">=10.0.0" } }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240404.0.tgz", + "integrity": "sha512-rc/ov3I9GwgKRtUnkShNW3TIoZEPHzExrMRNlHq1VpXQRBSchHdMw8meMn54+oqgxW1AKLmPWj/c0A7EnYAsIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240404.0.tgz", + "integrity": "sha512-V9oPjeC2PYBCoAYnjbO2bsjT7PtzxfUHnh780FUi1r59Hwxd7FNlojwsIidA0nS/1WV5UKeJusIdrYlQbsketA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240404.0.tgz", + "integrity": "sha512-ndO7q6G2X8uYd5byGFzow4SWPqINQcmJ7pKKATNa+9vh/YMO0of2ihPntnm9uv577l8nRiAwRkHbnsWoEI33qQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240404.0.tgz", + "integrity": "sha512-hto5pjKYFqFu2Rvxnh84TzgDwalBRXQSwOVHltcgqo48en9TJDCN48ZtLj2G7QTGUOMW88h+nqdbj8+P7S/GXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240404.0.tgz", + "integrity": "sha512-DpCLvNkOeFinKGJwv9qbyT7RLZ1168dhPx85IHSqAYVWZIszNSmNOkEDqklvoJoab01AqETrrEhwBdmjCA7qfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" } }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" }, "peerDependencies": { - "react": ">=16.8.0" + "@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/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "node_modules/@docusaurus/core": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.2.1.tgz", + "integrity": "sha512-ZeMAqNvy0eBv2dThEeMuNzzuu+4thqMQakhxsgT5s02A8LqRcdkg+rbcnuNqUIpekQ4GRx3+M5nj0ODJhBXo9w==", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "@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.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "@svgr/webpack": "^6.5.1", + "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": "^4.2.2", + "cssnano": "^5.1.15", + "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@5.5.2", + "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": ">=16.8.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.2.1.tgz", + "integrity": "sha512-wTL9KuSSbMJjKrfu385HZEzAoamUsbKqwscAQByZw4k6Ja/RWpqgVvt/CbAC+aYEH6inLzOt+MjuRwMOrD3VBA==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=18.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@docusaurus/logger": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.2.1.tgz", + "integrity": "sha512-0voOKJCn9RaM3np6soqEfo7SsVvf2C+CDTWhW+H/1AyBhybASpExtDEz+7ECck9TwPzFQ5tt+I3zVugUJbJWDg==", "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" + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node_modules/@docusaurus/mdx-loader": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.2.1.tgz", + "integrity": "sha512-Fs8tXhXKZjNkdGaOy1xSLXSwfjCMT73J3Zfrju2U16uGedRFRjgK0ojpK5tiC7TnunsL3tOFgp1BSMBRflX9gw==", + "dependencies": { + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "@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/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.2.1.tgz", + "integrity": "sha512-FyViV5TqhL1vsM7eh29nJ5NtbRE6Ra6LP1PDcPvhwPSlA7eiWGRKAn3jWwMUcmjkos5SYY+sr0/feCdbM3eQHQ==", "dependencies": { - "type-fest": "^0.20.2" + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.2.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.2.1.tgz", + "integrity": "sha512-lOx0JfhlGZoZu6pEJfeEpSISZR5dQbJGGvb42IP13G5YThNHhG9R9uoWuo4IOimPqBC7sHThdLA3VLevk61Fsw==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "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": ">=8" + "node": ">=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.2.1.tgz", + "integrity": "sha512-GHe5b/lCskAR8QVbfWAfPAApvRZgqk7FN3sOHgjCtjzQACZxkHmq6QqyqZ8Jp45V7lVck4wt2Xw2IzBJ7Cz3bA==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "@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": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "node": ">=18.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/@eslint/eslintrc/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", - "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", - "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-skeleton-parser": "1.8.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", - "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", - "dependencies": { - "tslib": "^2.4.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@gatsbyjs/parcel-namer-relative-to-cwd": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@gatsbyjs/parcel-namer-relative-to-cwd/-/parcel-namer-relative-to-cwd-1.7.0.tgz", - "integrity": "sha512-KifWxXYcLrXFHvM9Ug77BlyoQ3TLOB3lh4izNHFVuST/NEr5fKpn/IZRqEXhNEYaESjE6C1gDA42Vvhi58pnRQ==", + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.2.1.tgz", + "integrity": "sha512-TOqVfMVTAHqWNEGM94Drz+PUpHDbwFy6ucHFgyTx9zJY7wPNSG5EN+rd/mU7OvAi26qpOn2o9xTdUmb28QLjEQ==", "dependencies": { - "@babel/runtime": "^7.18.0", - "@parcel/namer-default": "2.6.2", - "@parcel/plugin": "2.6.2", - "gatsby-core-utils": "^3.22.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=14.15.0", - "parcel": "2.x" - } - }, - "node_modules/@gatsbyjs/potrace": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@gatsbyjs/potrace/-/potrace-2.3.0.tgz", - "integrity": "sha512-72szhSY/4tPiPPOzq15CG6LW0s9FuWQ86gkLSUvBNoF0s+jsEdRaZmATYNjiY2Skg//EuyPLEqUQnXKXME0szg==", - "dependencies": { - "jimp-compact": "^0.16.1-2" - } - }, - "node_modules/@gatsbyjs/reach-router": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@gatsbyjs/reach-router/-/reach-router-1.3.9.tgz", - "integrity": "sha512-/354IaUSM54xb7K/TxpLBJB94iEAJ3P82JD38T8bLnIDWF+uw8+W/82DKnQ7y24FJcKxtVmG43aiDLG88KSuYQ==", - "dependencies": { - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4" + "node": ">=18.0" }, "peerDependencies": { - "react": "15.x || 16.x || 17.x || 18.x", - "react-dom": "15.x || 16.x || 17.x || 18.x" - } - }, - "node_modules/@gatsbyjs/webpack-hot-middleware": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/@gatsbyjs/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", - "integrity": "sha512-ul17OZ8Dlw+ATRbnuU+kwxuAlq9lKbYz/2uBS1FLCdgoPTF1H2heP7HbUbgfMZbfRQNcCG2rMscMnr32ritCDw==", - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.3.3", - "strip-ansi": "^6.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/add": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", - "integrity": "sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ==", + "node_modules/@docusaurus/plugin-debug": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.2.1.tgz", + "integrity": "sha512-AMKq8NuUKf2sRpN1m/sIbqbRbnmk+rSA+8mNU1LNxEl9BW9F/Gng8m9HKlzeyMPrf5XidzS1jqkuTLDJ6KIrFw==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.1", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/add/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/add/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/core": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", - "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.2.1.tgz", + "integrity": "sha512-/rJ+9u+Px0eTCiF4TNcNtj3kHf8cp6K1HCwOTdbsSlz6Xn21syZYcy+f1VM9wF6HrvUkXUcbM5TDCvg2IRL6bQ==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.1", - "@graphql-tools/schema": "^9.0.0", - "@graphql-tools/utils": "^9.1.1", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/core/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/core/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.2.1.tgz", + "integrity": "sha512-XtuJnlMvYfppeVdUyKiDIJAa/gTJKCQU92z8CLZZ9ibJdgVjFOLS10s0hIC0eL5z0U2u2loJz2rZ63HOkNHbBA==", "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/@graphql-codegen/plugin-helpers": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", - "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", - "dependencies": { - "@graphql-tools/utils": "^8.8.0", - "change-case-all": "1.0.14", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/plugin-helpers/node_modules/@graphql-tools/utils": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", - "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/schema-ast": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", - "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.2.1.tgz", + "integrity": "sha512-wiS/kE0Ny5pnjTxVCs8ljRnkL1RVMj59t6jmSsgEX7piDOoaXSMIUaoIt9ogS/v132uO0xEsxHstkRUZHQyPcQ==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-tools/utils": "^9.0.0", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/schema-ast/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.2.1.tgz", + "integrity": "sha512-uWZ7AxzdeaQSTCwD2yZtOiEm9zyKU+wqCmi/Sf25kQQqqFSBZUStXfaQ8OHP9cecnw893ZpZ811rPhB/wfujJw==", "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/schema-ast/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/typescript": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.8.tgz", - "integrity": "sha512-A0oUi3Oy6+DormOlrTC4orxT9OBZkIglhbJBcDmk34jAKKUgesukXRd4yOhmTrnbchpXz2T8IAOFB3FWIaK4Rw==", + "node_modules/@docusaurus/preset-classic": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.2.1.tgz", + "integrity": "sha512-E3OHSmttpEBcSMhfPBq3EJMBxZBM01W1rnaCUTXy9EHvkmB5AwgTfW1PwGAybPAX579ntE03R+2zmXdizWfKnQ==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/schema-ast": "^2.6.1", - "@graphql-codegen/visitor-plugin-common": "2.13.8", - "auto-bind": "~4.0.0", - "tslib": "~2.4.0" + "@docusaurus/core": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/plugin-debug": "3.2.1", + "@docusaurus/plugin-google-analytics": "3.2.1", + "@docusaurus/plugin-google-gtag": "3.2.1", + "@docusaurus/plugin-google-tag-manager": "3.2.1", + "@docusaurus/plugin-sitemap": "3.2.1", + "@docusaurus/theme-classic": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-search-algolia": "3.2.1", + "@docusaurus/types": "3.2.1" + }, + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/typescript-operations": { - "version": "2.5.13", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.13.tgz", - "integrity": "sha512-3vfR6Rx6iZU0JRt29GBkFlrSNTM6t+MSLF86ChvL4d/Jfo/JYAGuB3zNzPhirHYzJPCvLOAx2gy9ID1ltrpYiw==", + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/typescript": "^2.8.8", - "@graphql-codegen/visitor-plugin-common": "2.13.8", - "auto-bind": "~4.0.0", - "tslib": "~2.4.0" + "@types/react": "*", + "prop-types": "^15.6.2" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "*" } }, - "node_modules/@graphql-codegen/typescript-operations/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "node_modules/@docusaurus/theme-classic": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.2.1.tgz", + "integrity": "sha512-+vSbnQyoWjc6vRZi4vJO2dBU02wqzynsai15KK+FANZudrYaBHtkbLZAQhgmxzBGVpxzi87gRohlMm+5D8f4tA==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-translations": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "@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": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript-operations/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/typescript/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "node_modules/@docusaurus/theme-common": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.2.1.tgz", + "integrity": "sha512-d+adiD7L9xv6EvfaAwUqdKf4orsM3jqgeqAM+HAjgL/Ux0GkVVnfKr+tsoe+4ow4rHe6NUt+nkkW8/K8dKdilA==", + "dependencies": { + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@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": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/typescript/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "2.13.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz", - "integrity": "sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ==", - "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-tools/optimize": "^1.3.0", - "@graphql-tools/relay-operation-optimizer": "^6.5.0", - "@graphql-tools/utils": "^9.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.4.0" + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.2.1.tgz", + "integrity": "sha512-bzhCrpyXBXzeydNUH83II2akvFEGfhsNTPPWsk5N7e+odgQCQwoHhcF+2qILbQXjaoZ6B3c48hrvkyCpeyqGHw==", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-translations": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "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": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "node_modules/@docusaurus/theme-translations": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.2.1.tgz", + "integrity": "sha512-jAUMkIkFfY+OAhJhv6mV8zlwY6J4AQxJPTgLdR2l+Otof9+QdJjHNh/ifVEu9q0lp3oSPlJj9l05AaP7Ref+cg==", "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "engines": { + "node": ">=18.0" } }, - "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } + "node_modules/@docusaurus/tsconfig": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.2.1.tgz", + "integrity": "sha512-+biUwtsYW3oChLxYezzA+NIgS3Q9KDRl7add/YT54RXs9Q4rKInebxdHdG6JFs5BaTg45gyjDu0rvNVcGeHODg==", + "dev": true }, - "node_modules/@graphql-tools/code-file-loader": { - "version": "7.3.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", - "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", + "node_modules/@docusaurus/types": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.2.1.tgz", + "integrity": "sha512-n/toxBzL2oxTtRTOFiGKsHypzn/Pm+sXyw+VSk1UbqbXQiHOwHwts55bpKwbcUgA530Is6kix3ELiFOv9GAMfw==", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@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": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", - "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", + "node_modules/@docusaurus/utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.2.1.tgz", + "integrity": "sha512-DPkIS/EPc+pGAV798PUXgNzJFM3HJouoQXgr0KDZuJVz1EkWbDLOcQwLIz8Qx7liI9ddfkN/TXTRQdsTPZNakw==", "dependencies": { - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@svgr/webpack": "^6.5.1", + "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", + "webpack": "^5.88.1" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/load": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", - "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", - "dependencies": { - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "p-limit": "3.1.0", - "tslib": "^2.4.0" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/merge": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", - "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "@docusaurus/types": "*" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, - "node_modules/@graphql-tools/optimize": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", - "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", + "node_modules/@docusaurus/utils-common": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.2.1.tgz", + "integrity": "sha512-N5vadULnRLiqX2QfTjVEU3u5vo6RG2EZTdyXvJdzDOdrLCGIZAfnf/VkssinFZ922sVfaFfQ4FnStdhn5TWdVg==", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "6.5.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", - "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", - "dependencies": { - "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, - "node_modules/@graphql-tools/schema": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", - "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "node_modules/@docusaurus/utils-validation": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.2.1.tgz", + "integrity": "sha512-+x7IR9hNMXi62L1YAglwd0s95fR7+EtirjTxSN4kahYRWGqOi3jlQl1EV0az/yTEvKbxVvOPcdYicGu9dk4LJw==", "dependencies": { - "@graphql-tools/merge": "^8.4.1", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "engines": { + "node": ">=18.0" } }, - "node_modules/@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "node_modules/@internationalized/date": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz", - "integrity": "sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==", + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { - "@swc/helpers": "^0.5.0" + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@internationalized/date/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { - "tslib": "^2.4.0" + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "node_modules/@internationalized/message": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz", - "integrity": "sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==", - "dependencies": { - "@swc/helpers": "^0.5.0", - "intl-messageformat": "^10.1.0" - } + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, - "node_modules/@internationalized/message/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "dependencies": { - "tslib": "^2.4.0" - } + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "node_modules/@internationalized/number": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.0.tgz", - "integrity": "sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w==", - "dependencies": { - "@swc/helpers": "^0.5.0" + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@internationalized/number/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "dependencies": { - "tslib": "^2.4.0" - } + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, - "node_modules/@internationalized/string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.0.tgz", - "integrity": "sha512-Xx3Sy3f2c9ctT+vh8c7euEaEHQZltp0euZ3Hy4UfT3E13r6lxpUS3kgKyumEjboJZSnaZv7JhqWz3D75v+IxQg==", - "dependencies": { - "@swc/helpers": "^0.5.0" - } + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, - "node_modules/@internationalized/string/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "dependencies": { - "tslib": "^2.4.0" + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lezer/common": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.1.1.tgz", - "integrity": "sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==" - }, - "node_modules/@lezer/lr": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.14.tgz", - "integrity": "sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==", - "dependencies": { - "@lezer/common": "^1.0.0" + "peerDependencies": { + "esbuild": "*" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.3.tgz", - "integrity": "sha512-RXwGZ/0eCqtCY8FLTM/koR60w+MXyvBUpToXiIyjOcBnC81tAlTUHrRUavCEWPI9zc9VgvpK3+cbumPyR8BSuA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", "cpu": [ - "arm64" + "ppc64" ], "optional": true, "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.3.tgz", - "integrity": "sha512-337dNzh5yCdNCTk8kPfoU7jR3otibSlPDGW0vKZT97rKnQMb9tNdto3RtWoGPsQ8hKmlRZpojOJtmwjncq1MoA==", - "cpu": [ - "x64" + "aix" ], - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.3.tgz", - "integrity": "sha512-mU2HFJDGwECkoD9dHQEfeTG5mp8hNS2BCfwoiOpVPMeapjYpQz9Uw3FkUjRZ4dGHWKbin40oWHuL0bk2bCx+Sg==", + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", "cpu": [ "arm" ], "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.3.tgz", - "integrity": "sha512-VJw60Mdgb4n+L0fO1PqfB0C7TyEQolJAC8qpqvG3JoQwvyOv6LH7Ib/WE3wxEW9nuHmVz9jkK7lk5HfWWgoO1Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", "cpu": [ "arm64" ], "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.3.tgz", - "integrity": "sha512-qaReO5aV8griBDsBr8uBF/faO3ieGjY1RY4p8JvTL6Mu1ylLrTVvOONqKFlNaCwrmUjWw5jnf7VafxDAeQHTow==", + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", "cpu": [ "x64" ], "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.3.tgz", - "integrity": "sha512-cK+Elf3RjEzrm3SerAhrFWL5oQAsZSJ/LmjL1joIpTfEP1etJJ9CTRvdaV6XLYAxaEkfdhk/9hOvHLbR9yIhCA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", "cpu": [ - "x64" + "arm64" ], "optional": true, "os": [ - "win32" - ] - }, - "node_modules/@mdx-js/loader": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.6.22.tgz", - "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==", - "dependencies": { - "@mdx-js/mdx": "1.6.22", - "@mdx-js/react": "1.6.22", - "loader-utils": "2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "darwin" + ], "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node": ">=12" } }, - "node_modules/@mischnic/json-sourcemap": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", - "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", - "dependencies": { - "@lezer/common": "^1.0.0", - "@lezer/lr": "^1.0.0", - "json5": "^2.2.1" - }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", "cpu": [ "arm64" ], "optional": true, "os": [ - "darwin" - ] + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", "cpu": [ "x64" ], "optional": true, "os": [ - "darwin" - ] + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", "cpu": [ - "x64" + "ia32" ], "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", "cpu": [ - "x64" + "loong64" ], "optional": true, "os": [ - "win32" - ] - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@parcel/bundler-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.6.2.tgz", - "integrity": "sha512-XIa3had/MIaTGgRFkHApXwytYs77k4geaNcmlb6nzmAABcYjW1CLYh83Zt0AbzLFsDT9ZcRY3u2UjhNf6efSaw==", - "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/cache": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.6.2.tgz", - "integrity": "sha512-hhJ6AsEGybeQZd9c/GYqfcKTgZKQXu3Xih6TlnP3gdR3KZoJOnb40ovHD1yYg4COvfcXThKP1cVJ18J6rcv3IA==", - "dependencies": { - "@parcel/fs": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/utils": "2.6.2", - "lmdb": "2.5.2" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.6.2" + "node": ">=12" } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", "cpu": [ - "arm64" + "x64" ], "optional": true, "os": [ - "darwin" - ] + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", "cpu": [ "x64" ], "optional": true, "os": [ - "darwin" - ] + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", "cpu": [ - "arm" + "x64" ], "optional": true, "os": [ - "linux" - ] + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", "cpu": [ "arm64" ], "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", "cpu": [ - "x64" + "ia32" ], "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", "cpu": [ "x64" ], "optional": true, "os": [ "win32" - ] - }, - "node_modules/@parcel/cache/node_modules/lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2" - } - }, - "node_modules/@parcel/cache/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, - "node_modules/@parcel/codeframe": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.6.2.tgz", - "integrity": "sha512-oFlHr6HCaYYsB4SHkU+gn9DKtbzvv3/4NdwMX0/6NAKyYVI7inEsXyPGw2Bbd2ZCFatW9QJZUETF0etvh5AEfQ==", - "dependencies": { - "chalk": "^4.1.0" - }, + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/codeframe/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14" } }, - "node_modules/@parcel/codeframe/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@floating-ui/utils": "^0.2.1" } }, - "node_modules/@parcel/codeframe/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, - "node_modules/@parcel/codeframe/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@parcel/codeframe/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, - "node_modules/@parcel/codeframe/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" } }, - "node_modules/@parcel/compressor-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.6.2.tgz", - "integrity": "sha512-P3c8jjV5HVs+fNDjhvq7PtHXNm687nit1iwTS5VAt+ScXKhKBhoIJ56q+9opcw0jnXVjAAgZqcRZ50oAJBGdKw==", + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", "dependencies": { - "@parcel/plugin": "2.6.2" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "tslib": "^2.4.0" } }, - "node_modules/@parcel/core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.6.2.tgz", - "integrity": "sha512-JlKS3Ux0ngmdooSBbzQLShHJdsapF9E7TGMo1hFaHRquZip/DaqzvysYrgMJlDuCoLArciq5ei7ZKzGeK9zexA==", - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/events": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/graph": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/package-manager": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", + "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/icu-skeleton-parser": "1.8.0", + "tslib": "^2.4.0" } }, - "node_modules/@parcel/core/node_modules/dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "engines": { - "node": ">=6" + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", + "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "tslib": "^2.4.0" } }, - "node_modules/@parcel/core/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@parcel/diagnostic": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.6.2.tgz", - "integrity": "sha512-3ODSBkKVihENU763z1/1DhGAWFhYWRxOCOShC72KXp+GFnSgGiBsxclu8NBa/N948Rzp8lqQI8U1nLcKkh0O/w==", - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/events": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.6.2.tgz", - "integrity": "sha512-IaCjOeA5ercdFVi1EZOmUHhGfIysmCUgc2Th9hMugSFO0I3GzRsBcAdP6XPfWm+TV6sQ/qZRfdk/drUxoAupnw==", - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, - "node_modules/@parcel/fs": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.6.2.tgz", - "integrity": "sha512-mIhqdF3tjgeoIGqW7Nc/xfM2ClID7o8livwUe5lpQEP+ZaIBiMigXs6ckv3WToCACK+3uylrSD2A/HmlhrxMqQ==", + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dependencies": { - "@parcel/fs-search": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.6.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.6.2" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@parcel/fs-search": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.6.2.tgz", - "integrity": "sha512-4STid1zqtGnmGjHD/2TG2g/zPDiCTtE3IAS24QYH3eiUAz2uoKGgEqd2tZbZ2yI96jtCuIhC1bzVu8Hbykls7w==", + "node_modules/@internationalized/date": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", + "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@swc/helpers": "^0.5.0" } }, - "node_modules/@parcel/graph": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.6.2.tgz", - "integrity": "sha512-DPH4G/RBFJWayIN2fnhDXqhUw75n7k15YsGzdDKiXuwwz4wMOjoL4cyrI6zOf1SIyh3guRmeTYJ4jjPzwrLYww==", + "node_modules/@internationalized/message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", + "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", "dependencies": { - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@swc/helpers": "^0.5.0", + "intl-messageformat": "^10.1.0" } }, - "node_modules/@parcel/hash": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.6.2.tgz", - "integrity": "sha512-tFB+cJU1Wqag6WyJgsmx3nx+xhmjcNZqtWh/MtK1lHNnZdDRk6bjr7SapnygBwruz+SmSt5bbdVThcpk2dRCcA==", + "node_modules/@internationalized/number": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", + "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", "dependencies": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@swc/helpers": "^0.5.0" } }, - "node_modules/@parcel/logger": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.6.2.tgz", - "integrity": "sha512-Sz5YGCj1DbEiX0/G8Uw97LLZ0uEK+qtWcRAkHNpJpeMiSqDiRNevxXltz42EcLo+oCh4d4wyiVzwi9mNwzhS/Q==", + "node_modules/@internationalized/string": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", + "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/events": "2.6.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@swc/helpers": "^0.5.0" } }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.6.2.tgz", - "integrity": "sha512-N/h9J4eibhc+B+krzvPMzFUWL37GudBIZBa7XSLkcuH6MnYYfh6rrMvhIyyESwk6VkcZNVzAeZrGQqxEs0dHDQ==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "chalk": "^4.1.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@parcel/markdown-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "color-convert": "^2.0.1" + "@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": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@parcel/markdown-ansi/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.0.0" } }, - "node_modules/@parcel/markdown-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { - "node": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/@parcel/markdown-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@parcel/markdown-ansi/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@parcel/markdown-ansi/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@parcel/namer-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.6.2.tgz", - "integrity": "sha512-mp7bx/BQaIuohmZP0uE+gAmDBzzH0Yu8F4yCtE611lc6i0mou+nWRhzyKLNC/ieuI8DB3BFh2QQKeTxJn4W0qg==", - "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/@parcel/node-resolver-core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.6.2.tgz", - "integrity": "sha512-4b2L5QRYlTybvv3+TIRtwg4PPJXy+cRShCBa8eu1K0Fj297Afe8MOZrcVV+RIr2KPMIRXcIJoqDmOhyci/DynA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@parcel/node-resolver-core/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, - "node_modules/@parcel/optimizer-terser": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.6.2.tgz", - "integrity": "sha512-ZSEVQ3G3zOiVPeHvH+BrHegZybrQj9kWQAaAA92leSqbvf6UaX4xqXbGRg2OttNFtbGYBzIl28Zm4t2SLeUIuA==", + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "@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/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/@parcel/package-manager": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.6.2.tgz", - "integrity": "sha512-xGMqTgnwTE3rgzYwUZMKxR8fzmP5iSYz/gj2H8FR3pEmwh/8xCMtNjTSth+hPVGuqgRZ6JxwpfdY/fXdZ61ViQ==", + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" + "@types/mdx": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" }, "peerDependencies": { - "@parcel/core": "^2.6.2" - } - }, - "node_modules/@parcel/package-manager/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/@parcel/packager-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.6.2.tgz", - "integrity": "sha512-fm5rKWtaExR0W+UEKWivXNPysRFxuBCdskdxDByb1J1JeGMvp7dJElbi8oXDAQM4MnM5EyG7cg47SlMZNTLm4A==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/@parcel/packager-js/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/@parcel/packager-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.6.2.tgz", - "integrity": "sha512-Rl3ZkMtMjb+LEvRowijDD8fibUAS6rWK0/vZQMk9cDNYCP2gCpZayLk0HZIGxneeTbosf/0sbngHq4VeRQOnQA==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { - "@parcel/plugin": "2.6.2" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/@parcel/plugin": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.6.2.tgz", - "integrity": "sha512-wbbWsM23Pr+8xtLSvf+UopXdVYlpKCCx6PuuZaZcKo+9IcDCWoGXD4M8Kkz14qBmkFn5uM00mULUqmVdSibB2w==", - "dependencies": { - "@parcel/types": "2.6.2" - }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12.22.0" } }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.6.2.tgz", - "integrity": "sha512-5QtL3ETMFL161jehlIK6rjBM+Pqk5cMhr60s9yLYqE1GY4M4gMj+Act+FXViyM6gmMA38cPxDvUsxTKBYXpFCw==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2" + "graceful-fs": "4.2.10" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12.22.0" } }, - "node_modules/@parcel/resolver-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.6.2.tgz", - "integrity": "sha512-Lo5sWb5QkjWvdBr+TdmAF6Mszb/sMldBBatc1osQTkHXCy679VMH+lfyiWxHbwK+F1pmdMeBJpYcMxvrgT8EsA==", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dependencies": { - "@parcel/node-resolver-core": "2.6.2", - "@parcel/plugin": "2.6.2" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.6.2.tgz", - "integrity": "sha512-M4X0+7dyfdI6smwGUGjGXb8Ns3HX7ZrTemyq4Gc7zp7P/5gWjR8i9eISz46sXmF9bf01a/4dKZpoCC9un1pH1g==", + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" + }, + "node_modules/@react-aria/focus": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.2.tgz", + "integrity": "sha512-Rqo9ummmgotESfypzFjI3uh58yMpL+E+lJBbQuXkBM0u0cU2YYzu0uOrFrq3zcHk997udZvq1pGK/R+2xk9B7g==", "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2" + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/i18n": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.2.tgz", + "integrity": "sha512-Z1ormoIvMOI4mEdcFLYsoJy9w/EzBdBmgfLP+S/Ah+1xwQOXpgwZxiKOhYHpWa0lf6hkKJL34N9MHJvCJ5Crvw==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@internationalized/message": "^3.1.2", + "@internationalized/number": "^3.5.1", + "@internationalized/string": "^3.2.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/runtime-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.6.2.tgz", - "integrity": "sha512-0S3JFwgvs6FmEx2dHta9R0Sfu8vCnFAm4i7Y4efGHtAcTrF2CHjyiz4/hG+RQGJ70eoWW463Q+8qt6EKbkaOBQ==", + "node_modules/@react-aria/interactions": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", + "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/overlays": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.21.1.tgz", + "integrity": "sha512-djEBDF+TbIIOHWWNpdm19+z8xtY8U+T+wKVQg/UZ6oWnclSqSWeGl70vu73Cg4HVBJ4hKf1SRx4Z/RN6VvH4Yw==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/overlays": "^3.6.5", + "@react-types/button": "^3.9.2", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.6.2.tgz", - "integrity": "sha512-DJTm5D/tUAGZm0o3ndDOPbKwdYrobuvm4jvkPq31LdEUqVvyuzBAMlqQFHc1yJEJDRRWOIQwQP9Y0NQbJmXFfg==", + "node_modules/@react-aria/ssr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", + "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" + "@swc/helpers": "^0.5.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "node": ">= 12" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/runtime-react-refresh/node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/@react-aria/tooltip": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.2.tgz", + "integrity": "sha512-6jXOSGPao3gPgUQWLbH2r/jxGMqIaIKrJgfwu9TQrh+UkwwiTYW20EpEDCYY2nRFlcoi7EYAiPDSEbHCwXS7Lg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/tooltip": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@react-types/tooltip": "^3.4.7", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.6.2.tgz", - "integrity": "sha512-9jV+RwVEeDUI5+eLy8j1tapTNoHHGOY2+JUprcObQkQ8fux7KltQBJWFhpkUdGtz5LTCNXtj9tdycFtS5lmSzg==", + "node_modules/@react-aria/utils": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.2.tgz", + "integrity": "sha512-yznR9jJ0GG+YJvTMZxijQwVp+ahP66DY0apZf7X+dllyN+ByEDW+yaL1ewYPIpugxVzH5P8jhnBXsIyHKN411g==", "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" + "@react-aria/ssr": "^3.9.2", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/visually-hidden": { + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.10.tgz", + "integrity": "sha512-np8c4wxdbE7ZrMv/bnjwEfpX0/nkWy9sELEb0sK8n4+HJ+WycoXXrVxBUb9tXgL/GCx5ReeDQChjQWwajm/z3A==", + "dependencies": { + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", + "@swc/helpers": "^0.5.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "node_modules/@react-stately/overlays": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.5.tgz", + "integrity": "sha512-U4rCFj6TPJPXLUvYXAcvh+yP/CO2W+7f0IuqP7ZZGE+Osk9qFkT+zRK5/6ayhBDFpmueNfjIEAzT9gYPQwNHFw==", "dependencies": { - "detect-libc": "^1.0.3" + "@react-stately/utils": "^3.9.1", + "@react-types/overlays": "^3.8.5", + "@swc/helpers": "^0.5.0" }, - "engines": { - "node": "^12.18.3 || >=14" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/transformer-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.6.2.tgz", - "integrity": "sha512-uhXAMTjE/Q61amflV8qVpb73mj+mIdXIMH0cSks1/gDIAxcgIvWvrE14P4TvY6zJ1q1iRJRIRUN6cFSXqjjLSA==", + "node_modules/@react-stately/tooltip": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-ACtRgBQ8rphBtsUaaxvEAM0HHN9PvMuyvL0vUHd7jvBDCVZJ6it1BKu9SBKjekBkoBOw9nemtkplh9R2CA6V8Q==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" + "@react-stately/overlays": "^3.6.5", + "@react-types/tooltip": "^3.4.7", + "@swc/helpers": "^0.5.0" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.1.tgz", + "integrity": "sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==", + "dependencies": { + "@swc/helpers": "^0.5.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/button": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.2.tgz", + "integrity": "sha512-EnPTkGHZRtiwAoJy5q9lDjoG30bEzA/qnvKG29VVXKYAGeqY2IlFs1ypmU+z1X/CpJgPcG3I5cakM7yTVm3pSg==", + "dependencies": { + "@react-types/shared": "^3.22.1" }, "peerDependencies": { - "@parcel/core": "^2.6.2" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/transformer-js/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/@react-types/overlays": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.5.tgz", + "integrity": "sha512-4D7EEBQigD/m8hE68Ys8eloyyZFHHduqykSIgINJ0edmo0jygRbWlTwuhWFR9USgSP4dK54duN0Mvq0m4HEVEw==", + "dependencies": { + "@react-types/shared": "^3.22.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } }, - "node_modules/@parcel/transformer-js/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" + "node_modules/@react-types/shared": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.1.tgz", + "integrity": "sha512-PCpa+Vo6BKnRMuOEzy5zAZ3/H5tnQg1e80khMhK2xys0j6ZqzkgQC+fHMNZ7VDFNLqqNMj/o0eVeSBDh2POjkw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@parcel/transformer-json": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.6.2.tgz", - "integrity": "sha512-QGcIIvbPF/u10ihYvQhxXqb2QMXWSzcBxJrOSIXIl74TUGrWX05D5LmjDA/rzm/n/kvRnBkFNP60R/smYb8x+Q==", + "node_modules/@react-types/tooltip": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-rV4HZRQxLRNhe24yATOxnFQtGRUmsR7mqxMupXCmd1vrw8h+rdKlQv1zW2q8nALAKNmnRXZJHxYQ1SFzb98fgg==", "dependencies": { - "@parcel/plugin": "2.6.2", - "json5": "^2.2.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@parcel/transformer-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.6.2.tgz", - "integrity": "sha512-CsofYq5g9Zj/FNmhya2R7Xp3WHlzz34mEdN69bds3azRYHCrl/TS33xXcp/9J+74SEIY1Ufh552o1cM3fnSrDQ==", + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", "dependencies": { - "@parcel/plugin": "2.6.2" - }, + "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": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.6.2.tgz", - "integrity": "sha512-7EE68ebISz+oAHm64ZJbz6uJQT4aOoB8QiK3PvuY6+RsP7aK4/FEHGM1afW49KrZbP4lWjloEkcJm/88DfBiGw==", - "dependencies": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "react-refresh": "^0.9.0" - }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.6.2" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/types": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.6.2.tgz", - "integrity": "sha512-MV8BFpCIs2jMUvK2RHqzkoiuOQ//JIbrD1zocA2YRW3zuPL/iABvbAABJoXpoPCKikVWOoCWASgBfWQo26VvJQ==", - "dependencies": { - "@parcel/cache": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/package-manager": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.6.2", - "utility-types": "^3.10.0" + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.6.2.tgz", - "integrity": "sha512-Ug7hpRxjgbY5AopW55nY7MmGMVmwmN+ihfCmxJkBUoESTG/3iq8uME7GjyOgW5DkQc2K7q62i8y8N0wCJT1u4Q==", - "dependencies": { - "@parcel/codeframe": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/markdown-ansi": "2.6.2", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "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": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", "engines": { - "node": ">= 12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "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": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@parcel/utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", "dependencies": { - "color-name": "~1.1.4" + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@parcel/utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@parcel/utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@parcel/utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/types": "^7.20.0", + "entities": "^4.4.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@parcel/watcher": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", - "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", - "hasInstallScript": true, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.3.0", - "@parcel/watcher-darwin-arm64": "2.3.0", - "@parcel/watcher-darwin-x64": "2.3.0", - "@parcel/watcher-freebsd-x64": "2.3.0", - "@parcel/watcher-linux-arm-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-musl": "2.3.0", - "@parcel/watcher-linux-x64-glibc": "2.3.0", - "@parcel/watcher-linux-x64-musl": "2.3.0", - "@parcel/watcher-win32-arm64": "2.3.0", - "@parcel/watcher-win32-ia32": "2.3.0", - "@parcel/watcher-win32-x64": "2.3.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", - "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">= 10.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", - "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", - "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", - "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", - "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node_modules/@swc/helpers": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.8.tgz", + "integrity": "sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==", + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", - "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", - "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=14.16" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", - "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10.13.0" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", - "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", - "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", - "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", - "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, - "node_modules/@parcel/workers": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.6.2.tgz", - "integrity": "sha512-wBgUjJQm+lDd12fPRUmk09+ujTA9DgwPdqylSFK0OtI/yT6A+2kArUqjp8IwWo2tCJXoMzXBne2XQIWKqMiN4Q==", + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", "dependencies": { - "@parcel/diagnostic": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.6.2" + "@types/estree": "*" } }, - "node_modules/@percy/cli": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.27.4.tgz", - "integrity": "sha512-eIM44ejCMFc/S2W7X0htV+lvvmf63x5CaBpsSoQ9LRc/W02zHVAwQYdFFUowZEK6G1EwJEPIUnDxuuEx9PLG5A==", - "dev": true, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dependencies": { - "@percy/cli-app": "1.27.4", - "@percy/cli-build": "1.27.4", - "@percy/cli-command": "1.27.4", - "@percy/cli-config": "1.27.4", - "@percy/cli-exec": "1.27.4", - "@percy/cli-snapshot": "1.27.4", - "@percy/cli-upload": "1.27.4", - "@percy/client": "1.27.4", - "@percy/logger": "1.27.4" - }, - "bin": { - "percy": "bin/run.cjs" - }, - "engines": { - "node": ">=14" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@percy/cli-app": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.27.4.tgz", - "integrity": "sha512-av/s6K2QmQgq4SCQQ+3lmteNHeQtIpMeBjMfSgxs9zeBoPVOMx5hXrdsi6l7ChvOLXyYfzl/TbEuwrSDXiA8mw==", - "dev": true, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dependencies": { - "@percy/cli-command": "1.27.4", - "@percy/cli-exec": "1.27.4" - }, - "engines": { - "node": ">=14" + "@types/node": "*" } }, - "node_modules/@percy/cli-build": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.27.4.tgz", - "integrity": "sha512-tzCAcV0sAw608Gr/Q6NtPvVkA8dnIehMzvEXNIN3WP9DkprOgu7MYuexN0fZXf4vSroDWYXT87pHYP8YrrnDag==", - "dev": true, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { - "@percy/cli-command": "1.27.4" - }, - "engines": { - "node": ">=14" + "@types/node": "*" } }, - "node_modules/@percy/cli-command": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.27.4.tgz", - "integrity": "sha512-YDKeeOr1MvksDOnc2ZKQ/XuERGrWwzuT/vWZ9it8L+0SyPj28UbklDu0e9zBgPsSDfxJlIvsWXRuHNGHsweKXg==", - "dev": true, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dependencies": { - "@percy/config": "1.27.4", - "@percy/core": "1.27.4", - "@percy/logger": "1.27.4" - }, - "bin": { - "percy-cli-readme": "bin/readme.js" - }, - "engines": { - "node": ">=14" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/@percy/cli-config": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.27.4.tgz", - "integrity": "sha512-wFtQwPw4LEqpcZ6ac6WtejyGrvrrzzLdyvXNvsCPQLE47qXnXVXJ+E99k9KGcjavtUuPxrbWtX996Fz9Fb5hoQ==", - "dev": true, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { - "@percy/cli-command": "1.27.4" - }, - "engines": { - "node": ">=14" + "@types/ms": "*" } }, - "node_modules/@percy/cli-exec": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.27.4.tgz", - "integrity": "sha512-aSDLvzXXdwJso+p5iI4iTOa7AYzgFdRoqY9ij/R5aAL9juNkvG5QatB1bkUNbJabKFe16t7iigt4eJnlS0R13A==", - "dev": true, + "node_modules/@types/eslint": { + "version": "8.56.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", + "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", "dependencies": { - "@percy/cli-command": "1.27.4", - "cross-spawn": "^7.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@percy/cli-snapshot": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.27.4.tgz", - "integrity": "sha512-dDT2UpeP6X5NcMdj3AKLhHGmnobwzlXsHa52C+ne3kg3HSZgaXH9OsNY866Xe7onvcsZxvnRKDYHmWW6kC3cKQ==", - "dev": true, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { - "@percy/cli-command": "1.27.4", - "yaml": "^2.0.0" - }, - "engines": { - "node": ">=14" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@percy/cli-upload": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.27.4.tgz", - "integrity": "sha512-+4mcEOUydFubyMWVzQjPV79sL1Jar95SR7Yr7Vp4FBoE0iq0CbaHoJtyOWDfwvHYYp4rRjVMxpY0ha3jnmF0mA==", - "dev": true, - "dependencies": { - "@percy/cli-command": "1.27.4", - "fast-glob": "^3.2.11", - "image-size": "^1.0.0" - }, - "engines": { - "node": ">=14" - } + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, - "node_modules/@percy/client": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.27.4.tgz", - "integrity": "sha512-1F8ulTJhfk4/Lgj1Cn0blaRd8vTRJDxahAGseTbfrnZ2PHsftPZ65/5nCHPtpdD/2CE8N5COBQscGTMQQO+hBA==", - "dev": true, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dependencies": { - "@percy/env": "1.27.4", - "@percy/logger": "1.27.4" - }, - "engines": { - "node": ">=14" + "@types/estree": "*" } }, - "node_modules/@percy/config": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.27.4.tgz", - "integrity": "sha512-mlgiOdzdSfUSx9FskVIjmbT/iHbTif0Ow5evZQJTT1W0xgHOBWDCZyhINdsqulSBw+K1PNhHsu1J0h2ijxF4uA==", - "dev": true, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { - "@percy/logger": "1.27.4", - "ajv": "^8.6.2", - "cosmiconfig": "^8.0.0", - "yaml": "^2.0.0" - }, - "engines": { - "node": ">=14" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@percy/core": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.27.4.tgz", - "integrity": "sha512-WdsA4zlPgXl9xj+a5WW2wA20iU6VTDmRq5sgsYNSuPzZfQB2I5Cecgvb55p86dhlUTbPJrC76daQKzDTGe0hfA==", - "dev": true, - "hasInstallScript": true, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { - "@percy/client": "1.27.4", - "@percy/config": "1.27.4", - "@percy/dom": "1.27.4", - "@percy/logger": "1.27.4", - "@percy/webdriver-utils": "1.27.4", - "content-disposition": "^0.5.4", - "cross-spawn": "^7.0.3", - "extract-zip": "^2.0.1", - "fast-glob": "^3.2.11", - "micromatch": "^4.0.4", - "mime-types": "^2.1.34", - "path-to-regexp": "^6.2.0", - "rimraf": "^3.0.2", - "ws": "^8.0.0" - }, - "engines": { - "node": ">=14" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@percy/dom": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.27.4.tgz", - "integrity": "sha512-pwPDx3e9y7uRobVlEya8xu3BB3GeXbC74kQ6pPM/wFYDwi/Dg8DJywCsj5Nko/7QuhXP02rYgatkbREOIRxDnA==", - "dev": true + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" }, - "node_modules/@percy/env": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.27.4.tgz", - "integrity": "sha512-Xl2VUpljOrlCvAp/+KfmN9NUcTGpRdXPa1U9zSIyBnV/oAksp3/CK5EPpKZX/f8xUUkTp78UPaG99sEMA8VvXQ==", - "dev": true, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "@percy/logger": "1.27.4" - }, - "engines": { - "node": ">=14" + "@types/unist": "*" } }, - "node_modules/@percy/logger": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.27.4.tgz", - "integrity": "sha512-AwXqYaDkHaq1TPkP+ByB8rjvH9ddvkAH9tFd2kmq8AeFFXZ0amAPSbm6u090OUtdHWjRmKQK9JjSouBxEh0aRw==", - "dev": true, - "engines": { - "node": ">=14" - } + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, - "node_modules/@percy/sdk-utils": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.27.4.tgz", - "integrity": "sha512-vhPcdtmJlvTYJ5VOqiVzo02ujdtBFNw1/Bj+2ybiZgn7PkCDPFcITfXoWWPea319EIibGC4ZHjWHctRBgtW/tQ==", - "dev": true, - "engines": { - "node": ">=14" - } + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, - "node_modules/@percy/webdriver-utils": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/webdriver-utils/-/webdriver-utils-1.27.4.tgz", - "integrity": "sha512-pZOOYns8Fikh2qlbxO16DxFEnCrnFIoLpE7iz4M9jXxOfk16VZF1PWknMChSr5NqG2I9k2OMjizUE2j8zvtl2Q==", - "dev": true, - "dependencies": { - "@percy/config": "1.27.4", - "@percy/sdk-utils": "1.27.4" - }, - "engines": { - "node": ">=14" - } + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, - "node_modules/@philpl/buble": { - "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@philpl/buble/-/buble-0.19.7.tgz", - "integrity": "sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA==", + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dependencies": { - "acorn": "^6.1.1", - "acorn-class-fields": "^0.2.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", - "chalk": "^2.4.2", - "magic-string": "^0.25.2", - "minimist": "^1.2.0", - "os-homedir": "^1.0.1", - "regexpu-core": "^4.5.4" - }, - "bin": { - "buble": "bin/buble" + "@types/node": "*" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", - "dev": true + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, - "node_modules/@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", - "hasInstallScript": true, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", "dependencies": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } + "@types/unist": "*" } }, - "node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "devOptional": true, - "hasInstallScript": true + "node_modules/@types/mdx": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.12.tgz", + "integrity": "sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==" }, - "node_modules/@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, - "node_modules/@prisma/prisma-fmt-wasm": { - "version": "4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49", - "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49.tgz", - "integrity": "sha512-12dZRXW36s3hRHLeD8c4S3o1ZZcnFt1NxhBrSlYepnMxatfkj5S8aIDP/G+zzUqucB//kGZZWNX3eUcmxMsEqw==", - "dev": true + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, - "node_modules/@react-aria/focus": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.0.tgz", - "integrity": "sha512-GP6EYI07E8NKQQcXHjpIocEU0vh0oi0Vcsd+/71fKS0NnTR0TUOEeil0JuuQ9ymkmPDTu51Aaaa4FxVsuN/23A==", + "node_modules/@types/node": { + "version": "20.12.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz", + "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==", "dependencies": { - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "undici-types": "~5.26.4" } }, - "node_modules/@react-aria/focus/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dependencies": { - "tslib": "^2.4.0" + "@types/node": "*" } }, - "node_modules/@react-aria/focus/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, - "node_modules/@react-aria/i18n": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.0.tgz", - "integrity": "sha512-sviD5Y1pLPG49HHRmVjR+5nONrp0HK219+nu9Y7cDfUhXu2EjyhMS9t/n9/VZ69hHChZ2PnHYLEE2visu9CuCg==", - "dependencies": { - "@internationalized/date": "^3.5.1", - "@internationalized/message": "^3.1.1", - "@internationalized/number": "^3.5.0", - "@internationalized/string": "^3.2.0", - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" }, - "node_modules/@react-aria/i18n/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "dependencies": { - "tslib": "^2.4.0" - } + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, - "node_modules/@react-aria/interactions": { - "version": "3.20.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.1.tgz", - "integrity": "sha512-PLNBr87+SzRhe9PvvF9qvzYeP4ofTwfKSorwmO+hjr3qoczrSXf4LRQlb27wB6hF10C7ZE/XVbUI1lj4QQrZ/g==", + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.74", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz", + "integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==", "dependencies": { - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/@react-aria/interactions/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", "dependencies": { - "tslib": "^2.4.0" + "@types/history": "^4.7.11", + "@types/react": "*" } }, - "node_modules/@react-aria/overlays": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.20.0.tgz", - "integrity": "sha512-2m7MpRJL5UucbEuu08lMHsiFJoDowkJV4JAIFBZYK1NzVH0vF/A+w9HRNM7jRwx2DUxE+iIsZnl8yKV/7KY8OQ==", - "dependencies": { - "@react-aria/focus": "^3.16.0", - "@react-aria/i18n": "^3.10.0", - "@react-aria/interactions": "^3.20.1", - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-aria/visually-hidden": "^3.8.8", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" } }, - "node_modules/@react-aria/overlays/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dependencies": { - "tslib": "^2.4.0" + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" } }, - "node_modules/@react-aria/ssr": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz", - "integrity": "sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg==", + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@types/react": "*" } }, - "node_modules/@react-aria/ssr/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "dependencies": { - "tslib": "^2.4.0" + "@types/node": "*" } }, - "node_modules/@react-aria/tooltip": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.0.tgz", - "integrity": "sha512-+u9Sftkfe09IDyPEnbbreFKS50vh9X/WTa7n1u2y3PenI9VreLpUR6czyzda4BlvQ95e9jQz1cVxUjxTNaZmBw==", - "dependencies": { - "@react-aria/focus": "^3.16.0", - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-stately/tooltip": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@react-aria/tooltip/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dependencies": { - "tslib": "^2.4.0" + "@types/express": "*" } }, - "node_modules/@react-aria/utils": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.0.tgz", - "integrity": "sha512-fJA63/VU4iQNT8WUvrmll3kvToqMurD69CcgVmbQ56V7ZbvlzFi44E7BpnoaofScYLLtFWRjVdaHsohT6O/big==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { - "@react-aria/ssr": "^3.9.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/@react-aria/utils/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dependencies": { - "tslib": "^2.4.0" + "@types/node": "*" } }, - "node_modules/@react-aria/utils/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@react-aria/visually-hidden": { - "version": "3.8.8", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.8.tgz", - "integrity": "sha512-Cn2PYKD4ijGDtF0+dvsh8qa4y7KTNAlkTG6h20r8Q+6UTyRNmtE2/26QEaApRF8CBiNy9/BZC/ZC4FK2OjvCoA==", + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@types/node": "*" } }, - "node_modules/@react-aria/visually-hidden/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/xml2js": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", "dependencies": { - "tslib": "^2.4.0" + "@types/node": "*" } }, - "node_modules/@react-stately/overlays": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz", - "integrity": "sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA==", + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { - "@react-stately/utils": "^3.9.0", - "@react-types/overlays": "^3.8.4", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/@react-stately/overlays/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { - "tslib": "^2.4.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/@react-stately/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@react-stately/overlays": "^3.6.4", - "@react-types/tooltip": "^3.4.6", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/@react-stately/tooltip/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "tslib": "^2.4.0" + "@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/@react-stately/utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz", - "integrity": "sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@react-stately/utils/node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { - "tslib": "^2.4.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/@react-types/button": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz", - "integrity": "sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@react-types/shared": "^3.22.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@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/@react-types/overlays": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz", - "integrity": "sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@react-types/shared": "^3.22.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@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/@react-types/shared": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz", - "integrity": "sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "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/@react-types/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "@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/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "dependencies": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/@swc/helpers": { - "version": "0.4.36", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", - "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", - "dependencies": { - "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", - "tslib": "^2.4.0" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "engines": { - "node": ">=10.13.0" + "node": ">= 10.0.0" } }, - "node_modules/@turist/fetch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.2.0.tgz", - "integrity": "sha512-2x7EGw+6OJ29phunsbGvtxlNmSfcuPcyYudkMbi8gARCP9eJ1CtuMvnVUHL//O9Ixi9SJiug8wNt6lj86pN8XQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dependencies": { - "@types/node-fetch": "2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, - "peerDependencies": { - "node-fetch": "2" + "engines": { + "node": ">=8" } }, - "node_modules/@turist/time": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.2.tgz", - "integrity": "sha512-qLOvfmlG2vCVw5fo/oz8WAZYlpe5a5OurgTj3diIxJCdjRHpapC+vQCz3er9LV79Vcat+DifBjeAhOAdmndtDQ==" - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@types/common-tags": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", - "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==" - }, - "node_modules/@types/component-emitter": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.14.tgz", - "integrity": "sha512-lmPil1g82wwWg/qHSxMWkSKyJGQOK+ejXeMAAWyxNtVUD0/Ycj2maL63RAqpxVfdtvTfZkRnqzB0A9ft59y69g==" - }, - "node_modules/@types/configstore": { + "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha512-YY+hm3afkDHeSM2rsFXxeZtu0garnusBWNG1+7MknmDWQHqcH2w21/xOU9arJUi8ch4qyFklidANLCu3ihhVwQ==" - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" - }, - "node_modules/@types/glob": { - "version": "5.0.38", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.38.tgz", - "integrity": "sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "node_modules/algoliasearch": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", + "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-account": "4.23.2", + "@algolia/client-analytics": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-personalization": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/recommend": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, - "node_modules/@types/hast": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", - "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", + "node_modules/algoliasearch-helper": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.17.0.tgz", + "integrity": "sha512-R5422OiQjvjlK3VdpNQ/Qk7KsTIGeM5ACm8civGifOVWdRRV/3SgXuKmeNxe94Dz6fwj/IgpVmXbHutU4mHubg==", "dependencies": { - "@types/unist": "^2" + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "string-width": "^4.1.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "@types/node": "*" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@types/unist": "^2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "node_modules/@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" - }, - "node_modules/@types/reach__router": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.14.tgz", - "integrity": "sha512-2iOQZbwfw1ZYwYK+dRp7D1b8kU6GlFPJ/iEt33zDYxfId5CAKT7vX3lN/XmJ+FaMZ3FyB99tPgfajcmZnTqdtg==", - "dependencies": { - "@types/react": "*" - } + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, - "node_modules/@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/@types/react-dom": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", - "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/@types/react-instantsearch-core": { - "version": "6.26.8", - "resolved": "https://registry.npmjs.org/@types/react-instantsearch-core/-/react-instantsearch-core-6.26.8.tgz", - "integrity": "sha512-XjsnIaafuT3AnnpFhriv3vt9rGytIVv7+1bHEu185VRjbF0pN5znM4ggRCY8JmTDRPvGWe01qSV48oUW37apGQ==", - "dev": true, - "dependencies": { - "@types/react": "*", - "algoliasearch": ">=4", - "algoliasearch-helper": ">=3" + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" } }, - "node_modules/@types/react-instantsearch-dom": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/@types/react-instantsearch-dom/-/react-instantsearch-dom-6.12.4.tgz", - "integrity": "sha512-J5CeXqg5Iq7KWVeVnLBO8Yk52+joJRknipC2RHiTVzEM+c5xa58EqJH3Y9Whrjbz/USZd62XlL852lt0T8zxUA==", + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", "dev": true, "dependencies": { - "@types/react": "*", - "@types/react-instantsearch-core": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", - "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" + "printable-characters": "^1.0.42" } }, - "node_modules/@types/rimraf": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.5.tgz", - "integrity": "sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==", - "dependencies": { - "@types/glob": "*", - "@types/node": "*" + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" } }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "dependencies": { - "@types/node": "*" - } + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/@types/sharp": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.5.tgz", - "integrity": "sha512-EhO29617AIBqxoVtpd1qdBanWpspk/kD2B6qTFRJ31Q23Rdf+DNU1xlHSwtqvwq1vgOqBwq1i38SX+HGCymIQg==", - "dependencies": { - "@types/node": "*" + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/@types/styled-components": { - "version": "5.1.28", - "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.28.tgz", - "integrity": "sha512-nu0VKNybkjvUqJAXWtRqKd7j3iRUl8GbYSTvZNuIBJcw/HUp1Y4QUXNLlj7gcnRV/t784JnHAlvRnSnE3nPbJA==", - "dev": true, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "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" + } + ], "dependencies": { - "@types/hoist-non-react-statics": "*", - "@types/react": "*", - "csstype": "^3.0.2" + "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/@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" - }, - "node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "node_modules/axios": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@types/vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", - "deprecated": "This is a stub types definition. vfile-message provides its own type definitions, so you do not need this installed.", + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dependencies": { - "vfile-message": "*" + "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/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dependencies": { - "@types/node": "*" + "object.assign": "^4.1.0" } }, - "node_modules/@types/yoga-layout": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10", + "npm": ">=6" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dependencies": { - "yallist": "^4.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { - "eslint": "*" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "*" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "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": ">=10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/webpack-asset-relocator-loader": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", - "integrity": "sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g==", - "dependencies": { - "resolve": "^1.10.0" + "node": ">= 0.8" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "ms": "2.0.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "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/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "@xtuc/long": "4.2.2" + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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" + } + ], "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "node_modules/bundle-require": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz", + "integrity": "sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@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/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@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": ">= 0.6" + "node": ">=14.16" } }, - "node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "engines": { - "node": ">=0.4.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn-class-fields": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz", - "integrity": "sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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": ">=4.8.2" + "node": ">= 0.4" }, - "peerDependencies": { - "acorn": "^6.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", - "peerDependencies": { - "acorn": "^6.0.0" + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-filename-increment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-filename-increment/-/add-filename-increment-1.0.0.tgz", - "integrity": "sha512-pFV8VZX8jxuVMIycKvGZkWF/ihnUubu9lbQVnOnZWp7noVxbKQTNj7zG2y9fXdPcuZ6lAN3Drr517HaivGCjdQ==", - "dependencies": { - "strip-filename-increment": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz", - "integrity": "sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/anser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", - "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==" - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, @@ -6396,2279 +5404,1946 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/application-config-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", - "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001606", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", + "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, "dependencies": { - "dequal": "^2.0.3" + "debug": "^4.3.1", + "tslib": "^2.2.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/array-union": { + "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "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": ">= 0.4" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "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/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "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": ">= 0.4" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "engines": { - "node": ">=8" + "node": ">=6.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/async-cache": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", - "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", - "deprecated": "No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option.", - "dependencies": { - "lru-cache": "^4.0.0" - } - }, - "node_modules/async-cache/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" } }, - "node_modules/async-cache/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "engines": { - "node": ">= 4.0.0" + "node": ">=6" } }, - "node_modules/auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "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" - } - ], + "node_modules/cli-table3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", + "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "string-width": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "10.* || >= 12.*" }, - "peerDependencies": { - "postcss": "^8.1.0" + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "follow-redirects": "^1.14.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" - } + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", - "peer": true, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "eslint": ">= 4.12.1" + "node": ">=8" } }, - "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "peer": true, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/babel-jsx-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-jsx-utils/-/babel-jsx-utils-1.1.0.tgz", - "integrity": "sha512-Mh1j/rw4xM9T3YICkw22aBQ78FhsHdsmlb9NEk4uVAFBOg+Ez9ZgXXHugoBPCZui3XLomk/7/JBBH4daJqTkQQ==" - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "node": ">=6" } }, - "node_modules/babel-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "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" + "isobject": "^3.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/babel-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" } }, - "node_modules/babel-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/babel-plugin-add-module-exports": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", - "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==" - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "color-name": "~1.1.4" }, - "peerDependencies": { - "@babel/core": "^7.11.6" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, - "node_modules/babel-plugin-lodash": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", - "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0-beta.49", - "@babel/types": "^7.0.0-beta.49", - "glob": "^7.1.1", - "lodash": "^4.17.10", - "require-package-name": "^2.0.1" + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "engines": { + "node": ">=10" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">= 0.8" } }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "engines": { "node": ">= 6" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "mime-db": ">= 1.43.0 < 2" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/babel-plugin-remove-graphql-queries": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.25.0.tgz", - "integrity": "sha512-enyqRNRrn7vTG3nwg1V+XhoAJIyUv3ZukQCs5KbHOK+WNDDiGZQzIG+FCiZFACScdZBJWyx7TYRYbOFJZ/KEGg==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { - "@babel/runtime": "^7.15.4", - "@babel/types": "^7.15.4", - "gatsby-core-utils": "^3.25.0" + "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": ">=14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "gatsby": "^4.0.0-next" + "node": ">= 0.8.0" } }, - "node_modules/babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - }, - "peerDependencies": { - "styled-components": ">= 2" + "ms": "2.0.0" } }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/babel-preset-gatsby": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-2.25.0.tgz", - "integrity": "sha512-KFfSTDAkY87/Myq1KIUk9cVphWZem/08U7ps9Hiotbo6Mge/lL6ggh3xKP9SdR5Le4DLLyIUI7a4ILrAVacYDg==", + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.14.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/preset-env": "^7.15.4", - "@babel/preset-react": "^7.14.0", - "@babel/runtime": "^7.15.4", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^3.25.0", - "gatsby-legacy-polyfills": "^2.25.0" + "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": ">=14.15.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.11.6", - "core-js": "^3.0.0" - } - }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "engines": { - "node": ">= 0.6.0" + "node": ">=0.8" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "engines": { - "node": "^4.5.0 || >= 5.9" + "node": ">= 0.6" } }, - "node_modules/better-opn": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", - "dependencies": { - "open": "^7.0.3" - }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { - "node": ">8.0.0" + "node": ">= 0.6" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "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/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "browserslist": "^4.23.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "node_modules/core-js-pure": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", + "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "color-convert": "^2.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "type-fest": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { - "has-flag": "^4.0.0" + "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": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "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": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "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" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "node": ">= 14.15.0" }, - "bin": { - "browserslist": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "@swc/css": { + "optional": true }, - { - "type": "consulting", - "url": "https://feross.org/support" + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { - "streamsearch": "^1.1.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=10.16.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-manager": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", - "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", - "dependencies": { - "async": "1.5.2", - "lodash.clonedeep": "4.5.0", - "lru-cache": "4.0.0" - } - }, - "node_modules/cache-manager/node_modules/lru-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "integrity": "sha512-WKhDkjlLwzE8jAQdQlsxLUQTPXLCKX/4cJk6s5AlRtJkDBk0IKH5O51bVDH61K9N4bhbbyvLM6EiOuE8ovApPA==", + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/cache-manager/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=10.6.0" + "node": ">=8.0.0" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >=14.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "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": ">=8" + "node": "^10 || ^12 || >=14.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "engines": { - "node": ">=6" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true }, - "node_modules/caniuse-lite": { - "version": "1.0.30001565", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", - "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", - "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" - } - ] + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/change-case-all": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", - "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" } }, - "node_modules/character-reference-invalid": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "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" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "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" + "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/fb55" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "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" + "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": ">= 8.10.0" + "node": ">=10" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=6.0" + "node": ">=0.4.0" } }, - "node_modules/ci-info": { + "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cli-truncate": { + "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" + "address": "^1.0.1", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, "engines": { - "node": ">= 10" + "node": ">= 4.2.1" } }, - "node_modules/clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "node_modules/clipboardy/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "dequal": "^2.0.0" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "engines": { - "node": ">=4.8" + "node": ">=0.3.1" } }, - "node_modules/clipboardy/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dependencies": { - "pump": "^3.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { "node": ">=6" } }, - "node_modules/clipboardy/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clipboardy/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/docusaurus-plugin-sass": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.5.tgz", + "integrity": "sha512-Z+D0fLFUKcFpM+bqSUmqKIU+vO+YF1xoEQh5hoFreg2eMf722+siwXDD+sqtwU8E4MvVpuvsQfaHwODNlxJAEg==", "dependencies": { - "path-key": "^2.0.0" + "sass-loader": "^10.1.1" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", + "sass": "^1.30.0" } }, - "node_modules/clipboardy/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" } }, - "node_modules/clipboardy/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "node_modules/clipboardy/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "shebang-regex": "^1.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/clipboardy/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/clipboardy/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { - "isexe": "^2.0.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dependencies": { - "color-convert": "^2.0.1" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.729", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", + "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "engines": { - "node": ">=0.8" + "node": ">= 4" } }, - "node_modules/clone-deep": { + "node_modules/emoticon": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", + "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dependencies": { - "isobject": "^3.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">= 4.0" + "node": ">= 0.4" } }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12.5.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "color-name": "~1.1.4" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.0.0" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">= 12" + "node": ">=4.0" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": ">=4.0.0" + "node": ">=4.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "@types/estree": "^1.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "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" + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/compression/node_modules/ms": { + "node_modules/estree-util-to-js": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@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/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "node_modules/estree-util-value-to-estree": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", + "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/remcohaszing" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "@types/estree": "^1.0.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", "engines": { - "node": ">=8" + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "dependencies": { - "browserslist": "^4.22.1" + "@types/node": "*", + "require-like": ">= 0.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.3.tgz", - "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": ">= 0.8" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">= 0.10" + "node": ">=0.8.x" } }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "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": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/create-gatsby": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-2.25.0.tgz", - "integrity": "sha512-96Kl/6Far2j65/vFv/6Mb9+T+/4oW8hlC3UmdfjgBgUIzTPFmezY1ygPu2dfCKjprWkArB8DpE7EsAaJoRKB1Q==", - "dependencies": { - "@babel/runtime": "^7.15.4" + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" }, - "bin": { - "create-gatsby": "cli.js" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "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": ">= 8" + "node": ">= 0.10.0" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" }, - "peerDependencies": { - "postcss": "^8.0.9" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" + "@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": ">= 10.13.0" + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { - "yallist": "^4.0.0" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=10" + "node": ">=0.8.0" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "xml-js": "^1.6.11" }, "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-2.0.0.tgz", - "integrity": "sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==", + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dependencies": { - "cssnano": "^5.0.0", - "jest-worker": "^26.3.0", - "p-limit": "^3.0.2", - "postcss": "^8.2.9", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" @@ -8678,412 +7353,412 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "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": { - "url": "https://github.com/sponsors/fb55" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-selector-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", - "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=8" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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": ">=4" + "node": ">= 0.8" } }, - "node_modules/cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=14.16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "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" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" } }, - "node_modules/cssnano/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dependencies": { - "css-tree": "^1.1.2" + "@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": ">=8.0.0" + "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/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dependencies": { - "@babel/runtime": "^7.21.0" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" }, "engines": { - "node": ">=0.11" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "url": "https://opencollective.com/webpack" } }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "engines": { - "node": ">=0.10.0" + "node": ">= 14.17" } }, - "node_modules/decode-uri-component": { + "node_modules/format": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { - "node": ">=0.10" + "node": ">=0.4.x" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "engines": { - "node": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { - "node": ">=4.0.0" + "node": ">= 0.6" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.14" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">=8" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "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" @@ -9092,1237 +7767,1057 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-port-please": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/get-source/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">= 0.6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": ">=6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 6" } }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dependencies": { - "repeat-string": "^1.5.4" + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "engines": { - "node": ">=0.10" + "node": ">=10" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dependencies": { - "address": "^1.0.1", - "debug": "4" + "global-prefix": "^3.0.0" }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "engines": { + "node": ">=6" } }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "engines": { - "node": ">= 4.2.1" + "node": ">=6" } }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "ms": "2.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } }, - "node_modules/devcert": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", - "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", - "dependencies": { - "@types/configstore": "^2.1.1", - "@types/debug": "^0.0.30", - "@types/get-port": "^3.2.0", - "@types/glob": "^5.0.34", - "@types/lodash": "^4.14.92", - "@types/mkdirp": "^0.5.2", - "@types/node": "^8.5.7", - "@types/rimraf": "^2.0.2", - "@types/tmp": "^0.0.33", - "application-config-path": "^0.1.0", - "command-exists": "^1.2.4", - "debug": "^3.1.0", - "eol": "^0.9.1", - "get-port": "^3.2.0", - "glob": "^7.1.2", - "is-valid-domain": "^0.1.6", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "password-prompt": "^1.0.4", - "rimraf": "^2.6.2", - "sudo-prompt": "^8.2.0", - "tmp": "^0.0.33", - "tslib": "^1.10.0" - } - }, - "node_modules/devcert/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - }, - "node_modules/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/devcert/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { - "glob": "^7.1.3" + "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" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/devcert/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "os-tmpdir": "~1.0.2" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=0.6.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/devcert/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "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": ">=0.3.1" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "dependencies": { - "esutils": "^2.0.2" + "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.0" + "node": ">=6.0" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "utila": "~0.4" + "sprintf-js": "~1.0.2" } }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "domelementtype": "^2.3.0" + "es-define-property": "^1.0.0" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { - "node": ">= 4" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "is-obj": "^2.0.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "engines": { - "node": ">=10" + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "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/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.594", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.594.tgz", - "integrity": "sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", - "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "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" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/engine.io-client": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.1.4.tgz", - "integrity": "sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg==", + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", "dependencies": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@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" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/engine.io-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", - "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", "dependencies": { - "base64-arraybuffer": "0.1.4" + "@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" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/engine.io/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "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/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" } }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "@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" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "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": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" + "he": "bin/he" } }, - "node_modules/eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "dependencies": { - "is-arrayish": "^0.2.1" + "@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/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dependencies": { - "stackframe": "^1.3.4" + "react-is": "^16.7.0" } }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/es-array-method-boxes-properly": { + "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "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/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, - "node_modules/es-set-tostringtag": { + "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "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": ">= 0.4" + "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "@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/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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": ">=6" + "node": ">=12" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "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.0" + "node": ">= 0.8" } }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" } }, - "node_modules/eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { - "confusing-browser-globals": "^1.0.10" + "@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": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0", - "@typescript-eslint/parser": "^4.0.0", - "babel-eslint": "^10.0.0", - "eslint": "^7.5.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jest": "^24.0.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.3", - "eslint-plugin-react-hooks": "^4.0.8", - "eslint-plugin-testing-library": "^3.9.0" + "@types/express": "^4.17.13" }, "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - }, - "eslint-plugin-testing-library": { + "@types/express": { "optional": true } } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "engines": { - "node": ">=4" + "node": ">=10" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-flowtype": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", - "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dependencies": { - "lodash": "^4.17.15", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node": ">=10.19.0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { + "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { - "node": ">=0.10.0" + "node": ">=10.17.0" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "engines": { - "node": ">=10" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "postcss": "^8.1.0" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "node": ">= 4" } }, - "node_modules/eslint-plugin-react/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "queue": "6.0.2" }, "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=16.x" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/eslint-webpack-plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", - "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", - "dependencies": { - "@types/eslint": "^7.29.0", - "arrify": "^2.0.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=0.8.19" } }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { + "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "engines": { "node": ">=8" } }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { - "node": ">= 10.13.0" + "node": ">=12" } }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/intl-messageformat": { + "version": "10.5.11", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", + "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", "dependencies": { - "@babel/highlight": "^7.10.4" + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.6", + "tslib": "^2.4.0" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "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" + "loose-envify": "^1.0.0" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 10" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "color-name": "~1.1.4" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" + "hasown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" }, "engines": { "node": ">=8" @@ -10331,27926 +8826,4377 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "yallist": "^4.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.12.0" } }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "@types/estree": "*" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" + "is-docker": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "engines": { + "node": ">=12" } }, - "node_modules/event-source-polyfill": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz", - "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==" + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { - "node": ">=0.8.x" + "node": ">=0.10.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "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/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" + "@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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/express-graphql": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", - "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", - "deprecated": "This package is no longer maintained. We recommend using `graphql-http` instead. Please consult the migration document https://github.com/graphql/graphql-http#migrating-express-grpahql.", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "accepts": "^1.3.7", - "content-type": "^1.0.4", - "http-errors": "1.8.0", - "raw-body": "^2.4.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 10.x" + "node": ">=10" }, - "peerDependencies": { - "graphql": "^14.7.0 || ^15.3.0" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/express-graphql/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/express-graphql/node_modules/http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "node_modules/joi": { + "version": "17.12.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", + "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express-graphql/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" + "@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/express-graphql/node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/express-http-proxy": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", - "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "debug": "^3.0.1", - "es6-promise": "^4.1.1", - "raw-body": "^2.3.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/express-http-proxy/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "type": "^2.7.2" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dependencies": { - "is-extendable": "^0.1.0" - }, + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "engines": { - "node": ">=0.6.0" + "node": ">= 8" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "package-json": "^8.1.0" }, "engines": { - "node": ">= 10.17.0" + "node": ">=14.16" }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "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" - }, + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "engines": { - "node": ">=8.6.0" + "node": ">=6" } }, - "node_modules/fast-json-stable-stringify": { + "node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "engines": { - "node": ">= 4.9.1" + "node": ">=10" } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" } }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "node_modules/fd": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", - "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { - "pend": "~1.2.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dependencies": { - "escape-string-regexp": "^1.0.5" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" + "node_modules/lost-pixel": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/lost-pixel/-/lost-pixel-3.16.0.tgz", + "integrity": "sha512-YLNHXglZTQUaztQyAjZN0KMM2y+czzsHQ7BKhNojJkF77JGian4KyFiTCKNU1sxHQT0loZUlH7edo+JueQj3HA==", + "dependencies": { + "@types/xml2js": "^0.4.14", + "async": "3.2.5", + "axios": "1.6.5", + "bundle-require": "4.0.2", + "esbuild": "0.19.11", + "execa": "5.1.1", + "form-data": "4.0.0", + "fs-extra": "11.2.0", + "get-port-please": "3.1.2", + "lodash.get": "4.4.2", + "lodash.kebabcase": "4.1.1", + "odiff-bin": "2.6.1", + "pixelmatch": "5.3.0", + "playwright-core": "1.40.1", + "pngjs": "7.0.0", + "posthog-node": "3.5.0", + "serve-handler": "6.1.5", + "shelljs": "0.8.5", + "ts-node": "10.9.2", + "uuid": "9.0.1", + "xml2js": "^0.6.2", + "yargs": "17.7.2", + "zod": "3.22.4" + }, + "bin": { + "lost-pixel": "dist/bin.js" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" + "peerDependencies": { + "playwright-core": ">=1.37.0" } }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "engines": { - "node": ">=4" + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "sourcemap-codec": "^1.4.8" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "engines": { - "node": ">=0.10.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "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/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", "dependencies": { - "ms": "2.0.0" + "@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/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "@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", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "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/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@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", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "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/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@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" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { - "is-callable": "^1.1.3" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "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 + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "vue-template-compiler": { - "optional": true + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } + ] }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", "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" + "@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": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "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/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@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": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "dependencies": { - "color-name": "~1.1.4" + "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" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", "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" + "@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" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "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" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dependencies": { - "yallist": "^4.0.0" + "@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" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@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" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dependencies": { - "has-flag": "^4.0.0" + "@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" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/form-data": { + "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" + "@types/mdast": "^4.0.0" }, "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "fs-monkey": "^1.0.4" }, "engines": { - "node": ">=12" + "node": ">= 4.0.0" } }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 8" } }, - "node_modules/function-bind": { + "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@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.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gatsby": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.22.1.tgz", - "integrity": "sha512-5alRl+7RlK9kVTX4wwECx8XD181Ti5HTgCK5IL0uFBJlqeA6UDLOY+S9noOQgvoFgzwApPOGoiV5sKlSTxPnfw==", - "hasInstallScript": true, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/code-frame": "^7.14.0", - "@babel/core": "^7.15.5", - "@babel/eslint-parser": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/parser": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "@builder.io/partytown": "^0.5.2", - "@gatsbyjs/reach-router": "^1.3.9", - "@gatsbyjs/webpack-hot-middleware": "^2.25.2", - "@graphql-codegen/add": "^3.1.1", - "@graphql-codegen/core": "^2.5.1", - "@graphql-codegen/plugin-helpers": "^2.4.2", - "@graphql-codegen/typescript": "^2.4.8", - "@graphql-codegen/typescript-operations": "^2.3.5", - "@graphql-tools/code-file-loader": "^7.2.14", - "@graphql-tools/load": "^7.5.10", - "@jridgewell/trace-mapping": "^0.3.13", - "@nodelib/fs.walk": "^1.2.8", - "@parcel/cache": "2.6.2", - "@parcel/core": "2.6.2", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", - "@types/http-proxy": "^1.17.7", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.0", - "address": "1.1.2", - "anser": "^2.1.0", - "autoprefixer": "^10.4.0", - "axios": "^0.21.1", - "babel-loader": "^8.2.3", - "babel-plugin-add-module-exports": "^1.0.4", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-lodash": "^3.3.4", - "babel-plugin-remove-graphql-queries": "^4.22.0", - "babel-preset-gatsby": "^2.22.1", - "better-opn": "^2.1.1", - "bluebird": "^3.7.2", - "browserslist": "^4.17.5", - "cache-manager": "^2.11.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "common-tags": "^1.8.0", - "compression": "^1.7.4", - "cookie": "^0.4.1", - "core-js": "^3.22.3", - "cors": "^2.8.5", - "css-loader": "^5.2.7", - "css-minimizer-webpack-plugin": "^2.0.0", - "css.escape": "^1.5.1", - "date-fns": "^2.25.0", - "debug": "^3.2.7", - "deepmerge": "^4.2.2", - "detect-port": "^1.3.0", - "devcert": "^1.2.0", - "dotenv": "^8.6.0", - "enhanced-resolve": "^5.8.3", - "error-stack-parser": "^2.1.4", - "eslint": "^7.32.0", - "eslint-config-react-app": "^6.0.0", - "eslint-plugin-flowtype": "^5.10.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.5.0", - "eslint-webpack-plugin": "^2.7.0", - "event-source-polyfill": "1.0.25", - "execa": "^5.1.1", - "express": "^4.17.1", - "express-graphql": "^0.12.0", - "express-http-proxy": "^1.6.3", - "fastest-levenshtein": "^1.0.12", - "fastq": "^1.13.0", - "file-loader": "^6.2.0", - "find-cache-dir": "^3.3.2", - "fs-exists-cached": "1.0.0", - "fs-extra": "^10.1.0", - "gatsby-cli": "^4.22.1", - "gatsby-core-utils": "^3.22.0", - "gatsby-graphiql-explorer": "^2.22.0", - "gatsby-legacy-polyfills": "^2.22.0", - "gatsby-link": "^4.22.0", - "gatsby-page-utils": "^2.22.0", - "gatsby-parcel-config": "0.13.0", - "gatsby-plugin-page-creator": "^4.22.0", - "gatsby-plugin-typescript": "^4.22.0", - "gatsby-plugin-utils": "^3.16.0", - "gatsby-react-router-scroll": "^5.22.0", - "gatsby-script": "^1.7.0", - "gatsby-telemetry": "^3.22.0", - "gatsby-worker": "^1.22.0", - "glob": "^7.2.3", - "globby": "^11.1.0", - "got": "^11.8.5", - "graphql": "^15.7.2", - "graphql-compose": "^9.0.7", - "graphql-playground-middleware-express": "^1.7.22", - "hasha": "^5.2.2", - "invariant": "^2.2.4", - "is-relative": "^1.0.0", - "is-relative-url": "^3.0.0", - "joi": "^17.4.2", - "json-loader": "^0.5.7", - "latest-version": "5.1.0", - "lmdb": "2.5.3", - "lodash": "^4.17.21", - "md5-file": "^5.0.0", - "meant": "^1.0.3", - "memoizee": "^0.4.15", - "micromatch": "^4.0.4", - "mime": "^2.5.2", - "mini-css-extract-plugin": "1.6.2", - "mitt": "^1.2.0", - "moment": "^2.29.1", - "multer": "^1.4.5-lts.1", - "node-fetch": "^2.6.6", - "node-html-parser": "^5.3.3", - "normalize-path": "^3.0.0", - "null-loader": "^4.0.1", - "opentracing": "^0.14.5", - "p-defer": "^3.0.0", - "parseurl": "^1.3.3", - "physical-cpu-count": "^2.0.0", - "platform": "^1.3.6", - "postcss": "^8.3.11", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^5.3.0", - "prompts": "^2.4.2", - "prop-types": "^15.7.2", - "query-string": "^6.14.1", - "raw-loader": "^4.0.2", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.9.0", - "redux": "4.1.2", - "redux-thunk": "^2.4.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.7", - "shallow-compare": "^1.2.2", - "signal-exit": "^3.0.5", - "slugify": "^1.6.1", - "socket.io": "3.1.2", - "socket.io-client": "3.1.3", - "st": "^2.0.0", - "stack-trace": "^0.0.10", - "string-similarity": "^1.2.2", - "strip-ansi": "^6.0.1", - "style-loader": "^2.0.0", - "terser-webpack-plugin": "^5.2.4", - "tmp": "^0.2.1", - "true-case-path": "^2.2.1", - "type-of": "^2.0.1", - "url-loader": "^4.1.1", - "uuid": "^8.3.2", - "webpack": "^5.61.0", - "webpack-dev-middleware": "^4.3.0", - "webpack-merge": "^5.8.0", - "webpack-stats-plugin": "^1.0.3", - "webpack-virtual-modules": "^0.3.2", - "xstate": "4.32.1", - "yaml-loader": "^0.6.0" - }, - "bin": { - "gatsby": "cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "optionalDependencies": { - "gatsby-sharp": "^0.16.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-cli": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-4.25.0.tgz", - "integrity": "sha512-CJ2PCsfFmn9Xqc/jg9MFMU1BG5oQGiej1TFFx8GhChJ+kGhi9ANnNM+qo1K4vOmoMnsT4SSGiPAFD10AWFqpAQ==", - "hasInstallScript": true, - "dependencies": { - "@babel/code-frame": "^7.14.0", - "@babel/core": "^7.15.5", - "@babel/generator": "^7.16.8", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "@babel/runtime": "^7.15.4", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.8", - "@jridgewell/trace-mapping": "^0.3.13", - "@types/common-tags": "^1.8.1", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", - "chalk": "^4.1.2", - "clipboardy": "^2.3.0", - "common-tags": "^1.8.2", - "convert-hrtime": "^3.0.0", - "create-gatsby": "^2.25.0", - "envinfo": "^7.8.1", - "execa": "^5.1.1", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-telemetry": "^3.25.0", - "hosted-git-info": "^3.0.8", - "is-valid-path": "^0.1.1", - "joi": "^17.4.2", - "lodash": "^4.17.21", - "node-fetch": "^2.6.6", - "opentracing": "^0.14.5", - "pretty-error": "^2.1.2", - "progress": "^2.0.3", - "prompts": "^2.4.2", - "redux": "4.1.2", - "resolve-cwd": "^3.0.0", - "semver": "^7.3.7", - "signal-exit": "^3.0.6", - "stack-trace": "^0.0.10", - "strip-ansi": "^6.0.1", - "update-notifier": "^5.1.0", - "yargs": "^15.4.1", - "yoga-layout-prebuilt": "^1.10.0", - "yurnalist": "^2.1.0" - }, - "bin": { - "gatsby": "cli.js" - }, - "engines": { - "node": ">=14.15.0" - } + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "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": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/gatsby-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/gatsby-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-cli/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-core-utils": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.25.0.tgz", - "integrity": "sha512-lmMDwbnKpqAi+8WWd7MvCTCx3E0u7j8sbVgydERNCYVxKVpzD/aLCH4WPb4EE9m1H1rSm76w0Z+MaentyB/c/Q==", + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dependencies": { - "@babel/runtime": "^7.15.4", - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fastq": "^1.13.0", - "file-type": "^16.5.3", - "fs-extra": "^10.1.0", - "got": "^11.8.5", - "import-from": "^4.0.0", - "lmdb": "2.5.3", - "lock": "^1.1.0", - "node-object-hash": "^2.3.10", - "proper-lockfile": "^4.1.2", - "resolve-from": "^5.0.0", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" + "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" }, - "engines": { - "node": ">=14.15.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-graphiql-explorer": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-2.25.0.tgz", - "integrity": "sha512-/NDsaW4x3/KtvzmxYvedhDwUW1kb7gQO6iOhCkillVJSYBd6mPB8aOSulM49fyCT76UXGYFtRaUI8fyOkmpWhg==", + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", "dependencies": { - "@babel/runtime": "^7.15.4" + "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" }, - "engines": { - "node": ">=14.15.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-legacy-polyfills": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-2.25.0.tgz", - "integrity": "sha512-cMeFwMH1FGENo2gNpyTyMYc/CJ7uBGE26n89OGrVVvBMaQegK+CMNZBOh09sLrXUcOp8hSOX2IwzvOlo6CdWpg==", + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "core-js-compat": "3.9.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-legacy-polyfills/node_modules/core-js-compat": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", - "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", "dependencies": { - "browserslist": "^4.16.3", - "semver": "7.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-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/core-js" - } - }, - "node_modules/gatsby-legacy-polyfills/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-link": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-4.25.0.tgz", - "integrity": "sha512-Fpwk45sUMPvFUAZehNE8SLb3vQyVSxt9YxU++ZZECyukK4A/3Wxk3eIzoNvwfpMfWu6pnAkqcBhIO6KAfvbPGQ==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/reach__router": "^1.3.10", - "gatsby-page-utils": "^2.25.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "@gatsbyjs/reach-router": "^1.3.5", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-link/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/gatsby-link/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/gatsby-page-utils": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-2.25.0.tgz", - "integrity": "sha512-TlwS149JCeb3xGANeV8HdcQi9Q8J9hYwlO9jdxLGVIXVGbWIMWFrDuwx382jOOsISGQ3jfByToNulUzO6fiqig==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "bluebird": "^3.7.2", - "chokidar": "^3.5.3", - "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^3.25.0", - "glob": "^7.2.3", - "lodash": "^4.17.21", - "micromatch": "^4.0.5" - }, - "engines": { - "node": ">=14.15.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-parcel-config": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/gatsby-parcel-config/-/gatsby-parcel-config-0.13.0.tgz", - "integrity": "sha512-RJdrI8ioVXpwoCu9XjhQu/xidIshI+Vvjn07WlGV4IRNW77Xt9t2iXk12LdTHKmvKxXmGIA0CeC0eEg79V/2EQ==", - "dependencies": { - "@gatsbyjs/parcel-namer-relative-to-cwd": "1.7.0", - "@parcel/bundler-default": "2.6.2", - "@parcel/compressor-raw": "2.6.2", - "@parcel/namer-default": "2.6.2", - "@parcel/optimizer-terser": "2.6.2", - "@parcel/packager-js": "2.6.2", - "@parcel/packager-raw": "2.6.2", - "@parcel/reporter-dev-server": "2.6.2", - "@parcel/resolver-default": "2.6.2", - "@parcel/runtime-browser-hmr": "2.6.2", - "@parcel/runtime-js": "2.6.2", - "@parcel/runtime-react-refresh": "2.6.2", - "@parcel/runtime-service-worker": "2.6.2", - "@parcel/transformer-js": "2.6.2", - "@parcel/transformer-json": "2.6.2", - "@parcel/transformer-raw": "2.6.2", - "@parcel/transformer-react-refresh-wrap": "2.6.2" - }, - "engines": { - "parcel": "2.x" - }, - "peerDependencies": { - "@parcel/core": "^2.0.0" - } + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-algolia": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gatsby-plugin-algolia/-/gatsby-plugin-algolia-1.0.3.tgz", - "integrity": "sha512-fM+Kmk0O5/m8/40I2AiILdTkn8YYRsKACpgdS5z/AwE9zXZ2uCKDadWljLZ5iynmFn84f/gNNvZsuyKlOtjOtw==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", "dependencies": { - "algoliasearch": "^4.9.1", - "lodash.chunk": "^4.2.0" + "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" }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "gatsby": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-plugin-catch-links": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-4.22.0.tgz", - "integrity": "sha512-uBJMvNGEfk10WRfsUXw0OWhuP2BgamjbfDTh54emNb2MtmN3cz91G5ZDQWxFe24+3BSagJ3WN3lwDra9r1UjuQ==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" - } + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-google-tagmanager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-google-tagmanager/-/gatsby-plugin-google-tagmanager-4.22.0.tgz", - "integrity": "sha512-TNQLz7E3TypzXTfH/MIX1R+n8JclWfbHEK+4TnTEqjbUeTbLAkUCBlzqOCm/gWABWszpI2VYDN+UkOnfiZ3hVw==", + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", "dependencies": { - "@babel/runtime": "^7.15.4", - "web-vitals": "^1.1.2" - }, - "engines": { - "node": ">=14.15.0" + "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" }, - "peerDependencies": { - "gatsby": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/gatsby-plugin-image": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-2.22.0.tgz", - "integrity": "sha512-39XbPtUv/rtB/PffkTiEYjGGAFkqivWHGLil1aqiDo42RhPhhgHQ5Y2mn9B3ZiK86foUhSjQMRX6XSgTw2CGDA==", - "dependencies": { - "@babel/code-frame": "^7.14.0", - "@babel/parser": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "babel-jsx-utils": "^1.1.0", - "babel-plugin-remove-graphql-queries": "^4.22.0", - "camelcase": "^5.3.1", - "chokidar": "^3.5.3", - "common-tags": "^1.8.2", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "gatsby-plugin-utils": "^3.16.0", - "objectFitPolyfill": "^2.3.5", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@babel/core": "^7.12.3", - "gatsby": "^4.0.0-next", - "gatsby-plugin-sharp": "^4.0.0-next", - "gatsby-source-filesystem": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-plugin-image/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-image/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-image/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-3.15.2.tgz", - "integrity": "sha512-TsEgeAq40x7IwABXZkZcGStltr6gr3DnGjmhq4QZKapjtsPeTzWKp9HhB93t0OCDD9AfWUCH/teQq0rFTvsaEw==", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/generator": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.0", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/preset-env": "^7.15.4", - "@babel/preset-react": "^7.14.0", - "@babel/runtime": "^7.15.4", - "@babel/types": "^7.15.4", - "camelcase-css": "^2.0.1", - "change-case": "^3.1.0", - "core-js": "^3.22.3", - "dataloader": "^1.4.0", - "debug": "^4.3.1", - "escape-string-regexp": "^1.0.5", - "eval": "^0.1.4", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.15.0", - "gray-matter": "^4.0.2", - "json5": "^2.1.3", - "loader-utils": "^1.4.0", - "lodash": "^4.17.21", - "mdast-util-to-string": "^1.1.0", - "mdast-util-toc": "^3.1.0", - "mime": "^2.4.6", - "mkdirp": "^1.0.4", - "p-queue": "^6.6.2", - "pretty-bytes": "^5.3.0", - "remark": "^10.0.1", - "remark-retext": "^3.1.3", - "retext-english": "^3.0.4", - "slugify": "^1.4.4", - "static-site-generator-webpack-plugin": "^3.4.2", - "style-to-object": "^0.3.0", - "underscore.string": "^3.3.5", - "unified": "^8.4.2", - "unist-util-map": "^1.0.5", - "unist-util-remove": "^1.0.3", - "unist-util-visit": "^1.4.1" + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" }, - "peerDependencies": { - "@mdx-js/mdx": "^1.0.0", - "@mdx-js/react": "^1.0.0", - "gatsby": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-plugin-mdx/node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "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/gatsby-plugin-mdx/node_modules/change-case": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", - "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", - "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/gatsby-plugin-mdx/node_modules/constant-case": { + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "no-case": "^2.2.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" + "@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/gatsby-plugin-mdx/node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "lower-case": "^1.1.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/is-plain-obj": { + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-plugin-mdx/node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "upper-case": "^1.1.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx/node_modules/loader-utils/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", "dependencies": { - "minimist": "^1.2.0" + "@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" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-plugin-mdx/node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "node_modules/gatsby-plugin-mdx/node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "lower-case": "^1.1.2" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gatsby-plugin-mdx/node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "lower-case": "^1.1.1" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dependencies": { - "no-case": "^2.2.0" - } + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx/node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gatsby-plugin-mdx/node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "dependencies": { - "no-case": "^2.2.0" + "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/gatsby-plugin-mdx/node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" + "@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/gatsby-plugin-mdx/node_modules/snake-case": { + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "no-case": "^2.2.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx/node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "unist-util-visit-parents": "^2.0.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "unist-util-is": "^3.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-mdx/node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-mdx/node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "upper-case": "^1.1.1" + "@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/gatsby-plugin-meta-redirect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-meta-redirect/-/gatsby-plugin-meta-redirect-1.1.1.tgz", - "integrity": "sha512-Oc4qgU3SlDUM9qoxIMKO+re2bdMs3/a2KXrfL65gb8XMLsHylBbveWtXZRhgjd2QDL/49RX4S9SEykuadRju2w==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "fs-extra": "^7.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-meta-redirect/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/gatsby-plugin-meta-redirect/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-meta-redirect/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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/gatsby-plugin-page-creator": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.25.0.tgz", - "integrity": "sha512-plHek7xHSV9l1bLPa1JAnxzBqP7j2ihCPRwpBk/wIJAR8cG65wjAT+Nu8DKpW0+2/MYill84ns1r2m8g0L/7bg==", + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@sindresorhus/slugify": "^1.1.2", - "chokidar": "^3.5.3", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-page-utils": "^2.25.0", - "gatsby-plugin-utils": "^3.19.0", - "gatsby-telemetry": "^3.25.0", - "globby": "^11.1.0", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-robots-txt": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-robots-txt/-/gatsby-plugin-robots-txt-1.7.1.tgz", - "integrity": "sha512-ZdZm8/4b7Whf+W5kf+DqjZwz/+DY+IB7xp227+m2f2rgGUsz8yVCz4RitiN5+EInGFZFry0v+IbrUKCXTpIZYg==", - "dependencies": { - "@babel/runtime": "^7.16.7", - "generate-robotstxt": "^8.0.3" - }, - "peerDependencies": { - "gatsby": "^4.0.0 || ^3.0.0 || ^2.0.0" - } - }, - "node_modules/gatsby-plugin-sharp": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.22.0.tgz", - "integrity": "sha512-LL9M6aa5lXXRg1CrjIs10v2gMyjnVWBwWNXZCQzhP2OHdfxPhL4YapYIWPIJXqQSZG85bOP09fEnFfOpttfgUQ==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@gatsbyjs/potrace": "^2.3.0", - "async": "^3.2.4", - "bluebird": "^3.7.2", - "debug": "^4.3.4", - "filenamify": "^4.3.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "gatsby-plugin-utils": "^3.16.0", - "lodash": "^4.17.21", - "mini-svg-data-uri": "^1.4.4", - "probe-image-size": "^7.2.3", - "semver": "^7.3.7", - "sharp": "^0.30.7", - "svgo": "1.3.2" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-sharp/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-sharp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "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/gatsby-plugin-sharp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-sharp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/gatsby-plugin-sitemap": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.22.0.tgz", - "integrity": "sha512-51iJqCT+bCJ37akJnSvmCTjqVBIFLe/oE0sBLyjkCbMgmCFRW67eLRMsQeLRcm4KkIex3fbpGaAOxvXvP+FFUQ==", + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "common-tags": "^1.8.2", - "minimatch": "^3.1.2", - "sitemap": "^7.0.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-plugin-smoothscroll": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-smoothscroll/-/gatsby-plugin-smoothscroll-1.2.0.tgz", - "integrity": "sha512-wfIK06xwbNx91nHVg1YJwlLUJc0EmfWqV8KgvlNr6gFa9pqMx5Mprdp5jDRloAi3+9K0dVCybPO8FfaZ0i4HgA==", - "dependencies": { - "smoothscroll-polyfill": "^0.4.4" - } + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-styled-components": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-5.22.0.tgz", - "integrity": "sha512-L/+W8abTBTCpGpyC6efKwUcrGzE6Rk6Kgc8eTn+Nx/w+Vuxk3y4W7Ed7kuLb+MeRBfIR1PBFTJOfwum5j+Or7Q==", + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "babel-plugin-styled-components": ">1.5.0", - "gatsby": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0", - "styled-components": ">=2.0.0" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/gatsby-plugin-typescript": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.25.0.tgz", - "integrity": "sha512-8BTtiVWuIqIEGx/PBBMWd6FYPgel16hT3js7SMo5oI9K4EPsSxRItgRf41MTJGxRR20EhL4e99g2S8x0v1+odA==", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.15.4", - "babel-plugin-remove-graphql-queries": "^4.25.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" - } - }, - "node_modules/gatsby-plugin-utils": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.19.0.tgz", - "integrity": "sha512-EZtvgHSU5NPbEn6a4cfSpEGCQ09SfwbhoybHTJKj1clop86HSwOCV2iH8RbCc+X6jbdgHaSZsfsl7zG1h7DBUw==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "fastq": "^1.13.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-sharp": "^0.19.0", - "graphql-compose": "^9.0.7", - "import-from": "^4.0.0", - "joi": "^17.4.2", - "mime": "^3.0.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next", - "graphql": "^15.0.0" - } + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-utils/node_modules/gatsby-sharp": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.19.0.tgz", - "integrity": "sha512-EbI3RNBu2+aaxuMUP/INmoj8vcNAG6BgpFvi1tLeU7/gVTNVQ+7pC/ZYtlVCzSw+faaw7r1ZBMi6F66mNIIz5A==", + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/sharp": "^0.30.5", - "sharp": "^0.30.7" - }, - "engines": { - "node": ">=14.15.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/gatsby-plugin-utils/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gatsby-plugin-webpack-bundle-analyser-v2": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/gatsby-plugin-webpack-bundle-analyser-v2/-/gatsby-plugin-webpack-bundle-analyser-v2-1.1.32.tgz", - "integrity": "sha512-w6OJAR3CTyiKEKKD5tYu3J56YiQOW/8Sl2GPWmoiwzHIhZGjTOG+NbgkhboAK3+g2vgBlGTUmqgTAiJZWN7E/g==", - "dev": true, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.23.2", - "webpack-bundle-analyzer": "^4.10.1" - }, - "peerDependencies": { - "gatsby": "^4.0.0 || ^5.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-react-router-scroll": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-5.25.0.tgz", - "integrity": "sha512-SFSdezIa5lahCE8ieCLrtLA5tztemGco/rN8si9rI9KHu1h1jPvDhsNqs2g+Z50JrUb1RPfsmxJTmLa5i6MIgQ==", + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "@gatsbyjs/reach-router": "^1.3.5", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-react-router-scroll/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/gatsby-react-router-scroll/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/gatsby-remark-autolink-headers": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-5.22.0.tgz", - "integrity": "sha512-Eyom72XpN2x2BLCKdgWYnseeqXIcN9kVZmaXECGzc/IrE6RBHTMjzCMZJx9Ii39OAOhILaumOEfYhnAIw6SWXg==", + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.15.4", - "github-slugger": "^1.3.0", - "lodash": "^4.17.21", - "mdast-util-to-string": "^2.0.0", - "unist-util-visit": "^2.0.3" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/gatsby-remark-autolink-headers/node_modules/mdast-util-to-string": { + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-remark-copy-linked-files": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.22.0.tgz", - "integrity": "sha512-n+HNVZDtog7o4LX0yS0uQbcPectfcf1VuOou/rhkzeGR1vKXTcTHpfc4A+n9MfvoBoV8N4FyZCGjSzxF9nqS2g==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "cheerio": "^1.0.0-rc.10", - "fs-extra": "^10.1.0", - "is-relative-url": "^3.0.0", - "lodash": "^4.17.21", - "path-is-inside": "^1.0.2", - "probe-image-size": "^7.2.3", - "unist-util-visit": "^2.0.3" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" - } - }, - "node_modules/gatsby-remark-normalize-paths": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-normalize-paths/-/gatsby-remark-normalize-paths-1.1.0.tgz", - "integrity": "sha512-/0mueJUohhuHHUe7N40Gn3b68DCVQWp6QDgsxpyBiykWvS0L6Aiv/SbmqX0oh0ubg47m4P6iakJUN/V2KKir4g==", - "dependencies": { - "is-valid-path": "^0.1.1", - "path": "^0.12.7", - "unist-util-visit": "^2.0.3" - }, - "peerDependencies": { - "gatsby": ">2.0.0-alpha" - } - }, - "node_modules/gatsby-remark-rewrite-relative-links": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-remark-rewrite-relative-links/-/gatsby-remark-rewrite-relative-links-1.0.8.tgz", - "integrity": "sha512-7jCyMM+AWdp8mFLUWuJ5RGPQIKFzpLqf253QR6Aq8xrhlV0Bcz2k1+03MxPnGP0R5XetIoRm2W864KrbIZdk9Q==", - "dependencies": { - "unist-util-visit": "^2.0.0" - } - }, - "node_modules/gatsby-remark-sectionize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-sectionize/-/gatsby-remark-sectionize-1.0.0.tgz", - "integrity": "sha512-S6FefaA1KlBDRNw/RaH8iRUzdcFgB8nBYox3hraXqLsfRETRkY668ay6xo8iSNyl/XG+L6fjaNBss0KcmAqBSg==", - "dependencies": { - "remark-sectionize": "^1.0.1" - } - }, - "node_modules/gatsby-script": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/gatsby-script/-/gatsby-script-1.10.0.tgz", - "integrity": "sha512-8jAtQR0mw3G8sCy6i2D1jfGvUF5d9AIboEQuo9ZEChT4Ep5f+PSRxiWZqSjhKvintAOIeS4QXCJP5Rtp3xZKLg==", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "@gatsbyjs/reach-router": "^1.3.5", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", - "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" - } - }, - "node_modules/gatsby-sharp": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.16.0.tgz", - "integrity": "sha512-ApkxUe04waBzqyTE1x9OcP/ZzIbFBYxkjsrBoK+Fl2CZrQgBk7433kVVufy7FVW4o69StQmztrwaNEh2t5miTQ==", - "optional": true, - "dependencies": { - "@types/sharp": "^0.30.5", - "sharp": "^0.30.7" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/gatsby-source-filesystem": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.22.0.tgz", - "integrity": "sha512-fcL3M+bQgI8DxD+XfB5XAnMvXp6czfqRZs8J2RStw9p02ekLaR/8R9ZYrn8OoQYLB9y9CHid+pdA78Dy3h73cg==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "chokidar": "^3.5.3", - "file-type": "^16.5.4", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "md5-file": "^5.0.0", - "mime": "^2.5.2", - "pretty-bytes": "^5.4.1", - "valid-url": "^1.0.9", - "xstate": "4.32.1" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" - } - }, - "node_modules/gatsby-telemetry": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.25.0.tgz", - "integrity": "sha512-FGC1yS2evJxTN/Ku9XonCBiqhH6uO6aPjjps65BbL+Xbpct/qfirIFxYG6DhHPrksR0fKOhstJGnQqay74hWdQ==", - "hasInstallScript": true, - "dependencies": { - "@babel/code-frame": "^7.14.0", - "@babel/runtime": "^7.15.4", - "@turist/fetch": "^7.2.0", - "@turist/time": "^0.0.2", - "boxen": "^4.2.0", - "configstore": "^5.0.1", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "git-up": "^7.0.0", - "is-docker": "^2.2.1", - "lodash": "^4.17.21", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/gatsby-telemetry/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/gatsby-telemetry/node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gatsby-telemetry/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/gatsby-telemetry/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-telemetry/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/gatsby-telemetry/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/gatsby-telemetry/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-telemetry/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-telemetry/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-transformer-remark": { - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.25.1.tgz", - "integrity": "sha512-6k3uOnZYsJSgmZIWq9Y+Cqb6pysusCUBYpQY1+V9ofpSRbrZGGfuoCeFKd27x/c0jI5jneuL3NXnxwn/JJK1Ig==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "gatsby-core-utils": "^3.25.0", - "gray-matter": "^4.0.3", - "hast-util-raw": "^6.0.2", - "hast-util-to-html": "^7.1.3", - "lodash": "^4.17.21", - "mdast-util-to-hast": "^10.2.0", - "mdast-util-to-string": "^2.0.0", - "mdast-util-toc": "^5.1.0", - "remark": "^13.0.0", - "remark-footnotes": "^3.0.0", - "remark-gfm": "^1.0.0", - "remark-parse": "^9.0.0", - "remark-retext": "^4.0.0", - "remark-stringify": "^9.0.1", - "retext-english": "^3.0.4", - "sanitize-html": "^1.27.5", - "underscore.string": "^3.3.6", - "unified": "^9.2.2", - "unist-util-remove-position": "^3.0.0", - "unist-util-select": "^3.0.4", - "unist-util-visit": "^2.0.3" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/hast-util-raw": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", - "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/mdast-util-to-hast": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", - "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/mdast-util-to-nlcst": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz", - "integrity": "sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.0.0", - "unist-util-position": "^3.0.0", - "vfile-location": "^3.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/mdast-util-toc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz", - "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==", - "dependencies": { - "@types/mdast": "^3.0.3", - "@types/unist": "^2.0.3", - "extend": "^3.0.2", - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/gatsby-transformer-remark/node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/remark-footnotes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", - "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", - "dependencies": { - "mdast-util-footnote": "^0.1.0", - "micromark-extension-footnote": "^0.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/remark-retext": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-4.0.0.tgz", - "integrity": "sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q==", - "dependencies": { - "mdast-util-to-nlcst": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-remark/node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/gatsby-transformer-sharp": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.22.0.tgz", - "integrity": "sha512-gTZ9pXwxsdmGEBV6yANnZFvsw921r6FChzuD43r+7JTs7uhmBsSGPPSF3EQnOKClP9co3IE0kztYSLoUHQe/cQ==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@gatsbyjs/potrace": "^2.3.0", - "bluebird": "^3.7.2", - "common-tags": "^1.8.2", - "fs-extra": "^10.1.0", - "gatsby-plugin-utils": "^3.16.0", - "probe-image-size": "^7.2.3", - "semver": "^7.3.7", - "sharp": "^0.30.7" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "gatsby": "^4.0.0-next", - "gatsby-plugin-sharp": "^4.0.0-next" - } - }, - "node_modules/gatsby-transformer-sharp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gatsby-transformer-sharp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gatsby-transformer-sharp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/gatsby-worker": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/gatsby-worker/-/gatsby-worker-1.25.0.tgz", - "integrity": "sha512-gjp28irgHASihwvMyF5aZMALWGax9mEmcD8VYGo2osRe7p6BZuWi4cSuP9XM9EvytDvIugpnSadmTP01B7LtWg==", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/gatsby/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/gatsby/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/gatsby/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/gatsby/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/gatsby/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/gatsby/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gatsby/node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gatsby/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gatsby/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gatsby/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/generate-robotstxt": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/generate-robotstxt/-/generate-robotstxt-8.0.3.tgz", - "integrity": "sha512-iD//oAVKcHOCz9M0IiT3pyUiF2uN1qvL3qaTA8RGLz7NU7l0XVwyzd3rN+tzhB657DNUgrygXt9w8+0zkTMFrg==", - "dependencies": { - "cosmiconfig": "^6.0.0", - "fs-extra": "^9.0.0", - "ip-regex": "^4.1.0", - "is-absolute-url": "^3.0.3", - "meow": "^7.0.1", - "resolve-from": "^5.0.0" - }, - "bin": { - "generate-robotstxt": "dist/cli.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/generate-robotstxt/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "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/generate-robotstxt/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "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/generate-robotstxt/node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/generate-robotstxt/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "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", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "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", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/graphql-compose": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-9.0.10.tgz", - "integrity": "sha512-UsVoxfi2+c8WbHl2pEB+teoRRZoY4mbWBoijeLDGpAZBSPChnqtSRjp+T9UcouLCwGr5ooNyOQLoI3OVzU1bPQ==", - "dependencies": { - "graphql-type-json": "0.3.2" - } - }, - "node_modules/graphql-playground-html": { - "version": "1.6.30", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz", - "integrity": "sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==", - "dependencies": { - "xss": "^1.0.6" - } - }, - "node_modules/graphql-playground-middleware-express": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.23.tgz", - "integrity": "sha512-M/zbTyC1rkgiQjFSgmzAv6umMHOphYLNWZp6Ye5QrD77WfGOOoSqDsVmGUczc2pDkEPEzzGB/bvBO5rdzaTRgw==", - "dependencies": { - "graphql-playground-html": "^1.6.30" - }, - "peerDependencies": { - "express": "^4.16.2" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-type-json": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", - "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==", - "peerDependencies": { - "graphql": ">=0.8.0" - } - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "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", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gray-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", - "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/hast-util-to-html": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", - "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", - "dependencies": { - "ccount": "^1.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-is-element": "^1.0.0", - "hast-util-whitespace": "^1.0.0", - "html-void-elements": "^1.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0", - "stringify-entities": "^3.0.1", - "unist-util-is": "^4.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", - "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "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", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "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/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/intl-messageformat": { - "version": "10.5.11", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", - "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.6", - "tslib": "^2.4.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "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-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", - "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz", - "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==", - "dependencies": { - "is-absolute-url": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-relative-url/node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", - "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/is-valid-domain": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-valid-domain/-/is-valid-domain-0.1.6.tgz", - "integrity": "sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==", - "dependencies": { - "punycode": "^2.1.1" - } - }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jimp-compact": { - "version": "0.16.1-2", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1-2.tgz", - "integrity": "sha512-b2A3rRT1TITzqmaO70U2/uunCh43BQVq7BfRwGPkD5xj8/WZsR3sPTy9DENt+dNZGsel3zBEm1UtYegUxjZW7A==" - }, - "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/legacy-swc-helpers": { - "name": "@swc/helpers", - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/lint-staged": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", - "integrity": "sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==", - "dev": true, - "dependencies": { - "cli-truncate": "2.1.0", - "colorette": "^1.4.0", - "commander": "^8.2.0", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "execa": "^5.1.1", - "listr2": "^3.12.2", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "3.3.0", - "supports-color": "8.1.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lint-staged/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/lmdb": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.3.tgz", - "integrity": "sha512-iBA0cb13CobBSoGJLfZgnrykLlfJipDAnvtf+YwIqqzBEsTeQYsXrHaSBkaHd5wCWeabwrNvhjZoFMUrlo+eLw==", - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.5.3", - "@lmdb/lmdb-darwin-x64": "2.5.3", - "@lmdb/lmdb-linux-arm": "2.5.3", - "@lmdb/lmdb-linux-arm64": "2.5.3", - "@lmdb/lmdb-linux-x64": "2.5.3", - "@lmdb/lmdb-win32-x64": "2.5.3" - } - }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "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": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lock": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", - "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" - }, - "node_modules/lodash.chunk": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.every": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", - "integrity": "sha512-isF82d+65/sNvQ3aaQAW7LLHnnTxSN/2fm4rhYyuufLzA4VtHz6y6S5vFwe6PQVr2xdqUOyxBbTNKDpnmeu50w==" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" - }, - "node_modules/lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha512-QfTqQTwzmKxLy7VZlbx2M/ipWv8DCQ2F5BI/MRxLharOQ5V78yMSuB+JE+EuUM22txYfj09R2Q7hUlEYj7KdNg==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "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/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", - "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-age-cleaner/node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/md5-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", - "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", - "bin": { - "md5-file": "cli.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-squeeze-paragraphs/node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-compact": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", - "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", - "dependencies": { - "unist-util-visit": "^1.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-compact/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/mdast-util-compact/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/mdast-util-compact/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", - "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-footnote": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", - "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0", - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", - "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", - "dependencies": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", - "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", - "dependencies": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", - "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", - "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", - "dependencies": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", - "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", - "dependencies": { - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-nlcst": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", - "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - } - }, - "node_modules/mdast-util-to-nlcst/node_modules/vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-toc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz", - "integrity": "sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w==", - "dependencies": { - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^1.0.5", - "unist-util-is": "^2.1.2", - "unist-util-visit": "^1.1.0" - } - }, - "node_modules/mdast-util-toc/node_modules/unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - }, - "node_modules/mdast-util-toc/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/meant": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.3.tgz", - "integrity": "sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "node_modules/meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/micromark-extension-footnote": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", - "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", - "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", - "dependencies": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", - "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", - "dependencies": { - "micromark": "~2.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", - "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", - "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", - "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", - "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", - "dependencies": { - "micromark": "~2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/msgpackr": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.9.tgz", - "integrity": "sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/nlcst-to-string": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", - "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-html-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", - "dependencies": { - "css-select": "^4.2.1", - "he": "1.2.0" - } - }, - "node_modules/node-html-parser/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "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/node-html-parser/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "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/node-html-parser/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/node-html-parser/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "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/node-html-parser/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-object-hash": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.3.10.tgz", - "integrity": "sha512-jY5dPJzw6NHd/KPSfPKJ+IHoFS81/tJ43r34ZeNMXGzCOM8jwQDCD12HYayKIB6MuznrnqIYy2e891NA2g0ibA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, - "node_modules/not": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", - "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "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/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/objectFitPolyfill": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/objectFitPolyfill/-/objectFitPolyfill-2.3.5.tgz", - "integrity": "sha512-8Quz071ZmGi0QWEG4xB3Bv5Lpw6K0Uca87FLoLMKMWjB6qIq9IyBegP3b/VLNxv2WYvIMGoeUQ+c6ibUkNa8TA==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/opentracing": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", - "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ordered-binary": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.1.tgz", - "integrity": "sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==" - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/package-json/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/package-json/node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/package-json/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-english": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.2.0.tgz", - "integrity": "sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "parse-latin": "^4.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "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-latin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", - "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", - "dependencies": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-srcset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/password-prompt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", - "dependencies": { - "ansi-escapes": "^4.3.2", - "cross-spawn": "^7.0.3" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/physical-cpu-count": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", - "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "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", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "dependencies": { - "semver-compare": "^1.0.0" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "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" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "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/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-loader": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", - "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/postcss-loader/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "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/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "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/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "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/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "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.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "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", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "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/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "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/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "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/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "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/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "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/postcss-svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "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/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-prisma": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-prisma/-/prettier-plugin-prisma-4.13.0.tgz", - "integrity": "sha512-bnOWoQTVXM9VWBErPGE6rVgI8kCQts+DMQolg7Sj/Q0/oAlpDYOhce4ljQKf5BhJW061yrB3+CRVps6tNcUkQg==", - "dev": true, - "dependencies": { - "@prisma/prisma-fmt-wasm": "4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - }, - "peerDependencies": { - "prettier": ">=2" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/prism-react-renderer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", - "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", - "dev": true, - "peerDependencies": { - "react": ">=0.14.9" - } - }, - "node_modules/prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "4.16.2" - }, - "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", - "dependencies": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "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", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "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/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "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", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "dependencies": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" - } - }, - "node_modules/react-copy-to-clipboard/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/react-copy-to-clipboard/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "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/react-dev-utils/node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "node_modules/react-feather": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-2.0.10.tgz", - "integrity": "sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": ">=16.8.6" - } - }, - "node_modules/react-ga": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", - "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^15.6.2 || ^16.0 || ^17 || ^18" - } - }, - "node_modules/react-instantsearch-core": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.1.tgz", - "integrity": "sha512-R8VivvJmFemsW6Urp5KGiqjVZ8XkgYNm8qt6t9WVHXOoo7B8Txi/7yOMNRwT8PWNWBMpYlYMEWZ9PClMuX0Zsg==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.10.0", - "prop-types": "^15.6.2", - "react-fast-compare": "^3.0.0" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 5", - "react": ">= 16.3.0 < 19" - } - }, - "node_modules/react-instantsearch-dom": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.1.tgz", - "integrity": "sha512-oditYXY6zNbAY6txhGBLOPaEie95Eii+nCEgysuoo4fnOQDUxuHXMruiTkYJlfJJ5HAKBJyTdjtKoGeuJL6G1w==", - "deprecated": "package has moved to react-instantsearch", - "dependencies": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.10.0", - "classnames": "^2.2.5", - "prop-types": "^15.6.2", - "react-fast-compare": "^3.0.0", - "react-instantsearch-core": "6.32.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 5", - "react": ">= 16.3.0 < 19", - "react-dom": ">= 16.3.0 < 19" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-select": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.4.0.tgz", - "integrity": "sha512-CjE9RFLUvChd5SdlfG4vqxZd55AZJRrLrHzkQyTYeHlpOztqcgnyftYAolJ0SGsBev6zAs6qFrjm6KU3eo2hzg==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-sticky-box": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-sticky-box/-/react-sticky-box-1.0.2.tgz", - "integrity": "sha512-Kyvtppdtv1KqJyNU4DtrSMI0unyQRgtraZvVQ0GAazVbYiTsIVpyhpr+5R0Aavzu4uJNSe1awj2rk/qI7i6Zfw==", - "dependencies": { - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/react-toastify": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.8.tgz", - "integrity": "sha512-EwM+teWt49HSHx+67qI08yLAW1zAsBxCXLCsUfxHYv1W7/R3ZLhrqKalh7j+kjgPna1h5LQMSMwns4tB4ww2yQ==", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "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/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "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", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "peerDependencies": { - "redux": "^4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "node_modules/regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relay-runtime": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", - "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.0", - "invariant": "^2.2.4" - } - }, - "node_modules/remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", - "dependencies": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", - "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", - "dependencies": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse/node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-retext": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", - "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", - "dependencies": { - "mdast-util-to-nlcst": "^3.2.0" - } - }, - "node_modules/remark-sectionize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/remark-sectionize/-/remark-sectionize-1.1.1.tgz", - "integrity": "sha512-++GBmbsoeQrMBWn6jf3mj0bRq3DR8LnQPJo7u5faQ9JAJ5GeAu2uve8NoW+vgvhnuAv0GYS8hGb2+kqa+8mnpg==", - "dependencies": { - "unist-util-find-after": "^2.0.2", - "unist-util-visit-parents": "^2.0.1" - } - }, - "node_modules/remark-sectionize/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/remark-sectionize/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark/node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" - }, - "node_modules/remark/node_modules/parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "node_modules/remark/node_modules/remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "dependencies": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "node_modules/remark/node_modules/remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", - "dependencies": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "node_modules/remark/node_modules/stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "node_modules/remark/node_modules/unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dependencies": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } - }, - "node_modules/remark/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/remark/node_modules/unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "dependencies": { - "unist-util-visit": "^1.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark/node_modules/unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "node_modules/remark/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/remark/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/remark/node_modules/vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "dependencies": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "node_modules/remark/node_modules/vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark/node_modules/vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "dependencies": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" - }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "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", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "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", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "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", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "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", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/require-package-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", - "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "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", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retext-english": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz", - "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==", - "dependencies": { - "parse-english": "^4.0.0", - "unherit": "^1.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize-html": { - "version": "1.27.5", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.5.tgz", - "integrity": "sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==", - "dependencies": { - "htmlparser2": "^4.1.0", - "lodash": "^4.17.15", - "parse-srcset": "^1.0.2", - "postcss": "^7.0.27" - } - }, - "node_modules/sanitize-html/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "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/sanitize-html/node_modules/dom-serializer/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", - "dependencies": { - "domelementtype": "^2.0.1" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "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/sanitize-html/node_modules/domutils/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" - } - }, - "node_modules/sanitize-html/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/sanitize-html/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/sanitize-html/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "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/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "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", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "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-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallow-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", - "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/sharp": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", - "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.1", - "node-addon-api": "^5.0.0", - "prebuild-install": "^7.1.1", - "semver": "^7.3.7", - "simple-get": "^4.0.1", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sharp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/signedsource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "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/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/smoothscroll-polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", - "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==" - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/socket.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", - "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", - "dependencies": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~4.1.0", - "socket.io-adapter": "~2.1.0", - "socket.io-parser": "~4.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", - "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" - }, - "node_modules/socket.io-client": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.1.3.tgz", - "integrity": "sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==", - "dependencies": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~4.1.0", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", - "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/sponge-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", - "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/st": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", - "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", - "dependencies": { - "async-cache": "^1.1.0", - "bl": "^4.0.0", - "fd": "~0.0.2", - "mime": "^2.4.4", - "negotiator": "~0.6.2" - }, - "bin": { - "st": "bin/server.js" - }, - "optionalDependencies": { - "graceful-fs": "^4.2.3" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/static-site-generator-webpack-plugin": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-3.4.2.tgz", - "integrity": "sha512-39Kn+fZDVjolLYuX5y1rDvksJIW0QEUaEC/AVO/UewNXxGzoSQI1UYnRsL+ocAcN5Yti6d6rJgEL0qZ5tNXfdw==", - "dependencies": { - "bluebird": "^3.0.5", - "cheerio": "^0.22.0", - "eval": "^0.1.0", - "url": "^0.11.0", - "webpack-sources": "^0.2.0" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "engines": { - "node": "*" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/source-list-map": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", - "integrity": "sha512-FqR2O+cX+toUD3ULVIgTtiqYIqPnA62ehJD47mf4LG1PZCB+xmIa3gcTEhegGbP22aRPh88dJSdgDIolrvSxBQ==" - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-site-generator-webpack-plugin/node_modules/webpack-sources": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", - "integrity": "sha512-iqanNZjOHLdPn/R0e/nKVn90dm4IsUMxKam0MZD1btWhFub/Cdo1nWdMio6yEqBc0F8mEieOjc+jfBSXwna94Q==", - "dependencies": { - "source-list-map": "^1.1.1", - "source-map": "~0.5.3" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "dependencies": { - "debug": "2" - } - }, - "node_modules/stream-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stream-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-similarity": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", - "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "lodash.every": "^4.6.0", - "lodash.flattendeep": "^4.4.0", - "lodash.foreach": "^4.5.0", - "lodash.map": "^4.6.0", - "lodash.maxby": "^4.6.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-filename-increment": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-filename-increment/-/strip-filename-increment-2.0.1.tgz", - "integrity": "sha512-+v5xsiTTsdYqkPj7qz1zlngIsjZedhHDi3xp/9bMurV8kXe9DAr732gNVqtt4X8sI3hOqS3nlFfps5gyVcux6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "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/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/sudo-prompt": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", - "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/svgo/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/svgo/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/swap-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", - "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "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/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "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.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "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/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "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/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/title-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", - "integrity": "sha512-39wxbwHdQ2sTiBB8wAzKfQ9GN+om8w+sjNWzr+vZJR5AMD5J+J7Yc8AtXnU9r/r2c8XiDZ/smxutDmZehX/qpQ==" - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", - "dependencies": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "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", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-2.0.4.tgz", - "integrity": "sha512-zo0ShIr+E/aU9xSK7JC9Kb+WP9seTFCuqVYdo5+HJSjN009XMfhiA1FIExEKzdDP1UsgvKGleGlB/pSdTSqZww==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/unist-util-find-after/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-1.0.5.tgz", - "integrity": "sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==", - "dependencies": { - "object-assign": "^4.0.1" - } - }, - "node_modules/unist-util-modify-children": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", - "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", - "dependencies": { - "array-iterate": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", - "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/unist-util-remove-position": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz", - "integrity": "sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "node_modules/unist-util-select": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-3.0.4.tgz", - "integrity": "sha512-xf1zCu4okgPqGLdhCDpRnjwBNyv3EqjiXRUbz2SdK1+qnLMB7uXXajfzuBvvbHoQ+JLyp4AEbFCGndmc6S72sw==", - "dependencies": { - "css-selector-parser": "^1.0.0", - "not": "^0.1.0", - "nth-check": "^2.0.0", - "unist-util-is": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-children": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", - "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unixify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", - "dependencies": { - "normalize-path": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unixify/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "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" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "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-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-or-promise": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", - "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==" - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.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.9", - "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.7", - "watchpack": "^2.4.0", - "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.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", - "dev": true, - "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", - "is-plain-object": "^5.0.0", - "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/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "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/webpack-dev-middleware": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", - "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", - "dependencies": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", - "mime-types": "^2.1.30", - "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= v10.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-stats-plugin": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-1.1.3.tgz", - "integrity": "sha512-yUKYyy+e0iF/w31QdfioRKY+h3jDBRpthexBOWGKda99iu2l/wxYsI/XqdlP5IU58/0KB9CsJZgWNAl+/MPkRw==" - }, - "node_modules/webpack-virtual-modules": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.3.2.tgz", - "integrity": "sha512-RXQXioY6MhzM4CNQwmBwKXYgBs6ulaiQ8bkNQEl2J6Z+V+s7lgl/wGvaI/I0dLnYKB8cKsxQc17QOAVIphPLDw==", - "dependencies": { - "debug": "^3.0.0" - } - }, - "node_modules/webpack-virtual-modules/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/write/-/write-2.0.0.tgz", - "integrity": "sha512-yam9TAqN8sAZokECAejo9HpT2j2s39OgK8i8yxadrFBVo+iSWLfnipRVFulfAw1d2dz5vSuGmlMHYRKG4fysOA==", - "dependencies": { - "add-filename-increment": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "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": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "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/x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==" - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xss": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/xss/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/xstate": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.32.1.tgz", - "integrity": "sha512-QYUd+3GkXZ8i6qdixnOn28bL3EvA++LONYL/EMWwKlFSh/hiLndJ8YTnz77FDs+JUXcwU7NZJg7qoezoRHc4GQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/xstate" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==" - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-loader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.6.0.tgz", - "integrity": "sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==", - "dependencies": { - "loader-utils": "^1.4.0", - "yaml": "^1.8.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yaml-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/yaml-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/yaml-loader/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoga-layout-prebuilt": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", - "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", - "dependencies": { - "@types/yoga-layout": "1.9.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yurnalist": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-2.1.0.tgz", - "integrity": "sha512-PgrBqosQLM3gN2xBFIMDLACRTV9c365VqityKKpSTWpwR+U4LAFR3rSVyEoscWlu3EzX9+Y0I86GXUKxpHFl6w==", - "dependencies": { - "chalk": "^2.4.2", - "inquirer": "^7.0.0", - "is-ci": "^2.0.0", - "read": "^1.0.7", - "strip-ansi": "^5.2.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/yurnalist/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yurnalist/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" - }, - "@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", - "requires": { - "@algolia/cache-common": "4.14.2" - } - }, - "@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" - }, - "@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", - "requires": { - "@algolia/cache-common": "4.14.2" - } - }, - "@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", - "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", - "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", - "requires": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", - "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", - "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" - }, - "@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", - "requires": { - "@algolia/logger-common": "4.14.2" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", - "requires": { - "@algolia/requester-common": "4.14.2" - } - }, - "@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" - }, - "@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", - "requires": { - "@algolia/requester-common": "4.14.2" - } - }, - "@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", - "requires": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" - } - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@ardatan/relay-compiler": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", - "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", - "requires": { - "@babel/core": "^7.14.0", - "@babel/generator": "^7.14.0", - "@babel/parser": "^7.14.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.4.0", - "chalk": "^4.0.0", - "fb-watchman": "^2.0.0", - "fbjs": "^3.0.0", - "glob": "^7.1.1", - "immutable": "~3.7.6", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "relay-runtime": "12.0.0", - "signedsource": "^1.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==" - }, - "@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", - "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", - "requires": { - "@babel/types": "^7.23.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "requires": { - "@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" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "requires": { - "@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" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==" - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", - "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.4", - "@babel/types": "^7.23.4" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "dependencies": { - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - } - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz", - "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==", - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "semver": "^6.3.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz", - "integrity": "sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@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.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@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.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - } - }, - "@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "dependencies": { - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - } - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", - "requires": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@builder.io/partytown": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.5.4.tgz", - "integrity": "sha512-qnikpQgi30AS01aFlNQV6l8/qdZIcP76mp90ti+u4rucXHsn4afSKivQXApqxvrQG9+Ibv45STyvHizvxef/7A==" - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "requires": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "requires": { - "@emotion/memoize": "^0.8.1" - } - }, - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", - "requires": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", - "requires": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "requires": {} - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - } - } - }, - "@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", - "requires": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@formatjs/icu-messageformat-parser": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", - "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", - "requires": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-skeleton-parser": "1.8.0", - "tslib": "^2.4.0" - } - }, - "@formatjs/icu-skeleton-parser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", - "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", - "requires": { - "@formatjs/ecma402-abstract": "1.18.2", - "tslib": "^2.4.0" - } - }, - "@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@gatsbyjs/parcel-namer-relative-to-cwd": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@gatsbyjs/parcel-namer-relative-to-cwd/-/parcel-namer-relative-to-cwd-1.7.0.tgz", - "integrity": "sha512-KifWxXYcLrXFHvM9Ug77BlyoQ3TLOB3lh4izNHFVuST/NEr5fKpn/IZRqEXhNEYaESjE6C1gDA42Vvhi58pnRQ==", - "requires": { - "@babel/runtime": "^7.18.0", - "@parcel/namer-default": "2.6.2", - "@parcel/plugin": "2.6.2", - "gatsby-core-utils": "^3.22.0" - } - }, - "@gatsbyjs/potrace": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@gatsbyjs/potrace/-/potrace-2.3.0.tgz", - "integrity": "sha512-72szhSY/4tPiPPOzq15CG6LW0s9FuWQ86gkLSUvBNoF0s+jsEdRaZmATYNjiY2Skg//EuyPLEqUQnXKXME0szg==", - "requires": { - "jimp-compact": "^0.16.1-2" - } - }, - "@gatsbyjs/reach-router": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@gatsbyjs/reach-router/-/reach-router-1.3.9.tgz", - "integrity": "sha512-/354IaUSM54xb7K/TxpLBJB94iEAJ3P82JD38T8bLnIDWF+uw8+W/82DKnQ7y24FJcKxtVmG43aiDLG88KSuYQ==", - "requires": { - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4" - } - }, - "@gatsbyjs/webpack-hot-middleware": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/@gatsbyjs/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", - "integrity": "sha512-ul17OZ8Dlw+ATRbnuU+kwxuAlq9lKbYz/2uBS1FLCdgoPTF1H2heP7HbUbgfMZbfRQNcCG2rMscMnr32ritCDw==", - "requires": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.3.3", - "strip-ansi": "^6.0.0" - } - }, - "@graphql-codegen/add": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", - "integrity": "sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.1", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-codegen/core": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", - "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.1", - "@graphql-tools/schema": "^9.0.0", - "@graphql-tools/utils": "^9.1.1", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-codegen/plugin-helpers": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", - "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", - "requires": { - "@graphql-tools/utils": "^8.8.0", - "change-case-all": "1.0.14", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-tools/utils": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", - "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@graphql-codegen/schema-ast": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", - "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-tools/utils": "^9.0.0", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-codegen/typescript": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.8.tgz", - "integrity": "sha512-A0oUi3Oy6+DormOlrTC4orxT9OBZkIglhbJBcDmk34jAKKUgesukXRd4yOhmTrnbchpXz2T8IAOFB3FWIaK4Rw==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/schema-ast": "^2.6.1", - "@graphql-codegen/visitor-plugin-common": "2.13.8", - "auto-bind": "~4.0.0", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-codegen/typescript-operations": { - "version": "2.5.13", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.13.tgz", - "integrity": "sha512-3vfR6Rx6iZU0JRt29GBkFlrSNTM6t+MSLF86ChvL4d/Jfo/JYAGuB3zNzPhirHYzJPCvLOAx2gy9ID1ltrpYiw==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/typescript": "^2.8.8", - "@graphql-codegen/visitor-plugin-common": "2.13.8", - "auto-bind": "~4.0.0", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-codegen/visitor-plugin-common": { - "version": "2.13.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz", - "integrity": "sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ==", - "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-tools/optimize": "^1.3.0", - "@graphql-tools/relay-operation-optimizer": "^6.5.0", - "@graphql-tools/utils": "^9.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.4.0" - }, - "dependencies": { - "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", - "requires": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.4.0" - } - }, - "change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - } - } - }, - "@graphql-tools/code-file-loader": { - "version": "7.3.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", - "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", - "requires": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - } - }, - "@graphql-tools/graphql-tag-pluck": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", - "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", - "requires": { - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - } - }, - "@graphql-tools/load": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", - "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", - "requires": { - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "p-limit": "3.1.0", - "tslib": "^2.4.0" - } - }, - "@graphql-tools/merge": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", - "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", - "requires": { - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - } - }, - "@graphql-tools/optimize": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", - "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@graphql-tools/relay-operation-optimizer": { - "version": "6.5.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", - "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", - "requires": { - "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - } - }, - "@graphql-tools/schema": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", - "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", - "requires": { - "@graphql-tools/merge": "^8.4.1", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - } - }, - "@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", - "requires": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" - } - }, - "@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "requires": {} - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "@internationalized/date": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz", - "integrity": "sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==", - "requires": { - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@internationalized/message": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz", - "integrity": "sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==", - "requires": { - "@swc/helpers": "^0.5.0", - "intl-messageformat": "^10.1.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@internationalized/number": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.0.tgz", - "integrity": "sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w==", - "requires": { - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@internationalized/string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.0.tgz", - "integrity": "sha512-Xx3Sy3f2c9ctT+vh8c7euEaEHQZltp0euZ3Hy4UfT3E13r6lxpUS3kgKyumEjboJZSnaZv7JhqWz3D75v+IxQg==", - "requires": { - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@lezer/common": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.1.1.tgz", - "integrity": "sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==" - }, - "@lezer/lr": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.14.tgz", - "integrity": "sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.3.tgz", - "integrity": "sha512-RXwGZ/0eCqtCY8FLTM/koR60w+MXyvBUpToXiIyjOcBnC81tAlTUHrRUavCEWPI9zc9VgvpK3+cbumPyR8BSuA==", - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.3.tgz", - "integrity": "sha512-337dNzh5yCdNCTk8kPfoU7jR3otibSlPDGW0vKZT97rKnQMb9tNdto3RtWoGPsQ8hKmlRZpojOJtmwjncq1MoA==", - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.3.tgz", - "integrity": "sha512-mU2HFJDGwECkoD9dHQEfeTG5mp8hNS2BCfwoiOpVPMeapjYpQz9Uw3FkUjRZ4dGHWKbin40oWHuL0bk2bCx+Sg==", - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.3.tgz", - "integrity": "sha512-VJw60Mdgb4n+L0fO1PqfB0C7TyEQolJAC8qpqvG3JoQwvyOv6LH7Ib/WE3wxEW9nuHmVz9jkK7lk5HfWWgoO1Q==", - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.3.tgz", - "integrity": "sha512-qaReO5aV8griBDsBr8uBF/faO3ieGjY1RY4p8JvTL6Mu1ylLrTVvOONqKFlNaCwrmUjWw5jnf7VafxDAeQHTow==", - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.3.tgz", - "integrity": "sha512-cK+Elf3RjEzrm3SerAhrFWL5oQAsZSJ/LmjL1joIpTfEP1etJJ9CTRvdaV6XLYAxaEkfdhk/9hOvHLbR9yIhCA==", - "optional": true - }, - "@mdx-js/loader": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.6.22.tgz", - "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==", - "requires": { - "@mdx-js/mdx": "1.6.22", - "@mdx-js/react": "1.6.22", - "loader-utils": "2.0.0" - } - }, - "@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "requires": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "requires": {} - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "@mischnic/json-sourcemap": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", - "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", - "requires": { - "@lezer/common": "^1.0.0", - "@lezer/lr": "^1.0.0", - "json5": "^2.2.1" - } - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", - "optional": true - }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "requires": { - "eslint-scope": "5.1.1" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@parcel/bundler-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.6.2.tgz", - "integrity": "sha512-XIa3had/MIaTGgRFkHApXwytYs77k4geaNcmlb6nzmAABcYjW1CLYh83Zt0AbzLFsDT9ZcRY3u2UjhNf6efSaw==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - } - }, - "@parcel/cache": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.6.2.tgz", - "integrity": "sha512-hhJ6AsEGybeQZd9c/GYqfcKTgZKQXu3Xih6TlnP3gdR3KZoJOnb40ovHD1yYg4COvfcXThKP1cVJ18J6rcv3IA==", - "requires": { - "@parcel/fs": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/utils": "2.6.2", - "lmdb": "2.5.2" - }, - "dependencies": { - "@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "optional": true - }, - "lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2", - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - } - }, - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - } - } - }, - "@parcel/codeframe": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.6.2.tgz", - "integrity": "sha512-oFlHr6HCaYYsB4SHkU+gn9DKtbzvv3/4NdwMX0/6NAKyYVI7inEsXyPGw2Bbd2ZCFatW9QJZUETF0etvh5AEfQ==", - "requires": { - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@parcel/compressor-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.6.2.tgz", - "integrity": "sha512-P3c8jjV5HVs+fNDjhvq7PtHXNm687nit1iwTS5VAt+ScXKhKBhoIJ56q+9opcw0jnXVjAAgZqcRZ50oAJBGdKw==", - "requires": { - "@parcel/plugin": "2.6.2" - } - }, - "@parcel/core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.6.2.tgz", - "integrity": "sha512-JlKS3Ux0ngmdooSBbzQLShHJdsapF9E7TGMo1hFaHRquZip/DaqzvysYrgMJlDuCoLArciq5ei7ZKzGeK9zexA==", - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/events": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/graph": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/package-manager": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "dependencies": { - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "@parcel/diagnostic": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.6.2.tgz", - "integrity": "sha512-3ODSBkKVihENU763z1/1DhGAWFhYWRxOCOShC72KXp+GFnSgGiBsxclu8NBa/N948Rzp8lqQI8U1nLcKkh0O/w==", - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/events": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.6.2.tgz", - "integrity": "sha512-IaCjOeA5ercdFVi1EZOmUHhGfIysmCUgc2Th9hMugSFO0I3GzRsBcAdP6XPfWm+TV6sQ/qZRfdk/drUxoAupnw==" - }, - "@parcel/fs": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.6.2.tgz", - "integrity": "sha512-mIhqdF3tjgeoIGqW7Nc/xfM2ClID7o8livwUe5lpQEP+ZaIBiMigXs6ckv3WToCACK+3uylrSD2A/HmlhrxMqQ==", - "requires": { - "@parcel/fs-search": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.6.2" - } - }, - "@parcel/fs-search": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.6.2.tgz", - "integrity": "sha512-4STid1zqtGnmGjHD/2TG2g/zPDiCTtE3IAS24QYH3eiUAz2uoKGgEqd2tZbZ2yI96jtCuIhC1bzVu8Hbykls7w==", - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/graph": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.6.2.tgz", - "integrity": "sha512-DPH4G/RBFJWayIN2fnhDXqhUw75n7k15YsGzdDKiXuwwz4wMOjoL4cyrI6zOf1SIyh3guRmeTYJ4jjPzwrLYww==", - "requires": { - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - } - }, - "@parcel/hash": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.6.2.tgz", - "integrity": "sha512-tFB+cJU1Wqag6WyJgsmx3nx+xhmjcNZqtWh/MtK1lHNnZdDRk6bjr7SapnygBwruz+SmSt5bbdVThcpk2dRCcA==", - "requires": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - } - }, - "@parcel/logger": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.6.2.tgz", - "integrity": "sha512-Sz5YGCj1DbEiX0/G8Uw97LLZ0uEK+qtWcRAkHNpJpeMiSqDiRNevxXltz42EcLo+oCh4d4wyiVzwi9mNwzhS/Q==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/events": "2.6.2" - } - }, - "@parcel/markdown-ansi": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.6.2.tgz", - "integrity": "sha512-N/h9J4eibhc+B+krzvPMzFUWL37GudBIZBa7XSLkcuH6MnYYfh6rrMvhIyyESwk6VkcZNVzAeZrGQqxEs0dHDQ==", - "requires": { - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@parcel/namer-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.6.2.tgz", - "integrity": "sha512-mp7bx/BQaIuohmZP0uE+gAmDBzzH0Yu8F4yCtE611lc6i0mou+nWRhzyKLNC/ieuI8DB3BFh2QQKeTxJn4W0qg==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "nullthrows": "^1.1.1" - } - }, - "@parcel/node-resolver-core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.6.2.tgz", - "integrity": "sha512-4b2L5QRYlTybvv3+TIRtwg4PPJXy+cRShCBa8eu1K0Fj297Afe8MOZrcVV+RIr2KPMIRXcIJoqDmOhyci/DynA==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "@parcel/optimizer-terser": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.6.2.tgz", - "integrity": "sha512-ZSEVQ3G3zOiVPeHvH+BrHegZybrQj9kWQAaAA92leSqbvf6UaX4xqXbGRg2OttNFtbGYBzIl28Zm4t2SLeUIuA==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - } - }, - "@parcel/package-manager": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.6.2.tgz", - "integrity": "sha512-xGMqTgnwTE3rgzYwUZMKxR8fzmP5iSYz/gj2H8FR3pEmwh/8xCMtNjTSth+hPVGuqgRZ6JxwpfdY/fXdZ61ViQ==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "semver": "^5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "@parcel/packager-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.6.2.tgz", - "integrity": "sha512-fm5rKWtaExR0W+UEKWivXNPysRFxuBCdskdxDByb1J1JeGMvp7dJElbi8oXDAQM4MnM5EyG7cg47SlMZNTLm4A==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - }, - "dependencies": { - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "requires": { - "type-fest": "^0.20.2" - } - } - } - }, - "@parcel/packager-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.6.2.tgz", - "integrity": "sha512-Rl3ZkMtMjb+LEvRowijDD8fibUAS6rWK0/vZQMk9cDNYCP2gCpZayLk0HZIGxneeTbosf/0sbngHq4VeRQOnQA==", - "requires": { - "@parcel/plugin": "2.6.2" - } - }, - "@parcel/plugin": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.6.2.tgz", - "integrity": "sha512-wbbWsM23Pr+8xtLSvf+UopXdVYlpKCCx6PuuZaZcKo+9IcDCWoGXD4M8Kkz14qBmkFn5uM00mULUqmVdSibB2w==", - "requires": { - "@parcel/types": "2.6.2" - } - }, - "@parcel/reporter-dev-server": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.6.2.tgz", - "integrity": "sha512-5QtL3ETMFL161jehlIK6rjBM+Pqk5cMhr60s9yLYqE1GY4M4gMj+Act+FXViyM6gmMA38cPxDvUsxTKBYXpFCw==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2" - } - }, - "@parcel/resolver-default": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.6.2.tgz", - "integrity": "sha512-Lo5sWb5QkjWvdBr+TdmAF6Mszb/sMldBBatc1osQTkHXCy679VMH+lfyiWxHbwK+F1pmdMeBJpYcMxvrgT8EsA==", - "requires": { - "@parcel/node-resolver-core": "2.6.2", - "@parcel/plugin": "2.6.2" - } - }, - "@parcel/runtime-browser-hmr": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.6.2.tgz", - "integrity": "sha512-M4X0+7dyfdI6smwGUGjGXb8Ns3HX7ZrTemyq4Gc7zp7P/5gWjR8i9eISz46sXmF9bf01a/4dKZpoCC9un1pH1g==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2" - } - }, - "@parcel/runtime-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.6.2.tgz", - "integrity": "sha512-0S3JFwgvs6FmEx2dHta9R0Sfu8vCnFAm4i7Y4efGHtAcTrF2CHjyiz4/hG+RQGJ70eoWW463Q+8qt6EKbkaOBQ==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - } - }, - "@parcel/runtime-react-refresh": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.6.2.tgz", - "integrity": "sha512-DJTm5D/tUAGZm0o3ndDOPbKwdYrobuvm4jvkPq31LdEUqVvyuzBAMlqQFHc1yJEJDRRWOIQwQP9Y0NQbJmXFfg==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" - }, - "dependencies": { - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==" - } - } - }, - "@parcel/runtime-service-worker": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.6.2.tgz", - "integrity": "sha512-9jV+RwVEeDUI5+eLy8j1tapTNoHHGOY2+JUprcObQkQ8fux7KltQBJWFhpkUdGtz5LTCNXtj9tdycFtS5lmSzg==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "nullthrows": "^1.1.1" - } - }, - "@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/transformer-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.6.2.tgz", - "integrity": "sha512-uhXAMTjE/Q61amflV8qVpb73mj+mIdXIMH0cSks1/gDIAxcgIvWvrE14P4TvY6zJ1q1iRJRIRUN6cFSXqjjLSA==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/plugin": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.6.2", - "@parcel/workers": "2.6.2", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "@parcel/transformer-json": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.6.2.tgz", - "integrity": "sha512-QGcIIvbPF/u10ihYvQhxXqb2QMXWSzcBxJrOSIXIl74TUGrWX05D5LmjDA/rzm/n/kvRnBkFNP60R/smYb8x+Q==", - "requires": { - "@parcel/plugin": "2.6.2", - "json5": "^2.2.0" - } - }, - "@parcel/transformer-raw": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.6.2.tgz", - "integrity": "sha512-CsofYq5g9Zj/FNmhya2R7Xp3WHlzz34mEdN69bds3azRYHCrl/TS33xXcp/9J+74SEIY1Ufh552o1cM3fnSrDQ==", - "requires": { - "@parcel/plugin": "2.6.2" - } - }, - "@parcel/transformer-react-refresh-wrap": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.6.2.tgz", - "integrity": "sha512-7EE68ebISz+oAHm64ZJbz6uJQT4aOoB8QiK3PvuY6+RsP7aK4/FEHGM1afW49KrZbP4lWjloEkcJm/88DfBiGw==", - "requires": { - "@parcel/plugin": "2.6.2", - "@parcel/utils": "2.6.2", - "react-refresh": "^0.9.0" - }, - "dependencies": { - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==" - } - } - }, - "@parcel/types": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.6.2.tgz", - "integrity": "sha512-MV8BFpCIs2jMUvK2RHqzkoiuOQ//JIbrD1zocA2YRW3zuPL/iABvbAABJoXpoPCKikVWOoCWASgBfWQo26VvJQ==", - "requires": { - "@parcel/cache": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/fs": "2.6.2", - "@parcel/package-manager": "2.6.2", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.6.2", - "utility-types": "^3.10.0" - } - }, - "@parcel/utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.6.2.tgz", - "integrity": "sha512-Ug7hpRxjgbY5AopW55nY7MmGMVmwmN+ihfCmxJkBUoESTG/3iq8uME7GjyOgW5DkQc2K7q62i8y8N0wCJT1u4Q==", - "requires": { - "@parcel/codeframe": "2.6.2", - "@parcel/diagnostic": "2.6.2", - "@parcel/hash": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/markdown-ansi": "2.6.2", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@parcel/watcher": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", - "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", - "requires": { - "@parcel/watcher-android-arm64": "2.3.0", - "@parcel/watcher-darwin-arm64": "2.3.0", - "@parcel/watcher-darwin-x64": "2.3.0", - "@parcel/watcher-freebsd-x64": "2.3.0", - "@parcel/watcher-linux-arm-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-musl": "2.3.0", - "@parcel/watcher-linux-x64-glibc": "2.3.0", - "@parcel/watcher-linux-x64-musl": "2.3.0", - "@parcel/watcher-win32-arm64": "2.3.0", - "@parcel/watcher-win32-ia32": "2.3.0", - "@parcel/watcher-win32-x64": "2.3.0", - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - } - }, - "@parcel/watcher-android-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", - "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", - "optional": true - }, - "@parcel/watcher-darwin-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", - "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", - "optional": true - }, - "@parcel/watcher-darwin-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", - "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", - "optional": true - }, - "@parcel/watcher-freebsd-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", - "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", - "optional": true - }, - "@parcel/watcher-linux-arm-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", - "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", - "optional": true - }, - "@parcel/watcher-linux-arm64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", - "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", - "optional": true - }, - "@parcel/watcher-linux-arm64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", - "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", - "optional": true - }, - "@parcel/watcher-linux-x64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", - "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", - "optional": true - }, - "@parcel/watcher-linux-x64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", - "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", - "optional": true - }, - "@parcel/watcher-win32-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", - "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", - "optional": true - }, - "@parcel/watcher-win32-ia32": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", - "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", - "optional": true - }, - "@parcel/watcher-win32-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", - "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", - "optional": true - }, - "@parcel/workers": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.6.2.tgz", - "integrity": "sha512-wBgUjJQm+lDd12fPRUmk09+ujTA9DgwPdqylSFK0OtI/yT6A+2kArUqjp8IwWo2tCJXoMzXBne2XQIWKqMiN4Q==", - "requires": { - "@parcel/diagnostic": "2.6.2", - "@parcel/logger": "2.6.2", - "@parcel/types": "2.6.2", - "@parcel/utils": "2.6.2", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - } - }, - "@percy/cli": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.27.4.tgz", - "integrity": "sha512-eIM44ejCMFc/S2W7X0htV+lvvmf63x5CaBpsSoQ9LRc/W02zHVAwQYdFFUowZEK6G1EwJEPIUnDxuuEx9PLG5A==", - "dev": true, - "requires": { - "@percy/cli-app": "1.27.4", - "@percy/cli-build": "1.27.4", - "@percy/cli-command": "1.27.4", - "@percy/cli-config": "1.27.4", - "@percy/cli-exec": "1.27.4", - "@percy/cli-snapshot": "1.27.4", - "@percy/cli-upload": "1.27.4", - "@percy/client": "1.27.4", - "@percy/logger": "1.27.4" - } - }, - "@percy/cli-app": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.27.4.tgz", - "integrity": "sha512-av/s6K2QmQgq4SCQQ+3lmteNHeQtIpMeBjMfSgxs9zeBoPVOMx5hXrdsi6l7ChvOLXyYfzl/TbEuwrSDXiA8mw==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4", - "@percy/cli-exec": "1.27.4" - } - }, - "@percy/cli-build": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.27.4.tgz", - "integrity": "sha512-tzCAcV0sAw608Gr/Q6NtPvVkA8dnIehMzvEXNIN3WP9DkprOgu7MYuexN0fZXf4vSroDWYXT87pHYP8YrrnDag==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4" - } - }, - "@percy/cli-command": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.27.4.tgz", - "integrity": "sha512-YDKeeOr1MvksDOnc2ZKQ/XuERGrWwzuT/vWZ9it8L+0SyPj28UbklDu0e9zBgPsSDfxJlIvsWXRuHNGHsweKXg==", - "dev": true, - "requires": { - "@percy/config": "1.27.4", - "@percy/core": "1.27.4", - "@percy/logger": "1.27.4" - } - }, - "@percy/cli-config": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.27.4.tgz", - "integrity": "sha512-wFtQwPw4LEqpcZ6ac6WtejyGrvrrzzLdyvXNvsCPQLE47qXnXVXJ+E99k9KGcjavtUuPxrbWtX996Fz9Fb5hoQ==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4" - } - }, - "@percy/cli-exec": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.27.4.tgz", - "integrity": "sha512-aSDLvzXXdwJso+p5iI4iTOa7AYzgFdRoqY9ij/R5aAL9juNkvG5QatB1bkUNbJabKFe16t7iigt4eJnlS0R13A==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4", - "cross-spawn": "^7.0.3", - "which": "^2.0.2" - } - }, - "@percy/cli-snapshot": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.27.4.tgz", - "integrity": "sha512-dDT2UpeP6X5NcMdj3AKLhHGmnobwzlXsHa52C+ne3kg3HSZgaXH9OsNY866Xe7onvcsZxvnRKDYHmWW6kC3cKQ==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4", - "yaml": "^2.0.0" - } - }, - "@percy/cli-upload": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.27.4.tgz", - "integrity": "sha512-+4mcEOUydFubyMWVzQjPV79sL1Jar95SR7Yr7Vp4FBoE0iq0CbaHoJtyOWDfwvHYYp4rRjVMxpY0ha3jnmF0mA==", - "dev": true, - "requires": { - "@percy/cli-command": "1.27.4", - "fast-glob": "^3.2.11", - "image-size": "^1.0.0" - } - }, - "@percy/client": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.27.4.tgz", - "integrity": "sha512-1F8ulTJhfk4/Lgj1Cn0blaRd8vTRJDxahAGseTbfrnZ2PHsftPZ65/5nCHPtpdD/2CE8N5COBQscGTMQQO+hBA==", - "dev": true, - "requires": { - "@percy/env": "1.27.4", - "@percy/logger": "1.27.4" - } - }, - "@percy/config": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.27.4.tgz", - "integrity": "sha512-mlgiOdzdSfUSx9FskVIjmbT/iHbTif0Ow5evZQJTT1W0xgHOBWDCZyhINdsqulSBw+K1PNhHsu1J0h2ijxF4uA==", - "dev": true, - "requires": { - "@percy/logger": "1.27.4", - "ajv": "^8.6.2", - "cosmiconfig": "^8.0.0", - "yaml": "^2.0.0" - } - }, - "@percy/core": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.27.4.tgz", - "integrity": "sha512-WdsA4zlPgXl9xj+a5WW2wA20iU6VTDmRq5sgsYNSuPzZfQB2I5Cecgvb55p86dhlUTbPJrC76daQKzDTGe0hfA==", - "dev": true, - "requires": { - "@percy/client": "1.27.4", - "@percy/config": "1.27.4", - "@percy/dom": "1.27.4", - "@percy/logger": "1.27.4", - "@percy/webdriver-utils": "1.27.4", - "content-disposition": "^0.5.4", - "cross-spawn": "^7.0.3", - "extract-zip": "^2.0.1", - "fast-glob": "^3.2.11", - "micromatch": "^4.0.4", - "mime-types": "^2.1.34", - "path-to-regexp": "^6.2.0", - "rimraf": "^3.0.2", - "ws": "^8.0.0" - } - }, - "@percy/dom": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.27.4.tgz", - "integrity": "sha512-pwPDx3e9y7uRobVlEya8xu3BB3GeXbC74kQ6pPM/wFYDwi/Dg8DJywCsj5Nko/7QuhXP02rYgatkbREOIRxDnA==", - "dev": true - }, - "@percy/env": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.27.4.tgz", - "integrity": "sha512-Xl2VUpljOrlCvAp/+KfmN9NUcTGpRdXPa1U9zSIyBnV/oAksp3/CK5EPpKZX/f8xUUkTp78UPaG99sEMA8VvXQ==", - "dev": true, - "requires": { - "@percy/logger": "1.27.4" - } - }, - "@percy/logger": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.27.4.tgz", - "integrity": "sha512-AwXqYaDkHaq1TPkP+ByB8rjvH9ddvkAH9tFd2kmq8AeFFXZ0amAPSbm6u090OUtdHWjRmKQK9JjSouBxEh0aRw==", - "dev": true - }, - "@percy/sdk-utils": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.27.4.tgz", - "integrity": "sha512-vhPcdtmJlvTYJ5VOqiVzo02ujdtBFNw1/Bj+2ybiZgn7PkCDPFcITfXoWWPea319EIibGC4ZHjWHctRBgtW/tQ==", - "dev": true - }, - "@percy/webdriver-utils": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/@percy/webdriver-utils/-/webdriver-utils-1.27.4.tgz", - "integrity": "sha512-pZOOYns8Fikh2qlbxO16DxFEnCrnFIoLpE7iz4M9jXxOfk16VZF1PWknMChSr5NqG2I9k2OMjizUE2j8zvtl2Q==", - "dev": true, - "requires": { - "@percy/config": "1.27.4", - "@percy/sdk-utils": "1.27.4" - } - }, - "@philpl/buble": { - "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@philpl/buble/-/buble-0.19.7.tgz", - "integrity": "sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA==", - "requires": { - "acorn": "^6.1.1", - "acorn-class-fields": "^0.2.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", - "chalk": "^2.4.2", - "magic-string": "^0.25.2", - "minimist": "^1.2.0", - "os-homedir": "^1.0.1", - "regexpu-core": "^4.5.4" - } - }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", - "requires": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", - "dev": true - }, - "@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", - "requires": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" - } - }, - "@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "devOptional": true - }, - "@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" - }, - "@prisma/prisma-fmt-wasm": { - "version": "4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49", - "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49.tgz", - "integrity": "sha512-12dZRXW36s3hRHLeD8c4S3o1ZZcnFt1NxhBrSlYepnMxatfkj5S8aIDP/G+zzUqucB//kGZZWNX3eUcmxMsEqw==", - "dev": true - }, - "@react-aria/focus": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.0.tgz", - "integrity": "sha512-GP6EYI07E8NKQQcXHjpIocEU0vh0oi0Vcsd+/71fKS0NnTR0TUOEeil0JuuQ9ymkmPDTu51Aaaa4FxVsuN/23A==", - "requires": { - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - }, - "clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" - } - } - }, - "@react-aria/i18n": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.0.tgz", - "integrity": "sha512-sviD5Y1pLPG49HHRmVjR+5nONrp0HK219+nu9Y7cDfUhXu2EjyhMS9t/n9/VZ69hHChZ2PnHYLEE2visu9CuCg==", - "requires": { - "@internationalized/date": "^3.5.1", - "@internationalized/message": "^3.1.1", - "@internationalized/number": "^3.5.0", - "@internationalized/string": "^3.2.0", - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-aria/interactions": { - "version": "3.20.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.1.tgz", - "integrity": "sha512-PLNBr87+SzRhe9PvvF9qvzYeP4ofTwfKSorwmO+hjr3qoczrSXf4LRQlb27wB6hF10C7ZE/XVbUI1lj4QQrZ/g==", - "requires": { - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-aria/overlays": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.20.0.tgz", - "integrity": "sha512-2m7MpRJL5UucbEuu08lMHsiFJoDowkJV4JAIFBZYK1NzVH0vF/A+w9HRNM7jRwx2DUxE+iIsZnl8yKV/7KY8OQ==", - "requires": { - "@react-aria/focus": "^3.16.0", - "@react-aria/i18n": "^3.10.0", - "@react-aria/interactions": "^3.20.1", - "@react-aria/ssr": "^3.9.1", - "@react-aria/utils": "^3.23.0", - "@react-aria/visually-hidden": "^3.8.8", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-aria/ssr": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz", - "integrity": "sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg==", - "requires": { - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-aria/tooltip": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.0.tgz", - "integrity": "sha512-+u9Sftkfe09IDyPEnbbreFKS50vh9X/WTa7n1u2y3PenI9VreLpUR6czyzda4BlvQ95e9jQz1cVxUjxTNaZmBw==", - "requires": { - "@react-aria/focus": "^3.16.0", - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-stately/tooltip": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-aria/utils": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.0.tgz", - "integrity": "sha512-fJA63/VU4iQNT8WUvrmll3kvToqMurD69CcgVmbQ56V7ZbvlzFi44E7BpnoaofScYLLtFWRjVdaHsohT6O/big==", - "requires": { - "@react-aria/ssr": "^3.9.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - }, - "clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" - } - } - }, - "@react-aria/visually-hidden": { - "version": "3.8.8", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.8.tgz", - "integrity": "sha512-Cn2PYKD4ijGDtF0+dvsh8qa4y7KTNAlkTG6h20r8Q+6UTyRNmtE2/26QEaApRF8CBiNy9/BZC/ZC4FK2OjvCoA==", - "requires": { - "@react-aria/interactions": "^3.20.1", - "@react-aria/utils": "^3.23.0", - "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-stately/overlays": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz", - "integrity": "sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA==", - "requires": { - "@react-stately/utils": "^3.9.0", - "@react-types/overlays": "^3.8.4", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-stately/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA==", - "requires": { - "@react-stately/overlays": "^3.6.4", - "@react-types/tooltip": "^3.4.6", - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-stately/utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz", - "integrity": "sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw==", - "requires": { - "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@react-types/button": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz", - "integrity": "sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw==", - "requires": { - "@react-types/shared": "^3.22.0" - } - }, - "@react-types/overlays": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz", - "integrity": "sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w==", - "requires": { - "@react-types/shared": "^3.22.0" - } - }, - "@react-types/shared": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz", - "integrity": "sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA==", - "requires": {} - }, - "@react-types/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw==", - "requires": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", - "requires": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - } - }, - "@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "requires": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "@swc/helpers": { - "version": "0.4.36", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", - "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", - "requires": { - "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", - "tslib": "^2.4.0" - } - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@turist/fetch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.2.0.tgz", - "integrity": "sha512-2x7EGw+6OJ29phunsbGvtxlNmSfcuPcyYudkMbi8gARCP9eJ1CtuMvnVUHL//O9Ixi9SJiug8wNt6lj86pN8XQ==", - "requires": { - "@types/node-fetch": "2" - } - }, - "@turist/time": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.2.tgz", - "integrity": "sha512-qLOvfmlG2vCVw5fo/oz8WAZYlpe5a5OurgTj3diIxJCdjRHpapC+vQCz3er9LV79Vcat+DifBjeAhOAdmndtDQ==" - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/common-tags": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", - "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==" - }, - "@types/component-emitter": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.14.tgz", - "integrity": "sha512-lmPil1g82wwWg/qHSxMWkSKyJGQOK+ejXeMAAWyxNtVUD0/Ycj2maL63RAqpxVfdtvTfZkRnqzB0A9ft59y69g==" - }, - "@types/configstore": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha512-YY+hm3afkDHeSM2rsFXxeZtu0garnusBWNG1+7MknmDWQHqcH2w21/xOU9arJUi8ch4qyFklidANLCu3ihhVwQ==" - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" - }, - "@types/glob": { - "version": "5.0.38", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.38.tgz", - "integrity": "sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", - "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", - "requires": { - "@types/unist": "^2" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "requires": { - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" - }, - "@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "requires": { - "@types/unist": "^2" - } - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" - }, - "@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "@types/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", - "requires": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" - }, - "@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" - }, - "@types/reach__router": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.14.tgz", - "integrity": "sha512-2iOQZbwfw1ZYwYK+dRp7D1b8kU6GlFPJ/iEt33zDYxfId5CAKT7vX3lN/XmJ+FaMZ3FyB99tPgfajcmZnTqdtg==", - "requires": { - "@types/react": "*" - } - }, - "@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", - "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-instantsearch-core": { - "version": "6.26.8", - "resolved": "https://registry.npmjs.org/@types/react-instantsearch-core/-/react-instantsearch-core-6.26.8.tgz", - "integrity": "sha512-XjsnIaafuT3AnnpFhriv3vt9rGytIVv7+1bHEu185VRjbF0pN5znM4ggRCY8JmTDRPvGWe01qSV48oUW37apGQ==", - "dev": true, - "requires": { - "@types/react": "*", - "algoliasearch": ">=4", - "algoliasearch-helper": ">=3" - } - }, - "@types/react-instantsearch-dom": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/@types/react-instantsearch-dom/-/react-instantsearch-dom-6.12.4.tgz", - "integrity": "sha512-J5CeXqg5Iq7KWVeVnLBO8Yk52+joJRknipC2RHiTVzEM+c5xa58EqJH3Y9Whrjbz/USZd62XlL852lt0T8zxUA==", - "dev": true, - "requires": { - "@types/react": "*", - "@types/react-instantsearch-core": "*" - } - }, - "@types/react-transition-group": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", - "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", - "requires": { - "@types/react": "*" - } - }, - "@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "requires": { - "@types/node": "*" - } - }, - "@types/rimraf": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.5.tgz", - "integrity": "sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==", - "requires": { - "@types/glob": "*", - "@types/node": "*" - } - }, - "@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "@types/sharp": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.5.tgz", - "integrity": "sha512-EhO29617AIBqxoVtpd1qdBanWpspk/kD2B6qTFRJ31Q23Rdf+DNU1xlHSwtqvwq1vgOqBwq1i38SX+HGCymIQg==", - "requires": { - "@types/node": "*" - } - }, - "@types/styled-components": { - "version": "5.1.28", - "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.28.tgz", - "integrity": "sha512-nu0VKNybkjvUqJAXWtRqKd7j3iRUl8GbYSTvZNuIBJcw/HUp1Y4QUXNLlj7gcnRV/t784JnHAlvRnSnE3nPbJA==", - "dev": true, - "requires": { - "@types/hoist-non-react-statics": "*", - "@types/react": "*", - "csstype": "^3.0.2" - } - }, - "@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" - }, - "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", - "requires": { - "vfile-message": "*" - } - }, - "@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yoga-layout": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@vercel/webpack-asset-relocator-loader": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", - "integrity": "sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g==", - "requires": { - "resolve": "^1.10.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "requires": { - "@webassemblyjs/ast": "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" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@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" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "acorn-class-fields": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz", - "integrity": "sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ==", - "requires": {} - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true - }, - "add-filename-increment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-filename-increment/-/add-filename-increment-1.0.0.tgz", - "integrity": "sha512-pFV8VZX8jxuVMIycKvGZkWF/ihnUubu9lbQVnOnZWp7noVxbKQTNj7zG2y9fXdPcuZ6lAN3Drr517HaivGCjdQ==", - "requires": { - "strip-filename-increment": "^2.0.1" - } - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", - "requires": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" - } - }, - "algoliasearch-helper": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz", - "integrity": "sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==", - "requires": { - "@algolia/events": "^4.0.1" - } - }, - "anser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", - "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==" - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "application-config-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", - "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "requires": { - "dequal": "^2.0.3" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "async-cache": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", - "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", - "requires": { - "lru-cache": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - } - } - }, - "asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" - }, - "autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "requires": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==" - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "requires": { - "dequal": "^2.0.3" - } - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "peer": true - } - } - }, - "babel-jsx-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-jsx-utils/-/babel-jsx-utils-1.1.0.tgz", - "integrity": "sha512-Mh1j/rw4xM9T3YICkw22aBQ78FhsHdsmlb9NEk4uVAFBOg+Ez9ZgXXHugoBPCZui3XLomk/7/JBBH4daJqTkQQ==" - }, - "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-add-module-exports": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", - "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==" - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-lodash": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", - "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0-beta.49", - "@babel/types": "^7.0.0-beta.49", - "glob": "^7.1.1", - "lodash": "^4.17.10", - "require-package-name": "^2.0.1" - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - } - }, - "babel-plugin-remove-graphql-queries": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.25.0.tgz", - "integrity": "sha512-enyqRNRrn7vTG3nwg1V+XhoAJIyUv3ZukQCs5KbHOK+WNDDiGZQzIG+FCiZFACScdZBJWyx7TYRYbOFJZ/KEGg==", - "requires": { - "@babel/runtime": "^7.15.4", - "@babel/types": "^7.15.4", - "gatsby-core-utils": "^3.25.0" - } - }, - "babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - } - }, - "babel-preset-gatsby": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-2.25.0.tgz", - "integrity": "sha512-KFfSTDAkY87/Myq1KIUk9cVphWZem/08U7ps9Hiotbo6Mge/lL6ggh3xKP9SdR5Le4DLLyIUI7a4ILrAVacYDg==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.14.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/preset-env": "^7.15.4", - "@babel/preset-react": "^7.14.0", - "@babel/runtime": "^7.15.4", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^3.25.0", - "gatsby-legacy-polyfills": "^2.25.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "better-opn": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", - "requires": { - "open": "^7.0.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "cache-manager": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", - "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", - "requires": { - "async": "1.5.2", - "lodash.clonedeep": "4.5.0", - "lru-cache": "4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "integrity": "sha512-WKhDkjlLwzE8jAQdQlsxLUQTPXLCKX/4cJk6s5AlRtJkDBk0IKH5O51bVDH61K9N4bhbbyvLM6EiOuE8ovApPA==", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - } - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" - } - } - }, - "camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001565", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", - "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==" - }, - "capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "requires": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "change-case-all": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", - "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", - "requires": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "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" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "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" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==" - }, - "core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", - "requires": { - "browserslist": "^4.22.1" - } - }, - "core-js-pure": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.3.tgz", - "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - } - }, - "create-gatsby": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-2.25.0.tgz", - "integrity": "sha512-96Kl/6Far2j65/vFv/6Mb9+T+/4oW8hlC3UmdfjgBgUIzTPFmezY1ygPu2dfCKjprWkArB8DpE7EsAaJoRKB1Q==", - "requires": { - "@babel/runtime": "^7.15.4" - } - }, - "cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "requires": { - "node-fetch": "^2.6.12" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "requires": {} - }, - "css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "requires": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "css-minimizer-webpack-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-2.0.0.tgz", - "integrity": "sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==", - "requires": { - "cssnano": "^5.0.0", - "jest-worker": "^26.3.0", - "p-limit": "^3.0.2", - "postcss": "^8.2.9", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-selector-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", - "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" - }, - "css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" - }, - "cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "requires": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "dependencies": { - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } - } - }, - "cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "requires": { - "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" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" - }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "requires": { - "@babel/runtime": "^7.21.0" - } - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" - } - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "devcert": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", - "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", - "requires": { - "@types/configstore": "^2.1.1", - "@types/debug": "^0.0.30", - "@types/get-port": "^3.2.0", - "@types/glob": "^5.0.34", - "@types/lodash": "^4.14.92", - "@types/mkdirp": "^0.5.2", - "@types/node": "^8.5.7", - "@types/rimraf": "^2.0.2", - "@types/tmp": "^0.0.33", - "application-config-path": "^0.1.0", - "command-exists": "^1.2.4", - "debug": "^3.1.0", - "eol": "^0.9.1", - "get-port": "^3.2.0", - "glob": "^7.1.2", - "is-valid-domain": "^0.1.6", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "password-prompt": "^1.0.4", - "rimraf": "^2.6.2", - "sudo-prompt": "^8.2.0", - "tmp": "^0.0.33", - "tslib": "^1.10.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.594", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.594.tgz", - "integrity": "sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", - "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" - }, - "dependencies": { - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - } - } - }, - "engine.io-client": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.1.4.tgz", - "integrity": "sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg==", - "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - } - } - }, - "engine.io-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", - "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", - "requires": { - "base64-arraybuffer": "0.1.4" - } - }, - "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "requires": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "requires": { - "stackframe": "^1.3.4" - } - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "requires": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", - "requires": { - "confusing-browser-globals": "^1.0.10" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", - "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", - "requires": { - "lodash": "^4.17.15", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "requires": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - } - }, - "eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - }, - "eslint-webpack-plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", - "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", - "requires": { - "@types/eslint": "^7.29.0", - "arrify": "^2.0.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "requires": { - "@types/node": "*", - "require-like": ">= 0.1.1" - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-source-polyfill": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz", - "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "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" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "express-graphql": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", - "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", - "requires": { - "accepts": "^1.3.7", - "content-type": "^1.0.4", - "http-errors": "1.8.0", - "raw-body": "^2.4.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - } - } - }, - "express-http-proxy": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", - "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", - "requires": { - "debug": "^3.0.1", - "es6-promise": "^4.1.1", - "raw-body": "^2.3.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "requires": { - "@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" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "requires": { - "bser": "2.1.1" - } - }, - "fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "requires": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "fd": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", - "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "requires": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - } - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" - }, - "filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - } - }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" - }, - "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "requires": { - "@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" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@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" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==" - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "gatsby": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.22.1.tgz", - "integrity": "sha512-5alRl+7RlK9kVTX4wwECx8XD181Ti5HTgCK5IL0uFBJlqeA6UDLOY+S9noOQgvoFgzwApPOGoiV5sKlSTxPnfw==", - "requires": { - "@babel/code-frame": "^7.14.0", - "@babel/core": "^7.15.5", - "@babel/eslint-parser": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/parser": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "@builder.io/partytown": "^0.5.2", - "@gatsbyjs/reach-router": "^1.3.9", - "@gatsbyjs/webpack-hot-middleware": "^2.25.2", - "@graphql-codegen/add": "^3.1.1", - "@graphql-codegen/core": "^2.5.1", - "@graphql-codegen/plugin-helpers": "^2.4.2", - "@graphql-codegen/typescript": "^2.4.8", - "@graphql-codegen/typescript-operations": "^2.3.5", - "@graphql-tools/code-file-loader": "^7.2.14", - "@graphql-tools/load": "^7.5.10", - "@jridgewell/trace-mapping": "^0.3.13", - "@nodelib/fs.walk": "^1.2.8", - "@parcel/cache": "2.6.2", - "@parcel/core": "2.6.2", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", - "@types/http-proxy": "^1.17.7", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.0", - "address": "1.1.2", - "anser": "^2.1.0", - "autoprefixer": "^10.4.0", - "axios": "^0.21.1", - "babel-loader": "^8.2.3", - "babel-plugin-add-module-exports": "^1.0.4", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-lodash": "^3.3.4", - "babel-plugin-remove-graphql-queries": "^4.22.0", - "babel-preset-gatsby": "^2.22.1", - "better-opn": "^2.1.1", - "bluebird": "^3.7.2", - "browserslist": "^4.17.5", - "cache-manager": "^2.11.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "common-tags": "^1.8.0", - "compression": "^1.7.4", - "cookie": "^0.4.1", - "core-js": "^3.22.3", - "cors": "^2.8.5", - "css-loader": "^5.2.7", - "css-minimizer-webpack-plugin": "^2.0.0", - "css.escape": "^1.5.1", - "date-fns": "^2.25.0", - "debug": "^3.2.7", - "deepmerge": "^4.2.2", - "detect-port": "^1.3.0", - "devcert": "^1.2.0", - "dotenv": "^8.6.0", - "enhanced-resolve": "^5.8.3", - "error-stack-parser": "^2.1.4", - "eslint": "^7.32.0", - "eslint-config-react-app": "^6.0.0", - "eslint-plugin-flowtype": "^5.10.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.5.0", - "eslint-webpack-plugin": "^2.7.0", - "event-source-polyfill": "1.0.25", - "execa": "^5.1.1", - "express": "^4.17.1", - "express-graphql": "^0.12.0", - "express-http-proxy": "^1.6.3", - "fastest-levenshtein": "^1.0.12", - "fastq": "^1.13.0", - "file-loader": "^6.2.0", - "find-cache-dir": "^3.3.2", - "fs-exists-cached": "1.0.0", - "fs-extra": "^10.1.0", - "gatsby-cli": "^4.22.1", - "gatsby-core-utils": "^3.22.0", - "gatsby-graphiql-explorer": "^2.22.0", - "gatsby-legacy-polyfills": "^2.22.0", - "gatsby-link": "^4.22.0", - "gatsby-page-utils": "^2.22.0", - "gatsby-parcel-config": "0.13.0", - "gatsby-plugin-page-creator": "^4.22.0", - "gatsby-plugin-typescript": "^4.22.0", - "gatsby-plugin-utils": "^3.16.0", - "gatsby-react-router-scroll": "^5.22.0", - "gatsby-script": "^1.7.0", - "gatsby-sharp": "^0.16.0", - "gatsby-telemetry": "^3.22.0", - "gatsby-worker": "^1.22.0", - "glob": "^7.2.3", - "globby": "^11.1.0", - "got": "^11.8.5", - "graphql": "^15.7.2", - "graphql-compose": "^9.0.7", - "graphql-playground-middleware-express": "^1.7.22", - "hasha": "^5.2.2", - "invariant": "^2.2.4", - "is-relative": "^1.0.0", - "is-relative-url": "^3.0.0", - "joi": "^17.4.2", - "json-loader": "^0.5.7", - "latest-version": "5.1.0", - "lmdb": "2.5.3", - "lodash": "^4.17.21", - "md5-file": "^5.0.0", - "meant": "^1.0.3", - "memoizee": "^0.4.15", - "micromatch": "^4.0.4", - "mime": "^2.5.2", - "mini-css-extract-plugin": "1.6.2", - "mitt": "^1.2.0", - "moment": "^2.29.1", - "multer": "^1.4.5-lts.1", - "node-fetch": "^2.6.6", - "node-html-parser": "^5.3.3", - "normalize-path": "^3.0.0", - "null-loader": "^4.0.1", - "opentracing": "^0.14.5", - "p-defer": "^3.0.0", - "parseurl": "^1.3.3", - "physical-cpu-count": "^2.0.0", - "platform": "^1.3.6", - "postcss": "^8.3.11", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^5.3.0", - "prompts": "^2.4.2", - "prop-types": "^15.7.2", - "query-string": "^6.14.1", - "raw-loader": "^4.0.2", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.9.0", - "redux": "4.1.2", - "redux-thunk": "^2.4.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.7", - "shallow-compare": "^1.2.2", - "signal-exit": "^3.0.5", - "slugify": "^1.6.1", - "socket.io": "3.1.2", - "socket.io-client": "3.1.3", - "st": "^2.0.0", - "stack-trace": "^0.0.10", - "string-similarity": "^1.2.2", - "strip-ansi": "^6.0.1", - "style-loader": "^2.0.0", - "terser-webpack-plugin": "^5.2.4", - "tmp": "^0.2.1", - "true-case-path": "^2.2.1", - "type-of": "^2.0.1", - "url-loader": "^4.1.1", - "uuid": "^8.3.2", - "webpack": "^5.61.0", - "webpack-dev-middleware": "^4.3.0", - "webpack-merge": "^5.8.0", - "webpack-stats-plugin": "^1.0.3", - "webpack-virtual-modules": "^0.3.2", - "xstate": "4.32.1", - "yaml-loader": "^0.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "gatsby-cli": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-4.25.0.tgz", - "integrity": "sha512-CJ2PCsfFmn9Xqc/jg9MFMU1BG5oQGiej1TFFx8GhChJ+kGhi9ANnNM+qo1K4vOmoMnsT4SSGiPAFD10AWFqpAQ==", - "requires": { - "@babel/code-frame": "^7.14.0", - "@babel/core": "^7.15.5", - "@babel/generator": "^7.16.8", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "@babel/runtime": "^7.15.4", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.8", - "@jridgewell/trace-mapping": "^0.3.13", - "@types/common-tags": "^1.8.1", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", - "chalk": "^4.1.2", - "clipboardy": "^2.3.0", - "common-tags": "^1.8.2", - "convert-hrtime": "^3.0.0", - "create-gatsby": "^2.25.0", - "envinfo": "^7.8.1", - "execa": "^5.1.1", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-telemetry": "^3.25.0", - "hosted-git-info": "^3.0.8", - "is-valid-path": "^0.1.1", - "joi": "^17.4.2", - "lodash": "^4.17.21", - "node-fetch": "^2.6.6", - "opentracing": "^0.14.5", - "pretty-error": "^2.1.2", - "progress": "^2.0.3", - "prompts": "^2.4.2", - "redux": "4.1.2", - "resolve-cwd": "^3.0.0", - "semver": "^7.3.7", - "signal-exit": "^3.0.6", - "stack-trace": "^0.0.10", - "strip-ansi": "^6.0.1", - "update-notifier": "^5.1.0", - "yargs": "^15.4.1", - "yoga-layout-prebuilt": "^1.10.0", - "yurnalist": "^2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "gatsby-core-utils": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.25.0.tgz", - "integrity": "sha512-lmMDwbnKpqAi+8WWd7MvCTCx3E0u7j8sbVgydERNCYVxKVpzD/aLCH4WPb4EE9m1H1rSm76w0Z+MaentyB/c/Q==", - "requires": { - "@babel/runtime": "^7.15.4", - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fastq": "^1.13.0", - "file-type": "^16.5.3", - "fs-extra": "^10.1.0", - "got": "^11.8.5", - "import-from": "^4.0.0", - "lmdb": "2.5.3", - "lock": "^1.1.0", - "node-object-hash": "^2.3.10", - "proper-lockfile": "^4.1.2", - "resolve-from": "^5.0.0", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "gatsby-graphiql-explorer": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-2.25.0.tgz", - "integrity": "sha512-/NDsaW4x3/KtvzmxYvedhDwUW1kb7gQO6iOhCkillVJSYBd6mPB8aOSulM49fyCT76UXGYFtRaUI8fyOkmpWhg==", - "requires": { - "@babel/runtime": "^7.15.4" - } - }, - "gatsby-legacy-polyfills": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-2.25.0.tgz", - "integrity": "sha512-cMeFwMH1FGENo2gNpyTyMYc/CJ7uBGE26n89OGrVVvBMaQegK+CMNZBOh09sLrXUcOp8hSOX2IwzvOlo6CdWpg==", - "requires": { - "@babel/runtime": "^7.15.4", - "core-js-compat": "3.9.0" - }, - "dependencies": { - "core-js-compat": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", - "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", - "requires": { - "browserslist": "^4.16.3", - "semver": "7.0.0" - } - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "gatsby-link": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-4.25.0.tgz", - "integrity": "sha512-Fpwk45sUMPvFUAZehNE8SLb3vQyVSxt9YxU++ZZECyukK4A/3Wxk3eIzoNvwfpMfWu6pnAkqcBhIO6KAfvbPGQ==", - "requires": { - "@types/reach__router": "^1.3.10", - "gatsby-page-utils": "^2.25.0", - "prop-types": "^15.8.1" - }, - "dependencies": { - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "gatsby-page-utils": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-2.25.0.tgz", - "integrity": "sha512-TlwS149JCeb3xGANeV8HdcQi9Q8J9hYwlO9jdxLGVIXVGbWIMWFrDuwx382jOOsISGQ3jfByToNulUzO6fiqig==", - "requires": { - "@babel/runtime": "^7.15.4", - "bluebird": "^3.7.2", - "chokidar": "^3.5.3", - "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^3.25.0", - "glob": "^7.2.3", - "lodash": "^4.17.21", - "micromatch": "^4.0.5" - } - }, - "gatsby-parcel-config": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/gatsby-parcel-config/-/gatsby-parcel-config-0.13.0.tgz", - "integrity": "sha512-RJdrI8ioVXpwoCu9XjhQu/xidIshI+Vvjn07WlGV4IRNW77Xt9t2iXk12LdTHKmvKxXmGIA0CeC0eEg79V/2EQ==", - "requires": { - "@gatsbyjs/parcel-namer-relative-to-cwd": "1.7.0", - "@parcel/bundler-default": "2.6.2", - "@parcel/compressor-raw": "2.6.2", - "@parcel/namer-default": "2.6.2", - "@parcel/optimizer-terser": "2.6.2", - "@parcel/packager-js": "2.6.2", - "@parcel/packager-raw": "2.6.2", - "@parcel/reporter-dev-server": "2.6.2", - "@parcel/resolver-default": "2.6.2", - "@parcel/runtime-browser-hmr": "2.6.2", - "@parcel/runtime-js": "2.6.2", - "@parcel/runtime-react-refresh": "2.6.2", - "@parcel/runtime-service-worker": "2.6.2", - "@parcel/transformer-js": "2.6.2", - "@parcel/transformer-json": "2.6.2", - "@parcel/transformer-raw": "2.6.2", - "@parcel/transformer-react-refresh-wrap": "2.6.2" - } - }, - "gatsby-plugin-algolia": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gatsby-plugin-algolia/-/gatsby-plugin-algolia-1.0.3.tgz", - "integrity": "sha512-fM+Kmk0O5/m8/40I2AiILdTkn8YYRsKACpgdS5z/AwE9zXZ2uCKDadWljLZ5iynmFn84f/gNNvZsuyKlOtjOtw==", - "requires": { - "algoliasearch": "^4.9.1", - "lodash.chunk": "^4.2.0" - } - }, - "gatsby-plugin-catch-links": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-4.22.0.tgz", - "integrity": "sha512-uBJMvNGEfk10WRfsUXw0OWhuP2BgamjbfDTh54emNb2MtmN3cz91G5ZDQWxFe24+3BSagJ3WN3lwDra9r1UjuQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "escape-string-regexp": "^1.0.5" - } - }, - "gatsby-plugin-google-tagmanager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-google-tagmanager/-/gatsby-plugin-google-tagmanager-4.22.0.tgz", - "integrity": "sha512-TNQLz7E3TypzXTfH/MIX1R+n8JclWfbHEK+4TnTEqjbUeTbLAkUCBlzqOCm/gWABWszpI2VYDN+UkOnfiZ3hVw==", - "requires": { - "@babel/runtime": "^7.15.4", - "web-vitals": "^1.1.2" - } - }, - "gatsby-plugin-image": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-2.22.0.tgz", - "integrity": "sha512-39XbPtUv/rtB/PffkTiEYjGGAFkqivWHGLil1aqiDo42RhPhhgHQ5Y2mn9B3ZiK86foUhSjQMRX6XSgTw2CGDA==", - "requires": { - "@babel/code-frame": "^7.14.0", - "@babel/parser": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "babel-jsx-utils": "^1.1.0", - "babel-plugin-remove-graphql-queries": "^4.22.0", - "camelcase": "^5.3.1", - "chokidar": "^3.5.3", - "common-tags": "^1.8.2", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "gatsby-plugin-utils": "^3.16.0", - "objectFitPolyfill": "^2.3.5", - "prop-types": "^15.8.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "gatsby-plugin-mdx": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-3.15.2.tgz", - "integrity": "sha512-TsEgeAq40x7IwABXZkZcGStltr6gr3DnGjmhq4QZKapjtsPeTzWKp9HhB93t0OCDD9AfWUCH/teQq0rFTvsaEw==", - "requires": { - "@babel/core": "^7.15.5", - "@babel/generator": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.0", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/preset-env": "^7.15.4", - "@babel/preset-react": "^7.14.0", - "@babel/runtime": "^7.15.4", - "@babel/types": "^7.15.4", - "camelcase-css": "^2.0.1", - "change-case": "^3.1.0", - "core-js": "^3.22.3", - "dataloader": "^1.4.0", - "debug": "^4.3.1", - "escape-string-regexp": "^1.0.5", - "eval": "^0.1.4", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.15.0", - "gray-matter": "^4.0.2", - "json5": "^2.1.3", - "loader-utils": "^1.4.0", - "lodash": "^4.17.21", - "mdast-util-to-string": "^1.1.0", - "mdast-util-toc": "^3.1.0", - "mime": "^2.4.6", - "mkdirp": "^1.0.4", - "p-queue": "^6.6.2", - "pretty-bytes": "^5.3.0", - "remark": "^10.0.1", - "remark-retext": "^3.1.3", - "retext-english": "^3.0.4", - "slugify": "^1.4.4", - "static-site-generator-webpack-plugin": "^3.4.2", - "style-to-object": "^0.3.0", - "underscore.string": "^3.3.5", - "unified": "^8.4.2", - "unist-util-map": "^1.0.5", - "unist-util-remove": "^1.0.3", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "change-case": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", - "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "requires": { - "no-case": "^2.2.0" - } - }, - "header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "requires": { - "upper-case": "^1.1.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "requires": { - "lower-case": "^1.1.2" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "^1.1.1" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "requires": { - "no-case": "^2.2.0" - } - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "requires": { - "no-case": "^2.2.0" - } - }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "requires": { - "no-case": "^2.2.0" - } - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "requires": { - "upper-case": "^1.1.1" - } - } - } - }, - "gatsby-plugin-meta-redirect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-meta-redirect/-/gatsby-plugin-meta-redirect-1.1.1.tgz", - "integrity": "sha512-Oc4qgU3SlDUM9qoxIMKO+re2bdMs3/a2KXrfL65gb8XMLsHylBbveWtXZRhgjd2QDL/49RX4S9SEykuadRju2w==", - "requires": { - "fs-extra": "^7.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - } - }, - "gatsby-plugin-page-creator": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.25.0.tgz", - "integrity": "sha512-plHek7xHSV9l1bLPa1JAnxzBqP7j2ihCPRwpBk/wIJAR8cG65wjAT+Nu8DKpW0+2/MYill84ns1r2m8g0L/7bg==", - "requires": { - "@babel/runtime": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@sindresorhus/slugify": "^1.1.2", - "chokidar": "^3.5.3", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-page-utils": "^2.25.0", - "gatsby-plugin-utils": "^3.19.0", - "gatsby-telemetry": "^3.25.0", - "globby": "^11.1.0", - "lodash": "^4.17.21" - } - }, - "gatsby-plugin-robots-txt": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-robots-txt/-/gatsby-plugin-robots-txt-1.7.1.tgz", - "integrity": "sha512-ZdZm8/4b7Whf+W5kf+DqjZwz/+DY+IB7xp227+m2f2rgGUsz8yVCz4RitiN5+EInGFZFry0v+IbrUKCXTpIZYg==", - "requires": { - "@babel/runtime": "^7.16.7", - "generate-robotstxt": "^8.0.3" - } - }, - "gatsby-plugin-sharp": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.22.0.tgz", - "integrity": "sha512-LL9M6aa5lXXRg1CrjIs10v2gMyjnVWBwWNXZCQzhP2OHdfxPhL4YapYIWPIJXqQSZG85bOP09fEnFfOpttfgUQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "@gatsbyjs/potrace": "^2.3.0", - "async": "^3.2.4", - "bluebird": "^3.7.2", - "debug": "^4.3.4", - "filenamify": "^4.3.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "gatsby-plugin-utils": "^3.16.0", - "lodash": "^4.17.21", - "mini-svg-data-uri": "^1.4.4", - "probe-image-size": "^7.2.3", - "semver": "^7.3.7", - "sharp": "^0.30.7", - "svgo": "1.3.2" - }, - "dependencies": { - "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "gatsby-plugin-sitemap": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.22.0.tgz", - "integrity": "sha512-51iJqCT+bCJ37akJnSvmCTjqVBIFLe/oE0sBLyjkCbMgmCFRW67eLRMsQeLRcm4KkIex3fbpGaAOxvXvP+FFUQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "common-tags": "^1.8.2", - "minimatch": "^3.1.2", - "sitemap": "^7.0.0" - } - }, - "gatsby-plugin-smoothscroll": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-smoothscroll/-/gatsby-plugin-smoothscroll-1.2.0.tgz", - "integrity": "sha512-wfIK06xwbNx91nHVg1YJwlLUJc0EmfWqV8KgvlNr6gFa9pqMx5Mprdp5jDRloAi3+9K0dVCybPO8FfaZ0i4HgA==", - "requires": { - "smoothscroll-polyfill": "^0.4.4" - } - }, - "gatsby-plugin-styled-components": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-5.22.0.tgz", - "integrity": "sha512-L/+W8abTBTCpGpyC6efKwUcrGzE6Rk6Kgc8eTn+Nx/w+Vuxk3y4W7Ed7kuLb+MeRBfIR1PBFTJOfwum5j+Or7Q==", - "requires": { - "@babel/runtime": "^7.15.4" - } - }, - "gatsby-plugin-typescript": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.25.0.tgz", - "integrity": "sha512-8BTtiVWuIqIEGx/PBBMWd6FYPgel16hT3js7SMo5oI9K4EPsSxRItgRf41MTJGxRR20EhL4e99g2S8x0v1+odA==", - "requires": { - "@babel/core": "^7.15.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.15.4", - "babel-plugin-remove-graphql-queries": "^4.25.0" - } - }, - "gatsby-plugin-utils": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.19.0.tgz", - "integrity": "sha512-EZtvgHSU5NPbEn6a4cfSpEGCQ09SfwbhoybHTJKj1clop86HSwOCV2iH8RbCc+X6jbdgHaSZsfsl7zG1h7DBUw==", - "requires": { - "@babel/runtime": "^7.15.4", - "fastq": "^1.13.0", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "gatsby-sharp": "^0.19.0", - "graphql-compose": "^9.0.7", - "import-from": "^4.0.0", - "joi": "^17.4.2", - "mime": "^3.0.0" - }, - "dependencies": { - "gatsby-sharp": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.19.0.tgz", - "integrity": "sha512-EbI3RNBu2+aaxuMUP/INmoj8vcNAG6BgpFvi1tLeU7/gVTNVQ+7pC/ZYtlVCzSw+faaw7r1ZBMi6F66mNIIz5A==", - "requires": { - "@types/sharp": "^0.30.5", - "sharp": "^0.30.7" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" - } - } - }, - "gatsby-plugin-webpack-bundle-analyser-v2": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/gatsby-plugin-webpack-bundle-analyser-v2/-/gatsby-plugin-webpack-bundle-analyser-v2-1.1.32.tgz", - "integrity": "sha512-w6OJAR3CTyiKEKKD5tYu3J56YiQOW/8Sl2GPWmoiwzHIhZGjTOG+NbgkhboAK3+g2vgBlGTUmqgTAiJZWN7E/g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.23.2", - "webpack-bundle-analyzer": "^4.10.1" - } - }, - "gatsby-react-router-scroll": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-5.25.0.tgz", - "integrity": "sha512-SFSdezIa5lahCE8ieCLrtLA5tztemGco/rN8si9rI9KHu1h1jPvDhsNqs2g+Z50JrUb1RPfsmxJTmLa5i6MIgQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "prop-types": "^15.8.1" - }, - "dependencies": { - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "gatsby-remark-autolink-headers": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-5.22.0.tgz", - "integrity": "sha512-Eyom72XpN2x2BLCKdgWYnseeqXIcN9kVZmaXECGzc/IrE6RBHTMjzCMZJx9Ii39OAOhILaumOEfYhnAIw6SWXg==", - "requires": { - "@babel/runtime": "^7.15.4", - "github-slugger": "^1.3.0", - "lodash": "^4.17.21", - "mdast-util-to-string": "^2.0.0", - "unist-util-visit": "^2.0.3" - }, - "dependencies": { - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - } - } - }, - "gatsby-remark-copy-linked-files": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.22.0.tgz", - "integrity": "sha512-n+HNVZDtog7o4LX0yS0uQbcPectfcf1VuOou/rhkzeGR1vKXTcTHpfc4A+n9MfvoBoV8N4FyZCGjSzxF9nqS2g==", - "requires": { - "@babel/runtime": "^7.15.4", - "cheerio": "^1.0.0-rc.10", - "fs-extra": "^10.1.0", - "is-relative-url": "^3.0.0", - "lodash": "^4.17.21", - "path-is-inside": "^1.0.2", - "probe-image-size": "^7.2.3", - "unist-util-visit": "^2.0.3" - } - }, - "gatsby-remark-normalize-paths": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-normalize-paths/-/gatsby-remark-normalize-paths-1.1.0.tgz", - "integrity": "sha512-/0mueJUohhuHHUe7N40Gn3b68DCVQWp6QDgsxpyBiykWvS0L6Aiv/SbmqX0oh0ubg47m4P6iakJUN/V2KKir4g==", - "requires": { - "is-valid-path": "^0.1.1", - "path": "^0.12.7", - "unist-util-visit": "^2.0.3" - } - }, - "gatsby-remark-rewrite-relative-links": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-remark-rewrite-relative-links/-/gatsby-remark-rewrite-relative-links-1.0.8.tgz", - "integrity": "sha512-7jCyMM+AWdp8mFLUWuJ5RGPQIKFzpLqf253QR6Aq8xrhlV0Bcz2k1+03MxPnGP0R5XetIoRm2W864KrbIZdk9Q==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "gatsby-remark-sectionize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-sectionize/-/gatsby-remark-sectionize-1.0.0.tgz", - "integrity": "sha512-S6FefaA1KlBDRNw/RaH8iRUzdcFgB8nBYox3hraXqLsfRETRkY668ay6xo8iSNyl/XG+L6fjaNBss0KcmAqBSg==", - "requires": { - "remark-sectionize": "^1.0.1" - } - }, - "gatsby-script": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/gatsby-script/-/gatsby-script-1.10.0.tgz", - "integrity": "sha512-8jAtQR0mw3G8sCy6i2D1jfGvUF5d9AIboEQuo9ZEChT4Ep5f+PSRxiWZqSjhKvintAOIeS4QXCJP5Rtp3xZKLg==", - "requires": {} - }, - "gatsby-sharp": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.16.0.tgz", - "integrity": "sha512-ApkxUe04waBzqyTE1x9OcP/ZzIbFBYxkjsrBoK+Fl2CZrQgBk7433kVVufy7FVW4o69StQmztrwaNEh2t5miTQ==", - "optional": true, - "requires": { - "@types/sharp": "^0.30.5", - "sharp": "^0.30.7" - } - }, - "gatsby-source-filesystem": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.22.0.tgz", - "integrity": "sha512-fcL3M+bQgI8DxD+XfB5XAnMvXp6czfqRZs8J2RStw9p02ekLaR/8R9ZYrn8OoQYLB9y9CHid+pdA78Dy3h73cg==", - "requires": { - "@babel/runtime": "^7.15.4", - "chokidar": "^3.5.3", - "file-type": "^16.5.4", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.22.0", - "md5-file": "^5.0.0", - "mime": "^2.5.2", - "pretty-bytes": "^5.4.1", - "valid-url": "^1.0.9", - "xstate": "4.32.1" - } - }, - "gatsby-telemetry": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.25.0.tgz", - "integrity": "sha512-FGC1yS2evJxTN/Ku9XonCBiqhH6uO6aPjjps65BbL+Xbpct/qfirIFxYG6DhHPrksR0fKOhstJGnQqay74hWdQ==", - "requires": { - "@babel/code-frame": "^7.14.0", - "@babel/runtime": "^7.15.4", - "@turist/fetch": "^7.2.0", - "@turist/time": "^0.0.2", - "boxen": "^4.2.0", - "configstore": "^5.0.1", - "fs-extra": "^10.1.0", - "gatsby-core-utils": "^3.25.0", - "git-up": "^7.0.0", - "is-docker": "^2.2.1", - "lodash": "^4.17.21", - "node-fetch": "^2.6.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "gatsby-transformer-remark": { - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.25.1.tgz", - "integrity": "sha512-6k3uOnZYsJSgmZIWq9Y+Cqb6pysusCUBYpQY1+V9ofpSRbrZGGfuoCeFKd27x/c0jI5jneuL3NXnxwn/JJK1Ig==", - "requires": { - "@babel/runtime": "^7.15.4", - "gatsby-core-utils": "^3.25.0", - "gray-matter": "^4.0.3", - "hast-util-raw": "^6.0.2", - "hast-util-to-html": "^7.1.3", - "lodash": "^4.17.21", - "mdast-util-to-hast": "^10.2.0", - "mdast-util-to-string": "^2.0.0", - "mdast-util-toc": "^5.1.0", - "remark": "^13.0.0", - "remark-footnotes": "^3.0.0", - "remark-gfm": "^1.0.0", - "remark-parse": "^9.0.0", - "remark-retext": "^4.0.0", - "remark-stringify": "^9.0.1", - "retext-english": "^3.0.4", - "sanitize-html": "^1.27.5", - "underscore.string": "^3.3.6", - "unified": "^9.2.2", - "unist-util-remove-position": "^3.0.0", - "unist-util-select": "^3.0.4", - "unist-util-visit": "^2.0.3" - }, - "dependencies": { - "hast-util-raw": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", - "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "mdast-util-to-hast": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", - "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-nlcst": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz", - "integrity": "sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg==", - "requires": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.0.0", - "unist-util-position": "^3.0.0", - "vfile-location": "^3.1.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "mdast-util-toc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz", - "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==", - "requires": { - "@types/mdast": "^3.0.3", - "@types/unist": "^2.0.3", - "extend": "^3.0.2", - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "requires": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - } - }, - "remark-footnotes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", - "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", - "requires": { - "mdast-util-footnote": "^0.1.0", - "micromark-extension-footnote": "^0.3.0" - } - }, - "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "requires": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "remark-retext": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-4.0.0.tgz", - "integrity": "sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q==", - "requires": { - "mdast-util-to-nlcst": "^4.0.0" - } - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "gatsby-transformer-sharp": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.22.0.tgz", - "integrity": "sha512-gTZ9pXwxsdmGEBV6yANnZFvsw921r6FChzuD43r+7JTs7uhmBsSGPPSF3EQnOKClP9co3IE0kztYSLoUHQe/cQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "@gatsbyjs/potrace": "^2.3.0", - "bluebird": "^3.7.2", - "common-tags": "^1.8.2", - "fs-extra": "^10.1.0", - "gatsby-plugin-utils": "^3.16.0", - "probe-image-size": "^7.2.3", - "semver": "^7.3.7", - "sharp": "^0.30.7" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "gatsby-worker": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/gatsby-worker/-/gatsby-worker-1.25.0.tgz", - "integrity": "sha512-gjp28irgHASihwvMyF5aZMALWGax9mEmcD8VYGo2osRe7p6BZuWi4cSuP9XM9EvytDvIugpnSadmTP01B7LtWg==", - "requires": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4" - } - }, - "generate-robotstxt": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/generate-robotstxt/-/generate-robotstxt-8.0.3.tgz", - "integrity": "sha512-iD//oAVKcHOCz9M0IiT3pyUiF2uN1qvL3qaTA8RGLz7NU7l0XVwyzd3rN+tzhB657DNUgrygXt9w8+0zkTMFrg==", - "requires": { - "cosmiconfig": "^6.0.0", - "fs-extra": "^9.0.0", - "ip-regex": "^4.1.0", - "is-absolute-url": "^3.0.3", - "meow": "^7.0.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@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" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "requires": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "requires": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "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" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "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" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" - }, - "graphql-compose": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-9.0.10.tgz", - "integrity": "sha512-UsVoxfi2+c8WbHl2pEB+teoRRZoY4mbWBoijeLDGpAZBSPChnqtSRjp+T9UcouLCwGr5ooNyOQLoI3OVzU1bPQ==", - "requires": { - "graphql-type-json": "0.3.2" - } - }, - "graphql-playground-html": { - "version": "1.6.30", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz", - "integrity": "sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==", - "requires": { - "xss": "^1.0.6" - } - }, - "graphql-playground-middleware-express": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.23.tgz", - "integrity": "sha512-M/zbTyC1rkgiQjFSgmzAv6umMHOphYLNWZp6Ye5QrD77WfGOOoSqDsVmGUczc2pDkEPEzzGB/bvBO5rdzaTRgw==", - "requires": { - "graphql-playground-html": "^1.6.30" - } - }, - "graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "graphql-type-json": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", - "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==", - "requires": {} - }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - } - } - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "requires": { - "get-intrinsic": "^1.2.2" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "requires": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-is-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", - "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - } - } - }, - "hast-util-to-html": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", - "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", - "requires": { - "ccount": "^1.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-is-element": "^1.0.0", - "hast-util-whitespace": "^1.0.0", - "html-void-elements": "^1.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0", - "stringify-entities": "^3.0.1", - "unist-util-is": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-whitespace": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", - "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==" - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "requires": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==" - }, - "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "requires": { - "queue": "6.0.2" - } - }, - "immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" - }, - "immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==" - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "requires": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "intl-messageformat": { - "version": "10.5.11", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", - "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", - "requires": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.6", - "tslib": "^2.4.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "is-lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", - "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", - "requires": { - "tslib": "^2.0.3" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-relative-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz", - "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==", - "requires": { - "is-absolute-url": "^3.0.0" - }, - "dependencies": { - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - } - } - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "requires": { - "protocols": "^2.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "requires": { - "which-typed-array": "^1.1.11" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", - "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", - "requires": { - "tslib": "^2.0.3" - } - }, - "is-valid-domain": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-valid-domain/-/is-valid-domain-0.1.6.tgz", - "integrity": "sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==", - "requires": { - "punycode": "^2.1.1" - } - }, - "is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "requires": { - "is-invalid-path": "^0.1.0" - } - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "requires": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jimp-compact": { - "version": "0.16.1-2", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1-2.tgz", - "integrity": "sha512-b2A3rRT1TITzqmaO70U2/uunCh43BQVq7BfRwGPkD5xj8/WZsR3sPTy9DENt+dNZGsel3zBEm1UtYegUxjZW7A==" - }, - "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "requires": { - "language-subtag-registry": "^0.3.20" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "legacy-swc-helpers": { - "version": "npm:@swc/helpers@0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "requires": { - "tslib": "^2.4.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "lint-staged": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", - "integrity": "sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==", - "dev": true, - "requires": { - "cli-truncate": "2.1.0", - "colorette": "^1.4.0", - "commander": "^8.2.0", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "execa": "^5.1.1", - "listr2": "^3.12.2", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "3.3.0", - "supports-color": "8.1.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - } - } - }, - "listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - } - } - }, - "lmdb": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.3.tgz", - "integrity": "sha512-iBA0cb13CobBSoGJLfZgnrykLlfJipDAnvtf+YwIqqzBEsTeQYsXrHaSBkaHd5wCWeabwrNvhjZoFMUrlo+eLw==", - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.5.3", - "@lmdb/lmdb-darwin-x64": "2.5.3", - "@lmdb/lmdb-linux-arm": "2.5.3", - "@lmdb/lmdb-linux-arm64": "2.5.3", - "@lmdb/lmdb-linux-x64": "2.5.3", - "@lmdb/lmdb-win32-x64": "2.5.3", - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "dependencies": { - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + ] }, - "loader-utils": { + "node_modules/micromark-util-decode-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lock": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", - "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" - }, - "lodash.chunk": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "lodash.every": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", - "integrity": "sha512-isF82d+65/sNvQ3aaQAW7LLHnnTxSN/2fm4rhYyuufLzA4VtHz6y6S5vFwe6PQVr2xdqUOyxBbTNKDpnmeu50w==" - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" - }, - "lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha512-QfTqQTwzmKxLy7VZlbx2M/ipWv8DCQ2F5BI/MRxLharOQ5V78yMSuB+JE+EuUM22txYfj09R2Q7hUlEYj7KdNg==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lower-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", - "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - }, - "dependencies": { - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - }, - "md5-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", - "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==" - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - }, - "dependencies": { - "unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "requires": { - "unist-util-is": "^4.0.0" - } + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "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" } }, - "mdast-util-compact": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", - "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", - "requires": { - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-find-and-replace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", - "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", - "requires": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, + ], "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - } - }, - "mdast-util-footnote": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", - "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", - "requires": { - "mdast-util-to-markdown": "^0.6.0", - "micromark": "~2.11.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "dependencies": { - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } - }, - "mdast-util-gfm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", - "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", - "requires": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" - } - }, - "mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", - "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", - "requires": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" - } - }, - "mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", - "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "mdast-util-gfm-table": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", - "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", - "requires": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" - } - }, - "mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", - "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", - "requires": { - "mdast-util-to-markdown": "~0.6.0" - } + ] }, - "mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "dependencies": { - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } + ] }, - "mdast-util-to-nlcst": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", - "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", - "requires": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - }, - "dependencies": { - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "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" } }, - "mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "mdast-util-toc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz", - "integrity": "sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w==", - "requires": { - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^1.0.5", - "unist-util-is": "^2.1.2", - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - } - } + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "meant": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.3.tgz", - "integrity": "sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "requires": { - "fs-monkey": "^1.0.4" + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "micromark-extension-footnote": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", - "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", - "requires": { - "micromark": "~2.11.0" - } + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "micromark-extension-gfm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", - "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", - "requires": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" - } + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", - "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", - "requires": { - "micromark": "~2.11.3" - } + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", - "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", - "requires": { - "micromark": "~2.11.0" + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "micromark-extension-gfm-table": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", - "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", - "requires": { - "micromark": "~2.11.0" + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", - "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==" - }, - "micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", - "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", - "requires": { - "micromark": "~2.11.0" - } + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { + "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "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/miniflare": { + "version": "3.20240404.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240404.0.tgz", + "integrity": "sha512-+FOTcztPMW3akmucX4vE0PWMNvP4JBwl4s9ieA84fcOaDtTbtfU1rHXpcacj16klpUpvSnD6xd8Sjsn6SJXPfg==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240404.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/miniflare/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "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 + } } }, - "mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" - } + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true - }, - "ms": { + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "msgpackr": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.9.tgz", - "integrity": "sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==", - "requires": { - "msgpackr-extract": "^3.0.2" - } - }, - "msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", - "optional": true, - "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2", - "node-gyp-build-optional-packages": "5.0.7" - }, - "dependencies": { - "node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "optional": true - } + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" } }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "nanoid": { + "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, - "neo-async": { + "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "nlcst-to-string": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", - "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==" - }, - "no-case": { + "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { + "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, - "node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", - "requires": { - "semver": "^7.3.5" - }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, - "node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==" - }, - "node-html-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", - "requires": { - "css-select": "^4.2.1", - "he": "1.2.0" - }, - "dependencies": { - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" } }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node-object-hash": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.3.10.tgz", - "integrity": "sha512-jY5dPJzw6NHd/KPSfPKJ+IHoFS81/tJ43r34ZeNMXGzCOM8jwQDCD12HYayKIB6MuznrnqIYy2e891NA2g0ibA==" - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, - "normalize-range": { + "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } }, - "normalize-url": { + "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, - "not": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", - "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "nth-check": { + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { + "dependencies": { "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" - }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" } }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "requires": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "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" } }, - "object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "requires": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "node_modules/odiff-bin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/odiff-bin/-/odiff-bin-2.6.1.tgz", + "integrity": "sha512-SeI3ehAqjQUMlUkGjvIFGKoHZIO3zG1N1wMRhf7ojM7Vb+HcyB2RKSSCu7kbvYVtSdZADEBSJ7nvP/d7iBLivA==", + "hasInstallScript": true, + "bin": { + "odiff": "bin/odiff" } }, - "objectFitPolyfill": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/objectFitPolyfill/-/objectFitPolyfill-2.3.5.tgz", - "integrity": "sha512-8Quz071ZmGi0QWEG4xB3Bv5Lpw6K0Uca87FLoLMKMWjB6qIq9IyBegP3b/VLNxv2WYvIMGoeUQ+c6ibUkNa8TA==" - }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { + "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "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" } }, - "opener": { + "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "opentracing": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", - "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==" - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "ordered-binary": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.1.tgz", - "integrity": "sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + "bin": { + "opener": "bin/opener-bin.js" + } }, - "p-defer": { + "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-map": { + "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { + "dependencies": { "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "requires": { - "lowercase-keys": "^1.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - } - } - } + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "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" } }, - "param-case": { + "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { + "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-english": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.2.0.tgz", - "integrity": "sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg==", - "requires": { - "nlcst-to-string": "^2.0.0", - "parse-latin": "^4.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "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" } }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { + "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" } }, - "parse-latin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", - "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^2.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-numeric-range": { + "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, - "parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "requires": { - "protocols": "^2.0.0" - } - }, - "parse-srcset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" - }, - "parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "requires": { - "parse-path": "^7.0.0" - } - }, - "parse5": { + "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { + "dependencies": { "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "parse5-htmlparser2-tree-adapter": { + "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "requires": { + "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "pascal-case": { + "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { + "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, - "password-prompt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", - "requires": { - "ansi-escapes": "^4.3.2", - "cross-spawn": "^7.0.3" - } - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } }, - "path-is-inside": { + "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" - }, - "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } }, - "physical-cpu-count": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", - "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } + "node_modules/pixelmatch": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", + "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "dependencies": { + "pngjs": "^6.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "pkg-up": { + "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { + "dependencies": { "find-up": "^3.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/playwright-core": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", + "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "engines": { + "node": ">=14.19.0" } }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "requires": { - "nanoid": "^3.3.6", + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "postcss-calc": { + "node_modules/postcss-calc": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { + "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "postcss-colormin": { + "node_modules/postcss-colormin": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "requires": { + "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" } }, - "postcss-convert-values": { + "node_modules/postcss-convert-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "requires": { + "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-discard-comments": { + "node_modules/postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-discard-duplicates": { + "node_modules/postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-discard-empty": { + "node_modules/postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-discard-overridden": { + "node_modules/postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-loader": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", - "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.4" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "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-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "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 } } }, - "postcss-merge-longhand": { + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "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/postcss-merge-longhand": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-merge-rules": { + "node_modules/postcss-merge-rules": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "requires": { + "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" } }, - "postcss-minify-font-values": { + "node_modules/postcss-minify-font-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-minify-gradients": { + "node_modules/postcss-minify-gradients": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "requires": { + "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" } }, - "postcss-minify-params": { + "node_modules/postcss-minify-params": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "requires": { + "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" } }, - "postcss-minify-selectors": { + "node_modules/postcss-minify-selectors": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "requires": { + "dependencies": { "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "requires": { + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "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" } }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dependencies": { "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "postcss-modules-values": { + "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { + "dependencies": { "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "postcss-normalize-charset": { + "node_modules/postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "postcss-normalize-display-values": { + "node_modules/postcss-normalize-display-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-positions": { + "node_modules/postcss-normalize-positions": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-repeat-style": { + "node_modules/postcss-normalize-repeat-style": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-string": { + "node_modules/postcss-normalize-string": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-timing-functions": { + "node_modules/postcss-normalize-timing-functions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-unicode": { + "node_modules/postcss-normalize-unicode": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "requires": { + "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-url": { + "node_modules/postcss-normalize-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "requires": { + "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-normalize-whitespace": { + "node_modules/postcss-normalize-whitespace": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-ordered-values": { + "node_modules/postcss-ordered-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "requires": { + "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/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-reduce-initial": { + "node_modules/postcss-reduce-initial": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "requires": { + "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-reduce-transforms": { + "node_modules/postcss-reduce-transforms": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "requires": { + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" } }, - "postcss-svgo": { + "node_modules/postcss-svgo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "requires": { + "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "requires": { - "@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" - } - } + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-unique-selectors": { + "node_modules/postcss-unique-selectors": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "requires": { + "dependencies": { "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "postcss-value-parser": { + "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - } + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "prettier-plugin-prisma": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-prisma/-/prettier-plugin-prisma-4.13.0.tgz", - "integrity": "sha512-bnOWoQTVXM9VWBErPGE6rVgI8kCQts+DMQolg7Sj/Q0/oAlpDYOhce4ljQKf5BhJW061yrB3+CRVps6tNcUkQg==", - "dev": true, - "requires": { - "@prisma/prisma-fmt-wasm": "4.13.0-52.integration-mobc-upstream-d100a9299fcb9cffb064301998e9a94ce2722c49" + "node_modules/posthog-node": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.5.0.tgz", + "integrity": "sha512-u1lzJiLiYH3ShBS5s+uy/FEiAnpkYfNuKs+GmkYo9Z6hO6UXWKPkib9mtTx3y2pbV7O/+Pjup1+/1Q3CA55Z2Q==", + "dependencies": { + "axios": "^1.6.2", + "rusha": "^0.8.14" + }, + "engines": { + "node": ">=15.0.0" } }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" - }, - "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "requires": { + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, - "prism-react-renderer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", - "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", - "dev": true, - "requires": {} - }, - "prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", - "devOptional": true, - "requires": { - "@prisma/engines": "4.16.2" + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" } }, - "probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", - "requires": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prompts": { + "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "react-is": "^16.13.1" } }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" } }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" - }, - "qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "requires": { - "side-channel": "^1.0.4" + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "requires": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "queue": { + "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "requires": { + "dependencies": { "inherits": "~2.0.3" } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "quick-lru": { + "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } + "engines": { + "node": ">= 0.8" } }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" } }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - } + "bin": { + "rc": "cli.js" } }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" } }, - "react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "requires": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - }, - "dependencies": { - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "react-dev-utils": { + "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "requires": { + "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", "browserslist": "^4.18.1", @@ -38276,1225 +13222,1078 @@ "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", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } + "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.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "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", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "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", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" } }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, - "react-fast-compare": { + "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, - "react-feather": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-2.0.10.tgz", - "integrity": "sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==", - "requires": { - "prop-types": "^15.7.2" + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "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" } }, - "react-ga": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", - "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", - "requires": {} - }, - "react-instantsearch-core": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.1.tgz", - "integrity": "sha512-R8VivvJmFemsW6Urp5KGiqjVZ8XkgYNm8qt6t9WVHXOoo7B8Txi/7yOMNRwT8PWNWBMpYlYMEWZ9PClMuX0Zsg==", - "requires": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.10.0", - "prop-types": "^15.6.2", - "react-fast-compare": "^3.0.0" + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view-lite": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.3.0.tgz", + "integrity": "sha512-aN1biKC5v4DQkmQBlZjuMFR09MKZGMPtIg+cut8zEeg2HXd6gl2gRy0n4HMacHf0dznQgo0SVXN7eT8zV3hEuQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, - "react-instantsearch-dom": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.1.tgz", - "integrity": "sha512-oditYXY6zNbAY6txhGBLOPaEie95Eii+nCEgysuoo4fnOQDUxuHXMruiTkYJlfJJ5HAKBJyTdjtKoGeuJL6G1w==", - "requires": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.10.0", - "classnames": "^2.2.5", + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "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", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "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-fast-compare": "^3.0.0", - "react-instantsearch-core": "6.32.1" + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" } }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==" - }, - "react-select": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.4.0.tgz", - "integrity": "sha512-CjE9RFLUvChd5SdlfG4vqxZd55AZJRrLrHzkQyTYeHlpOztqcgnyftYAolJ0SGsBev6zAs6qFrjm6KU3eo2hzg==", - "requires": { + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "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/react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", "@types/react-transition-group": "^4.4.0", - "memoize-one": "^5.0.0", + "memoize-one": "^6.0.0", "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0" - } - }, - "react-sticky-box": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-sticky-box/-/react-sticky-box-1.0.2.tgz", - "integrity": "sha512-Kyvtppdtv1KqJyNU4DtrSMI0unyQRgtraZvVQ0GAazVbYiTsIVpyhpr+5R0Aavzu4uJNSe1awj2rk/qI7i6Zfw==", - "requires": { - "resize-observer-polyfill": "^1.5.1" - } - }, - "react-toastify": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.8.tgz", - "integrity": "sha512-EwM+teWt49HSHx+67qI08yLAW1zAsBxCXLCsUfxHYv1W7/R3ZLhrqKalh7j+kjgPna1h5LQMSMwns4tB4ww2yQ==", - "requires": { - "clsx": "^1.1.1" + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "react-transition-group": { + "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { + "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "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/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "requires": { - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "recursive-readdir": { + "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "requires": { + "dependencies": { "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" } }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "requires": {} - }, - "reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - } - }, - "regenerate": { + "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, - "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "requires": { + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "regenerator-transform": { + "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "requires": { + "dependencies": { "@babel/runtime": "^7.8.4" } }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "requires": { + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "requires": { - "rc": "1.2.8" + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" } }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "requires": { + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { "jsesc": "~0.5.0" }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } + "bin": { + "regjsparser": "bin/parser" } }, - "relay-runtime": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", - "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "requires": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.0", - "invariant": "^2.2.4" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" } }, - "remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", - "requires": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" - }, - "dependencies": { - "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" - }, - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - } + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } }, - "remark-gfm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", - "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", - "requires": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" - } - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "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" } }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - } + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "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" } }, - "remark-retext": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", - "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", - "requires": { - "mdast-util-to-nlcst": "^3.2.0" + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "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" } }, - "remark-sectionize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/remark-sectionize/-/remark-sectionize-1.1.1.tgz", - "integrity": "sha512-++GBmbsoeQrMBWn6jf3mj0bRq3DR8LnQPJo7u5faQ9JAJ5GeAu2uve8NoW+vgvhnuAv0GYS8hGb2+kqa+8mnpg==", - "requires": { - "unist-util-find-after": "^2.0.2", - "unist-util-visit-parents": "^2.0.1" + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "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", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "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" } }, - "remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "requires": { - "mdast-util-to-markdown": "^0.6.0" + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "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" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "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" + } }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "requires": { + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "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", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } - } + "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", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "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", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==" + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } }, - "require-from-string": { + "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } }, - "require-like": { + "node_modules/require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "require-package-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", - "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, - "resolve": { + "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "requires": { + "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" } }, - "resolve-alpn": { + "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "requires": { - "lowercase-keys": "^2.0.0" + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "retext-english": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz", - "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==", - "requires": { - "parse-english": "^4.0.0", - "unherit": "^1.0.4" + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" } }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-inject/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", + "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "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" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } + "node_modules/rusha": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", + "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sanitize-html": { - "version": "1.27.5", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.5.tgz", - "integrity": "sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==", - "requires": { - "htmlparser2": "^4.1.0", - "lodash": "^4.17.15", - "parse-srcset": "^1.0.2", - "postcss": "^7.0.27" - }, - "dependencies": { - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - } - } - }, - "domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", - "requires": { - "domelementtype": "^2.0.1" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "dependencies": { - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + "node_modules/sass": { + "version": "1.74.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz", + "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.5.2.tgz", + "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==", + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } + "node-sass": { + "optional": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "sass": { + "optional": true } } }, - "sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "node_modules/sass-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/sass-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "schema-utils": { + "node_modules/sass-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/sass-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { + "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/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "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" } }, - "section-matter": { + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" } }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "send": { + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -39509,2604 +14308,2614 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "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/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" } }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "requires": { - "randombytes": "^2.1.0" + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" } }, - "serve-static": { + "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "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.0" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "shallow-clone": { + "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { + "dependencies": { "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "shallow-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", - "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" - }, - "shallowequal": { + "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, - "sharp": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", - "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", - "requires": { - "color": "^4.2.3", - "detect-libc": "^2.0.1", - "node-addon-api": "^5.0.0", - "prebuild-install": "^7.1.1", - "semver": "^7.3.7", - "simple-get": "^4.0.1", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } }, - "shell-quote": { + "node_modules/shell-quote": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "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", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "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" } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "signedsource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "requires": { - "is-arrayish": "^0.3.1" - }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" } }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, - "sitemap": { + "node_modules/sitemap": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "requires": { + "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", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==" + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "smoothscroll-polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", - "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==" + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" } }, - "socket.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", - "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", - "requires": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~4.1.0", - "socket.io-adapter": "~2.1.0", - "socket.io-parser": "~4.0.3" + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" } }, - "socket.io-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", - "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "socket.io-client": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.1.3.tgz", - "integrity": "sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==", - "requires": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~4.1.0", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" - } - }, - "socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", - "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "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", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" } }, - "source-list-map": { + "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "safe-buffer": "~5.2.0" } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "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" } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } }, - "sponge-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", - "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", - "requires": { - "tslib": "^2.0.3" + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } }, - "st": { + "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", - "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", - "requires": { - "async-cache": "^1.1.0", - "bl": "^4.0.0", - "fd": "~0.0.2", - "graceful-fs": "^4.2.3", - "mime": "^2.4.4", - "negotiator": "~0.6.2" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "static-site-generator-webpack-plugin": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-3.4.2.tgz", - "integrity": "sha512-39Kn+fZDVjolLYuX5y1rDvksJIW0QEUaEC/AVO/UewNXxGzoSQI1UYnRsL+ocAcN5Yti6d6rJgEL0qZ5tNXfdw==", - "requires": { - "bluebird": "^3.0.5", - "cheerio": "^0.22.0", - "eval": "^0.1.0", - "url": "^0.11.0", - "webpack-sources": "^0.2.0" - }, - "dependencies": { - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "source-list-map": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", - "integrity": "sha512-FqR2O+cX+toUD3ULVIgTtiqYIqPnA62ehJD47mf4LG1PZCB+xmIa3gcTEhegGbP22aRPh88dJSdgDIolrvSxBQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "webpack-sources": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", - "integrity": "sha512-iqanNZjOHLdPn/R0e/nKVn90dm4IsUMxKam0MZD1btWhFub/Cdo1nWdMio6yEqBc0F8mEieOjc+jfBSXwna94Q==", - "requires": { - "source-list-map": "^1.1.1", - "source-map": "~0.5.3" - } - } + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "requires": { - "debug": "2" + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } + "@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" } }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "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" + } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "string-similarity": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", - "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", - "requires": { - "lodash.every": "^4.6.0", - "lodash.flattendeep": "^4.4.0", - "lodash.foreach": "^4.5.0", - "lodash.map": "^4.6.0", - "lodash.maxby": "^4.6.0" + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/terser": { + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } + "@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" } }, - "string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "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 + } } }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" } }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - } + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "stringify-object": { + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true - } + "@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" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "strip-filename-increment": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-filename-increment/-/strip-filename-increment-2.0.1.tgz", - "integrity": "sha512-+v5xsiTTsdYqkPj7qz1zlngIsjZedhHDi3xp/9bMurV8kXe9DAr732gNVqtt4X8sI3hOqS3nlFfps5gyVcux6w==" + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } }, - "strip-outer": { + "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { - "escape-string-regexp": "^1.0.2" + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" } }, - "strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "requires": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" } }, - "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.1" + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "dependencies": { - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true } } }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, - "sudo-prompt": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", - "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - } + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "swap-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", - "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", - "requires": { - "tslib": "^2.0.3" + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" } }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" } }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - }, - "terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "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" + } }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "title-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "requires": { - "tslib": "^2.0.3" + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "to-fast-properties": { + "node_modules/unist-util-position-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "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" + } }, - "token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "requires": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "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" + } }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "requires": { - "escape-string-regexp": "^1.0.2" + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "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" } }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - } + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" } }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "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 } } }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { - "tslib": "^1.8.1" - }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "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" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "type-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", - "integrity": "sha512-39wxbwHdQ2sTiBB8wAzKfQ9GN+om8w+sjNWzr+vZJR5AMD5J+J7Yc8AtXnU9r/r2c8XiDZ/smxutDmZehX/qpQ==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" } }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" } }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, - "ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==" + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "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" } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" - }, - "underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", - "requires": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" } }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "@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-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.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 } } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "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", + "is-plain-object": "^5.0.0", + "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", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" } }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, - "unist-util-find-after": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-2.0.4.tgz", - "integrity": "sha512-zo0ShIr+E/aU9xSK7JC9Kb+WP9seTFCuqVYdo5+HJSjN009XMfhiA1FIExEKzdDP1UsgvKGleGlB/pSdTSqZww==", - "requires": { - "unist-util-is": "^3.0.0" - }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - } + "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" } }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - }, - "unist-util-map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-1.0.5.tgz", - "integrity": "sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==", - "requires": { - "object-assign": "^4.0.1" + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" } }, - "unist-util-modify-children": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", - "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", - "requires": { - "array-iterate": "^1.0.0" + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "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 + } } }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-remove": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", - "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", - "requires": { - "unist-util-is": "^3.0.0" + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true } } }, - "unist-util-remove-position": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz", - "integrity": "sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg==", - "requires": { - "unist-util-visit": "^2.0.0" + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "unist-util-select": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-3.0.4.tgz", - "integrity": "sha512-xf1zCu4okgPqGLdhCDpRnjwBNyv3EqjiXRUbz2SdK1+qnLMB7uXXajfzuBvvbHoQ+JLyp4AEbFCGndmc6S72sw==", - "requires": { - "css-selector-parser": "^1.0.0", - "not": "^0.1.0", - "nth-check": "^2.0.0", - "unist-util-is": "^4.0.0", - "zwitch": "^1.0.0" + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" } }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" } }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "unist-util-visit-children": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", - "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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" } }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - }, - "unixify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", - "requires": { - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "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" } }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" } }, - "upper-case": { + "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "requires": { - "tslib": "^2.0.3" + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "requires": { - "tslib": "^2.0.3" + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, - "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "requires": { - "punycode": "^1.4.1", - "qs": "^6.11.2" + "node_modules/workerd": { + "version": "1.20240404.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240404.0.tgz", + "integrity": "sha512-U4tfnvBcPMsv7pmRGuF0J5UnoZi6tbc64tXNfyijI74r6w6Vlb2+a6eibdQL8g0g46+4vjuTKME9G5RvSvdc8g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240404.0", + "@cloudflare/workerd-darwin-arm64": "1.20240404.0", + "@cloudflare/workerd-linux-64": "1.20240404.0", + "@cloudflare/workerd-linux-arm64": "1.20240404.0", + "@cloudflare/workerd-windows-64": "1.20240404.0" + } + }, + "node_modules/wrangler": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.48.0.tgz", + "integrity": "sha512-Wv7JS6FyX1j9HkaM6WL3fmTzBMAYc4hPSyZCuxuH55hkJDX/7ts+YAgsaN1U8rKoDrV3FVSgBfI9TyqP9iuM8Q==", + "dev": true, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "@cloudflare/kv-asset-handler": "0.3.1", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "miniflare": "3.20240404.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240404.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true } } }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "requires": { - "prepend-http": "^2.0.0" + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - } + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "value-or-promise": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", - "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==" - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" - }, - "web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.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.9", - "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.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - } + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], "dev": true, - "requires": { - "@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", - "is-plain-object": "^5.0.0", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "webpack-dev-middleware": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", - "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", - "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", - "mime-types": "^2.1.30", - "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "webpack-stats-plugin": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-1.1.3.tgz", - "integrity": "sha512-yUKYyy+e0iF/w31QdfioRKY+h3jDBRpthexBOWGKda99iu2l/wxYsI/XqdlP5IU58/0KB9CsJZgWNAl+/MPkRw==" + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "webpack-virtual-modules": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.3.2.tgz", - "integrity": "sha512-RXQXioY6MhzM4CNQwmBwKXYgBs6ulaiQ8bkNQEl2J6Z+V+s7lgl/wGvaI/I0dLnYKB8cKsxQc17QOAVIphPLDw==", - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "requires": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/wrangler/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true }, - "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "node_modules/wrangler/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "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" } }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "write": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/write/-/write-2.0.0.tgz", - "integrity": "sha512-yam9TAqN8sAZokECAejo9HpT2j2s39OgK8i8yxadrFBVo+iSWLfnipRVFulfAw1d2dz5vSuGmlMHYRKG4fysOA==", - "requires": { - "add-filename-increment": "^1.0.0" - } - }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "requires": {} - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==" + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "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 + } + } }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" - }, - "xss": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" } }, - "xstate": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.32.1.tgz", - "integrity": "sha512-QYUd+3GkXZ8i6qdixnOn28bL3EvA++LONYL/EMWwKlFSh/hiLndJ8YTnz77FDs+JUXcwU7NZJg7qoezoRHc4GQ==" + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } }, - "xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==" + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true - }, - "yaml-loader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.6.0.tgz", - "integrity": "sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==", - "requires": { - "loader-utils": "^1.4.0", - "yaml": "^1.8.3" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" } }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } + "engines": { + "node": ">=12" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, - "yoga-layout-prebuilt": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", - "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", - "requires": { - "@types/yoga-layout": "1.9.2" + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" } }, - "yurnalist": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-2.1.0.tgz", - "integrity": "sha512-PgrBqosQLM3gN2xBFIMDLACRTV9c365VqityKKpSTWpwR+U4LAFR3rSVyEoscWlu3EzX9+Y0I86GXUKxpHFl6w==", - "requires": { - "chalk": "^2.4.2", - "inquirer": "^7.0.0", - "is-ci": "^2.0.0", - "read": "^1.0.7", - "strip-ansi": "^5.2.0" + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" } }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + "node_modules/youch/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index b88bf3633b..5e7cf8fb16 100644 --- a/package.json +++ b/package.json @@ -1,112 +1,55 @@ { - "name": "prisma2-docs", - "description": "Prisma.io docs v2.0", - "version": "1.0.0", - "author": "Nilufar Bava <bava@prisma.io>", - "dependencies": { - "@mdx-js/loader": "1.6.22", - "@mdx-js/mdx": "1.6.22", - "@mdx-js/react": "1.6.22", - "@philpl/buble": "0.19.7", - "@prisma/client": "^4.8.1", - "@react-aria/overlays": "^3.20.0", - "@react-aria/tooltip": "^3.7.0", - "@react-aria/utils": "^3.23.0", - "@react-stately/tooltip": "^3.4.6", - "algoliasearch": "4.14.2", - "babel-plugin-styled-components": "2.0.7", - "gatsby": "4.22.1", - "gatsby-plugin-algolia": "^1.0.3", - "gatsby-plugin-catch-links": "4.22.0", - "gatsby-plugin-google-tagmanager": "4.22.0", - "gatsby-plugin-image": "2.22.0", - "gatsby-plugin-mdx": "3.15.2", - "gatsby-plugin-meta-redirect": "1.1.1", - "gatsby-plugin-robots-txt": "1.7.1", - "gatsby-plugin-sharp": "4.22.0", - "gatsby-plugin-sitemap": "5.22.0", - "gatsby-plugin-smoothscroll": "1.2.0", - "gatsby-plugin-styled-components": "5.22.0", - "gatsby-remark-autolink-headers": "5.22.0", - "gatsby-remark-copy-linked-files": "5.22.0", - "gatsby-remark-normalize-paths": "1.1.0", - "gatsby-remark-rewrite-relative-links": "1.0.8", - "gatsby-remark-sectionize": "1.0.0", - "gatsby-source-filesystem": "4.22.0", - "gatsby-transformer-remark": "5.25.1", - "gatsby-transformer-sharp": "4.22.0", - "normalize.css": "^8.0.1", - "parse-numeric-range": "1.3.0", - "prop-types": "15.7.2", - "qs": "6.11.2", - "react": "17.0.2", - "react-copy-to-clipboard": "5.1.0", - "react-dom": "17.0.2", - "react-feather": "2.0.10", - "react-ga": "3.3.1", - "react-instantsearch-dom": "6.32.1", - "react-refresh": "^0.14.0", - "react-select": "5.4.0", - "react-sticky-box": "1.0.2", - "react-toastify": "9.0.8", - "styled-components": "5.3.11", - "write": "2.0.0" - }, - "keywords": [ - "gatsby", - "mdx", - "typescript", - "prismaio", - "howtodata", - "databases", - "styled-components" - ], - "license": "Apache-2.0", + "name": "docs", + "version": "0.0.0", + "private": true, "scripts": { - "clean": "gatsby clean", - "build": "./scripts/build", - "dev": "gatsby develop", - "serve": "npm run build && gatsby serve --prefix-paths -o", - "format": "prettier . --write --check", - "install-algolia": "cd ./plugins/gatsby-algolia-indexer && npm install", - "postinstall": "husky install", - "redirect-transform": "node ./scripts/redirect-transformer.js" + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "npm run build && wrangler pages deploy ./build", + "clean": "docusaurus clear", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "^3.2.1", + "@docusaurus/preset-classic": "^3.2.1", + "@mdx-js/react": "^3.0.0", + "@react-aria/overlays": "^3.21.1", + "@react-aria/tooltip": "^3.7.2", + "@react-aria/utils": "^3.23.2", + "clsx": "^2.0.0", + "docusaurus-plugin-sass": "^0.2.5", + "lost-pixel": "^3.16.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-select": "^5.8.0", + "sass": "^1.72.0" }, "devDependencies": { - "@percy/cli": "^1.11.0", - "@types/node": "17.0.45", - "@types/react": "18.2.28", - "@types/react-dom": "18.2.13", - "@types/react-instantsearch-dom": "6.12.4", - "@types/styled-components": "5.1.28", - "gatsby-plugin-webpack-bundle-analyser-v2": "^1.1.31", - "husky": "7.0.4", - "is-absolute-url": "4.0.1", - "lint-staged": "11.2.6", - "path-browserify": "1.0.1", - "prettier": "2.8.8", - "prettier-plugin-prisma": "4.13.0", - "prism-react-renderer": "1.2.1", - "prisma": "^4.8.1", - "react-is": "18.2.0", - "tslint": "6.1.3", - "typescript": "4.9.5" + "@docusaurus/module-type-aliases": "^3.2.1", + "@docusaurus/tsconfig": "^3.2.1", + "@docusaurus/types": "^3.2.1", + "typescript": "~5.2.2", + "wrangler": "^3.48.0" }, - "lint-staged": { - "*.*": "prettier --write --ignore-unknown" + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] }, - "percy": { - "version": 2, - "snapshot": { - "enableJavaScript": true, - "widths": [ - 1280 - ] - }, - "discovery": { - "launch-options": { - "timeout": 100000 - } - } + "engines": { + "node": ">=18.0" } } diff --git a/plugins/gatsby-algolia-indexer/gatsby-config.js b/plugins/gatsby-algolia-indexer/gatsby-config.js deleted file mode 100644 index 653e8c2df7..0000000000 --- a/plugins/gatsby-algolia-indexer/gatsby-config.js +++ /dev/null @@ -1,162 +0,0 @@ -const mdxToSearchable = require('./mdx-to-searchable') -const withDefaults = require('./options') - -const settings = { - searchableAttributes: ['apiReference', 'title', 'heading', 'content'], - attributesToHighlight: ['title', 'heading', 'content'], - attributesToSnippet: ['title:30', 'heading:50', 'content:50'], - hitsPerPage: 20, - attributeForDistinct: 'slug', - distinct: 2, - separatorsToIndex: '!#()[]{}*+-_一,:;<>?@/^|%&~£¥$§€†‡', -} - -// Util functions - -const flat = (array) => { - var result = [] - array.forEach(function (a) { - result.push(a) - if (Array.isArray(a.items)) { - result = result.concat(flat(a.items)) - } - }) - return result -} - -const removeInlineCode = (heading, path) => - path - ? heading.replace(/inlinecode/g, '') - : heading.replace('<inlinecode>', '').replace('</inlinecode>', '') - -const isApiTerm = (term) => term.includes('AlgoliaTerm') && term.split('"')[1] === 'apiReference' - -const getApiVal = (term) => term.split('"')[3] - -const removeFrontmatter = (rawMdx) => rawMdx.split('---').slice(2).join('---') - -const unnestFrontmatter = (node) => { - const { fields, frontmatter, ...rest } = node - - return { - ...fields, - ...frontmatter, - ...rest, - } -} - -// Transform function - -const handleRawBody = (node) => { - const { rawBody, ...rest } = node - - const techParams = `${ - rest.langSwitcher ? `${rest.langSwitcher[0]}${rest.dbSwitcher ? '-' : ''}` : '' - }${rest.dbSwitcher ? `${rest.dbSwitcher[0]}` : ''}` - - const getTechParams = (item) => { - const path = `${ - rest.langSwitcher - ? `${item.langVal === '' || item.langVal === '*' ? rest.langSwitcher[0] : item.langVal}${ - rest.dbSwitcher ? '-' : '' - }` - : '' - }${ - rest.dbSwitcher - ? `${item.dbVal === '' || item.dbVal === '*' ? rest.dbSwitcher[0] : item.dbVal}` - : '' - }` - return path - } - - const getTitlePath = (item) => { - const tocItem = - rest.tableOfContents && - rest.tableOfContents.items && - item.heading && - flat(rest.tableOfContents.items).find( - (t) => t.title && removeInlineCode(t.title) === item.heading.replace(/`/g, '') - ) - return tocItem && tocItem.url ? removeInlineCode(tocItem.url, true) : '' - } - - const data = mdxToSearchable(removeFrontmatter(rawBody)) - - const records = data.map((item, index) => { - const record = { - //id: index, - id: rest.id + index, - title: rest.title, - slug: rest.modSlug, - apiReference: isApiTerm(item.text) ? getApiVal(item.text) : null, - heading: item.heading ? removeInlineCode(item.heading) : rest.title, - content: item.text.includes('\n') ? item.text.split(' ').slice(0, 20).join(' ') : item.text, - path: `${rest.modSlug.replace(/\d{2,}-/g, '')}${ - getTechParams(item) ? '-' + getTechParams(item) : '' - }${getTitlePath(item)}`, - internal: { - contentDigest: rest.internal.contentDigest, - }, - } - return record - }) - - return records -} - -module.exports = (options) => { - const { appId, adminKey, indexName } = withDefaults(options) - const queries = [ - { - query: `{ - allMdx { - edges { - node { - id - rawBody - fields { - slug - modSlug - } - internal { - contentDigest - } - frontmatter { - title - langSwitcher - dbSwitcher - search - } - tableOfContents - } - } - } - }`, - indexName, - settings, - transformer: ({ data }) => { - const noSearchFlag = Array.from(data.allMdx.edges).filter( - (e) => e.node.frontmatter.search !== false - ) - return noSearchFlag - .map((edge) => edge.node) - .map(unnestFrontmatter) - .map(handleRawBody) - .reduce((acc, cur) => [...acc, ...cur], []) - }, - }, - ] - - return { - plugins: [ - { - resolve: `gatsby-plugin-algolia`, - options: { - appId, - apiKey: adminKey, - queries, - }, - }, - ], - } -} diff --git a/plugins/gatsby-algolia-indexer/gatsby-node.js b/plugins/gatsby-algolia-indexer/gatsby-node.js deleted file mode 100644 index 48d2773929..0000000000 --- a/plugins/gatsby-algolia-indexer/gatsby-node.js +++ /dev/null @@ -1 +0,0 @@ -//noop diff --git a/plugins/gatsby-algolia-indexer/index.js b/plugins/gatsby-algolia-indexer/index.js deleted file mode 100644 index 48d2773929..0000000000 --- a/plugins/gatsby-algolia-indexer/index.js +++ /dev/null @@ -1 +0,0 @@ -//noop diff --git a/plugins/gatsby-algolia-indexer/mdx-to-searchable.js b/plugins/gatsby-algolia-indexer/mdx-to-searchable.js deleted file mode 100644 index 72cd6725c0..0000000000 --- a/plugins/gatsby-algolia-indexer/mdx-to-searchable.js +++ /dev/null @@ -1,8 +0,0 @@ -const remark = require('remark') -const mdx = require('remark-mdx') -const searchable = require('./remark-mdx-searchable') - -module.exports = (doc) => { - const result = remark().use(mdx).use(searchable).processSync(doc) - return result.data -} diff --git a/plugins/gatsby-algolia-indexer/options.js b/plugins/gatsby-algolia-indexer/options.js deleted file mode 100644 index 5f2d87cd7b..0000000000 --- a/plugins/gatsby-algolia-indexer/options.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = (options) => ({ - appId: null, - adminKey: null, - searchKey: null, - indexName: null, - query: '', // optional: use this to overwrite the default query. - ...options, -}) diff --git a/plugins/gatsby-algolia-indexer/package-lock.json b/plugins/gatsby-algolia-indexer/package-lock.json deleted file mode 100644 index a5799d9462..0000000000 --- a/plugins/gatsby-algolia-indexer/package-lock.json +++ /dev/null @@ -1,2148 +0,0 @@ -{ - "name": "gatsby-algolia-indexer", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "gatsby-algolia-indexer", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "algoliasearch": "4.11.0", - "remark": "^12.0.1", - "remark-mdx": "^1.6.16" - } - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.11.0.tgz", - "integrity": "sha512-4sr9vHIG1fVA9dONagdzhsI/6M5mjs/qOe2xUP0yBmwsTsuwiZq3+Xu6D3dsxsuFetcJgC6ydQoCW8b7fDJHYQ==", - "dependencies": { - "@algolia/cache-common": "4.11.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.11.0.tgz", - "integrity": "sha512-lODcJRuPXqf+6mp0h6bOxPMlbNoyn3VfjBVcQh70EDP0/xExZbkpecgHyyZK4kWg+evu+mmgvTK3GVHnet/xKw==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.11.0.tgz", - "integrity": "sha512-aBz+stMSTBOBaBEQ43zJXz2DnwS7fL6dR0e2myehAgtfAWlWwLDHruc/98VOy1ZAcBk1blE2LCU02bT5HekGxQ==", - "dependencies": { - "@algolia/cache-common": "4.11.0" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.11.0.tgz", - "integrity": "sha512-jwmFBoUSzoMwMqgD3PmzFJV/d19p1RJXB6C1ADz4ju4mU7rkaQLtqyZroQpheLoU5s5Tilmn/T8/0U2XLoJCRQ==", - "dependencies": { - "@algolia/client-common": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.11.0.tgz", - "integrity": "sha512-v5U9585aeEdYml7JqggHAj3E5CQ+jPwGVztPVhakBk8H/cmLyPS2g8wvmIbaEZCHmWn4TqFj3EBHVYxAl36fSA==", - "dependencies": { - "@algolia/client-common": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.11.0.tgz", - "integrity": "sha512-Qy+F+TZq12kc7tgfC+FM3RvYH/Ati7sUiUv/LkvlxFwNwNPwWGoZO81AzVSareXT/ksDDrabD4mHbdTbBPTRmQ==", - "dependencies": { - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.11.0.tgz", - "integrity": "sha512-mI+X5IKiijHAzf9fy8VSl/GTT67dzFDnJ0QAM8D9cMPevnfX4U72HRln3Mjd0xEaYUOGve8TK/fMg7d3Z5yG6g==", - "dependencies": { - "@algolia/client-common": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.11.0.tgz", - "integrity": "sha512-iovPLc5YgiXBdw2qMhU65sINgo9umWbHFzInxoNErWnYoTQWfXsW6P54/NlKx5uscoLVjSf+5RUWwFu5BX+lpw==", - "dependencies": { - "@algolia/client-common": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/@algolia/logger-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.11.0.tgz", - "integrity": "sha512-pRMJFeOY8hoWKIxWuGHIrqnEKN/kqKh7UilDffG/+PeEGxBuku+Wq5CfdTFG0C9ewUvn8mAJn5BhYA5k8y0Jqg==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.11.0.tgz", - "integrity": "sha512-wXztMk0a3VbNmYP8Kpc+F7ekuvaqZmozM2eTLok0XIshpAeZ/NJDHDffXK2Pw+NF0wmHqurptLYwKoikjBYvhQ==", - "dependencies": { - "@algolia/logger-common": "4.11.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.11.0.tgz", - "integrity": "sha512-Fp3SfDihAAFR8bllg8P5ouWi3+qpEVN5e7hrtVIYldKBOuI/qFv80Zv/3/AMKNJQRYglS4zWyPuqrXm58nz6KA==", - "dependencies": { - "@algolia/requester-common": "4.11.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.11.0.tgz", - "integrity": "sha512-+cZGe/9fuYgGuxjaBC+xTGBkK7OIYdfapxhfvEf03dviLMPmhmVYFJtJlzAjQ2YmGDJpHrGgAYj3i/fbs8yhiA==" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.11.0.tgz", - "integrity": "sha512-qJIk9SHRFkKDi6dMT9hba8X1J1z92T5AZIgl+tsApjTGIRQXJLTIm+0q4yOefokfu4CoxYwRZ9QAq+ouGwfeOg==", - "dependencies": { - "@algolia/requester-common": "4.11.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.11.0.tgz", - "integrity": "sha512-k4dyxiaEfYpw4UqybK9q7lrFzehygo6KV3OCYJMMdX0IMWV0m4DXdU27c1zYRYtthaFYaBzGF4Kjcl8p8vxCKw==", - "dependencies": { - "@algolia/cache-common": "4.11.0", - "@algolia/logger-common": "4.11.0", - "@algolia/requester-common": "4.11.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "dependencies": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "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", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/algoliasearch": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.11.0.tgz", - "integrity": "sha512-IXRj8kAP2WrMmj+eoPqPc6P7Ncq1yZkFiyDrjTBObV1ADNL8Z/KdZ+dWC5MmYcBLAbcB/mMCpak5N/D1UIZvsA==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.11.0", - "@algolia/cache-common": "4.11.0", - "@algolia/cache-in-memory": "4.11.0", - "@algolia/client-account": "4.11.0", - "@algolia/client-analytics": "4.11.0", - "@algolia/client-common": "4.11.0", - "@algolia/client-personalization": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/logger-common": "4.11.0", - "@algolia/logger-console": "4.11.0", - "@algolia/requester-browser-xhr": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/requester-node-http": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/remark": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", - "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", - "dependencies": { - "remark-parse": "^8.0.0", - "remark-stringify": "^8.0.0", - "unified": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "dependencies": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.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/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - } - }, - "dependencies": { - "@algolia/cache-browser-local-storage": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.11.0.tgz", - "integrity": "sha512-4sr9vHIG1fVA9dONagdzhsI/6M5mjs/qOe2xUP0yBmwsTsuwiZq3+Xu6D3dsxsuFetcJgC6ydQoCW8b7fDJHYQ==", - "requires": { - "@algolia/cache-common": "4.11.0" - } - }, - "@algolia/cache-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.11.0.tgz", - "integrity": "sha512-lODcJRuPXqf+6mp0h6bOxPMlbNoyn3VfjBVcQh70EDP0/xExZbkpecgHyyZK4kWg+evu+mmgvTK3GVHnet/xKw==" - }, - "@algolia/cache-in-memory": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.11.0.tgz", - "integrity": "sha512-aBz+stMSTBOBaBEQ43zJXz2DnwS7fL6dR0e2myehAgtfAWlWwLDHruc/98VOy1ZAcBk1blE2LCU02bT5HekGxQ==", - "requires": { - "@algolia/cache-common": "4.11.0" - } - }, - "@algolia/client-account": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.11.0.tgz", - "integrity": "sha512-jwmFBoUSzoMwMqgD3PmzFJV/d19p1RJXB6C1ADz4ju4mU7rkaQLtqyZroQpheLoU5s5Tilmn/T8/0U2XLoJCRQ==", - "requires": { - "@algolia/client-common": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "@algolia/client-analytics": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.11.0.tgz", - "integrity": "sha512-v5U9585aeEdYml7JqggHAj3E5CQ+jPwGVztPVhakBk8H/cmLyPS2g8wvmIbaEZCHmWn4TqFj3EBHVYxAl36fSA==", - "requires": { - "@algolia/client-common": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "@algolia/client-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.11.0.tgz", - "integrity": "sha512-Qy+F+TZq12kc7tgfC+FM3RvYH/Ati7sUiUv/LkvlxFwNwNPwWGoZO81AzVSareXT/ksDDrabD4mHbdTbBPTRmQ==", - "requires": { - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "@algolia/client-personalization": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.11.0.tgz", - "integrity": "sha512-mI+X5IKiijHAzf9fy8VSl/GTT67dzFDnJ0QAM8D9cMPevnfX4U72HRln3Mjd0xEaYUOGve8TK/fMg7d3Z5yG6g==", - "requires": { - "@algolia/client-common": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "@algolia/client-search": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.11.0.tgz", - "integrity": "sha512-iovPLc5YgiXBdw2qMhU65sINgo9umWbHFzInxoNErWnYoTQWfXsW6P54/NlKx5uscoLVjSf+5RUWwFu5BX+lpw==", - "requires": { - "@algolia/client-common": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "@algolia/logger-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.11.0.tgz", - "integrity": "sha512-pRMJFeOY8hoWKIxWuGHIrqnEKN/kqKh7UilDffG/+PeEGxBuku+Wq5CfdTFG0C9ewUvn8mAJn5BhYA5k8y0Jqg==" - }, - "@algolia/logger-console": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.11.0.tgz", - "integrity": "sha512-wXztMk0a3VbNmYP8Kpc+F7ekuvaqZmozM2eTLok0XIshpAeZ/NJDHDffXK2Pw+NF0wmHqurptLYwKoikjBYvhQ==", - "requires": { - "@algolia/logger-common": "4.11.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.11.0.tgz", - "integrity": "sha512-Fp3SfDihAAFR8bllg8P5ouWi3+qpEVN5e7hrtVIYldKBOuI/qFv80Zv/3/AMKNJQRYglS4zWyPuqrXm58nz6KA==", - "requires": { - "@algolia/requester-common": "4.11.0" - } - }, - "@algolia/requester-common": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.11.0.tgz", - "integrity": "sha512-+cZGe/9fuYgGuxjaBC+xTGBkK7OIYdfapxhfvEf03dviLMPmhmVYFJtJlzAjQ2YmGDJpHrGgAYj3i/fbs8yhiA==" - }, - "@algolia/requester-node-http": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.11.0.tgz", - "integrity": "sha512-qJIk9SHRFkKDi6dMT9hba8X1J1z92T5AZIgl+tsApjTGIRQXJLTIm+0q4yOefokfu4CoxYwRZ9QAq+ouGwfeOg==", - "requires": { - "@algolia/requester-common": "4.11.0" - } - }, - "@algolia/transporter": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.11.0.tgz", - "integrity": "sha512-k4dyxiaEfYpw4UqybK9q7lrFzehygo6KV3OCYJMMdX0IMWV0m4DXdU27c1zYRYtthaFYaBzGF4Kjcl8p8vxCKw==", - "requires": { - "@algolia/cache-common": "4.11.0", - "@algolia/logger-common": "4.11.0", - "@algolia/requester-common": "4.11.0" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "requires": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" - } - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "algoliasearch": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.11.0.tgz", - "integrity": "sha512-IXRj8kAP2WrMmj+eoPqPc6P7Ncq1yZkFiyDrjTBObV1ADNL8Z/KdZ+dWC5MmYcBLAbcB/mMCpak5N/D1UIZvsA==", - "requires": { - "@algolia/cache-browser-local-storage": "4.11.0", - "@algolia/cache-common": "4.11.0", - "@algolia/cache-in-memory": "4.11.0", - "@algolia/client-account": "4.11.0", - "@algolia/client-analytics": "4.11.0", - "@algolia/client-common": "4.11.0", - "@algolia/client-personalization": "4.11.0", - "@algolia/client-search": "4.11.0", - "@algolia/logger-common": "4.11.0", - "@algolia/logger-console": "4.11.0", - "@algolia/requester-browser-xhr": "4.11.0", - "@algolia/requester-common": "4.11.0", - "@algolia/requester-node-http": "4.11.0", - "@algolia/transporter": "4.11.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "requires": { - "has": "^1.0.3" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "remark": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", - "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", - "requires": { - "remark-parse": "^8.0.0", - "remark-stringify": "^8.0.0", - "unified": "^9.0.0" - } - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } - } -} diff --git a/plugins/gatsby-algolia-indexer/package.json b/plugins/gatsby-algolia-indexer/package.json deleted file mode 100644 index 42d61f2866..0000000000 --- a/plugins/gatsby-algolia-indexer/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "gatsby-algolia-indexer", - "version": "1.0.0", - "description": "Algolia", - "main": "index.js", - "license": "MIT", - "dependencies": { - "algoliasearch": "4.11.0", - "remark": "^12.0.1", - "remark-mdx": "^1.6.16" - } -} diff --git a/plugins/gatsby-algolia-indexer/remark-mdx-searchable.js b/plugins/gatsby-algolia-indexer/remark-mdx-searchable.js deleted file mode 100644 index 9a4c505d51..0000000000 --- a/plugins/gatsby-algolia-indexer/remark-mdx-searchable.js +++ /dev/null @@ -1,67 +0,0 @@ -const visit = require('unist-util-visit') -const textTypes = ['text', 'emphasis', 'strong', 'inlineCode', 'code'] - -const flattenNode = (node) => { - const p = [] - visit(node, (node) => { - if (!textTypes.includes(node.type)) return - p.push(node.value) - }) - return p.join(``) -} - -module.exports = () => (tree, file) => { - file.data = [] - let heading = null - let prev = '' - let prevType = '' - let langVal = '' - let dbVal = '' - - visit( - tree, - ({ type }) => { - return ['heading', 'paragraph', 'code', 'table', 'jsx', 'tableCell', 'tableRow'].includes( - type - ) - }, - (node) => { - if (node.type === 'jsx' && node.value.includes('<SwitchTech')) { - const val = node.value - .replace('<SwitchTech technologies={[', '') - .replace(']}>', '') - .replace(/\'/g, '') - langVal = val.split(', ')[0] - dbVal = val.split(', ')[1] - } - - if (node.type === 'jsx' && node.value.includes('</SwitchTech>')) { - langVal = '' - dbVal = '' - } - if (node.type === 'heading') { - if (prevType === 'heading') { - file.data.push({ - heading: prev, - text: '', - langVal, - dbVal, - }) - } - prev = flattenNode(node) - prevType = node.type - return (heading = flattenNode(node)) - } - - prev = flattenNode(node) - prevType = node.type - - file.data.push({ - heading, - text: flattenNode(node), - langVal, - dbVal, - }) - } - ) -} diff --git a/plugins/gatsby-plugin-lost-pixel/gatsby-node.js b/plugins/gatsby-plugin-lost-pixel/gatsby-node.js deleted file mode 100644 index f77ed7a869..0000000000 --- a/plugins/gatsby-plugin-lost-pixel/gatsby-node.js +++ /dev/null @@ -1,71 +0,0 @@ -const path = require('path') -const fsPromises = require('fs').promises - -const publicPath = `./public` - -// Excluded paths from page listing as they're redirected to the page with the language and db selected -// https://github.com/prisma/homepage-v8/blob/b972182ebee2c824e6b2981088907b215d9bfee0/public/_redirects#L75-L78 -const excludedPaths = [ - '/getting-started/quickstart', - '/getting-started/setup-prisma/add-to-existing-project', - '/getting-started/setup-prisma/start-from-scratch-sql ', - '/getting-started/setup-prisma/start-from-scratch-prisma-migrate', -] - -const errorPages = [ - '/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql', - '/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql', -] - -const longPages = [ - '/reference/api-reference/prisma-client-reference', - '/reference/api-reference/prisma-schema-reference', -] - -exports.onPostBuild = async ({ graphql, pathPrefix, basePath = pathPrefix }, pluginOptions) => { - const outputFile = path.join(publicPath, '/lost-pixel.json') - - const query = ` - { - allSitePage { - edges { - node { - path - } - } - } - }` - const { data } = await graphql(query) - - console.log('Generating lost-pixel.json file for lostpixel plugin.') - - // Construct the pages json by iterating over the mdx files. - - const pages = data.allSitePage.edges - .map((edge, i) => { - // Skip explicitly excluded paths - if ( - excludedPaths.includes(edge.node.path) || - longPages.includes(edge.node.path) || - errorPages.includes(edge.node.path) - ) - return null - // Allow headless browser to render super long pages before screenshoting them - - // console.log('entry', { - // path: edge.node.path, - // name: edge.node.path - // }) - - return { - path: edge.node.path, - name: - edge.node.path === '/' || edge.node.path === '/404/' - ? edge.node.path.split('/').join('-') - : edge.node.path, - } - }) - .filter((edge) => edge !== null) - console.log(pages.length) - await fsPromises.writeFile(outputFile, JSON.stringify(pages)) -} diff --git a/plugins/gatsby-plugin-lost-pixel/index.js b/plugins/gatsby-plugin-lost-pixel/index.js deleted file mode 100644 index 48d2773929..0000000000 --- a/plugins/gatsby-plugin-lost-pixel/index.js +++ /dev/null @@ -1 +0,0 @@ -//noop diff --git a/plugins/gatsby-plugin-lost-pixel/package.json b/plugins/gatsby-plugin-lost-pixel/package.json deleted file mode 100644 index db27f10444..0000000000 --- a/plugins/gatsby-plugin-lost-pixel/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "gatsby-plugin-lost-pixel", - "version": "1.0.0", - "description": "Create a json file with paths to screenshot with Lost Pixel", - "main": "index.js", - "license": "MIT" -} diff --git a/plugins/gatsby-plugin-page-list/gatsby-node.js b/plugins/gatsby-plugin-page-list/gatsby-node.js deleted file mode 100644 index e0f0e9c393..0000000000 --- a/plugins/gatsby-plugin-page-list/gatsby-node.js +++ /dev/null @@ -1,57 +0,0 @@ -const path = require('path') -const fsPromises = require('fs').promises -const url = require('url') - -const publicPath = `./public` - -// Excluded paths from page listing as they're redirected to the page with the language and db selected -// https://github.com/prisma/homepage-v8/blob/b972182ebee2c824e6b2981088907b215d9bfee0/public/_redirects#L75-L78 -const excludedPaths = [ - '/getting-started/quickstart', - '/getting-started/setup-prisma/add-to-existing-project', - '/getting-started/setup-prisma/start-from-scratch-sql ', - '/getting-started/setup-prisma/start-from-scratch-prisma-migrate', -] - -exports.onPostBuild = async ({ graphql, pathPrefix, basePath = pathPrefix }, pluginOptions) => { - const outputFile = path.join(publicPath, '/pages.json') - - const query = ` - { - site { - siteMetadata { - siteUrl - pathPrefix - } - } - allSitePage { - edges { - node { - path - pageContext - } - } - } - }` - const { data } = await graphql(query) - - // Construct the pages json by iterating over the mdx files. - const pages = data.allSitePage.edges - .map((edge, i) => { - // Skip the 404 pages and pages without seoTitle - if (!edge.node.pageContext || !edge.node.pageContext.seoTitle) return null - // Skip explicitly excluded paths - if (excludedPaths.includes(edge.node.path)) return null - - return { - title: edge.node.pageContext.seoTitle, - url: url.resolve( - data.site.siteMetadata.siteUrl, - path.join(data.site.siteMetadata.pathPrefix, edge.node.path) - ), - } - }) - .filter((edge) => edge !== null) - - await fsPromises.writeFile(outputFile, JSON.stringify(pages)) -} diff --git a/plugins/gatsby-plugin-page-list/index.js b/plugins/gatsby-plugin-page-list/index.js deleted file mode 100644 index 172f1ae6a4..0000000000 --- a/plugins/gatsby-plugin-page-list/index.js +++ /dev/null @@ -1 +0,0 @@ -// noop diff --git a/plugins/gatsby-plugin-page-list/package.json b/plugins/gatsby-plugin-page-list/package.json deleted file mode 100644 index a09648d65d..0000000000 --- a/plugins/gatsby-plugin-page-list/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "gatsby-plugin-page-list", - "version": "1.0.0", - "description": "Create a json file with all pages and titles", - "main": "index.js", - "license": "MIT" -} diff --git a/plugins/gatsby-remark-check-links-numberless/index.js b/plugins/gatsby-remark-check-links-numberless/index.js deleted file mode 100644 index 4bed87a468..0000000000 --- a/plugins/gatsby-remark-check-links-numberless/index.js +++ /dev/null @@ -1,372 +0,0 @@ -var visit = require('unist-util-visit') -const path = require('path') -var vercelSettings = require('../../vercel.json') - -const techStrings = [ - 'node', - 'typescript', - 'postgresql', - 'mysql', - 'sqlserver', - 'planetscale', - 'cockroachdb', -] -function getCacheKey(node) { - return `remark-check-links-${node.id}-${node.internal.contentDigest}` -} - -const isDirectMatch = (url, source) => - (url.includes('#') ? url.split('#')[0] : url) === source.replace('/docs', '') -const isSourcePartofUrl = (url, source) => - source.includes(':/any*') && ('/docs' + url).includes(source.replace('/:any*', '')) - -function getHeadingsMapKey(link, pathUrl) { - let key = link - const hashIndex = link.indexOf('#') - const hasHash = hashIndex !== -1 - if (hasHash) { - key = link.startsWith('#') ? pathUrl : link.slice(0, hashIndex) - } - - return { - key, - hasHash, - hashIndex, - } -} - -function createPathPrefixer(pathPrefix) { - return function withPathPrefix(url) { - var prefixed = pathPrefix + url - return prefixed.replace(/\/\//, '/') - } -} - -module.exports = async function plugin( - { markdownAST, markdownNode, files, getNode, cache, getCache, pathPrefix }, - { exceptions = [], ignore = [], verbose = true } = {} -) { - const withPathPrefix = createPathPrefixer(pathPrefix) - const pathSep = '/' - var pattern = /^https?:\/\//i - if (!markdownNode.fields) { - // let the file pass if it has no fields - return markdownAST - } - - const links = [] - const headings = [] - - function visitor(node, index, parent) { - if (parent.type === 'heading') { - headings.push(parent.data.id.replace(/inlinecode/g, '')) - return - } - - // if(node.isDomainUrl) { console.log(node) } - - if (!node.url.startsWith('mailto:') && !/^https?:\/\//.test(node.url)) { - let tranformedUrl = node.url - links.push({ - ...node, - tranformedUrl, - frontmatter: markdownNode.frontmatter, - }) - } - - if (node.isDomainUrl) { - let tranformedUrl = node.url - links.push({ - ...node, - tranformedUrl, - frontmatter: markdownNode.frontmatter, - }) - } - } - - visit(markdownAST, 'link', visitor) - - const parent = await getNode(markdownNode.parent) - const setAt = Date.now() - await cache.set(getCacheKey(parent), { - path: withPathPrefix( - markdownNode.fields.slug - .replace(new RegExp('\\b' + `${pathSep}index` + '\\b'), '') - .replace(/\d+-/g, '') - .concat(pathSep) - ), - links, - headings, - setAt, - }) - - // wait to see if all of the Markdown and MDX has been visited - const linksMap = {} - const headingsMap = {} - for (const file of files) { - if (/^mdx?$/.test(file.extension) && file.relativePath !== 'docs/README.md') { - const key = getCacheKey(file) - let visited = await cache.get(key) - if (!visited && getCache) { - // the cache provided to `gatsby-mdx` has its own namespace, and it - // doesn't have access to `getCache`, so we have to check to see if - // those files have been visited here. - const mdxCache = getCache('gatsby-plugin-mdx') - visited = await mdxCache.get(key) - } - if (visited && setAt >= visited.setAt) { - linksMap[visited.path] = visited.links - headingsMap[visited.path] = visited.headings - continue - } - - // don't continue if a page hasn't been visited yet - return - } - } - - let totalBrokenLinks = 0 - let totalBrokenAnchors = 0 - let totalDomainLinks = 0 - let totalTrailingSlashLinks = 0 - let totalRedirectedLinks = 0 - - const prefixedIgnore = ignore.map(withPathPrefix) - const prefixedExceptions = exceptions.map(withPathPrefix) - const pathKeys = Object.keys(linksMap) - const pathKeysWithoutIndex = pathKeys.map((p) => - p.replace(new RegExp('\\b' + `${pathSep}index` + '\\b'), '').replace(/\/$/, '') - ) - - for (const pathL in linksMap) { - if (prefixedIgnore.includes(pathL)) { - // don't check links on ignored pages - continue - } - - const linksForPath = linksMap[pathL] - if (linksForPath.length) { - const brokenLinks = linksForPath.filter((link) => { - // return true for broken links, false = pass - const { key, hasHash, hashIndex } = getHeadingsMapKey(link.tranformedUrl, pathL) - - if (link.originalUrl === '') { - return true - } - - if (prefixedExceptions.includes(key) || /^https?:\/\//.test(key)) { - // do not test this link as it is on the list of exceptions - return false - } - const url = hasHash ? link.tranformedUrl.slice(0, hashIndex) : link.tranformedUrl - const urlToCheck = url.slice(-1) === pathSep ? url.slice(0, -1) : url - const headings = headingsMap[key] - if (headings) { - if (hasHash) { - const id = link.tranformedUrl.slice(hashIndex + 1) - return !prefixedExceptions.includes(id) && !headings.includes(id) - } - - return false - } - return !pathKeysWithoutIndex.includes(urlToCheck) - }) - - const brokenAnchors = linksForPath.filter((link) => { - // return true for broken links, false = pass - const { key, hasHash, hashIndex } = getHeadingsMapKey(link.tranformedUrl, pathL) - - if (prefixedExceptions.includes(key) || /^https?:\/\//.test(key)) { - // do not test this link as it is on the list of exceptions - return false - } - const url = hasHash ? link.tranformedUrl.slice(0, hashIndex) : link.tranformedUrl - const urlToCheck = url.slice(-1) === pathSep ? url.slice(0, -1) : url - const keyToLook = `${key}${key.endsWith('/') ? '' : '/'}` - const headings = headingsMap[keyToLook] - if (headings) { - if (hasHash) { - const id = link.tranformedUrl.slice(hashIndex + 1) - return !prefixedExceptions.includes(id) && !headings.includes(id) - } - - return false - } - return !pathKeysWithoutIndex.includes(urlToCheck) - }) - - const domainLinks = linksForPath.filter((link) => { - return link.isDomainUrl - }) - - const trailingSlashLinks = linksForPath.filter((link) => { - return link.isTrailingSlashUrl - }) - - const redirectedLinks = linksForPath.filter((link) => { - if ( - link && - vercelSettings && - vercelSettings.redirects && - vercelSettings.redirects.some( - (r) => - isDirectMatch(link.originalUrl, r.source) || - isSourcePartofUrl(link.originalUrl, r.source) - ) - ) { - return true - } - }) - - const brokenLinkCount = brokenLinks.length - const brokenAnchorCount = brokenAnchors.length - const domainLinksCount = domainLinks.length - const trailingSlashLinksCount = trailingSlashLinks.length - const redirectedLinksCount = redirectedLinks.length - totalBrokenLinks += brokenLinkCount - totalBrokenAnchors += brokenAnchorCount - totalDomainLinks += domainLinksCount - totalTrailingSlashLinks += trailingSlashLinksCount - totalRedirectedLinks += redirectedLinksCount - - if (brokenLinkCount && verbose) { - console.warn(`${brokenLinkCount} broken links found on ${pathL.replace(/\/$/, '')}`) - for (const link of brokenLinks) { - let prefix = '-' - if (link.position) { - const { line, column } = link.position.start - - // account for the offset that frontmatter adds - const offset = link.frontmatter ? Object.keys(link.frontmatter).length + 2 : 0 - - prefix = [String(line + offset).padStart(3, ' '), String(column).padEnd(4, ' ')].join( - ':' - ) - } - - if (techStrings.some((tech) => link.originalUrl.includes(tech))) { - console.warn( - `${prefix} ${link.originalUrl} contains tech switcher strings. Please add this to the exceptions list in gatsby-config.ts` - ) - } else { - console.warn(`${prefix} ${link.originalUrl}`) - } - } - console.log('') - } - - if (brokenAnchorCount && verbose) { - console.warn(`${brokenAnchorCount} broken anchors found on ${pathL.replace(/\/$/, '')}`) - for (const link of brokenAnchors) { - let prefix = '-' - if (link.position) { - const { line, column } = link.position.start - - // account for the offset that frontmatter adds - const offset = link.frontmatter ? Object.keys(link.frontmatter).length + 2 : 0 - - prefix = [String(line + offset).padStart(3, ' '), String(column).padEnd(4, ' ')].join( - ':' - ) - } - console.warn(`${prefix} ${link.originalUrl}`) - } - console.log('') - } - - if (domainLinksCount && verbose) { - console.warn(`${domainLinksCount} domain urls found on ${pathL.replace(/\/$/, '')}`) - for (const link of domainLinks) { - let prefix = '-' - if (link.position) { - const { line, column } = link.position.start - - // account for the offset that frontmatter adds - const offset = link.frontmatter ? Object.keys(link.frontmatter).length + 2 : 0 - - prefix = [String(line + offset).padStart(3, ' '), String(column).padEnd(4, ' ')].join( - ':' - ) - } - console.warn(`${prefix} ${link.originalUrl}`) - } - console.log('') - } - - if (trailingSlashLinksCount && verbose) { - console.warn( - `${trailingSlashLinksCount} trailing slash urls found on ${pathL.replace(/\/$/, '')}` - ) - for (const link of trailingSlashLinks) { - let prefix = '-' - if (link.position) { - const { line, column } = link.position.start - - // account for the offset that frontmatter adds - const offset = link.frontmatter ? Object.keys(link.frontmatter).length + 2 : 0 - - prefix = [String(line + offset).padStart(3, ' '), String(column).padEnd(4, ' ')].join( - ':' - ) - } - console.warn(`${prefix} ${link.originalUrl}`) - } - console.log('') - } - - if (redirectedLinksCount && verbose) { - console.warn( - `${redirectedLinksCount} redirected links found on ${pathL.replace(/\/$/, '')}` - ) - for (const link of redirectedLinks) { - let prefix = '-' - if (link.position) { - const { line, column } = link.position.start - - // account for the offset that frontmatter adds - const offset = link.frontmatter ? Object.keys(link.frontmatter).length + 2 : 0 - - prefix = [String(line + offset).padStart(3, ' '), String(column).padEnd(4, ' ')].join( - ':' - ) - } - console.warn(`${prefix} ${link.originalUrl}`) - } - console.log('') - } - } - } - if ( - totalBrokenLinks || - totalBrokenAnchors || - totalDomainLinks || - totalTrailingSlashLinks || - totalRedirectedLinks - ) { - let message = ` - Broken (or redirected) internal links: ${totalBrokenLinks} - Broken anchors: ${totalBrokenAnchors} - Domain name in links: ${totalDomainLinks} - Links with trailing slashes: ${totalTrailingSlashLinks} - ` - - if (totalRedirectedLinks) { - message = `${message} - Redirected links found: ${totalRedirectedLinks}. Please run 'npm run redirect-transform' to replace these urls with correct paths - ` - } - if (process.env.NODE_ENV === 'production') { - // break builds with broken links before they get deployed for reals - // throw new Error(message) - console.warn(message) - } - - if (verbose) { - console.warn(message) - } - } else if (verbose) { - console.info('No internal broken links found') - } - - return markdownAST -} diff --git a/plugins/gatsby-remark-check-links-numberless/package.json b/plugins/gatsby-remark-check-links-numberless/package.json deleted file mode 100644 index e9453a9a4a..0000000000 --- a/plugins/gatsby-remark-check-links-numberless/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "gatsby-remark-check-links-numberless", - "version": "1.0.0", - "description": "Transformed links checker", - "main": "index.js", - "author": "Nilufar Bava <nilubava@gmail.com>", - "license": "ISC", - "keywords": [ - "gatsby", - "gatsby-plugin" - ] -} diff --git a/plugins/gatsby-remark-image-custom/constants.js b/plugins/gatsby-remark-image-custom/constants.js deleted file mode 100644 index 77d721069c..0000000000 --- a/plugins/gatsby-remark-image-custom/constants.js +++ /dev/null @@ -1,17 +0,0 @@ -exports.DEFAULT_OPTIONS = { - maxWidth: 650, - wrapperStyle: ``, - backgroundColor: `white`, - linkImagesToOriginal: true, - showCaptions: false, - markdownCaptions: false, - withWebp: false, - tracedSVG: false, - loading: `lazy`, - disableBgImageOnAlpha: false, - disableBgImage: false, -} - -exports.imageClass = `gatsby-resp-image-image` -exports.imageWrapperClass = `gatsby-resp-image-wrapper` -exports.imageBackgroundClass = `gatsby-resp-image-background-image` diff --git a/plugins/gatsby-remark-image-custom/gatsby-browser.js b/plugins/gatsby-remark-image-custom/gatsby-browser.js deleted file mode 100644 index 8f6f134a9b..0000000000 --- a/plugins/gatsby-remark-image-custom/gatsby-browser.js +++ /dev/null @@ -1,43 +0,0 @@ -const { - DEFAULT_OPTIONS, - imageClass, - imageBackgroundClass, - imageWrapperClass, -} = require(`./constants`) - -exports.onRouteUpdate = (apiCallbackContext, pluginOptions) => { - const options = Object.assign({}, DEFAULT_OPTIONS, pluginOptions) - - const imageWrappers = document.querySelectorAll(`.${imageWrapperClass}`) - - // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ - // for cross-browser looping through NodeList without polyfills - for (let i = 0; i < imageWrappers.length; i++) { - const imageWrapper = imageWrappers[i] - - const backgroundElement = imageWrapper.querySelector(`.${imageBackgroundClass}`) - const imageElement = imageWrapper.querySelector(`.${imageClass}`) - - const onImageLoad = () => { - backgroundElement.style.transition = `opacity 0.5s 0.5s` - imageElement.style.transition = `opacity 0.5s` - onImageComplete() - } - - const onImageComplete = () => { - backgroundElement.style.opacity = 0 - imageElement.style.opacity = 1 - imageElement.style.color = `inherit` - imageElement.style.boxShadow = `inset 0px 0px 0px 400px ${options.backgroundColor}` - imageElement.removeEventListener(`load`, onImageLoad) - imageElement.removeEventListener(`error`, onImageComplete) - } - - imageElement.style.opacity = 0 - imageElement.addEventListener(`load`, onImageLoad) - imageElement.addEventListener(`error`, onImageComplete) - if (imageElement.complete) { - onImageComplete() - } - } -} diff --git a/plugins/gatsby-remark-image-custom/gatsby-ssr.js b/plugins/gatsby-remark-image-custom/gatsby-ssr.js deleted file mode 100644 index 0f3b91d897..0000000000 --- a/plugins/gatsby-remark-image-custom/gatsby-ssr.js +++ /dev/null @@ -1,25 +0,0 @@ -const React = require('react') -const { imageClass } = require(`./constants`) - -exports.onRenderBody = ({ setHeadComponents }) => { - const style = ` - .${imageClass} { - width: 100%; - height: 100%; - margin: 0; - vertical-align: middle; - position: absolute; - top: 0; - left: 0; - color: transparent; - }` - .replace(/\s*\n\s*/g, ``) - .replace(/: /g, `:`) - .replace(/ \{/g, `{`) - - setHeadComponents([ - <style type="text/css" key="gatsby-remark-images-styles"> - {style} - </style>, - ]) -} diff --git a/plugins/gatsby-remark-image-custom/index.js b/plugins/gatsby-remark-image-custom/index.js deleted file mode 100644 index 4406c81527..0000000000 --- a/plugins/gatsby-remark-image-custom/index.js +++ /dev/null @@ -1,444 +0,0 @@ -const { - DEFAULT_OPTIONS, - imageClass, - imageBackgroundClass, - imageWrapperClass, -} = require(`./constants`) -const visitWithParents = require(`unist-util-visit-parents`) -const getDefinitions = require(`mdast-util-definitions`) -const path = require(`path`) -const queryString = require(`query-string`) -const isRelativeUrl = require(`is-relative-url`) -const _ = require(`lodash`) -const { fluid, stats, traceSVG } = require(`gatsby-plugin-sharp`) -const Promise = require(`bluebird`) -const cheerio = require(`cheerio`) -const slash = require(`slash`) -const chalk = require(`chalk`) - -// If the image is relative (not hosted elsewhere) -// 1. Find the image file -// 2. Find the image's size -// 3. Filter out any responsive image fluid sizes that are greater than the image's width -// 4. Create the responsive images. -// 5. Set the html w/ aspect ratio helper. -module.exports = ( - { files, markdownNode, markdownAST, pathPrefix, getNode, reporter, cache, compiler }, - pluginOptions -) => { - const options = _.defaults(pluginOptions, { pathPrefix }, DEFAULT_OPTIONS) - - const findParentLinks = ({ children }) => - children.some( - (node) => (node.type === `html` && !!node.value.match(/<a /)) || node.type === `link` - ) - - const getWidthOverride = (node) => { - if (!node.value || !node.value.match(/width/)) return null - - // extract width in pixels, as an integer (or null) - const regex = /width="([0-9]+)(?:px)?"/g - const match = regex.exec(node.value) - if (!match) return - return parseInt(match[1]) - } - - // Get all the available definitions in the markdown tree - const definitions = getDefinitions(markdownAST) - - // This will allow the use of html image tags - // const rawHtmlNodes = select(markdownAST, `html`) - let rawHtmlNodes = [] - visitWithParents(markdownAST, [`html`, `jsx`], (node, ancestors) => { - const inLink = ancestors.some(findParentLinks) - const width = getWidthOverride(node) || null - - rawHtmlNodes.push({ node, inLink, width }) - }) - - // This will only work for markdown syntax image tags - let markdownImageNodes = [] - - visitWithParents(markdownAST, [`image`, `imageReference`], (node, ancestors) => { - const inLink = ancestors.some(findParentLinks) - - markdownImageNodes.push({ node, inLink }) - }) - - const getImageInfo = (uri) => { - const { url, query } = queryString.parseUrl(uri) - return { - ext: path.extname(url).split(`.`).pop(), - url, - query, - } - } - - const getImageCaption = (node, overWrites) => { - const getCaptionString = () => { - const captionOptions = Array.isArray(options.showCaptions) - ? options.showCaptions - : options.showCaptions === true - ? [`title`, `alt`] - : false - - if (captionOptions) { - for (const option of captionOptions) { - switch (option) { - case `title`: - if (node.title) { - return node.title - } - break - case `alt`: - if (overWrites.alt) { - return overWrites.alt - } - if (node.alt) { - return node.alt - } - break - } - } - } - - return `` - } - - const captionString = getCaptionString() - - if (!options.markdownCaptions || !compiler) { - return _.escape(captionString) - } - - return compiler.generateHTML(compiler.parseString(captionString)) - } - - // Takes a node and generates the needed images and then returns - // the needed HTML replacement for the image - const generateImagesAndUpdateNode = async function ( - node, - resolve, - inLink, - overWrites = {}, - width = null - ) { - // Check if this markdownNode has a File parent. This plugin - // won't work if the image isn't hosted locally. - const parentNode = getNode(markdownNode.parent) - let imagePath - if (parentNode && parentNode.dir) { - imagePath = slash(path.join(parentNode.dir, getImageInfo(node.url).url)) - } else { - return null - } - - const imageNode = _.find(files, (file) => { - if (file && file.absolutePath) { - return file.absolutePath === imagePath - } - return null - }) - - if (!imageNode || !imageNode.absolutePath) { - return resolve() - } - - // If width attribute is set then overwrite gatsby-config's maxWidth - const args = width ? { ...options, maxWidth: `${width}px` } : options - - let fluidResult = await fluid({ - file: imageNode, - args, - reporter, - cache, - }) - - if (!fluidResult) { - return resolve() - } - - const originalImg = fluidResult.originalImg - const fallbackSrc = fluidResult.src - const srcSet = fluidResult.srcSet - const presentationWidth = width ? width : fluidResult.presentationWidth - - // Generate default alt tag - const srcSplit = getImageInfo(node.url).url.split(`/`) - const fileName = srcSplit[srcSplit.length - 1] - const fileNameNoExt = fileName.replace(/\.[^/.]+$/, ``) - const defaultAlt = fileNameNoExt.replace(/[^A-Z0-9]/gi, ` `) - - const alt = _.escape(overWrites.alt ? overWrites.alt : node.alt ? node.alt : defaultAlt) - - const title = node.title ? _.escape(node.title) : alt - - const loading = options.loading - - if (![`lazy`, `eager`, `auto`].includes(loading)) { - reporter.warn( - reporter.stripIndent(` - ${chalk.bold(loading)} is an invalid value for the ${chalk.bold( - `loading` - )} option. Please pass one of "lazy", "eager" or "auto". - `) - ) - } - - // Create our base image tag - let imageTag = ` - <img - class="${imageClass}" - alt="${alt}" - title="${title}" - src="${fallbackSrc}" - srcset="${srcSet}" - sizes="${fluidResult.sizes}" - loading="${loading}" - /> - `.trim() - - // if options.withWebp is enabled, generate a webp version and change the image tag to a picture tag - if (options.withWebp) { - const webpFluidResult = await fluid({ - file: imageNode, - args: _.defaults( - { toFormat: `WEBP` }, - // override options if it's an object, otherwise just pass through defaults - options.withWebp === true ? {} : options.withWebp, - pluginOptions, - DEFAULT_OPTIONS - ), - reporter, - }) - - if (!webpFluidResult) { - return resolve() - } - - imageTag = ` - <picture> - <source - srcset="${webpFluidResult.srcSet}" - sizes="${webpFluidResult.sizes}" - type="${webpFluidResult.srcSetType}" - /> - <source - srcset="${srcSet}" - sizes="${fluidResult.sizes}" - type="${fluidResult.srcSetType}" - /> - <img - class="${imageClass}" - src="${fallbackSrc}" - alt="${alt}" - title="${title}" - loading="${loading}" - /> - </picture> - `.trim() - } - - let placeholderImageData = fluidResult.base64 - - // if options.tracedSVG is enabled generate the traced SVG and use that as the placeholder image - if (options.tracedSVG) { - let args = typeof options.tracedSVG === `object` ? options.tracedSVG : {} - - // Translate Potrace constants (e.g. TURNPOLICY_LEFT, COLOR_AUTO) to the values Potrace expects - const { Potrace } = require(`potrace`) - const argsKeys = Object.keys(args) - args = argsKeys.reduce((result, key) => { - const value = args[key] - result[key] = Potrace.hasOwnProperty(value) ? Potrace[value] : value - return result - }, {}) - - const tracedSVG = await traceSVG({ - file: imageNode, - args, - fileArgs: args, - cache, - reporter, - }) - - // Escape single quotes so the SVG data can be used in inline style attribute with single quotes - placeholderImageData = tracedSVG.replace(/'/g, `\\'`) - } - - const ratio = `${(1 / fluidResult.aspectRatio) * 100}%` - - const wrapperStyle = - typeof options.wrapperStyle === `function` - ? options.wrapperStyle(fluidResult) - : options.wrapperStyle - - // Construct new image node w/ aspect ratio placeholder - const imageCaption = options.showCaptions && getImageCaption(node, overWrites) - - let removeBgImage = false - if (options.disableBgImageOnAlpha) { - const imageStats = await stats({ file: imageNode, reporter }) - if (imageStats && imageStats.isTransparent) removeBgImage = true - } - if (options.disableBgImage) { - removeBgImage = true - } - - const bgImage = removeBgImage - ? `` - : ` background-image: url('${placeholderImageData}'); background-size: cover;` - - let rawHTML = ` - <span - class="${imageBackgroundClass}" - style="padding-bottom: ${ratio}; position: relative; bottom: 0; left: 0;${bgImage} display: block;" - ></span> - ${imageTag} - `.trim() - - // Make linking to original image optional. - if (!inLink && options.linkImagesToOriginal) { - rawHTML = ` - <a - class="gatsby-resp-image-link" - href="${originalImg}" - style="display: block" - target="_blank" - rel="noopener" - > - ${rawHTML} - </a> - `.trim() - } - - rawHTML = ` - <span - class="${imageWrapperClass}" - style="position: relative; display: block; margin-left: auto; margin-right: auto; ${ - imageCaption ? `` : wrapperStyle - } max-width: ${presentationWidth}px;" - > - ${rawHTML} - </span> - `.trim() - - // Wrap in figure and use title as caption - if (imageCaption) { - rawHTML = ` - <figure class="gatsby-resp-image-figure" style="${wrapperStyle}"> - ${rawHTML} - <figcaption class="gatsby-resp-image-figcaption">${imageCaption}</figcaption> - </figure> - `.trim() - } - - return rawHTML - } - - return Promise.all( - // Simple because there is no nesting in markdown - markdownImageNodes.map( - ({ node, inLink }) => - new Promise(async (resolve, reject) => { - const overWrites = {} - let refNode - if (!node.hasOwnProperty(`url`) && node.hasOwnProperty(`identifier`)) { - //consider as imageReference node - refNode = node - node = definitions(refNode.identifier) - // pass original alt from referencing node - overWrites.alt = refNode.alt - if (!node) { - // no definition found for image reference, - // so there's nothing for us to do. - return resolve() - } - } - const fileType = getImageInfo(node.url).ext - - // Ignore gifs as we can't process them, - // svgs as they are already responsive by definition - if (isRelativeUrl(node.url) && fileType !== `gif` && fileType !== `svg`) { - const rawHTML = await generateImagesAndUpdateNode(node, resolve, inLink, overWrites) - - if (rawHTML) { - // Replace the image or ref node with an inline HTML node. - if (refNode) { - node = refNode - } - node.type = `html` - node.value = rawHTML - } - return resolve(node) - } else { - // Image isn't relative so there's nothing for us to do. - return resolve() - } - }) - ) - ).then((markdownImageNodes) => - // HTML image node stuff - Promise.all( - // Complex because HTML nodes can contain multiple images - rawHtmlNodes.map( - ({ node, inLink, width }) => - new Promise(async (resolve, reject) => { - if (!node.value) { - return resolve() - } - - const $ = cheerio.load(node.value) - if ($(`img`).length === 0) { - // No img tags - return resolve() - } - - let imageRefs = [] - $(`img`).each(function () { - imageRefs.push($(this)) - }) - - for (let thisImg of imageRefs) { - // Get the details we need. - let formattedImgTag = {} - formattedImgTag.url = thisImg.attr(`src`) - formattedImgTag.title = thisImg.attr(`title`) - formattedImgTag.alt = thisImg.attr(`alt`) - - if (!formattedImgTag.url) { - return resolve() - } - - const fileType = getImageInfo(formattedImgTag.url).ext - - // Ignore gifs as we can't process them, - // svgs as they are already responsive by definition - if (isRelativeUrl(formattedImgTag.url) && fileType !== `gif` && fileType !== `svg`) { - const rawHTML = await generateImagesAndUpdateNode( - formattedImgTag, - resolve, - inLink, - {}, - width - ) - - if (rawHTML) { - // Replace the image string - thisImg.replaceWith(rawHTML) - } else { - return resolve() - } - } - } - - // Replace the image node with an inline HTML node. - node.type = `html` - node.value = $(`body`).html() // fix for cheerio v1 - - return resolve(node) - }) - ) - ).then((htmlImageNodes) => markdownImageNodes.concat(htmlImageNodes).filter((node) => !!node)) - ) -} diff --git a/plugins/gatsby-remark-image-custom/package.json b/plugins/gatsby-remark-image-custom/package.json deleted file mode 100644 index e8e54e0304..0000000000 --- a/plugins/gatsby-remark-image-custom/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "@bonobolabs/gatsby-remark-images-custom-widths", - "description": "gatsby-remark-images but with support for custom image widths", - "version": "0.0.7", - "author": "Kyle Mathews <mathews.kyle@gmail.com>", - "contributors": [ - "Alex Louden <alex@louden.com>" - ], - "bugs": { - "url": "https://github.com/Bonobolabs/gatsby-remark-image-custom-widths/issues" - }, - "dependencies": { - "@babel/runtime": "^7.7.2", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.3", - "is-relative-url": "^3.0.0", - "lodash": "^4.17.15", - "mdast-util-definitions": "^1.2.5", - "potrace": "^2.1.2", - "query-string": "^6.8.3", - "slash": "^3.0.0", - "unist-util-select": "^1.5.0", - "unist-util-visit-parents": "^2.1.2" - }, - "devDependencies": { - "@babel/cli": "^7.7.0", - "@babel/core": "^7.7.2", - "babel-preset-gatsby-package": "^0.2.10", - "cross-env": "^5.2.1", - "hast-util-to-html": "^6.0.2", - "mdast-util-to-hast": "^6.0.2" - }, - "homepage": "https://github.com/Bonobolabs/gatsby-remark-image-custom-widths", - "keywords": [ - "gatsby", - "gatsby-plugin", - "image", - "markdown", - "remark", - "responsive images" - ], - "license": "MIT", - "main": "index.js", - "peerDependencies": { - "gatsby": "^4.0.0", - "gatsby-plugin-sharp": "^4.0.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/gatsbyjs/gatsby.git", - "directory": "packages/gatsby-remark-images" - }, - "scripts": { - "build": "babel src --out-dir . --ignore **/__tests__", - "prepare": "cross-env NODE_ENV=production npm run build", - "watch": "babel -w src --out-dir . --ignore **/__tests__" - }, - "engines": { - "node": ">=14.15.0" - } -} diff --git a/plugins/gatsby-remark-to-absoluteurl/gatsby-node.js b/plugins/gatsby-remark-to-absoluteurl/gatsby-node.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/plugins/gatsby-remark-to-absoluteurl/index.js b/plugins/gatsby-remark-to-absoluteurl/index.js deleted file mode 100644 index f71d15da96..0000000000 --- a/plugins/gatsby-remark-to-absoluteurl/index.js +++ /dev/null @@ -1,92 +0,0 @@ -var visit = require('unist-util-visit') -const path = require('path') - -function withPathPrefix(url, pathPrefix) { - const prefixed = pathPrefix + url - return prefixed.replace(/\/\//, '/') -} - -const pathSep = '/' -module.exports = function plugin( - { markdownAST, markdownNode, pathPrefix, getNode }, - { redirects = [] } = {} -) { - function visitor(node) { - node.originalUrl = node.url - var pattern = /^https?:\/\//i - node.isDomainUrl = false - - if ( - markdownNode.fields && - markdownNode.fields.slug && - !node.url.startsWith('/') && - !node.url.startsWith('#') && - !node.url.startsWith('mailto:') && - !/^https?:\/\//.test(node.url) - ) { - const parent = getNode(markdownNode.parent) - const newUrl = path - .resolve( - markdownNode.fields.slug - .replace(new RegExp('\\b' + `${pathSep}index` + '\\b'), '') - .replace(/\d{2,}-/g, '') - .replace(/\/$/, '') - .split(pathSep) - .slice(0, parent.name === 'index' ? undefined : -1) - .join(pathSep) || '/', - node.url - ) - .replace(/\/?(\?|$)/, '/$1') - .replace(/\/$/, '') - - if (/^..\\/.test(newUrl)) { - //Code specifically for local run, to fix broken links on - let newUrl2 = path.resolve( - markdownNode.fields.slug.replace(/(\/.+)\/.*/, '$1').replace(/\/\d{2,}-/g, '/'), - node.url - ) - - newUrl2 = newUrl2 - .replace(/\\/g, '/') - .slice(2) - .replace(/(^.*)#.*/, '$1') - - const isRedirectPath = redirects.find((url) => newUrl2.includes(url.from)) - if (isRedirectPath) newUrl2 = isRedirectPath.to - - let hashVal = node.url.match(/#.*/) - if (hashVal) newUrl2 += hashVal[0] - - node.url = newUrl2.replace(/^([^#]*)$/, '$1/') - } else { - const isRedirectPath = redirects.find((url) => newUrl.includes(url.from)) - node.url = withPathPrefix( - isRedirectPath ? newUrl.replace(isRedirectPath.from, isRedirectPath.to) : newUrl, - pathPrefix - ) - } - } - if ( - markdownNode.fields && - markdownNode.fields.slug && - node.url.includes('prisma.io/docs') && - !node.url.includes('https://v1.prisma.io/docs') - ) { - node.isDomainUrl = true - } - - if ( - markdownNode.fields && - markdownNode.fields.slug && - !pattern.test(node.url) && - node.url.endsWith('/') && - node.url !== './' - ) { - node.isTrailingSlashUrl = true - } - } - - visit(markdownAST, 'link', visitor) - - return markdownAST -} diff --git a/plugins/gatsby-remark-to-absoluteurl/package.json b/plugins/gatsby-remark-to-absoluteurl/package.json deleted file mode 100644 index bae6744889..0000000000 --- a/plugins/gatsby-remark-to-absoluteurl/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "gatsby-remark-to-absoluteurl", - "version": "1.0.0", - "description": "Relative to absolute url", - "main": "index.js", - "author": "Nilufar Bava <nilubava@gmail.com>", - "license": "ISC", - "keywords": [ - "gatsby", - "gatsby-plugin" - ] -} diff --git a/prisma/migrations/20201216150604_init/migration.sql b/prisma/migrations/20201216150604_init/migration.sql deleted file mode 100644 index 15bd31bfe7..0000000000 --- a/prisma/migrations/20201216150604_init/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ --- CreateEnum -CREATE TYPE "public"."Sentiment" AS ENUM ('Happy', 'Unhappy'); - --- CreateTable -CREATE TABLE "Feedback" ( -"id" SERIAL, - "pageUrl" TEXT NOT NULL, - "userAgent" TEXT NOT NULL, - "ip" TEXT NOT NULL, - "sentiment" "Sentiment" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - PRIMARY KEY ("id") -); diff --git a/prisma/migrations/20201216150920_add_feedback_text/migration.sql b/prisma/migrations/20201216150920_add_feedback_text/migration.sql deleted file mode 100644 index 819cea5f50..0000000000 --- a/prisma/migrations/20201216150920_add_feedback_text/migration.sql +++ /dev/null @@ -1,4 +0,0 @@ --- AlterTable -ALTER TABLE "Feedback" ADD COLUMN "feedback" TEXT, -ALTER COLUMN "userAgent" DROP NOT NULL, -ALTER COLUMN "ip" DROP NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index c0831ce96a..0000000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,24 +0,0 @@ -datasource db { - provider = "postgresql" - url = env("POSTGRES_URL") -} - -generator client { - provider = "prisma-client-js" - binaryTargets = ["native", "rhel-openssl-1.0.x"] -} - -model Feedback { - id Int @id @default(autoincrement()) - pageUrl String - userAgent String? - ip String? - sentiment Sentiment - feedback String? - createdAt DateTime @default(now()) -} - -enum Sentiment { - Happy - Unhappy -} diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index c8cc5697cf..0000000000 --- a/pull_request_template.md +++ /dev/null @@ -1,20 +0,0 @@ -## Describe this PR - -<!-- Please describe the issue, problem or reason for the PR... A little context helps us scan the PR first, without having to dive into the code --> - -## Changes - -<!-- What changes have you made? Keep it brief! - -- Refactored example to include new database field -- ... --> - -## What issue does this fix? - -<!-- Link the issue this is solving, if applicable, using the issue number. This can be found to the right of the issue title, or in the url. - -Fixes #1234 --> - -## Any other relevant information - -<!-- Add any other information you deem to be relevant to the PR --> diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 2826308d37..0000000000 --- a/renovate.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base"], - "schedule": ["before 8am on the first day of the month"], - "ignoreDeps": ["gatsby-plugin-algolia"], - "dependencyDashboard": true -} diff --git a/schema.sql b/schema.sql deleted file mode 100644 index 2ef007b9e4..0000000000 --- a/schema.sql +++ /dev/null @@ -1,22 +0,0 @@ -CREATE TABLE "public"."User" ( - id SERIAL PRIMARY KEY NOT NULL, - name VARCHAR(255), - email VARCHAR(255) UNIQUE NOT NULL -); - -CREATE TABLE "public"."Post" ( - id SERIAL PRIMARY KEY NOT NULL, - title VARCHAR(255) NOT NULL, - "createdAt" TIMESTAMP NOT NULL DEFAULT now(), - content TEXT, - published BOOLEAN NOT NULL DEFAULT false, - "authorId" INTEGER NOT NULL, - FOREIGN KEY ("authorId") REFERENCES "public"."User"(id) -); - -CREATE TABLE "public"."Profile" ( - id SERIAL PRIMARY KEY NOT NULL, - bio TEXT, - "userId" INTEGER UNIQUE NOT NULL, - FOREIGN KEY ("userId") REFERENCES "public"."User"(id) -); \ No newline at end of file diff --git a/scripts/build b/scripts/build deleted file mode 100755 index e94677e8e0..0000000000 --- a/scripts/build +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -find ./ -type f -name 'production-app.js' -exec sed -i 's#pagePath &&#& pagePath != "/" \&\&#g' {} \; && npm run install-algolia && gatsby build --prefix-paths diff --git a/scripts/redirect-transformer.js b/scripts/redirect-transformer.js deleted file mode 100644 index 2629cf783e..0000000000 --- a/scripts/redirect-transformer.js +++ /dev/null @@ -1,51 +0,0 @@ -const fs = require('fs') -const { join, extname } = require('path') -const remark = require('remark') -const mdx = require('remark-mdx') -var visit = require('unist-util-visit') -var vercelSettings = require('../vercel.json') - -function* walkSync(dir) { - const files = fs.readdirSync(dir, { withFileTypes: true }) - for (const file of files) { - if (file.isDirectory()) { - yield* walkSync(join(dir, file.name)) - } else { - yield join(dir, file.name) - } - } -} - -const isDirectMatch = (url, source) => - (url.includes('#') ? url.split('#')[0] : url) === source.replace('/docs', '') -const isSourcePartofUrl = (url, source) => - source.includes(':/any*') && ('/docs' + url).includes(source.replace('/:any*', '')) - -for (const filePath of walkSync(`${__dirname}/../content`)) { - if (extname(filePath) === '.mdx') { - const file = fs.readFileSync(filePath, 'utf8') - const contents = remark().use(mdx).parse(file) - visit(contents, 'link', function visitor(node) { - if ( - node.url && - !/^https?:\/\//.test(node.url) && - vercelSettings && - vercelSettings.redirects && - vercelSettings.redirects.some( - (r) => isDirectMatch(node.url, r.source) || isSourcePartofUrl(node.url, r.source) - ) - ) { - const redirectItem = vercelSettings.redirects.filter((r) => - isDirectMatch(node.url, r.source) - ) - const transformedSrc = redirectItem[0].source.replace('/docs', '').replace('/:any*', '') - var regex = new RegExp(transformedSrc, 'g') - const newMdx = file.replace( - regex, - redirectItem[0].destination.replace('/docs', '').replace('/:any*', '') - ) - fs.writeFileSync(filePath, newMdx) - } - }) - } -} diff --git a/sidebars.ts b/sidebars.ts new file mode 100644 index 0000000000..b624423f0a --- /dev/null +++ b/sidebars.ts @@ -0,0 +1,324 @@ +import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; + +// workaround suggested by Docusaurus team: https://github.com/facebook/docusaurus/issues/9902#issuecomment-1972125804 +type SidebarConfig = SidebarsConfig[string]; +type OnlyArray<Type> = Type extends unknown[] ? Type : never; +type SidebarItemConfigArray = OnlyArray<SidebarConfig>; +type SidebarItemConfig = SidebarItemConfigArray[number]; + +const platformCategory: SidebarItemConfig = { + type: 'category', + label: 'Platform', + collapsed: false, + collapsible: false, + link: { + type: 'doc', + id: 'platform/index', + }, + className: "firstTitle", + items: [{ type: 'autogenerated', dirName: '500-platform' }], +}; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + // By default, Docusaurus generates a sidebar from the docs folder structure + gettingStarted: [ + { + type: 'category', + collapsed: false, + collapsible: false, + label: 'Get Started', + link: { + type: 'doc', + id: 'getting-started/index', + }, + className: "firstTitle", + items: [ + 'getting-started/index', + { + type: 'doc', + id: 'getting-started/quickstart', + label: 'Quickstart', + }, + { + type: 'category', + label: 'Set up Prisma ORM', + collapsed: false, + collapsible: false, + link: { + type: 'doc', + id: 'getting-started/setup-prisma/index', + }, + items: [ + { + type: 'category', + label: 'Start from scratch', + link: { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/index', + }, + items: [ + { + type: 'category', + label: 'Relational databases', + customProps: { + badge: '15 Min' + }, + link: { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql', + }, + items: [ + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-planetscale', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-sqlserver', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-cockroachdb', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-node-planetscale', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-node-sqlserver', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/relational-databases-node-cockroachdb', + className: 'hidden-sidebar' + }, + { + type: 'autogenerated', + dirName: '100-getting-started/02-setup-prisma/100-start-from-scratch/110-relational-databases', + } + ] + }, + { + type: 'category', + label: 'MongoDB', + customProps: { + badge: '15 Min' + }, + link: { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb', + }, + items: [ + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/mongodb-node-mongodb', + className: "hidden-sidebar" + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/start-from-scratch/mongodb-typescript-mongodb', + className: "hidden-sidebar" + }, + { + type: 'autogenerated', + dirName: '100-getting-started/02-setup-prisma/100-start-from-scratch/120-mongodb', + } + ] + } + ] + }, + { + type: 'category', + label: "Add to existing project", + link: { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/index', + }, + items: [ + { + type: 'category', + label: 'Relational databases', + customProps: { + badge: '15 Min' + }, + link: { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql', + }, + items: [ + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-mysql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-planetscale', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-sqlserver', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-cockroachdb', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-node-postgresql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-node-mysql', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-node-planetscale', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-node-sqlserver', + className: 'hidden-sidebar' + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/relational-databases-node-cockroachdb', + className: 'hidden-sidebar' + }, + { + type: 'autogenerated', + dirName: '100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases', + } + ] + }, + { + type: 'category', + label: 'MongoDB', + customProps: { + badge: '15 Min' + }, + link: { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/mongodb-typescript-mongodb', + }, + items: [ + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/mongodb-node-mongodb', + className: "hidden-sidebar" + }, + { + type: 'doc', + id: 'getting-started/setup-prisma/add-to-existing-project/mongodb-typescript-mongodb', + className: "hidden-sidebar" + }, + { + type: 'autogenerated', + dirName: '100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb', + }] + } + ] + },] + } + ] + } + ], + ormSidebar: [{ + type: 'category', + label: 'ORM', + collapsed: false, + collapsible: false, + link: { + type: 'doc', + id: 'orm/orm-index' + }, + className: 'firstTitle', + items: [{ type: 'autogenerated', dirName: '200-orm' }], + }], + accelerateSidebar: [ + { + type: 'category', + label: 'Accelerate', + collapsed: false, + collapsible: false, + link: { + type: 'doc', + id: 'accelerate/index' + }, + className: 'firstTitle', + items: [{ type: 'autogenerated', dirName: '300-accelerate' }] + }, + platformCategory, + ], + pulseSidebar: [ + { + type: 'category', + label: 'Pulse', + collapsible: false, + collapsed: false, + link: { + type: 'doc', + id: 'pulse/index' + }, + className: 'firstTitle', + items: [{ type: 'autogenerated', dirName: '400-pulse' }] + }, + platformCategory, + ], + platformSidebar: [ + platformCategory, + ], + aboutSidebar: [{ + type: 'autogenerated', + dirName: '600-about' + }], +}; + +export default sidebars; diff --git a/src/components/shortcodes/gettingstarted.tsx b/src/components/GettingStarted/index.tsx similarity index 51% rename from src/components/shortcodes/gettingstarted.tsx rename to src/components/GettingStarted/index.tsx index c6c1fd3810..5cee2ba128 100644 --- a/src/components/shortcodes/gettingstarted.tsx +++ b/src/components/GettingStarted/index.tsx @@ -1,8 +1,8 @@ import React, { useRef, useState } from 'react' -import styled from 'styled-components' -import { defaultTheme } from '../../theme' import { Icon } from '../Icon' import { Tooltip } from '../tooltip/Tooltip' +import styles from "../../css/gettingStarted.module.scss" +import Link from '@docusaurus/Link' export const Database = ({ color, width, height }: any) => ( <svg @@ -49,153 +49,45 @@ export const SignalStream = ({ color, height, width }: any) => ( </svg> ) -export const BorderBoxWrapper = styled.div<{ border: boolean }>` - padding: 24px 24px 32px 24px; - border-radius: 8px; - background: var(--main-bgd-color); - > * { - font-family: Inter; - text-align: left; - letter-spacing: 0em; - line-height: 20px; - font-size: 14px; - :first-child { - margin-top: 0; - } - :last-child { - margin-bottom: 0; - } - } -` +export const BorderBoxWrapper = ({children, ...props}) => <div {...props} className={styles.borderBox}>{children}</div> -export const BoxTitle = styled.h1<{}>` - font-family: Barlow, system-ui, Arial, sans-serif; - font-style: normal; - font-weight: bold; - font-size: 2.5rem !important; - line-height: 48px; - letter-spacing: -0.8px; -` +export const BoxTitle = ({children, ...props}) => <h1 {...props} className={styles.boxTitle}>{children}</h1> export const BorderBox = ({ border, ...props }: any) => ( <BorderBoxWrapper {...props}>{props.children}</BorderBoxWrapper> ) -const LinkCardWrapper = styled.a` - border: 1px solid var(--border-color); - padding: 20px 24px; - border-radius: 8px; - color: var(--main-font-color); - transition: all 300ms ease-out; - display: flex; - flex-direction: column; - text-decoration: none; - &:hover { - background: var(--main-bgd-color); - border-color: #5a67d8; - } - .title { - display: inline-block; - h6 { - font-size: 18px; - display: inline-block; - margin: 0; - font-family: Barlow; - font-weight: 600; - line-height: 24px; - letter-spacing: 0px; - text-align: left; - } - } - p { - font-family: Inter; - font-size: 14px; - font-weight: 400; - line-height: 20px; - letter-spacing: 0em; - margin-bottom: 0; - text-align: left; - } -` - -export const Grid = styled.div` - gap: 16px; - display: grid; - margin-top: 24px; - grid-template-columns: none; - @media (min-width: 600px) { - grid-template-columns: 1fr 1fr; - } -` +export const Grid = ({children, ...props}) => <div {...props} className={styles.grid}>{children}</div> export const LinkCard = ({ icon, title, desc, link }: any) => { const linkCardRef = useRef(null) return ( - <LinkCardWrapper href={link} ref={linkCardRef}> - <div className="title"> + <Link to={link} ref={linkCardRef} className={styles.linkCardWrapper}> + <div className={styles.title}> <Icon icon={icon} btn="left" size="18px" /> <h6>{title}</h6> </div> <p>{desc}</p> - </LinkCardWrapper> + </Link> ) } -export const Tab = styled.div` - padding: 15px; - background-color: var(--main-bgd-color); - border: 1px solid ${defaultTheme.colors.indigo[600]}; - border-radius: 0px 8px 8px 8px; - font-family: Inter; - font-size: 14px; - font-weight: 400; - line-height: 20px; - letter-spacing: 0em; - text-align: left; - p { - margin-top: 0; - } -` - -const SquareWrapper = styled.a` - width: 90px; - height: 90px; - text-decoration: none; - padding: 22px; - display: inline-block; - border: 1px solid var(--border-color); - background: var(--header-bg-color); - border-radius: 8px; - transition: all 300ms ease-out; - cursor: pointer; - &:hover { - background: var(--main-bgd-color); - border-color: ${defaultTheme.colors.indigo[600]}; - } - &:active, - &:focus { - background: var(--code-inline-bgd-color); - border-color: ${defaultTheme.colors.indigo[700]}; - } - svg { - width: 100%; - height: 100%; - } -` +export const Tab = ({children, ...props}) => <div {...props} className={styles.tab}>{children}</div> export const SquareLogo = ({ image, tech, url }: any) => { const squareCardRef = useRef(null) const [visibleTooltip, setVisibleTooltip] = useState<boolean>(false) return ( <> - <SquareWrapper - href={url} + <Link + className={styles.squareWrapper} + to={url} ref={squareCardRef} onMouseMove={() => setVisibleTooltip(true)} onMouseLeave={() => setVisibleTooltip(false)} > - {image} - </SquareWrapper> + <img src={image} /> + </Link> {visibleTooltip && ( <Tooltip target={squareCardRef} position="top"> {tech} @@ -205,21 +97,4 @@ export const SquareLogo = ({ image, tech, url }: any) => { ) } -export const List = styled.div` - display: grid; - gap: 12px; - justify-content: space-between; - grid-template-columns: repeat(3, auto); - @media (min-width: 1240px) { - grid-template-columns: repeat(6, auto); - } - @media (min-width: 1025px) and (max-width: 1240px) { - grid-template-columns: repeat(3, auto); - } - @media (min-width: 768px) and (max-width: 1025px) { - grid-template-columns: repeat(6, auto); - } - @media (min-width: 480px) and (max-width: 768px) { - grid-template-columns: repeat(4, auto); - } -` +export const List = ({children, ...props}) => <div {...props} className={styles.list}>{children}</div> diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 8d1ca0c8bd..8c5b72e698 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -45,4 +45,4 @@ export const Icon = ({ icon, color, className, size, btn, fit }: IconProps) => { }} ></i> ) -} +} \ No newline at end of file diff --git a/src/components/WebProvider.tsx b/src/components/WebProvider.tsx deleted file mode 100644 index f8bbfb8137..0000000000 --- a/src/components/WebProvider.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' - -import '../styles/all.css' -import 'normalize.css' - -type Props = React.PropsWithChildren<{}> - -export function WebProvider({ children }: Props) { - return <>{children}</> -} diff --git a/src/components/button/buttons.ts b/src/components/button/buttons.ts deleted file mode 100644 index 0a3ef4d00e..0000000000 --- a/src/components/button/buttons.ts +++ /dev/null @@ -1,210 +0,0 @@ -import * as t from '../../theme/primitives' - -const buttonDefault = { - transition: 'background-color .1s ease, color .2s ease', - backgroundColor: 'transparent', // t.gray['500'] - color: t.colors.text, - fontFamily: t.fonts.text, - fontWeight: 500, - hover: { - backgroundColor: 'transparent', // t.gray['600'] - }, -} - -export const buttonsDefault = { - primary: { - ...buttonDefault, - color: 'white', - backgroundColor: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - border: `1px solid ${t.indigo[700]}`, - backgroundColor: t.indigo[700], - borderColor: t.indigo[700], - color: 'white', - }, - active: { - border: `1px solid ${t.indigo[800]}`, - backgroundColor: t.indigo[800], - color: 'white', - }, - indigo: { - backgroundColor: t.indigo[600], - color: 'white', - border: `1px solid ${t.indigo[600]}`, - hover: { - border: `1px solid ${t.indigo[700]}`, - borderColor: t.indigo[700], - backgroundColor: t.indigo[700], - color: 'white', - }, - active: { - border: `1px solid ${t.indigo[800]}`, - backgroundColor: t.indigo[800], - color: 'white', - }, - }, - teal: { - backgroundColor: t.teal[600], - color: 'white', - border: `1px solid ${t.teal[600]}`, - hover: { - border: `1px solid ${t.teal[700]}`, - backgroundColor: t.teal[700], - borderColor: t.teal[700], - color: 'white', - }, - active: { - border: `1px solid ${t.teal[800]}`, - backgroundColor: t.teal[800], - color: 'white', - }, - }, - white: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid white`, - hover: { - border: `1px solid white`, - backgroundColor: 'white', - borderColor: t.indigo[700], - color: t.indigo[700], - }, - active: { - border: `1px solid white`, - backgroundColor: 'white', - color: t.indigo[800], - }, - }, - }, - - secondary: { - ...buttonDefault, - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - color: t.indigo[700], - borderColor: t.indigo[700], - border: `1px solid ${t.indigo[700]}`, - }, - active: { - backgroundColor: 'white', - color: t.indigo[800], - border: `1px solid ${t.indigo[800]}`, - }, - indigo: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[700]}`, - borderColor: t.indigo[700], - color: t.indigo[700], - }, - active: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[800]}`, - color: t.indigo[800], - }, - }, - teal: { - backgroundColor: 'white', - color: t.teal[600], - border: `1px solid ${t.teal[600]}`, - hover: { - border: `1px solid ${t.teal[700]}`, - backgroundColor: 'white', - borderColor: t.teal[700], - color: t.teal[700], - }, - active: { - border: `1px solid ${t.teal[800]}`, - backgroundColor: 'white', - color: t.teal[800], - }, - }, - white: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[700]}`, - borderColor: t.indigo[700], - color: t.indigo[700], - }, - active: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[800]}`, - color: t.indigo[800], - }, - }, - }, - - link: { - ...buttonDefault, - backgroundColor: 'transparent', - color: t.indigo[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - borderColor: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - indigo: { - backgroundColor: 'transparent', - color: t.indigo[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - borderColor: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - }, - teal: { - backgroundColor: 'transparent', - color: t.teal[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.teal[800], - borderColor: t.teal[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.teal[800], - border: 'none', - }, - }, - white: { - backgroundColor: 'transparent', - border: 'none', - color: t.indigo[600], - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - }, - }, -} diff --git a/src/components/button/index.tsx b/src/components/button/index.tsx deleted file mode 100644 index 27e44fa578..0000000000 --- a/src/components/button/index.tsx +++ /dev/null @@ -1,123 +0,0 @@ -// @ts-nocheck -import React, { AnchorHTMLAttributes, HTMLAttributes } from 'react' -import styled from 'styled-components' - -import { buttonCss } from '../../theme/css/button' - -type ColorType = 'indigo' | 'teal' | 'white' | undefined -type BtnType = 'primary' | 'secondary' | 'link' | undefined - -export type ButtonProps = HTMLAttributes<HTMLButtonElement> & - AnchorHTMLAttributes<HTMLAnchorElement> & { - type?: BtnType - color?: ColorType - icon?: undefined | 'left' | 'right' - disabled?: boolean - transparent?: boolean - external?: boolean - href?: string - } - -const StyledLink = styled.a` - ${(props) => buttonCss(props.type, props.color, props.icon, props.disabled, props.transparent)} -` -const StyledBtn = styled.button` - ${(props) => buttonCss(props.type, props.color, props.icon, props.disabled, props.transparent)} -` -const StyledIcon = styled.svg` - fill: currentColor; - color: inherit; - transition: transform 0.2s ease; - position: absolute; - top: 50%; - transform: translateY(-50%); - path { - transition: left, right 0.2s ease; - fill: inherit; - } - ${(props) => - props.type !== 'link' - ? props.icon === 'left' - ? ` - left: 16px; - ` - : ` - right: 16px; - ` - : props.icon === 'left' - ? ` - left: -10px; -` - : ` - right: -6px; -`} -` - -export const Button = ({ - type = 'primary', - color = 'indigo', - icon = undefined, - disabled = false, - href = undefined, - external = false, - ...rest -}: ButtonProps) => { - return href ? ( - <StyledLink - href={href} - type={type} - color={color} - icon={icon} - disabled={disabled} - {...(external && { - target: '_blank', - rel: 'noopener noreferrer', - })} - {...rest} - > - {rest.children} - {(type === 'link' || icon) && ( - <StyledIcon - className="btn-arrow" - xmlns="http://www.w3.org/2000/svg" - width={external ? `10` : `12`} - viewBox={`0 0 ${external ? `320 512` : `448 512`}`} - disabled={disabled} - external={external} - icon={icon} - type={type} - color={color} - > - {external ? ( - <path d="M320 128c0-17.7-14.3-32-32-32L64 96c-17.7 0-32 14.3-32 32s14.3 32 32 32l146.7 0L9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L256 205.3 256 352c0 17.7 14.3 32 32 32s32-14.3 32-32l0-224z" /> - ) : ( - <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z" /> - )} - </StyledIcon> - )} - </StyledLink> - ) : ( - <StyledBtn href={href} type={type} color={color} icon={icon} disabled={disabled} {...rest}> - {rest.children} - {(type === 'link' || icon) && ( - <StyledIcon - className="btn-arrow" - xmlns="http://www.w3.org/2000/svg" - width={external ? `9` : `12`} - viewBox={`0 0 ${external ? `320 512` : `448 512`}`} - disabled={disabled} - external={external} - icon={icon} - type={type} - color={color} - > - {external ? ( - <path d="M320 128c0-17.7-14.3-32-32-32L64 96c-17.7 0-32 14.3-32 32s14.3 32 32 32l146.7 0L9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L256 205.3 256 352c0 17.7 14.3 32 32 32s32-14.3 32-32l0-224z" /> - ) : ( - <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z" /> - )} - </StyledIcon> - )} - </StyledBtn> - ) -} diff --git a/src/components/collapsible.tsx b/src/components/collapsible.tsx new file mode 100644 index 0000000000..9b6b5ba5ca --- /dev/null +++ b/src/components/collapsible.tsx @@ -0,0 +1,26 @@ +import * as React from 'react' +import styles from "../css/collapsible.module.scss" + +type CollapseProps = React.ReactNode +let index = 0 + +const getRemainingChildren = (children: any) => + children.filter((child: any) => !(child.props && child.props.originalType === 'summary')) + +//@ts-ignore +const CollapseBox = ({ children, ...props }: CollapseProps) => { + const titleChild = + children && children.find((child: any) => child.props && child.props.originalType === 'summary') + const title = titleChild && titleChild.props.children + return ( + <div className={styles.wrapper} {...props}> + <div className={styles.tab}> + <input className={styles.input} id={`tab-${++index}`} type="checkbox" name="tab" /> + <label className={styles.label} htmlFor={`tab-${index}`}>{title}</label> + <div className={styles.tabContent}>{getRemainingChildren(children)}</div> + </div> + </div> + ) +} + +export default CollapseBox \ No newline at end of file diff --git a/src/components/customLink.tsx b/src/components/customLink.tsx deleted file mode 100644 index 7257ad8ead..0000000000 --- a/src/components/customLink.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -const CustomButton = styled.button<{ mdx?: string }>` - background: transparent; - border: none; - padding: 0; - cursor: pointer; - - ${(props) => - props.mdx && - ` - color: var(--link-color); - cursor: pointer; - text-decoration: underline; - `}; -` - -const CustomLink = ({ href, mdx, ...props }: any) => { - const goToPath = () => { - window.open( - href, - href.includes('prisma.io') && !href.includes('slack.prisma.io') ? '_self' : '_blank', - href.includes('prisma.io') ? '' : 'noopener' - ) - } - return ( - <CustomButton onClick={goToPath} {...props} mdx={mdx}> - {props.children} - </CustomButton> - ) -} - -export default CustomLink diff --git a/src/components/footer.tsx b/src/components/footer.tsx deleted file mode 100644 index e7c1f9e5a3..0000000000 --- a/src/components/footer.tsx +++ /dev/null @@ -1,490 +0,0 @@ -import * as React from 'react' -import { AnchorHTMLAttributes } from 'react' -import styled, { css } from 'styled-components' - -import { darkTheme, defaultTheme as theme } from '../theme' -import { Icon } from './Icon' -import { FooterNewsletterForm } from './newsletter/FooterNewsletterForm' -import CustomLink from './customLink' - -const FooterWrapper = styled.div` - background: transparent; - width: 100%; - display: flex; - justify-content: center; - color: ${theme.colors.gray[500]}; - > div { - width: 100%; - } - @media (prefers-color-scheme: dark) { - form { - i { - color: ${theme.colors.gray[300]} !important; - } - .input-el { - background: ${theme.colors.gray[800]} !important; - border-color: ${theme.colors.gray[700]} !important; - color: ${theme.colors.gray[100]} !important; - &::placeholder { - color: ${theme.colors.gray[300]}; - } - } - } - } -` - -type ColorType = 'indigo' | 'teal' | 'white' | undefined - -export const Container = styled.div` - box-sizing: border-box; - margin: auto; - width: 100%; - padding: 0 2rem; - @media only screen and (min-width: 940px) { - padding: 0 1.5rem; - max-width: 1248px; // 1200 plus 2 x padding - } -` - -namespace S { - export const defaultText = (footer: any) => css` - color: ${footer.linkColor}; - font-size: ${footer.linkSize}; - font-weight: 400; - ` - - export const Container = styled.div<{ theme: any }>` - position: absolute; - left: 0; - background-color: ${(props) => props.theme.footer.backgroundColor}; - padding: 72px 0 24px; - width: 100%; - @media only screen and (min-width: 768px) { - padding: 46px 0 100px; - } - ` - - export const Row = styled.div` - font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI'; - @media only screen and (min-width: 940px) { - display: flex; - } - ` - - export const SocialLinksWrapper = styled.div` - display: flex; - justify-content: space-between; - align-items: center; - ` - - export const PrismaLogo = styled.div` - display: flex; - justify-content: center; - flex-direction: column; - .prisma-logo-img { - margin-bottom: ${(props) => props.theme.space[8]}; - } - ` - - export const PrismaDataText = styled.div` - font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI'; - ${(props) => defaultText(props.theme.footer)} - ` - - export const FooterWrapper = styled.div` - display: flex; - font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI'; - flex-direction: column-reverse; - @media only screen and (min-width: ${(props) => props.theme.breakpoints.tabletVertical}px) { - flex-direction: column; - } - ` - - export const NewsletterRow = styled.div` - > h4 { - margin-bottom: 16px; - margin-right: 32px; - } - margin-bottom: 0; - @media only screen and (min-width: ${(props) => props.theme.breakpoints.tabletVertical}px) { - padding: 64px 0; - display: flex; - justify-content: flex-start; - align-items: flex-start; - flex-direction: column; - margin-bottom: 64px; - border-top: 1px solid ${(props) => props.theme.colors.gray[300]}; - border-bottom: 1px solid ${(props) => props.theme.colors.gray[300]}; - } - @media only screen and (min-width: ${(props) => props.theme.breakpoints.tabletHorizontal}px) { - margin-top: 64px; - flex-direction: row; - justify-content: space-between; - align-items: center; - > h4 { - margin-bottom: 0; - } - } - ` - - export const Column = styled.div<{ flex?: number }>` - margin-bottom: 48px; - @media only screen and (min-width: ${(props) => props.theme.footer.mobileBreakpoint}px) { - margin-bottom: 0; - padding: 0 0.5rem; - flex: ${(props) => props.flex || 1}; - } - ` - - export const Title = styled.h4` - text-transform: uppercase; - font-weight: 400; - font-size: ${(props) => props.theme.footer.titleSize}; - color: ${(props) => props.theme.footer.titleColor}; - letter-spacing: 0.08em; - margin-top: 0; - margin-bottom: 1rem; - @media only screen and (min-width: ${(props) => props.theme.footer.mobileBreakpoint}px) { - margin-bottom: 0; - } - ` - - type LinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & { - theme: any - active?: boolean - external?: boolean - color?: ColorType - } - - export const Link = ({ external, theme, color = 'indigo', ...rest }: LinkProps) => { - return ( - <StyledLink {...rest} color={color} theme={theme} target={external ? '_blank' : '_self'}> - {rest.children} - {external && <Icon color="currentColor" icon={'fa-solid fa-arrow-up-right'} size="1rem" />} - </StyledLink> - ) - } - - const StyledLink = styled(CustomLink)<{ - color?: ColorType - }>( - ({ color = 'indigo' }) => css` - ${(props) => defaultText(props.theme.footer)}; - display: flex; - cursor: pointer; - font-weight: 500; - box-sizing: border-box; - text-decoration: none; - line-height: ${25 / 18}; - padding: 1rem 0; - @media only screen and (min-width: ${(props) => props.theme.footer.mobileBreakpoint}px) { - padding: 0.5rem 0; - } - &:hover { - color: ${(props) => props.theme.footer.linkHoverColor[color]}; - } - > i { - margin: 5px 0 0 3px; - } - > span { - margin-left: 6px; - } - .link-title-label { - display: flex; - align-items: center; - .label { - margin-left: 8px; - background: ${theme.colors[color]['600']}; - border-radius: 99px; - padding: 6px 8px; - font-family: 'Barlow'; - font-style: normal; - font-weight: 700; - font-size: 8px; - line-height: 100%; - white-space: nowrap; - /* identical to box height, or 8px */ - - display: flex; - align-items: center; - letter-spacing: 0.1em; - text-transform: uppercase; - color: white; - } - } - ` - ) - - export const SocialLinksContainer = styled.div<{ - color?: ColorType - theme?: boolean - }>( - ({ color = 'indigo' }) => css` - justify-content: start; - gap: 20px; - display: none; - @media only screen and (min-width: 768px) { - display: flex; - } - a { - font-size: 1.375rem; - color: ${(props) => props.theme.footer.linkColor}; - &:hover { - color: ${(props) => props.theme.footer.linkHoverColor[color]}; - } - } - i { - pointer-events: none; - } - ` - ) -} - -interface FooterProps { - className?: string - color?: ColorType - lightTheme?: boolean - absoluteLinks?: boolean - newsletterComponent?: any -} - -const FooterSec = ({ - className, - lightTheme = false, - absoluteLinks = true, - newsletterComponent, - color = 'indigo', -}: FooterProps) => { - const themeToUse = lightTheme ? theme : darkTheme - const newsletter = newsletterComponent ? ( - newsletterComponent - ) : ( - <FooterNewsletterForm theme={themeToUse} color={color} /> - ) - return ( - <FooterWrapper> - <S.Container theme={themeToUse} className={className}> - <Container> - <S.FooterWrapper theme={themeToUse}> - <S.Row> - <S.Column theme={themeToUse}> - <S.Title theme={themeToUse}>Product</S.Title> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/client`} - > - Client - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/migrate`} - > - Migrate - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/data-platform/accelerate`} - > - <div className="link-title-label">Accelerate</div> - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/data-platform/pulse`} - > - <div className="link-title-label"> - Pulse - <span className="label">Early Access</span> - </div> - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/pricing`} - > - Pricing - </S.Link> - </S.Column> - - <S.Column theme={themeToUse}> - <S.Title theme={themeToUse}>Developers</S.Title> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/docs`} - > - Docs - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/docs/getting-started`} - > - Get Started - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href="https://github.com/prisma/prisma-examples" - referrerPolicy="no-referrer" - external={true} - > - Prisma Examples - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/dataguide`} - > - Data Guide - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/stack`} - > - Prisma in your Stack - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/support`} - > - Support - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/community`} - > - Community - </S.Link> - <S.Link - color={color} - theme={themeToUse} - referrerPolicy="no-referrer" - href="https://www.prisma-status.com" - external={true} - > - Data Platform Status - </S.Link> - <S.Link - color={color} - theme={themeToUse} - referrerPolicy="no-referrer" - href="https://marketplace.visualstudio.com/items?itemName=Prisma.prisma" - external={true} - > - VS Code Extension - </S.Link> - </S.Column> - <S.Column theme={themeToUse}> - <S.Title theme={themeToUse}>Use Cases</S.Title> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/showcase`} - > - Customer Stories - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/enterprise`} - > - Enterprise - </S.Link> - </S.Column> - - <S.Column theme={themeToUse}> - <S.Title theme={themeToUse}>Company</S.Title> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/about`} - > - About - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/blog`} - > - Blog - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/careers`} - > - Careers{' '} - </S.Link> - <S.Link - color={color} - theme={themeToUse} - href={`${absoluteLinks ? 'https://www.prisma.io' : ''}/events`} - > - Events - </S.Link> - <S.Link - color={color} - theme={themeToUse} - referrerPolicy="no-referrer" - href="https://pris.ly/causes" - external={true} - > - Causes - </S.Link> - <S.Link - color={color} - theme={themeToUse} - referrerPolicy="no-referrer" - external={true} - href="https://pris.ly/privacy" - > - Terms & Privacy - </S.Link> - </S.Column> - </S.Row> - <S.NewsletterRow theme={themeToUse}> - <S.Title theme={themeToUse}>Newsletter</S.Title> - {newsletter} - </S.NewsletterRow> - </S.FooterWrapper> - <S.SocialLinksWrapper> - <S.PrismaLogo theme={themeToUse}> - <div className="prisma-logo-img"> - <img src={themeToUse.footer.logoUrl} width={90} height={27} alt="prisma_logo" /> - </div> - <S.PrismaDataText theme={themeToUse}> - © {new Date().getFullYear()} Prisma Data, Inc. - </S.PrismaDataText> - </S.PrismaLogo> - <S.SocialLinksContainer theme={themeToUse} color={color}> - <a href="https://discord.gg/KQyTW2H5ca" target="_blank" rel="noopener"> - <Icon color="currentColor" size="inherit" icon={'fa-brands fa-discord'} /> - </a> - <a href="https://twitter.com/prisma" target="_blank" rel="noopener"> - <Icon color="currentColor" size="inherit" icon={'fa-brands fa-x-twitter'} /> - </a> - <a href="https://www.youtube.com/c/PrismaData" target="_blank" rel="noopener"> - <Icon color="currentColor" size="inherit" icon={'fa-brands fa-youtube'} /> - </a> - <a href="https://slack.prisma.io" target="_blank" rel="noopener"> - <Icon color="currentColor" size="inherit" icon={'fa-brands fa-slack'} /> - </a> - <a href="https://github.com/prisma" target="_blank" rel="noopener"> - <Icon size="inherit" icon={'fa-brands fa-github'} color="currentColor" /> - </a> - </S.SocialLinksContainer> - </S.SocialLinksWrapper> - </Container> - </S.Container> - </FooterWrapper> - ) -} - -export default FooterSec diff --git a/src/components/header.tsx b/src/components/header.tsx deleted file mode 100644 index 74502562e7..0000000000 --- a/src/components/header.tsx +++ /dev/null @@ -1,561 +0,0 @@ -import { useLocation } from '@reach/router' -import * as React from 'react' -import styled from 'styled-components' - -import Link from '../components/link' -import Search from '../components/search' -import Sidebar from '../components/sidebar' -import ExternalLink from '../icons/ExternalLink' -import Github from '../icons/Github' -import Logo from '../icons/Logo' -import RightChevron from '../icons/RightChevron' -import UpChevron from '../icons/UpChevron' -import { HeaderProps } from '../interfaces/Layout.interface' -import { defaultTheme as theme } from '../theme' -import { Button } from './button' -import { Icon } from './Icon' -import CustomLink from './customLink' - -type HeaderViewProps = { - headerProps: HeaderProps - wide?: boolean - mobileNavOpen?: any - sidenavSearchOpened?: boolean - homePage?: boolean - closeSidenavSearch?: any - setInputText?: any -} - -const BucketHeader = styled.div<{ wide?: boolean }>` - max-width: ${(props) => (!props.wide ? '1240' : '1440')}px; - width: 100%; - display: flex; - gap: 16px; - justify-content: flex-start; - align-items: center; - - .log-btn { - padding: 6px 16px; - font-size: 16px; - font-weight: 700; - line-height: 22.4px; - - @media (min-width: 0px) and (max-width: 600px) { - display: none; - } - } - - .log-btn-mobile { - font-size: 20px; - line-height: 28px; - padding: 10px; - width: calc(100% - 70px); - margin: 24px 35px 0 35px; - @media (min-width: 600px) { - display: none; - } - } - - > * { - padding: 0; - a { - text-decoration: none; - } - .container { - padding: 0; - } - .menu { - background: transparent; - border: 0; - } - - .list { - z-index: 120; - } - - .menu, - .list { - a { - color: currentcolor !important; - text-decoration: none; - - &:hover { - color: ${theme.colors.white} !important; - } - } - } - } - @media (min-width: 0px) and (max-width: 940px) { - justify-content: space-between; - } -` - -const DocsMobileButton = styled.div` - background: ${theme.colors.white}; - border-radius: ${theme.radii.small}; - color: ${theme.colors.gray[700]}; - display: none; - padding: 0 ${theme.space[14]}; - height: 40px; - margin-left: ${theme.space[8]}; - font-weight: 600; - position: relative; - z-index: 3; - justify-content: space-between; - cursor: pointer; - svg { - margin-left: ${theme.space[8]}; - } - @media (min-width: 0px) and (max-width: 940px) { - display: flex; - align-items: center; - } -` - -const MobileOnlyNav = styled.div` - display: none; - position: fixed; - width: 100%; - z-index: 210; - top: 70px; - transition: top 0.35s; - padding: ${theme.space[16]}; - border-radius: ${theme.radii.small}; - text-align: left; - background: ${theme.colors.gray[800]}; - right: 0; - padding: ${theme.space[32]} ${theme.space[16]}; - @media (min-width: 0px) and (max-width: 940px) { - display: block; - } -` - -const SecondLevelMobileOnlyNav = styled(MobileOnlyNav)` - background: ${theme.colors.gray[100]}; - box-shadow: 0px 1px 0px ${theme.colors.gray[300]}; - top: 80px; - padding: 0; - height: calc(100% - 80px); - z-index: 200; -` - -const HeaderWrapper = styled.div<{ open: boolean }>` - background: var(--header-bg-color); - padding: 0 16px; - display: flex; - justify-content: center; - border-bottom: 1px solid #e2e8f0; - position: relative; - //position: fixed; - z-index: 202; - width: 100%; - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - padding: 12px 16px; - } - @media (min-width: 0px) and (max-width: 940px) { - z-index: 105; - padding: 20px 16px; - ${(p) => p.open && `position: fixed;`} - } - - .dark { - display: none; - } - - .light { - display: block; - } - - @media (prefers-color-scheme: dark) { - border-color: #242c3a; - - .dark { - display: block; - } - - .light { - display: none; - } - } -` - -const NonMobileMenu = styled.div` - display: flex; - align-items: center; - font-size: ${theme.fontSizes[16]}; - a, - button { - padding: 30px 8px; - border-bottom: 2px solid transparent; - &:hover { - border-bottom: 2px solid black; - } - } - @media (min-width: 0px) and (max-width: 940px) { - display: none; - } -` - -const NavLink = styled(Link)<{ wide?: boolean }>` - transition: all 0.1s ease-in; - color: ${theme.colors.gray[400]} !important; - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - margin: 0; - padding: 0; - } -` -const DarkNavLink = styled(NavLink)<{ wide?: boolean; dataPlatform?: boolean }>` - color: ${theme.colors.gray[800]} !important; - font-family: Inter; - font-size: 16px; - font-weight: 600; - line-height: 100%; - font-weight: 600; - text-decoration: none; - white-space: nowrap; - cursor: pointer; - span { - padding: 8px; - border-radius: 8px; - } - &.link { - padding: 0; - margin: 0; - display: flex; - align-items: center; - color: ${theme.colors.gray[600]} !important; - } - - .menu-item { - padding: 32px 30px; - display: flex; - justify-content: space-between; - align-items: center; - border-top: 1px solid ${theme.colors.gray[300]}; - color: ${theme.colors.gray[600]}; - font-weight: 600; - &:hover { - color: ${theme.colors.gray[900]}; - } - } - - &:hover { - //color: ${(props) => theme.colors[props.dataPlatform ? 'teal' : 'indigo'][700]} !important; - border-color: ${(props) => - theme.colors[props.dataPlatform ? 'teal' : 'indigo'][700]} !important; - //background: ${theme.colors.gray[200]}; - } - &.active-item span { - background: ${theme.colors.gray[200]}; - color: ${(props) => theme.colors[props.dataPlatform ? 'teal' : 'indigo'][700]} !important; - } - - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - &.active-item { - background: transparent; - color: ${theme.colors.gray[700]} !important; - padding: 0.25rem 0.5rem; - } - svg { - display: block; - } - } - @media (min-width: ${theme.breakpoints.tabletVertical}) and (max-width: 940px) { - font-size: 14px; - } - - @media (prefers-color-scheme: dark) { - color: var(--main-font-color) !important; - &.active-item span { - background: ${theme.colors.gray[800]}; - color: ${(props) => theme.colors[props.dataPlatform ? 'teal' : 'indigo'][400]} !important; - } - } -` - -const SecondLevelMobileNavLink = styled.div` - padding: ${theme.space[24]}; - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid #e2e8f0; - color: #1a202c; - font-weight: 600; - cursor: pointer; - &:hover { - color: ${theme.colors.gray[900]}; - } -` - -const SearchComponentDesktop = styled.div<{ - open?: boolean - homePage?: boolean - sidenavSearchOpened?: boolean - openSearch?: boolean -}>` - position: ${(p) => (p.open ? 'fixed' : 'absolute')}; - top: 80px; - left: 50%; - display: block; - transform: translateX(-50%); - transition: all 50ms ease-out; - padding: 16px; - width: 100%; - z-index: ${(p) => (p.open ? 200 : 101)}; - background: ${(p) => (p.sidenavSearchOpened ? 'transparent' : theme.colors.gray[100])}; - @media (min-width: 1025px) { - position: absolute; - ${(p) => !p.homePage && !p.sidenavSearchOpened && 'display: none;'} - ${(p) => !p.homePage && p.sidenavSearchOpened && 'margin-top: 1rem;'} - } - @media (prefers-color-scheme: dark) { - background: #242c3a; - } -` -const SecondLevelNav = styled.div<{ wide?: boolean }>` - ${(p) => (p.wide ? `padding: 0 2.5rem 0 0;` : `margin-left: 48px;`)} - width: fit-content; - width: 100%; - display: flex; - justify-content: space-between; - @media (min-width: 0px) and (max-width: 940px) { - margin: 92px 0 0 0; - flex-direction: column; - ${(p) => p.wide && `padding: 0;`} - } - > div { - display: flex; - gap: 16px; - align-items: center; - margin-top: 2px; - } -` - -interface MenuItemProps { - componentToShow?: any - type: string - text: string - link?: string - setCheckState?: (arg0: string) => void -} - -const MenuItem = ({ componentToShow, type, text, link }: MenuItemProps) => { - const isCurrent = location && link && location.pathname.includes(link) - const [showExpanded, setShowExpanded] = React.useState(isCurrent) - const toggle = () => setShowExpanded(!showExpanded) - return type === 'bucket' ? ( - <> - <SecondLevelMobileNavLink onClick={toggle}> - {text} - {showExpanded ? <UpChevron /> : <RightChevron />} - </SecondLevelMobileNavLink> - {showExpanded && componentToShow} - </> - ) : ( - <DarkNavLink to={link}> - <div className="menu-item"> - {text} - <ExternalLink /> - </div> - </DarkNavLink> - ) -} - -const SecondLevelMobileMenu = ({ headerProps, wide }: HeaderViewProps) => ( - <SecondLevelNav wide={wide}> - {headerProps.secondLevelHeaderMenuItems.map((item) => { - return ( - !item.hidden && ( - <MenuItem - componentToShow={<Sidebar isMobile={true} slug={item.bucketName} />} - type={item.type} - text={item.text} - link={item.to} - /> - ) - ) - })} - </SecondLevelNav> -) - -const HomeIcons = styled.div` - display: flex; - align-items: center; - button { - color: var(--main-font-color); - transition: transform 0.18s ease-out; - &:hover { - transform: translateY(-2px); - } - &:first-of-type { - svg { - height: 36px; - } - } - &:last-of-type { - //color: #2d3748; - font-family: 'Inter'; - font-size: 22px; - font-style: normal; - font-weight: 500; - padding-left: 22px; - position: relative; - line-height: 100%; - &:before { - position: absolute; - content: '/'; - left: 6px; - color: #a0aec0; - } - } - } -` - -const OverflowContainer = styled.div` - height: 100%; - background: white; - overflow: scroll; -` - -const GithubLink = styled.a` - margin-left: auto; - @media (min-width: 0px) and (max-width: 600px) { - display: none; - } - > svg { - height: 35px; - width: 31px; - } -` - -const Header = ({ - headerProps, - wide, - mobileNavOpen, - homePage, - sidenavSearchOpened, - closeSidenavSearch, - setInputText, -}: HeaderViewProps) => { - const [showMobileNav, setShowMobileNav] = React.useState(false) - const [showDocsBtn, setShowDocsBtn] = React.useState(true) - const changeHitsStatus = (status: boolean) => setShowDocsBtn(!status) - - const toggleMobileNav = () => setShowMobileNav(!showMobileNav) - - const location = useLocation() - - React.useEffect(() => { - mobileNavOpen(showMobileNav) - }, [showMobileNav]) - - const SecondLevelMenu = () => { - const bucketItems = headerProps.secondLevelHeaderMenuItems.filter( - (item) => item.type === 'bucket' && !item.hidden - ) - const externalLinkItems = headerProps.secondLevelHeaderMenuItems.filter( - (item) => item.type === 'external-link' && !item.hidden - ) - - return ( - <SecondLevelNav wide={wide}> - <div> - {bucketItems.map((item) => { - const bucketStringPosition = process.env.NODE_ENV === 'production' ? 2 : 1 - const bucketPath = `/${location.pathname.split('/')[bucketStringPosition]}` - const isCurrent = location && item.to && bucketPath !== '' && item.to === bucketPath - return ( - <DarkNavLink - to={item.to} - state={{ bucketName: item.bucketName }} - activeClassName="active-item" - dataPlatform={ - item.to.includes('/accelerate') || - item.to.includes('/pulse') || - item.to.includes('/platform') - } - className={isCurrent ? 'active-item' : 'non-active'} - > - <span>{item.text}</span> - </DarkNavLink> - ) - })} - </div> - </SecondLevelNav> - ) - } - - return ( - <> - <HeaderWrapper open={showMobileNav}> - <BucketHeader wide={wide}> - <HomeIcons> - <CustomLink href="https://www.prisma.io"> - <Logo className="light" fill={'#2d3748'} /> - <Logo className="dark" fill={'#ffffff'} /> - </CustomLink> - <CustomLink href="https://www.prisma.io/docs">Docs</CustomLink> - </HomeIcons> - <NonMobileMenu style={headerProps.wide ? { paddingRight: '200px' } : {}}> - <SecondLevelMenu /> - </NonMobileMenu> - <GithubLink href="https://github.com/prisma" target="_blank"> - <Github className="light" fill={'#2d3748'} width={24} height={24} /> - <Github className="dark" fill={'#ffffff'} width={24} height={24} /> - </GithubLink> - <Button - type="primary" - color="teal" - className="log-btn" - href="https://console.prisma.io/login?utm_source=docs&utm_medium=login" - > - Login - </Button> - <DocsMobileButton onClick={toggleMobileNav}> - {showMobileNav ? ( - <Icon icon="fa-regular fa-xmark" size="28px" /> - ) : ( - <Icon icon="fa-regular fa-bars" size="28px" /> - )} - </DocsMobileButton> - - {showMobileNav && ( - <SecondLevelMobileOnlyNav> - <OverflowContainer> - <SecondLevelMobileMenu headerProps={headerProps} wide={wide} /> - <Button - type="primary" - color="teal" - className="log-btn-mobile" - href="https://console.prisma.io/login?utm_source=docs&utm_medium=login" - > - Login - </Button> - </OverflowContainer> - </SecondLevelMobileOnlyNav> - )} - </BucketHeader> - </HeaderWrapper> - {(location || sidenavSearchOpened) && ( - <SearchComponentDesktop - open={showMobileNav} - homePage={homePage} - openSearch={!showDocsBtn} - sidenavSearchOpened={sidenavSearchOpened} - > - <Search - hitsStatus={changeHitsStatus} - location={location} - sidenavSearchOpened={sidenavSearchOpened} - closeSidenavSearch={closeSidenavSearch} - path="home" - setInputText={setInputText} - wide={wide} - /> - </SearchComponentDesktop> - )} - </> - ) -} - -export default Header diff --git a/src/components/layout.tsx b/src/components/layout.tsx deleted file mode 100644 index 5744c61768..0000000000 --- a/src/components/layout.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import { MDXProvider } from '@mdx-js/react' -import { RouterProps } from '@reach/router' -import { Script } from 'gatsby' -import React, { useState } from 'react' -import StickyBox from 'react-sticky-box' -import styled from 'styled-components' - -import { useLayoutQuery } from '../hooks/useLayoutQuery' -import { defaultTheme as theme } from '../theme' -import Footer from './footer' -import Header from './header' -import SearchBox from './search/minimalInput' -import shortcodes from './shortcodes' -import SidebarLayout from './sidebar' -import TableOfContents from './toc' -import { WebProvider } from './WebProvider' - -import '../styles/layout.css' - -interface LayoutContentProps { - toc: any - tocDepth?: number - slug?: string - homePage?: boolean - children: React.ReactNode - wide?: boolean -} - -type LayoutProps = RouterProps & LayoutContentProps - -const Wrapper = styled.div<{ homePage?: boolean }>` - display: flex; - width: 100%; - justify-content: center; - //${(p) => (p.homePage ? 'padding: 80px 0 0 0' : 'padding: 80px 0')}; - @media (max-width: ${theme.breakpoints.tabletVertical}) { - padding: 0; - } -` - -const Content = styled.article<{ homePage?: boolean; wide?: boolean }>` - ${(p) => - p.homePage - ? 'max-width: 100%;' - : p.wide - ? 'min-width: 0; max-width: 988px; flex-shrink: 1; padding: 0 1rem;' - : 'max-width: 748px; margin: 0 20px;'} - flex: 1; - position: relative; - z-index: 100; - width: 100%; - @media (min-width: 0px) and (max-width: 1024px) { - margin: 0; - max-width: 100%; - } - @media (min-width: 1025px) and (max-width: 1240px) { - margin: 0; - ${(p) => (p.homePage ? 'max-width: 100%' : 'max-width: 570px')}; - } - section { - > h1, - h2, - h3, - h4, - h5, - h6 { - &:has(> inlinecode) { - line-height: 1.5; - } - } - } -` - -const MaxWidth = styled.div<{ wide?: boolean }>` - > section { - padding: 0 ${(p) => `${theme.space[40]}${p.wide ? ` 0 0` : ``}`}; - &.top-section { - padding-top: 0; - } - @media (min-width: 0px) and (max-width: 1024px) { - margin-top: ${theme.space[8]}; - } - @media (min-width: 0px) and (max-width: 1024px) { - padding: 0 ${theme.space[24]}; - &.top-section { - padding-top: ${theme.space[24]}; - } - } - } -` - -const NotMobile = styled.section` - display: flex; - height: fit-content; - @media (min-width: 0px) and (max-width: 1024px) { - display: none; - } - &.fixed { - position: sticky; - } -` - -const Container = styled.div<{ homePage?: boolean; wide?: boolean }>` - ${(p) => (p.homePage ? 'max-width: 100%;' : p.wide ? 'max-width: 1440px' : 'max-width: 1240px')}; - width: 100%; - justify-content: center; - display: flex; - align-items: flex-start; - position: relative; - - ${(p) => (p.homePage ? `margin-top: 0` : `margin-top: ${theme.space[40]};`)} - @media (max-width: 1024px) { - ${(p) => (p.homePage ? `margin-top: 0` : `margin-top: 118px;`)} - } -` - -const TOCWrapper = styled.div<{ wide?: boolean }>` - width: 180px; - height: 85vh; - flex-shrink: 0; - overflow-y: auto; - position: sticky; - top: 20px; - ${(p) => p.wide && `margin-right: -100px;`} - - @media (min-width: 0px) and (max-width: 1024px) { - display: none; - } - &.fixed { - position: sticky; - } -` - -const FooterWrapper = styled.div` - button { - z-index: 10; - } -` - -const SearchComponentDesktop = styled.div<{ open?: boolean }>` - width: calc(100% - ${theme.space[16]}); - padding: 0 0 22px 0; - @media (min-width: 0px) and (max-width: 1024px) { - display: none; - } -` - -const CustomSticky = styled(StickyBox)` - width: 272px; - margin: 0px -${theme.space[16]} 0 ${theme.space[16]}; - @media (min-width: 0px) and (max-width: 1024px) { - width: auto; - } -` - -const LayoutWrapper = styled.div<{ mobileNavOpen?: boolean }>` - ${(p) => p.mobileNavOpen && 'position: fixed;'} -` - -export default function Layout({ - children, - toc, - tocDepth, - location, - slug, - homePage, - wide, -}: LayoutProps) { - const { site } = useLayoutQuery() - const { header, footer } = site.siteMetadata - const [mobileNavOpen, setMobileNav] = useState(false) - const [showDocsBtn, setShowDocsBtn] = React.useState(true) - const queryString = new URLSearchParams(location?.search).get('query') - const [value, setValue] = useState(queryString || '') - - const closeSidenavSearch = () => setShowDocsBtn(true) - - const showHeaderSearch = () => setShowDocsBtn(false) - - const setInputText = (input: any) => setValue(input) - return ( - <WebProvider> - <Script src="https://kit.fontawesome.com/1772ab679c.js" crossOrigin="anonymous" /> - <MDXProvider components={shortcodes}> - <LayoutWrapper className="dark"> - <Header - headerProps={header} - wide={wide} - mobileNavOpen={setMobileNav} - homePage={homePage} - sidenavSearchOpened={!showDocsBtn} - closeSidenavSearch={closeSidenavSearch} - setInputText={setInputText} - /> - <Wrapper homePage={homePage}> - <Container homePage={homePage} wide={wide}> - {!homePage && ( - <CustomSticky offsetTop={20} offsetBottom={20}> - <SearchComponentDesktop open={!showDocsBtn}> - <SearchBox showHeaderSearch={showHeaderSearch} value={value} path={location} /> - </SearchComponentDesktop> - <NotMobile id="sidebar-holder"> - <SidebarLayout isMobile={false} location={location} slug={slug} /> - </NotMobile> - </CustomSticky> - )} - <Content homePage={homePage} wide={wide}> - <MaxWidth wide={wide}>{children}</MaxWidth> - </Content> - {!homePage && ( - <TOCWrapper id="toc-holder"> - {toc && toc.items && toc.items.length > 0 && ( - <TableOfContents headings={toc.items} tocDepth={tocDepth} /> - )} - </TOCWrapper> - )} - </Container> - </Wrapper> - </LayoutWrapper> - </MDXProvider> - <FooterWrapper> - <Footer footerProps={footer} /> - </FooterWrapper> - </WebProvider> - ) -} diff --git a/src/components/link.tsx b/src/components/link.tsx deleted file mode 100644 index f42cf1943b..0000000000 --- a/src/components/link.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Link as GatsbyLink } from 'gatsby' -import isAbsoluteUrl from 'is-absolute-url' -import React from 'react' -import CustomLink from './customLink' - -interface LinkProps { - to: string | null - activeClassName?: string - partiallyActive?: string - getProps?: any - wide?: boolean - sidenav?: boolean -} - -const Link = ({ - to, - activeClassName, - partiallyActive, - getProps, - sidenav = false, - ...props -}: LinkProps & React.ReactNode) => { - return (!to || isAbsoluteUrl(to)) && !sidenav ? ( - <CustomLink - href={to} - {...props} - mdx={true} - // target={!to?.includes('prisma.io') ? '_blank' : '_self'} - // rel={!to?.includes('prisma.io') ? 'noopener' : ''} - style={{ display: 'inline-block' }} - > - {props.children} - {to && isAbsoluteUrl(to) && (!to.includes('prisma.io') || to.includes('slack.prisma.io')) && ( - <svg - xmlns="http://www.w3.org/2000/svg" - width="12" - style={{ marginLeft: '4px' }} - height="12" - viewBox="0 0 12 12" - fill="currentColor" - color="inherit" - > - <path - fill="inherit" - d="M6 1h5v5L8.86 3.85 4.7 8 4 7.3l4.15-4.16L6 1Z M2 3h2v1H2v6h6V8h1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Z" - /> - </svg> - )} - </CustomLink> - ) : ( - <GatsbyLink - to={to} - activeClassName={activeClassName} - partiallyActive={partiallyActive} - getProps={getProps} - {...props} - /> - ) -} - -export default Link diff --git a/src/components/newsletter/FooterNewsletterForm.tsx b/src/components/newsletter/FooterNewsletterForm.tsx index 38f45fb59a..4370d6a56d 100644 --- a/src/components/newsletter/FooterNewsletterForm.tsx +++ b/src/components/newsletter/FooterNewsletterForm.tsx @@ -1,106 +1,12 @@ -import React, { useEffect, useRef, useState } from 'react' -import styled from 'styled-components' - -import { Button } from '../button' +import React, { useRef, useState } from 'react' +import styles from "./styles.module.scss" import { Icon } from '../Icon' +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' namespace S { - export const Container = styled.div<{ error?: boolean }>` - form { - position: relative; - display: flex; - align-items: center; - flex-direction: column; - margin-bottom: 48px; - @media only screen and (min-width: 768px) { - flex-direction: row; - margin-bottom: 0; - } - } - .input-name { - margin-bottom: 24px; - width: 100%; - @media only screen and (min-width: 768px) { - max-width: 264px; - width: auto; - } - } - .input-email { - margin-bottom: 32px; - width: 100%; - @media only screen and (min-width: 768px) { - width: auto; - max-width: 312px; - } - } - .input-name, - .input-email { - position: relative; - width: 100%; - .leading-icon { - left: 24px; - color: ${(props) => props.theme.colors.blueGray[600]}; - display: none; - position: absolute; - top: 50%; - transform: translateY(-50%); - @media only screen and (min-width: 360px) { - display: flex; - } - } - @media only screen and (min-width: 768px) { - margin-right: 24px; - margin-bottom: 0; - width: auto; - } - } - .input-el { - box-sizing: border-box; - width: 100%; - line-height: ${(props) => props.theme.fontSizes[20]}; - font-size: 18px; - height: 48px; - border: none; - border-radius: 10px; - border: 1px solid ${(props) => props.theme.colors.gray[300]}; - outline: ${(props) => (props.error ? `1px solid ${props.theme.colors.red[700]}` : 0)}; - padding: 12px 25px 12px 58px; - - &:focus { - outline: 1px solid - ${(props) => - props.error ? props.theme.colors.red[700] : props.theme.colors.blueGray[800]}; - } - - &::placeholder { - color: ${(props) => props.theme.colors.gray[600]}; - } - } - button { - content: 'Subscribe for updates'; - max-height: 48px; - white-space: nowrap; - width: 100%; - @media only screen and (min-width: 768px) { - width: max-content; - } - .button { - background-color: transparent; - background-image: none; - color: inherit; - cursor: pointer; - font-weight: inherit; - line-height: inherit; - font-size: 100%; - margin: 0; - padding: 0; - border: 0; - } - } - ` } -const icon = (name: string) => <Icon size="1.125rem" color="currentColor" icon={name} /> +const icon = (name: string) => <Icon size="1.125rem" color="rgb(113, 128, 150)" icon={name} /> type ColorType = 'indigo' | 'teal' | 'white' | undefined type FooterNewsletterFormProps = { @@ -110,53 +16,47 @@ type FooterNewsletterFormProps = { export const FooterNewsletterForm = ({ theme, color = 'indigo' }: FooterNewsletterFormProps) => { const [email, setEmail] = useState<string>('') - const [name, setName] = useState<string>('') const [submitted, setSubmitted] = useState<boolean>(false) const mailchimpForm = useRef(null) + const { siteConfig: { customFields } } = useDocusaurusContext(); - useEffect(() => { - if (mailchimpForm.current) { - // @ts-ignore - mailchimpForm.current.addEventListener('submit', () => { - setSubmitted(true) - setTimeout(() => { - setEmail('') - setName('') - }, 1) - }) + const setFormSubmitted = (event: any) => { + const options = { + method: 'POST', + headers: { + accept: 'application/json', + 'content-type': 'application/json', + // Add API key to cloudfare deployment + 'api-key': customFields.BREVO_API_KEY, + }, + body: JSON.stringify({ + email: email, + attributes: { + EMAIL: email, + SOURCE: 'website', + }, + includeListIds: [15], + templateId: 36, + redirectionUrl: 'https://prisma.io', + }), } - }, [mailchimpForm.current]) + //@ts-ignore + fetch('https://api.brevo.com/v3/contacts/doubleOptinConfirmation', options) - return ( - <S.Container theme={theme}> - <form - action="https://prisma.us14.list-manage.com/subscribe/post-json" - method="POST" - target="hiddenFrame" - ref={mailchimpForm} - > - <input type="hidden" name="u" value="dbacf466dc6e90901d8936391" /> - <input type="hidden" name="id" value="83e066a034" /> - <input type="hidden" name="c" value="?" /> - <input type="hidden" name="f_id" value="00b0c2e1f0" /> + setTimeout(() => { + setEmail('') + setSubmitted(true) + }, 200) + } - <label className="input-name" htmlFor="MERGE1"> - <div className="leading-icon">{icon('fa-light fa-user')}</div> - <input - type="text" - className="input-el" - name="FNAME" - id="MERGE1" - placeholder="Name" - value={name} - onChange={(e) => setName(e.target.value)} - /> - </label> - <label className="input-email" htmlFor="MERGE0"> - <div className="leading-icon">{icon('fa-light fa-envelope')}</div> + return ( + <div> + <form target="hiddenFrame" ref={mailchimpForm} className={styles.form} onSubmit={setFormSubmitted}> + <label className={styles["input-email"]} htmlFor="MERGE0"> + <div className={styles["leading-icon"]}>{icon('fa-light fa-envelope')}</div> <input type="email" - className="input-el" + className={styles["input-el"]} name="EMAIL" id="MERGE0" value={email} @@ -166,17 +66,17 @@ export const FooterNewsletterForm = ({ theme, color = 'indigo' }: FooterNewslett autoCorrect="off" /> </label> - <Button type="primary" color={color === 'white' ? 'indigo' : color}> + <button className={styles.formBtn} color={color === 'white' ? 'indigo' : color}> <input type="submit" value={submitted ? 'Thank you!' : 'Subscribe for updates'} name="subscribe" id="mc-embedded-subscribe" - className="button" + className={styles.button} /> - </Button> + </button> </form> <iframe name="hiddenFrame" src="about:blank" style={{ display: 'none' }}></iframe> - </S.Container> + </div> ) } diff --git a/src/components/newsletter/mailChimp.ts b/src/components/newsletter/mailChimp.ts deleted file mode 100644 index 6690ddb1e6..0000000000 --- a/src/components/newsletter/mailChimp.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Subscribe to mailchimp - * - * TODO: better align with mailchimp, this is using an undocumented API - * https://stackoverflow.com/questions/5188418/jquery-ajax-post-not-working-with-mailchimp/16369887#16369887 - */ - -export default async function subscribe(email: string): Promise<any> { - await fetch( - `https://coo.us14.list-manage.com/subscribe/post-json?u=dbacf466dc6e90901d8936391&id=83e066a034&EMAIL=${encodeURIComponent( - email - )}&c=?`, - { - method: 'GET', - mode: 'no-cors', - } - ) - // no-cors doesn't give us any information, so this is just a fire & pray - return -} diff --git a/src/components/newsletter/styles.module.scss b/src/components/newsletter/styles.module.scss new file mode 100644 index 0000000000..583fd087e0 --- /dev/null +++ b/src/components/newsletter/styles.module.scss @@ -0,0 +1,105 @@ +.formBtn { + display: inline-flex; + -webkit-box-pack: center; + padding: 16px 24px; + justify-content: center; + max-width: 100%; + text-align: left; + z-index: 1; + margin: 4px; + -webkit-box-align: center; + align-items: center; + box-sizing: border-box; + border-radius: 6px; + text-decoration: none; + cursor: pointer; + position: relative; + line-height: 1; + transition: background-color 0.1s ease 0s, color 0.2s ease 0s; + font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-weight: 700; + font-size: 18px; + border: 1px solid rgb(90, 103, 216); + background-color: rgb(90, 103, 216); + color: white; + content: 'Subscribe for updates'; + max-height: 48px; + white-space: nowrap; + width: 100%; + @media only screen and (min-width: 768px) { + width: max-content; + } + .button { + background-color: transparent; + background-image: none; + color: inherit; + cursor: pointer; + font-weight: inherit; + line-height: inherit; + font-size: 100%; + margin: 0; + padding: 0; + border: 0; + } +} +.form { + position: relative; + display: flex; + align-items: center; + flex-direction: column; + margin-bottom: 48px; + @media only screen and (min-width: 768px) { + flex-direction: row; + margin-bottom: 0; + } +} +.input-name { + margin-bottom: 24px; + width: 100%; + @media only screen and (min-width: 768px) { + max-width: 264px; + width: auto; + } +} +.input-email { + margin-bottom: 32px; + width: 100%; + @media only screen and (min-width: 768px) { + width: auto; + max-width: 312px; + } +} +.input-name, +.input-email { + position: relative; + width: 100%; + .leading-icon { + left: 24px; + display: none; + position: absolute; + top: 50%; + transform: translateY(-50%); + @media only screen and (min-width: 360px) { + display: flex; + } + } + @media only screen and (min-width: 768px) { + margin-right: 24px; + margin-bottom: 0; + width: auto; + } +} +.input-el { + background: white; + box-sizing: border-box; + width: 100%; + font-size: 18px; + height: 48px; + border: none; + border-radius: 10px; + padding: 12px 25px 12px 58px; + + &:focus { + outline: 1px solid + } +} \ No newline at end of file diff --git a/src/components/newsletter/valid.ts b/src/components/newsletter/valid.ts deleted file mode 100644 index 24bdfcf64b..0000000000 --- a/src/components/newsletter/valid.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Test for an invalid email - */ - -export function email(email: string): string | Error { - email = email.toLowerCase() - const re = - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - if (!re.test(email)) { - return new Error(`invalid email: ${email}`) - } - return email -} diff --git a/src/components/pageBottom.tsx b/src/components/pageBottom.tsx deleted file mode 100644 index 1d76ca6acd..0000000000 --- a/src/components/pageBottom.tsx +++ /dev/null @@ -1,390 +0,0 @@ -import { useLocation } from '@reach/router' -import React, { MouseEvent, useCallback, useState } from 'react' -import { X } from 'react-feather' -import { toast, ToastContainer } from 'react-toastify' -import styled from 'styled-components' - -import config from '../../config' -import Down from '../icons/Down' -import Twitter from '../icons/Twitter' -import Up from '../icons/Up' -import { defaultTheme as theme } from '../theme' -import Link from './link' -import { ButtonWrapper } from './shortcodes/button' - -import 'react-toastify/dist/ReactToastify.css' - -const sentiments: any = { - unhappy: 'Unhappy', - happy: 'Happy', -} - -const twitterShareUrl = `https://twitter.com/intent/tweet?text=I%27ve%20found%20this%20%40prisma%20docs%20page%20helpful%21%20` - -const ToastForm = ({ sentiment, fbId, fbSubmitted }: any) => { - const currentDocsPageURL = encodeURIComponent(location ? location.href : '/') - - const [feedback, setFeedback] = useState('') - const handleFeedbackChange = (e: any) => setFeedback(e.target.value) - - const closeForm = (e: any) => toast.dismiss() - // Optional callback to add textual feedback - const sendFeedback = async (e: any) => { - e.preventDefault() - await fetch(config.feedback.feedbackUrl, { - method: 'POST', - mode: 'no-cors', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ id: fbId, feedback }), - }) - fbSubmitted(true) - } - return ( - <> - <Title> - <p> - {sentiment !== 'Happy' - ? `Thank you for letting us know. Any more details about what we could improve?` - : `Thank you for letting us know! Was there anything you particularly enjoyed?`} - </p> - <a onClick={closeForm}> - <X color={theme.colors.blue[300]} /> - </a> - -
- - - - {sentiment !== 'Happy' ? ( - - Open a Github Issue Instead - - ) : ( - - )} - -
- - ) -} - -const PageBottom = ({ editDocsPath }: any) => { - const [submittedFeedback, setSubmittedFeedback] = useState(false) - const [, setFeedbackId] = useState(null) - const [submittedSentiment, setSubmittedSentiment] = useState(false) - const [sentiment, setSentiment] = useState(sentiments['happy']) - let location = useLocation() - const pageUrl = location ? location.pathname : '/' - const closeForm = (e: any) => toast.dismiss() - const fbSumitted = (state: boolean) => { - setSubmittedFeedback(state) - toast.dismiss() - toast( - - 🎉 -

Message sent! Thank you for making Prisma better for the community.

- - - -
- ) - } - - // Send the initial sentiment - const sendSentiment = useCallback( - async (sentiment: any) => { - const createdSetiment = await fetch(config.feedback.sentimentUrl, { - method: 'POST', - mode: 'cors', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ pageUrl, sentiment }), - }) - .then((response) => response.json()) - .then((data) => data) - - toast() - - setFeedbackId(createdSetiment.id) - setSubmittedSentiment(true) - }, - [pageUrl, sentiment] - ) - - const handleSentiment = (e: MouseEvent) => { - const selectedSentiment = e.currentTarget.id - setSentiment(() => { - const newSentiment = sentiments[selectedSentiment] - sendSentiment(newSentiment) - return newSentiment - }) - } - - return ( - - -

Was this helpful?

-
- - -
-
- - - {submittedFeedback ? ( - <> - - - ) : ( - - )} - - - {editDocsPath && ( - - Edit this page on GitHub - - )} -
- ) -} - -export default PageBottom - -const PageBottomWrapper = styled.div` - display: flex; - font-size: ${theme.fontSizes[14]}; - flex-direction: row; - justify-content: space-between; - padding: ${theme.space[16]} ${theme.space[40]}; - align-items: center; - button svg { - cursor: pointer; - transition: width 2s linear 1s; - } - .edit-git, - .message { - color: ${theme.colors.gray[600]} !important; - } - - button { - color: ${theme.colors.white} !important; - } - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - padding: ${theme.space[16]}; - flex-direction: column; - align-items: flex-start; - .edit-git { - order: 1; - } - } -` - -const Feedback = styled.div` - h4 { - text-transform: uppercase; - font-weight: bold; - letter-spacing: 0.01em; - text-transform: uppercase; - margin: revert; - color: ${theme.colors.gray[500]} !important; - } - .sentiments { - button { - background: transparent; - border: 0; - &.active { - border-color: ${theme.colors.blue[500]}; - svg { - circle, - path { - stroke: ${theme.colors.blue[500]}; - } - } - } - &:hover svg { - border-radius: 50%; - background: rgba(204, 217, 223, 0.5); - } - &:disabled svg { - cursor: not-allowed; - } - } - } - @media (min-width: 0px) and (max-width: 767px) { - order: 2; - } -` - -const Wrapper = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - align-items: flex-start; - cursor: default; -` - -const Content = styled.div` - flex: 1; - .feedback-container, - .yay-container { - width: 360px; - } - .feedback-toast { - background: #ffffff; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25), 0px 2px 12px rgba(0, 0, 0, 0.12); - border-radius: 8px; - position: relative; - width: 360px; - height: 225px; - padding: 0; - - .feedback-body { - padding: 0; - } - - margin-top: ${theme.space[24]}; - align-items: center; - input { - width: 100%; - border: 0; - padding: ${theme.space[12]} 20px; - font-size: 100%; - font-weight: normal; - margin-bottom: 20px; - - &::placeholder { - color: ${theme.colors.gray[500]}; - } - } - button { - background: ${theme.colors.green[500]}; - border-radius: 6px; - padding: 8px; - font-size: 1rem; - font-weight: 600; - border-color: transparent; - &:hover { - background: ${theme.colors.green[600]}; - } - } - } - .yay-toast { - background: ${theme.colors.blue[100]}; - font-size: 14px; - color: ${theme.colors.blue[600]}; - min-width: 360px; - } -` - -const Title = styled.div` - background: ${theme.colors.blue[100]}; - display: flex; - padding: 20px; - p { - color: ${theme.colors.blue[600]}; - font-size: ${theme.fontSizes[14]}; - margin: 0; - } - - a { - cursor: pointer; - } -` - -const Button = styled(ButtonWrapper)` - display: inline-flex !important; - overflow: hidden; - text-transform: capitalize; - font-size: 1rem; - svg { - margin-right: 10px; - height: 1rem; - width: 1rem; - path { - stroke: ${theme.colors.blue[300]}; - } - } - background: ${theme.colors.blue[500]} !important; - margin: 0; - margin-left: 20px; - @media (min-width: 0px) and (max-width: 767px) { - font-size: ${theme.fontSizes[12]}; - text-transform: none; - svg { - width: 14px; - } - } -` - -const ButtonRow = styled.div` - display: flex; - padding: 20px; - align-items: center; - .git-link { - text-decoration: underline; - margin-left: 20px; - color: ${theme.colors.gray[700]} !important; - font-weight: 600; - font-size: 14px; - } -` - -const SuccessToast = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - p { - font-size: 14px; - } - span { - font-size: 24px; - margin-right: 0.5rem; - } - a { - cursor: pointer; - } -` diff --git a/src/components/parentTitleComp.tsx b/src/components/parentTitleComp.tsx deleted file mode 100644 index 0ec02b3729..0000000000 --- a/src/components/parentTitleComp.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -import { useAllArticlesQuery } from '../hooks/useAllArticlesQuery' -import { AllArticles } from '../interfaces/AllArticles.interface' -import { defaultTheme as theme } from '../theme' -import { getParentTitle } from '../utils/parentTitle' -import { Icon } from './Icon' -import Link from './link' -import CustomLink from './customLink' - -const BreadcrumbTitle = styled.div` - color: ${theme.colors.gray[600]} !important; - line-height: 1.6rem; - font-weight: normal; - margin: 0; - a, - button { - color: ${theme.colors.gray[600]} !important; - text-decoration: none; - - &:hover, - &:focus { - color: ${theme.colors.gray[700]} !important; - text-decoration: underline; - cursor: pointer; - } - } - - @media (prefers-color-scheme: dark) { - a, - button { - color: ${theme.colors.gray[500]} !important; - &:hover, - &:focus { - color: ${theme.colors.gray[600]} !important; - } - } - } -` - -interface ParentTitleProps { - slug: string - nonLink?: boolean - isSearchItem?: boolean -} - -const ParentTitle = ({ slug, nonLink, isSearchItem }: ParentTitleProps) => { - const { allMdx }: AllArticles = useAllArticlesQuery() - const parentTitle = getParentTitle(slug, allMdx) - if (parentTitle.length === 0) { - return null - } - return ( - - {!isSearchItem && ( - - - - )} - {!isSearchItem && {`/`} } - {parentTitle.map((part: any, index: number) => ( - - {part.link && !nonLink ? ( - - {part.title} - - ) : ( - {part.title} - )} - {parentTitle.length !== index + 1 ? ' / ' : ''} - - ))} - - ) -} - -export default ParentTitle diff --git a/src/components/search/hitComps.tsx b/src/components/search/hitComps.tsx deleted file mode 100644 index 5774af2e68..0000000000 --- a/src/components/search/hitComps.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import { Snippet } from 'react-instantsearch-dom' -import styled from 'styled-components' - -import Link from '../link' -import ParentTitle from '../parentTitleComp' - -const HitComp = styled.div` - padding: ${theme.space[24]} ${theme.space[40]} !important; - font-family: ${theme.fonts.text}; - font-style: normal; - font-weight: normal; - font-size: ${theme.fontSizes[16]}; - line-height: ${theme.space[24]}; - border-bottom: 1px solid ${theme.colors.gray[300]}; - // max-height: 150px; - &:last-item { - border: 0; - } - a { - color: ${theme.colors.gray[900]} !important; - display: block; - } - h4 { - font-weight: normal; - } - h3 { - font-weight: 600; - line-height: 28px; - letter-spacing: -0.01em; - margin: 10px 0; - } - &:hover, - &:focus { - background: ${theme.colors.gray[100]}; - } - mark { - color: ${theme.colors.blue[600]} !important; - background: #ebf8ff; - padding: 2px; - font-weight: bold; - } - - .more { - color: ${theme.colors.blue[600]}; - font-size: ${theme.fontSizes[14]}; - width: fit-content; - margin: 10px 0 0; - } - - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - max-height: fit-content; - padding: ${theme.space[24]} !important; - } -` - -const DocHit = ({ hit, selected }: any) => - hit._distinctSeqID == 0 ? ( - - - -

- /{' '} - - - -

- - {hit.moreCount > 1 &&

... More results on this page

} - -
- ) : null - -export default DocHit diff --git a/src/components/search/index.tsx b/src/components/search/index.tsx deleted file mode 100644 index f4c9877227..0000000000 --- a/src/components/search/index.tsx +++ /dev/null @@ -1,299 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import algoliasearch from 'algoliasearch/lite' -import { navigate } from 'gatsby' -import qs from 'qs' -import React, { useEffect, useRef, useState } from 'react' -import { connectHits, connectStateResults, Index, InstantSearch } from 'react-instantsearch-dom' -import styled from 'styled-components' - -import config from '../../../config' -import DocHit from './hitComps' -import CustomSearchBox from './input' -import Overlay from './overlay' - -const HitsWrapper = styled.div` - display: none; - &.show { - display: grid; - margin-bottom: 100px; - } - max-height: 75vh; - overflow-y: scroll; - overflow-x: hidden; - z-index: 100002; - -webkit-overflow-scrolling: touch; - position: absolute; - left: 50%; - top: 86px; - - transform: translate(-50%, -0%); - max-width: 1240px; - width: 100%; - background: ${theme.colors.white}; - box-shadow: 0px 4px 8px rgba(47, 55, 71, 0.05), 0px 1px 3px rgba(47, 55, 71, 0.1); - border-radius: 8px; - // border-top-left-radius: 0; - // border-top-right-radius: 0; - * { - margin-top: 0; - padding: 0; - } - ul { - list-style: none; - margin: 0; - } - .no-results { - padding: 2rem; - } - .loader, - .loader:after { - border-radius: 50%; - width: 5em; - height: 5em; - } - .loader { - margin: 60px auto; - font-size: 10px; - position: relative; - text-indent: -9999em; - border-top: 0.5em solid rgba(215, 215, 215, 0.2); - border-right: 0.5em solid rgba(215, 215, 215, 0.2); - border-bottom: 0.5em solid rgba(215, 215, 215, 0.2); - border-left: 0.5em solid #d7d7d7; - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - -webkit-animation: load8 1.1s infinite linear; - animation: load8 1.1s infinite linear; - } - @-webkit-keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - @keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - @media (min-width: 0px) and (max-width: 1024px) { - // left: 0; - // top: 88px; - // max-width: 100%; - border-top: 1px solid ${theme.colors.gray[300]}; - border-top-right-radius: 0; - border-top-left-radius: 0; - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[700]}; - } -` - -const indexName = config.header.search.indexName -const DEBOUNCE_TIME = 400 -const algoliaClient = algoliasearch( - config.header.search.algoliaAppId, - config.header.search.algoliaSearchKey -) - -const searchClient = { - ...algoliaClient, - search(requests: any) { - if (requests.every(({ params }: any) => !params.query)) { - return Promise.resolve({ - results: requests.map(() => ({ - hits: [], - nbHits: 0, - nbPages: 0, - page: 0, - processingTimeMS: 0, - hitsPerPage: 0, - exhaustiveNbHits: false, - query: '', - params: '', - })), - }) - } - - return algoliaClient.search(requests) - }, -} - -const getHits = (children: any, res: any) => { - const allHits = res.hits - const newHits = allHits - .filter((h: any) => h._distinctSeqID == 0) - .map((x: any) => ({ - ...x, - moreCount: 0, - })) - allHits.map((h: any) => { - const first = newHits.find((firstG: any) => firstG.slug == h.slug) - if (first) { - first.moreCount++ - } - }) - res.hits = newHits - return children -} -const Results = connectStateResults( - ({ isSearchStalled, searchState: state, searchResults: res, children }: any) => - (isSearchStalled || res?.query === '' ?
Searching...
: null) || - (res && res.nbHits > 0 ? ( - getHits(children, res) - ) : ( -
- No results for '{state.query}' -
- )) -) - -const createURL = (state: any) => `?${qs.stringify(state)}` - -const searchStateToUrl = (location: any, searchState: any) => - searchState - ? `${ - location.pathname === '/docs' - ? location.pathname.replace('docs', '') - : location.pathname.replace('/docs', '') - }${createURL(searchState)}` - : `` - -const urlToSearchState = (location: any) => qs.parse(location.search.slice(1)) - -export default function Search({ - hitsStatus, - location, - path, - sidenavSearchOpened, - closeSidenavSearch, - setInputText, - wide, -}: any) { - const [searchState, setSearchState] = useState(urlToSearchState(location)) - const [query, setQuery] = useState(``) - const [showHits, setShowHits] = React.useState(false) - const [selectedIndex, setSelectedIndex] = React.useState(-1) - const hideSearch = () => { - setShowHits(false) - if (searchState.query === '') { - clearTimeout(debouncedSetStateRef.current) - debouncedSetStateRef.current = setTimeout(() => { - navigate(location.href.split('?')[0]) - }, DEBOUNCE_TIME) - } - setInputText(query) - closeSidenavSearch() - } - - const showSearch = () => setShowHits(true) - - const debouncedSetStateRef = useRef(null) - - const onSearchStateChange = (updatedSearchState: any) => { - setQuery(updatedSearchState.query) - clearTimeout(debouncedSetStateRef.current) - - debouncedSetStateRef.current = setTimeout(() => { - navigate(searchStateToUrl(location, updatedSearchState)) - }, DEBOUNCE_TIME) - - setSearchState(updatedSearchState) - } - - React.useEffect(() => { - hitsStatus(showHits) - }, [showHits, query]) - - React.useEffect(() => { - setSearchState(urlToSearchState(location)) - setQuery(searchState.query) - }, [location]) - - const incrementIndex = () => { - setSelectedIndex((prevCount: number) => { - const nbHits = document.querySelectorAll('.ais-Hits-list .ais-Hits-item')?.length - if (prevCount < nbHits - 1) { - return prevCount + 1 - } else { - return 0 - } - }) - } - const decrementIndex = () => { - const nbHits = document.querySelectorAll('.ais-Hits-list .ais-Hits-item')?.length - setSelectedIndex((prevCount: number) => { - if (prevCount > 0) { - return prevCount - 1 - } else { - return nbHits - 1 - } - }) - } - - const scrollListener = () => { - hideSearch() - } - - useEffect(() => { - document.addEventListener('scroll', scrollListener) - return () => document.removeEventListener('scroll', scrollListener) - }, []) - return ( - - - setShowHits(true)} - isOpened={showHits} - closeSearch={hideSearch} - upClicked={decrementIndex} - downClicked={incrementIndex} - path={location.pathname} - sidenavSearchOpened={sidenavSearchOpened} - wide={wide} - /> - {query && query !== '' && showHits && ( - - - - - - - - )} - - ) -} - -const Hits = connectHits( - ({ hits, hitComponent, onMouseHoverHit, selectedIndex, onMouseLeaverHits }: any) => ( -
    - {hits.map((hit: any, index: number) => ( -
  • - {React.createElement(hitComponent, { - hit, - selected: index === selectedIndex, - onMouseHover: () => onMouseHoverHit(index), - })} -
  • - ))} -
- ) -) diff --git a/src/components/search/input.tsx b/src/components/search/input.tsx deleted file mode 100644 index 04b028aeaf..0000000000 --- a/src/components/search/input.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import { connectSearchBox } from 'react-instantsearch-dom' -import styled from 'styled-components' - -import useWindowDimensions from '../../hooks/useWindowDimensions' -import Clear from '../../icons/Clear' -import SearchPic from '../../icons/Search' -import SearchSlash from '../../icons/SearchSlash' - -const SearchBoxDiv = styled.div<{ minimal?: boolean; wide?: boolean }>` - width: 100%; - display: flex; - max-width: 1240px; - width: 100%; - margin: 0 auto; - padding: 12px 16px; - border-radius: 8px; - border: 1px solid #cbd5e0; - background: #fff; - transition: transform 50ms ease-out; - transform-origin: center left; - - form { - width: 100%; - position: relative; - height: 36px; - transition: transform 50ms ease-out; - } - //search input width - &.opened { - position: relative; - z-index: 100001; - max-width: ${(p) => (p.wide ? '1440px' : '1240px')}; - width: 100%; - background: ${theme.colors.white}; - box-shadow: 0px 25px 50px -12px #00000040; - border: 2px solid #667eea; - border-radius: 8px; - transform-origin: center; - transform: scaleY(1.1) - ${(props) => (props.minimal ? `translateX(-1px)` : `translate(-1px, -5px)`)}; - - .clear { - //background: ${theme.colors.gray[300]}; - border-radius: 6px; - // height: 36px; - // width: 36px; - display: flex; - align-items: center; - justify-content: center; - svg path { - stroke: ${theme.colors.gray[700]}; - } - } - form { - transform: scaleY(0.9); - } - } - @media (max-width: ${theme.breakpoints.mobile}) { - width: auto; - flex: 1; - form { - width: 100%; - } - } - - .clear { - display: none; - } - - form { - display: flex; - align-items: center; - - button.ais-SearchBox-submit { - display: none; - } - button.ais-SearchBox-reset { - background: transparent; - border: transparent; - outline: none; - } - - input { - width: 100%; - background: transparent; - outline: none; - padding: 0rem ${theme.space[32]}; - font-family: ${theme.fonts.text}; - font-style: normal; - font-weight: normal; - font-size: ${theme.fontSizes[16]}; - line-height: 100%; - border-width: 0; - &::placeholder { - content: 'Search Documentation...'; - color: ${theme.colors.gray[500]}; - opacity: 1; /* Firefox */ - } - } - - input[type='search']::-webkit-search-decoration, - input[type='search']::-webkit-search-cancel-button, - input[type='search']::-webkit-search-results-button, - input[type='search']::-webkit-search-results-decoration { - -webkit-appearance: none; - } - } - - .slash { - border: 1px solid ${theme.colors.gray[400]}; - border-radius: 4px; - color: ${theme.colors.gray[400]}; - min-width: 18px; - display: flex; - justify-content: center; - } - - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - .slash { - display: none; - } - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[800]}; - border-color: ${theme.colors.gray[700]}; - - form { - input { - color: ${theme.colors.gray[100]}; - &::placeholder { - color: ${theme.colors.gray[400]}; - } - } - - svg path { - stroke: ${theme.colors.gray[400]}; - } - } - &.opened { - background: ${theme.colors.gray[800]}; - .clear { - svg path { - stroke: ${theme.colors.gray[100]}; - } - } - } - } -` - -const SearchIcon = styled(SearchPic)` - min-width: 1em; - pointer-events: none; - //z-index: 100001; - position: absolute; -` - -const SearchSlashIcon = styled(SearchSlash)` - pointer-events: none; - //z-index: 100001; - position: absolute; - right: 0; - @media (prefers-color-scheme: dark) { - path { - stroke: ${theme.colors.gray[700]}; - } - } -` - -const ClearIcon = styled(Clear)` - cursor: pointer; -` - -const DEBOUNCE_DELAY = 500 -const ESCAPE_KEY = 27 -const focusShortcuts = ['s', 191] - -const SearchBox = ({ - refine, - onFocus, - currentRefinement, - isOpened, - closeSearch, - upClicked, - downClicked, - selectedInd, - path, - sidenavSearchOpened, - disconnectedForm, - wide, - ...rest -}: any) => { - const [value, setValue] = React.useState(currentRefinement) - const timeoutId = React.useRef(null) - const inputEl = React.useRef(null) - const { width } = useWindowDimensions() - const [placeholderText, setPlaceholderText] = React.useState('Search Documentation...') - - const onChange = (e: any) => { - const { value: newValue } = e.target - - // After the user manually cleared the input, call `refine` without waiting so that the search - // closes instantly. - if (newValue === '') { - return clearInput() - } - - // Otherwise, debounce the search to avoid triggering many queries at once, which could also - // make the UI freeze. - window.clearTimeout(timeoutId.current) - timeoutId.current = window.setTimeout(() => refine(newValue), DEBOUNCE_DELAY) - setValue(newValue) - inputEl.current.blur() - inputEl.current.focus() - } - - const clearInput = () => { - window.clearTimeout(timeoutId.current) - setValue('') - refine('') - } - - // Focus shortcuts on keydown - const onKeyDown = (e: any) => { - if (e && e.keyCode == ESCAPE_KEY) { - closeSearch() - } else if (e && e.keyCode === 40) { - downClicked() - } else if (e && e.keyCode === 38) { - upClicked() - } - - const shortcuts = focusShortcuts.map((key) => - typeof key === 'string' ? key.toUpperCase().charCodeAt(0) : key - ) - - const elt = e.target || e.srcElement - const tagName = elt.tagName - if ( - elt.isContentEditable || - tagName === 'INPUT' || - tagName === 'SELECT' || - tagName === 'TEXTAREA' - ) { - // already in an input - return - } - - const which = e.which || e.keyCode - if (shortcuts.indexOf(which) === -1) { - // not the right shortcut - return - } - - inputEl.current.focus() - e.stopPropagation() - e.preventDefault() - } - - const onSubmit = (e: any) => { - e.preventDefault() - e.stopPropagation() - inputEl.current.blur() - - return false - } - - React.useEffect(() => { - document.addEventListener('keydown', onKeyDown) - if (width > 640) { - setPlaceholderText('Search Documentation...') - } - if (value) { - onFocus() - } - return () => { - document.removeEventListener('keydown', onKeyDown) - } - }, []) - - if (sidenavSearchOpened) { - inputEl.current.focus() - onFocus() - } - - return ( - -
- - - - {value !== '' && isOpened && ( - - - - )} - {!isOpened && width > 768 && } - -
- ) -} - -const CustomSearchBox = connectSearchBox(SearchBox) -export default CustomSearchBox diff --git a/src/components/search/minimalInput.tsx b/src/components/search/minimalInput.tsx deleted file mode 100644 index 1a5471faaa..0000000000 --- a/src/components/search/minimalInput.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -import SearchPic from '../../icons/Search' -import SearchSlash from '../../icons/SearchSlash' - -const SearchBoxDiv = styled.div` - width: 100%; - display: flex; - max-width: 1240px; - width: 100%; - margin: 0 auto; - padding: 8px 16px; - border-radius: 8px; - border: 1px solid #cbd5e0; - background: #fff; - - form { - width: 100%; - position: relative; - height: 36px; - } - //search input width - &.opened { - position: relative; - z-index: 100001; - max-width: 1240px; - width: 100%; - height: 77px; - background: ${theme.colors.white}; - padding: ${theme.space[20]}; - border-bottom: 1px solid ${theme.colors.gray[300]}; - border-radius: ${theme.radii.small}; - border-color: ${theme.colors.white}; - form { - max-width: 100%; - input { - color: ${theme.colors.gray[700]}; - } - } - - .clear { - background: ${theme.colors.gray[300]}; - border-radius: 6px; - height: 36px; - width: 36px; - display: flex; - align-items: center; - justify-content: center; - svg path { - stroke: ${theme.colors.gray[700]}; - } - } - } - @media (max-width: ${theme.breakpoints.mobile}) { - width: auto; - flex: 1; - form { - width: 100%; - } - } - - .clear { - display: none; - } - - form { - display: flex; - align-items: center; - - button.ais-SearchBox-submit { - display: none; - } - button.ais-SearchBox-reset { - background: transparent; - border: transparent; - outline: none; - } - - input { - width: 100%; - background: transparent; - outline: none; - padding: 0rem ${theme.space[32]}; - font-family: ${theme.fonts.text}; - font-style: normal; - font-weight: normal; - font-size: ${theme.fontSizes[16]}; - line-height: 100%; - border-width: 0; - &::placeholder { - content: 'Search Documentation...'; - color: ${theme.colors.gray[500]}; - opacity: 1; /* Firefox */ - } - } - - input[type='search']::-webkit-search-decoration, - input[type='search']::-webkit-search-cancel-button, - input[type='search']::-webkit-search-results-button, - input[type='search']::-webkit-search-results-decoration { - -webkit-appearance: none; - } - } - - .slash { - border: 1px solid ${theme.colors.gray[400]}; - border-radius: 4px; - color: ${theme.colors.gray[400]}; - min-width: 18px; - display: flex; - justify-content: center; - } - - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - .slash { - display: none; - } - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[800]}; - border-color: ${theme.colors.gray[700]}; - - form { - input { - color: ${theme.colors.gray[100]}; - &::placeholder { - color: ${theme.colors.gray[400]}; - } - } - svg path { - stroke: ${theme.colors.gray[400]}; - } - } - &.opened { - background: ${theme.colors.gray[800]}; - } - } -` - -const SearchIcon = styled(SearchPic)` - min-width: 1em; - pointer-events: none; - //z-index: 100001; - position: absolute; -` - -const SearchSlashIcon = styled(SearchSlash)` - pointer-events: none; - //z-index: 100001; - position: absolute; - right: 0; - @media (prefers-color-scheme: dark) { - path { - stroke: ${theme.colors.gray[700]}; - } - } -` - -const focusShortcuts = ['s', 191] - -const SearchBox = ({ showHeaderSearch, value }: any) => { - const inputEl = React.useRef(null) - const onKeyDown = (e: any) => { - const shortcuts = focusShortcuts.map((key) => - typeof key === 'string' ? key.toUpperCase().charCodeAt(0) : key - ) - - const elt = e.target || e.srcElement - const tagName = elt.tagName - if ( - elt.isContentEditable || - tagName === 'INPUT' || - tagName === 'SELECT' || - tagName === 'TEXTAREA' - ) { - // already in an input - return - } - - const which = e.which || e.keyCode - if (shortcuts.indexOf(which) === -1) { - // not the right shortcut - return - } - - inputEl.current.focus() - e.stopPropagation() - e.preventDefault() - } - - React.useEffect(() => { - document.addEventListener('keydown', onKeyDown) - return () => { - document.removeEventListener('keydown', onKeyDown) - } - }, []) - - React.useEffect(() => { - if (value) { - inputEl.current.focus() - } - }, [value]) - - return ( - -
- - - - -
- ) -} - -export default SearchBox diff --git a/src/components/search/overlay.tsx b/src/components/search/overlay.tsx deleted file mode 100644 index 2e49c5b698..0000000000 --- a/src/components/search/overlay.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -interface Props { - visible: boolean - hideSearch: () => void - path?: string -} - -const Overlay = ({ visible, hideSearch, path }: Props) => { - const [transition, setTransition] = React.useState(false) - - React.useEffect(() => { - setTimeout(() => { - setTransition(true) - }, 1000) - }) - - return ( - - ) -} - -const StyledOverlay = styled.div<{ isVisible: boolean; isTransitioning: boolean; path?: string }>` - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(8, 35, 51, 0.3); - opacity: 0; - pointer-events: none; - z-index: 10000; - margin-top: -80px; - height: 100vh; - - // ${(p) => p.path && p.path === 'home' && `margin-top: -80px; width: 100vw; height: 100vh;`} - ${(p) => p.isTransitioning && 'transition: opacity 0.25s ease-in-out;'} - ${(p) => (p.isVisible ? 'opacity: 1; pointer-events: all;' : 'opacity: 0; pointer-events: none;')} -` - -export default Overlay diff --git a/src/components/seo.tsx b/src/components/seo.tsx deleted file mode 100644 index f58d1d98b1..0000000000 --- a/src/components/seo.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import * as React from 'react' -import favicon from '../images/favicon-32x32.png' -import { useStaticQuery, graphql } from 'gatsby' -import { useLocation } from '@reach/router' - -type SEOProps = { - title?: string - description?: string - homepage?: boolean -} - -const SEO = ({ title, description, homepage }: SEOProps) => { - const location = useLocation() - const { site } = useStaticQuery(query) - const { - siteMetadata: { - pathPrefix, - titlePrefix, - titleSuffix, - siteUrl, - keywords, - twitter: { site: tSite, creator: tCreator, image: tUrl }, - og: { - site_name: oSite, - type: oType, - image: { alt: oImgAlt, url: oUrl, type: oImgType, width: oImgWidth, height: oImgHeight }, - }, - }, - } = site - - let canonicalUrl = `${siteUrl}${location.pathname}`.replace(/\/$/, '') - - return ( - <> - - - {homepage ? '' : titlePrefix} - {title} - {homepage ? '' : titleSuffix} - - - {keywords && } - {/* Twitter */} - - - - - - - {/* Open Graph */} - - - - - - - - - - - - - - ) -} - -export default SEO - -const query = graphql` - query SEO { - site { - siteMetadata { - pathPrefix - titlePrefix - titleSuffix - siteUrl - twitter { - site - creator - image - } - og { - site_name - type - image { - url - alt - type - height - width - } - } - } - } - } -` diff --git a/src/components/shadow-card/index.tsx b/src/components/shadow-card/index.tsx index 28dd97e341..84edb335de 100644 --- a/src/components/shadow-card/index.tsx +++ b/src/components/shadow-card/index.tsx @@ -1,45 +1,10 @@ import React from 'react' -import styled from 'styled-components' - -import { defaultTheme as theme } from '../../theme' - -const CardLibWrapper = styled.div` - box-shadow: 0px 5px 3px rgba(23, 43, 77, 0.04), 0px 8px 5px rgba(23, 43, 77, 0.08); - background: #fff; - border-radius: 8px; - overflow: hidden; - width: 100%; - cursor: pointer; - max-width: 100%; - margin: 0; - &:hover { - transform: scale(1.02); - } - transition: transform 100ms ease; - .content { - padding: 32px 24px; - text-align: left; - p { - color: #4a5568; - } - a { - text-decoration: none; - } - - &:hover .link > span:first-of-type { - text-decoration: underline; - } - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[900]}; - } -` +import styles from "./styles.module.scss" const ShadowCard = ({ starter, className, ...rest }: any) => ( - +
{rest.children} - +
) export default ShadowCard diff --git a/src/components/shadow-card/styles.module.scss b/src/components/shadow-card/styles.module.scss new file mode 100644 index 0000000000..ef0c858e05 --- /dev/null +++ b/src/components/shadow-card/styles.module.scss @@ -0,0 +1,28 @@ +.cardLibWrapper { + box-shadow: 0px 5px 3px rgba(23, 43, 77, 0.04), 0px 8px 5px rgba(23, 43, 77, 0.08); + background: var(--shadow-card-bg); + border-radius: 8px; + overflow: hidden; + width: 100%; + cursor: pointer; + max-width: 100%; + margin: 0; + &:hover { + transform: scale(1.02); + } + transition: transform 100ms ease; + .content { + padding: 32px 24px; + text-align: left; + p { + color: #4a5568; + } + a { + text-decoration: none; + } + + &:hover .link > span:first-of-type { + text-decoration: underline; + } + } +} \ No newline at end of file diff --git a/src/components/shortcodes/admonition.tsx b/src/components/shortcodes/admonition.tsx deleted file mode 100644 index 0e2e4a69cc..0000000000 --- a/src/components/shortcodes/admonition.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React from 'react' -import { AlertCircle } from 'react-feather' -import styled from 'styled-components' - -import { defaultTheme as theme } from '../../theme' - -interface AdmonitionType { - type?: string -} - -type AdmonitionProps = React.ReactNode & AdmonitionType - -const colorMap: any = { - info: theme.colors.gray[200], - warning: theme.colors.orange[300], - alert: theme.colors.red[600], -} - -const Admonition = ({ children, type, ...props }: AdmonitionProps) => { - return ( - - {type === 'alert' && ( - - - - )} - {children && Array.isArray(children) ? ( - - {children.map((child: any, index: number) => - child.props.originalType === 'ul' ? ( - {child && child.props && child.props.children} - ) : ( - {child && child.props && child.props.children} - ) - )} - - ) : ( - children - )} - - ) -} - -export default Admonition - -const FlexContainer = styled.div` - display: flex; - flex-direction: column; -` - -const ChildDiv = styled.div` - margin: 0; -` - -const ChildList = styled.ul` - padding-left: 16px; -` - -const AdmonitionWrapper = styled.span<{ type?: string }>` - font-family: Inter; - font-style: normal; - font-size: 16px; - line-height: 24px; - color: ${theme.colors.gray[600]} !important; - padding-left: ${(p) => (p.type === 'alert' ? '3rem' : '1.5rem')}; - padding-bottom: 8px; - margin: 2rem 0px; - position: relative; - display: block; - max-width: 100%; - pre { - font-weight: normal; - } - - &::before { - content: ''; - position: absolute; - width: 8px; - height: 100%; - left: 0px; - background: ${(p) => (p.type ? colorMap[p.type] : colorMap['info'])} !important; - border-radius: 5px; - } - - &.alert { - min-height: 50px; - } - - .alert-circle { - position: absolute; - width: 34px; - height: 100%; - left: 0px; - display: flex; - justify-content: center; - padding: 12px 0; - background: ${(p) => (p.type ? colorMap[p.type] : colorMap['info'])} !important; - border-radius: 5px; - } - - code { - color: ${theme.colors.gray[600]} !important; - } - - p { - margin: 0; - } - - @media (prefers-color-scheme: dark) { - color: ${theme.colors.gray[500]} !important; - } -` diff --git a/src/components/shortcodes/button.tsx b/src/components/shortcodes/button.tsx deleted file mode 100644 index f1ccf9e104..0000000000 --- a/src/components/shortcodes/button.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { useLocation } from '@reach/router' -import { withPrefix } from 'gatsby' -import isAbsoluteUrl from 'is-absolute-url' -import * as path from 'path-browserify' -import * as React from 'react' -import styled from 'styled-components' - -import ArrowRight from '../../icons/ArrowRight' -import { defaultTheme as theme } from '../../theme' - -export interface ButtonProps { - href?: string - target?: string - block?: boolean - color?: ButtonColor - disabled?: boolean - arrow?: boolean - children?: any - onClick?: any - arrowLeft?: boolean - theme?: any -} - -type ButtonColor = 'red' | 'green' | 'grey' | 'grey-bg' | 'dark' -const colorMap = { - red: '#ffffff', - green: '#ffffff', - grey: '#3d556b', - 'grey-bg': '#ffffff', - dark: '#ffffff', -} - -const backgroundColorMap: any = { - red: '#ff4f56', - green: '#ff4f56', - grey: '#ffffff', - 'grey-bg': '#8fa6b2', - dark: 'rgb(12, 52, 75)', -} - -export const ButtonWrapper = styled.a<{ block?: boolean; disabled?: boolean; color?: ButtonColor }>` - padding: 11px 14px; - margin-right: 10px; - display: inline-flex; - align-items: center; - ${(p) => (p.block ? 'width: 100%;' : '')} - border: none; - text-decoration: none; - height: 40px; - font-size: ${theme.fontSizes[16]}; - box-sizing: border-box; - outline: none; - opacity: ${(p) => (p.disabled ? '0.2' : 1)}; - text-transform: uppercase; - letter-spacing: 0.4px; - background: ${(p) => backgroundColorMap[p.color || 'green']}; - color: ${(p) => colorMap[p.color || 'green']} !important; - line-height: 1; - font-size: 14px; - font-weight: 700; - cursor: ${(p) => (p.disabled ? 'default' : 'pointer')}; - pointer-events: ${(p) => (p.disabled ? 'none' : 'all')}; - border-radius: 6px; - transition: color 150ms ease 0s, background 150ms ease 0s, transform 100ms ease 0s; - white-space: nowrap; - word-break: keep-all; - max-width: 100%; - overflow-x: auto; - margin-bottom: 0.5rem; - - transition: opacity 0.3s ease; - -webkit-transition: opacity 0.3s ease; - -moz-transition: opacity 0.3s ease; - - &:hover { - opacity: 0.9; - } -` - -const getAbsPath = (href: any, location: any) => { - return withPrefix( - path - .resolve( - location.pathname - .replace('/docs', '') - .replace('docs', '') - .replace(/\/$/, '') - .split(path.sep) - .slice(0, -1) - .join(path.sep) || '/', - href - ) - .replace(/\/?(\?|$)/, '/$1') - .replace(/\/$/, '') - ) -} -const ButtonLink = ({ href, ...props }: ButtonProps) => { - const location = useLocation() - const newHref = isAbsoluteUrl(href || '') ? href : getAbsPath(href, location) - return ( - - {props.arrowLeft && } - {props.children} - {props.arrow && } - - ) -} - -const StyledArrow = styled(ArrowRight)` - margin-left: 12px; -` - -const StyledArrowLeft = styled(ArrowRight)` - margin-right: 12px; - transform: rotate(180deg); -` - -export default ButtonLink diff --git a/src/components/shortcodes/code.tsx b/src/components/shortcodes/code.tsx deleted file mode 100644 index 4657f85bb2..0000000000 --- a/src/components/shortcodes/code.tsx +++ /dev/null @@ -1,380 +0,0 @@ -import rangeParser from 'parse-numeric-range' -import Highlight, { defaultProps } from 'prism-react-renderer' -import theme from 'prism-react-renderer/themes/github' -import * as React from 'react' -import styled from 'styled-components' - -import Copy from '../../icons/Copy' -import { defaultTheme } from '../../theme' -import { stringify } from '../../utils/stringify' -import CopyButton from './copy' -import FileWithIcon from './fileWithIcon' - -import './prism/index.css' - -require('./prism/prism-prisma') - -interface CodeProps { - copy?: boolean -} - -type PreCodeProps = CodeProps & React.ReactNode - -const diffBgColorMap: any = { - '+': 'var(--code-added-bg-color)', - '-': 'var(--code-deleted-bg-color)', - '|': 'var(--code-highlight-bg-color)', - '✎': 'var(--code-edit-bg-color)', -} - -const symColorMap: any = { - '+': 'var(--code-added-color)', - '-': 'var(--code-deleted-color)', - '|': 'var(--code-highlight-color)', - '✎': 'var(--code-highlight-color)', -} - -const symbols: any = { - normal: '|', - add: '+', - delete: '-', - edit: '✎', -} - -function cleanTokens(tokens: any[]) { - const tokensLength = tokens.length - if (tokensLength === 0) { - return tokens - } - const lastToken = tokens[tokensLength - 1] - - if (lastToken.length === 1 && lastToken[0].empty) { - return tokens.slice(0, tokensLength - 1) - } - return tokens -} - -const propList = ['copy', 'bash-symbol', 'terminal', 'no-lines'] - -const Code = ({ children, className, ...props }: PreCodeProps) => { - const codeEl = React.useRef(null) - const preEl = React.useRef(null) - let language = className && className.replace(/language-/, '') - let breakWords = false - const [debugState, setDebugState] = React.useState('') - - let diffArray: any = [] - - if (props && props.metastring && props.metastring.includes('highlight')) { - const parts = props.highlight.split('|') - parts.forEach((part: any) => { - diffArray = [part.split(';'), ...diffArray] - }) - } - - if (propList.includes(language) && !props['no-break-terminal']) { - breakWords = true - } - - const code = stringify(children) - - const hasCopy = props['copy'] || language === 'copy' - const noCopy = props['no-copy'] - - let hasNoLine = true - const isTerminal = props['terminal'] || language === 'terminal' - const wrapContent = props['wrap'] - const hasTerminalSymbol = props['bash-symbol'] || language === 'bash-symbol' || isTerminal - const fileName = props['file'] || language === 'file' - - if (!fileName) { - hasNoLine = true - } else { - hasNoLine = props['no-lines'] || language === 'no-lines' - } - - const tokenCopyClass = `${hasCopy ? 'has-copy-button' : ''} ${breakWords ? 'break-words' : ''}` - - React.useEffect(() => { - if (codeEl.current !== null && preEl.current !== null) { - if (debugState.length === 0) - setDebugState( - `${codeEl.current.getBoundingClientRect().width},${ - preEl.current.getBoundingClientRect().width - 44 - }` - ) - } - }, []) - - return ( - - {fileName && ( -
- -
- )} -
- - {({ className: blockClassName, style, tokens, getLineProps, getTokenProps }) => ( -
-              {!noCopy && (
-                
-                  
-                    
-                    
-                  
-                
-              )}
-              
-                {cleanTokens(tokens).map((line: any, i: number) => {
-                  let lineClass = {
-                    backgroundColor: '',
-                    symbColor: '',
-                    className: '',
-                  }
-
-                  let isDiff = false
-                  let diffSymbol = ''
-                  if (
-                    (line[0] &&
-                      line[0].content.length &&
-                      (line[0].content[0] === '+' ||
-                        (line[0].content[0] === '-' && line[0].content[1] !== '-') ||
-                        line[0].content[0] === '|' ||
-                        line[0].content[0] === '✎')) ||
-                    (line[0] &&
-                      line[0].content === '' &&
-                      line[1] &&
-                      (line[1].content === '+' ||
-                        (line[1].content === '-' && line[2].content !== '-') ||
-                        line[1].content === '|' ||
-                        line[1].content === '✎'))
-                  ) {
-                    diffSymbol =
-                      line[0] && line[0].content.length ? line[0].content[0] : line[1].content
-                    lineClass = {
-                      backgroundColor: diffBgColorMap[diffSymbol],
-                      symbColor: symColorMap[diffSymbol],
-                      className: '',
-                    }
-                    isDiff = true
-                  }
-
-                  if (diffArray.length !== 0) {
-                    diffArray.forEach((arr: any) => {
-                      if (rangeParser(arr[0]).includes(i + 1)) {
-                        diffSymbol = symbols[arr[1]]
-                        lineClass = {
-                          backgroundColor: diffBgColorMap[diffSymbol],
-                          symbColor: symColorMap[diffSymbol],
-                          className: '',
-                        }
-                        isDiff = true
-                        lineClass.className = 'highlighted-line'
-                      }
-                    })
-                  }
-
-                  const lineProps = getLineProps({ line, key: i })
-
-                  lineProps.style = { ...lineClass }
-                  lineProps.className = lineProps.className + ' ' + lineClass.className
-
-                  return (
-                    
-                      {hasTerminalSymbol && !isDiff && $}
-                      {!hasTerminalSymbol && !isDiff && !hasNoLine && (
-                        {i + 1}
-                      )}
-                      {isDiff && !hasNoLine && (
-                        
-                          {['+', '-', '✎'].includes(diffSymbol) ? diffSymbol : i + 1}
-                        
-                      )}
-                      
-                        {line.map((token: any, key: any) => {
-                          if (isDiff) {
-                            if (
-                              (key === 0 || key === 1) &&
-                              (token.content.charAt(0) === '+' ||
-                                token.content.charAt(0) === '-' ||
-                                token.content.charAt(0) === '|' ||
-                                token.content.charAt(0) === '✎')
-                            ) {
-                              return (
-                                
-                              )
-                            }
-                          }
-                          return 
-                        })}
-                      
-                    
-                  )
-                })}
-              
-            
- )} -
-
-
- ) -} - -export default Code - -const CodeWrapper = styled.div` - margin-top: ${defaultTheme.space[24]}; - margin-bottom: ${defaultTheme.space[24]}; - .file { - font-weight: 600; - color: ${defaultTheme.colors.gray[600]}; - font-size: ${defaultTheme.fontSizes[14]}; - font-family: ${defaultTheme.fonts.text}; - margin-bottom: 0.5rem; - } -` - -const AbsoluteCopyButton = styled.div` - transition: opacity 100ms ease; - position: absolute; - top: 20px; - right: 16px; - z-index: 2; - - > div { - right: -${defaultTheme.space[8]}; - top: -6px; - } - - .dark { - display: none; - } - - .light { - display: block; - } - - @media (prefers-color-scheme: dark) { - .dark { - display: block; - } - - .light { - display: none; - } - } -` - -const Pre = styled.pre` - margin-top: ${defaultTheme.space[32]}; - text-align: left; - margin: 0 0 16px 0; - padding: 2rem 1rem 1rem 1rem; - webkit-overflow-scrolling: touch; - overflow-x: visible; - &.wrap-content { - overflow-x: auto; - code { - white-space: break-spaces; - .token-line { - display: inline-flex; - > span:last-child { - align-self: center; - } - } - } - } - &:not(.wrap-content) { - &::-webkit-scrollbar { - width: 10px; - height: 10px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c5c6c8; - } - &::-webkit-scrollbar-track { - border-radius: 10px; - background-color: transparent; - } - &::-webkit-scrollbar-corner { - background-color: transparent; - border-color: transparent; - } - &.not-scrollable { - overflow-x: hidden; - code { - display: inline; - } - } - } -` -const Line = styled.div` - display: block; - @media (prefers-color-scheme: dark) { - &.highlighted-line { - .token.plain { - color: ${defaultTheme.colors.gray[900]}; - } - } - } -` - -const LineNo = styled.span` - font-weight: 500; - line-height: ${defaultTheme.space[24]}; - color: ${defaultTheme.colors.gray[400]}; - display: inline-block; - text-align: right; - user-select: none; - width: 24px; -` - -const LineContent = styled.span` - padding: 0 ${defaultTheme.space[16]}; - &.break-words { - display: inline-table; - white-space: break-spaces; - width: 95%; - } - - &.token-line { - line-height: 1.3rem; - height: 1.3rem; - } -` diff --git a/src/components/shortcodes/codeBlock.tsx b/src/components/shortcodes/codeBlock.tsx deleted file mode 100644 index 99f8bcd54f..0000000000 --- a/src/components/shortcodes/codeBlock.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -interface CodeProps { - languages?: string[] -} - -type CodeBlockProps = CodeProps & React.ReactNode - -const CodeBlock = ({ languages, children }: CodeBlockProps) => { - const [activeIndex, setActiveIndex] = React.useState(0) - const child: any = React.Children.toArray(children)[activeIndex] - const code = child && child.props && child.props.children - - return ( - - {languages && Array.isArray(languages) && ( - - {languages.map((lang, index) => { - const setCurrentActive = () => setActiveIndex(index) - return ( -
- {lang} -
- ) - })} -
- )} - {code} -
- ) -} - -export default CodeBlock - -const Tabs = styled.div` - display: flex; - .tab { - margin-right: 10px; - color: ${theme.colors.gray[600]}; - cursor: pointer; - } - - .tab.active { - font-weight: 600; - color: ${theme.colors.gray[900]}; - } - - @media (prefers-color-scheme: dark) { - .tab.active { - color: ${theme.colors.gray[500]}; - } - } -` -const Wrapper = styled.div` - margin-top: 2rem; - position: relative; -` diff --git a/src/components/shortcodes/codeWithResult.tsx b/src/components/shortcodes/codeWithResult.tsx deleted file mode 100644 index 690d02e51c..0000000000 --- a/src/components/shortcodes/codeWithResult.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -interface ExpandedProps { - expanded?: boolean -} - -interface ShowHideProps { - showText?: string - hideText?: string - outputResultText?: string -} - -type CodeWithResultProps = React.ReactNode & ExpandedProps & ShowHideProps - -const CodeWithResult = ({ - children, - expanded, - showText, - hideText, - outputResultText, -}: CodeWithResultProps) => { - const [showResult, setShowResult] = React.useState(expanded) - const cmd = - children && children.filter((child: any) => child.props && child.props.mdxType === 'cmd') - const result = - children && children.filter((child: any) => child.props && child.props.mdxType === 'cmdResult') - - const toggleResult = () => setShowResult(!showResult) - const toggleShowText = showText - ? showText - : outputResultText - ? `Show ${outputResultText} results` - : 'Show CLI results' - const toggleHideText = hideText - ? hideText - : outputResultText - ? `Hide ${outputResultText} results` - : 'Hide CLI results' - - return ( - -
{cmd}
-
-
- {showResult ? toggleHideText : toggleShowText} -
- {showResult &&
{result}
} -
-
- ) -} - -export default CodeWithResult - -const Wrapper = styled.div` - margin-top: 2rem; - .cmd .pre-highlight pre { - border-radius: 8px 8px 0px 0px; - } - - code { - padding-bottom: 1em; - } - - .codeWrapperDiv { - margin-top: 0; - } - - .result { - background-color: var(--main-font-color) !important; - color: var(--code-inline-bgd-color) !important; - border-radius: 0px 0px 8px 8px; - margin-top: -24px; - - pre { - background-color: var(--main-font-color) !important; - color: var(--code-inline-bgd-color) !important; - - .token.plain { - color: var(--code-inline-bgd-color) !important; - } - - .token.punctuation { - color: ${theme.colors.gray[500]} !important; - } - - border-radius: 0px 0px 8px 8px; - margin-top: 0; - } - - .show-btn { - font-family: Inter; - font-style: normal; - font-weight: 600; - font-size: 12px; - line-height: 100%; - letter-spacing: 0.01em; - color: var(--code-inner-color); - height: 24px; - display: flex; - align-items: center; - cursor: pointer; - padding: 1rem; - } - } - - @media (min-width: 0px) and (max-width: 767px) { - margin-left: -24px; - margin-right: -24px; - .pre-highlight { - margin-right: 0; - margin-left: 0; - } - } - - @media (prefers-color-scheme: dark) { - .result { - background-color: #2d3748 !important; - color: #e2e8f0 !important; - pre, - pre .token.plain { - background-color: #2d3748 !important; - color: #e2e8f0 !important; - } - } - } -` diff --git a/src/components/shortcodes/collapsible.tsx b/src/components/shortcodes/collapsible.tsx deleted file mode 100644 index 6e91c67924..0000000000 --- a/src/components/shortcodes/collapsible.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -import ArrowRight from '../../icons/ArrowRight' - -type CollapseProps = React.ReactNode -let index = 0 - -const getRemainingChildren = (children: any) => - children.filter((child: any) => !(child.props && child.props.originalType === 'summary')) - -const CollapseBox = ({ children, ...props }: CollapseProps) => { - const titleChild = - children && children.find((child: any) => child.props && child.props.originalType === 'summary') - const title = titleChild && titleChild.props.children - return ( - - - - - - {getRemainingChildren(children)} - - - ) -} - -export default CollapseBox - -const Wrapper = styled.div` - margin-bottom: ${theme.space[16]}; -` - -const Tab = styled.div` - position: relative; - overflow: hidden; - .tab-content { - transition: max-height 0.35s; - } - &:before { - content: ''; - position: absolute; - width: 8px; - height: 100%; - left: 0px; - background: ${theme.colors.gray[100]}; - border-radius: ${theme.radii.small}; - } - p { - margin-top: ${theme.space[8]}; - } -` - -const Label = styled.label` - position: relative; - display: block; - color: #0c344b; - font-weight: 600; - line-height: 1.5; - padding-left: ${theme.space[32]}; - cursor: pointer; - @media (prefers-color-scheme: dark) { - color: ${theme.colors.gray[100]}; - } -` - -const TabContent = styled.div` - max-height: 0; - overflow: hidden; - color: ${theme.colors.gray[800]}; - transition: max-height 0.35s, padding 0.35s; - padding-left: 36px; - padding-bottom: 0; - @media (prefers-color-scheme: dark) { - color: ${theme.colors.gray[100]}; - } -` - -const Input = styled.input` - position: absolute; - opacity: 0; - z-index: -1; - &:checked ~ .tab-content { - max-height: 2000px; - padding-bottom: ${theme.space[8]}; - } -` - -const StyledArrow = styled(ArrowRight)` - position: absolute; - left: 18px; - top: 8px; - transition: transform 0.15s; - input:checked + & { - transform: rotate(90deg); - } -` diff --git a/src/components/shortcodes/copy.tsx b/src/components/shortcodes/copy.tsx deleted file mode 100644 index f62907e77c..0000000000 --- a/src/components/shortcodes/copy.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import * as CopyToClipboard from 'react-copy-to-clipboard' -import styled from 'styled-components' - -interface CopyProps { - text: string -} - -type CopyButtonProps = CopyProps & React.ReactNode - -const CopyButton = ({ text, children }: CopyButtonProps) => { - const [copied, setCopied] = React.useState(false) - let copyTimer: any - - const onCopyContent = () => { - setCopied(true) - copyTimer = window.setTimeout(() => setCopied(false), 500) - } - - return ( - - - {copied && ( -
- Copied -
- )} - {children} -
-
- ) -} - -export default CopyButton - -const CopyComponent = styled.div` - font-family: ${theme.fonts.text}; - & { - position: relative; - cursor: pointer; - display: inline-block; - } - @keyframes copying { - 0% { - opacity: 0; - transform: translate(-50%, 0); - } - 50% { - opacity: 1; - } - 100% { - opacity: 0; - transform: translate(-50%, 30px); - } - } - .indicator { - position: absolute; - top: 20px; - left: 0; - transform: translate(-50%, 0); - animation: copying 700ms linear; - } -` diff --git a/src/components/shortcodes/fileWithIcon.tsx b/src/components/shortcodes/fileWithIcon.tsx deleted file mode 100644 index d449044dcd..0000000000 --- a/src/components/shortcodes/fileWithIcon.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -import Code from '../../icons/Code' -import Database from '../../icons/Database' -import Display from '../../icons/Display' -import File from '../../icons/File' -import Prisma from '../../icons/Prisma' - -interface FileWithIconProps { - text: string[] - icon: keyof typeof icons -} - -const icons = { - file: , - database: , - display: , - code: , - prisma: , -} -const FileNameWrapper = styled.span` - color: inherit; - display: inline-flex; - align-items: center; - svg { - margin-right: ${theme.space[8]}; - } - @media (max-width: ${theme.breakpoints.tabletVertical}) { - font-size: ${theme.fontSizes[14]}; - } -` - -const FileWithIcon = ({ icon, text }: FileWithIconProps) => ( - - {icons[icon]} - {text} - -) - -export default FileWithIcon diff --git a/src/components/shortcodes/footnote.tsx b/src/components/shortcodes/footnote.tsx deleted file mode 100644 index 7b9708fca7..0000000000 --- a/src/components/shortcodes/footnote.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -type FootNoteProps = React.ReactNode - -const FootNote = ({ children, ...props }: FootNoteProps) => { - return {children} -} - -export default FootNote - -const FootNoteWrapper = styled.div` - * { - font-size: 14px; - font-style: italic; - } -` diff --git a/src/components/shortcodes/index.tsx b/src/components/shortcodes/index.tsx deleted file mode 100644 index c4df9305cc..0000000000 --- a/src/components/shortcodes/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import isAbsoluteUrl from 'is-absolute-url' -import React from 'react' - -import Link from '../link' -import Admonition from './admonition' -import ButtonLink from './button' -import Code from './code' -import CodeBlock from './codeBlock' -import CodeWithResult from './codeWithResult' -import CollapseBox from './collapsible' -import FileWithIcon from './fileWithIcon' -import FootNote from './footnote' -import NavigationLinksContainer from './navigationLinksContainer' -import ParallelBlocks from './parallelBlocks' -import Quiz from './quiz' -import Subsections from './subSections' -import SwitchTech from './switchTech' -import TabbedContent from './tabbedContent' -import Table from './table' -import Tip from './tip' -import TopBlock from './topBlock' -import { - Bolt, - BorderBox, - BoxTitle, - Database, - Grid, - LinkCard, - List, - SignalStream, - SquareLogo, - Tab, -} from './gettingstarted' -import PostgresSQLSimple from '../../icons/technologies/PostgresSQLSimple' -import MySQLSimple from '../../icons/technologies/MySQLSimple' -import SQLServer from '../../icons/technologies/SQLServer' -import PlanetScale from '../../icons/technologies/PlanetScale' -import CockroachDBgradient from '../../icons/technologies/CockroachDBgradient' -import MongoDBSimple from '../../icons/technologies/MongoDBSimple' - -const shortcodes = { - h1: () =>

, - h2: ({ id, ...props }: any) =>

, - h3: ({ id, ...props }: any) =>

, - h4: ({ id, ...props }: any) =>

, - a: ({ href, ...props }: any) => { - const to = href ? href.toString() : '' - return isAbsoluteUrl(to) ? ( - - ) : ( - - ) - }, - p: (props: any) =>

, - ul: (props: any) =>

    , - ol: (props: any) =>
      , - CodeBlock, - TabbedContent, - ParallelBlocks, - CodeWithResult, - SwitchTech, - FileWithIcon, - inlineCode: (props: any) => , - code: (props: any) => , - details: (props: any) => , - table: (props: any) => , - ButtonLink, - Subsections, - TopBlock, - FootNote, - Admonition, - img: (props: any) => - /^https?:\/\//i.test(props.src) ? ( - - - - ) : ( - - ), - AlgoliaTerm: () => , - Quiz, - Tip: (props: any) => {props.children}, - NavigationLinksContainer: (props: any) => ( - {props.children} - ), - Database, - Bolt, - SignalStream, - BorderBox, - BoxTitle, - LinkCard, - Grid, - Tab, - SquareLogo, - PostgresSQLSimple, - MySQLSimple, - SQLServer, - PlanetScale, - CockroachDBgradient, - MongoDBSimple, - List, -} - -export default shortcodes diff --git a/src/components/shortcodes/navigationLinksContainer.tsx b/src/components/shortcodes/navigationLinksContainer.tsx deleted file mode 100644 index 83a89d47eb..0000000000 --- a/src/components/shortcodes/navigationLinksContainer.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -interface Props { - isFirstLink?: boolean -} - -const ButtonContainer = styled.section` - display: flex; - justify-content: ${(props) => (props.isFirstLink ? 'flex-end' : 'space-between')}; - align-items: center; - padding: 1rem 0 1rem 0; - border-top: solid 2px ${theme.colors.gray[100]}; - padding-top: 2rem; - margin: 2rem 0; - - @media (max-width: 992px) { - flex-direction: column; - - & > a { - margin-bottom: 1.5rem; - } - } -` - -const NavigationLinksContainer: React.FC = ({ children, isFirstLink }) => { - return {children} -} - -export default NavigationLinksContainer diff --git a/src/components/shortcodes/parallelBlocks.tsx b/src/components/shortcodes/parallelBlocks.tsx deleted file mode 100644 index eb6c124ecf..0000000000 --- a/src/components/shortcodes/parallelBlocks.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -type CodeBlockProps = React.ReactNode - -const ParallelBlocks = ({ children }: CodeBlockProps) => { - const blockContent = - children && children.filter((child: any) => child.props && child.props.originalType === 'block') - return ( - - {blockContent.map((block: any, i: number) => ( - -
      {block.props.content}
      -
      {block.props.children}
      -
      - ))} -
      - ) -} - -export default ParallelBlocks - -const Block = styled.div` - flex: 1 1 0px; - width: calc(50% - 0.25rem); - .blockHeading { - font-weight: 600; - font-size: ${theme.fontSizes[14]}; - svg { - margin-right: ${theme.space[8]}; - } - } - - .blockContent { - height: calc(100% - 2em); - - .pre-highlight, - pre { - height: 100%; - } - } - - @media (max-width: ${theme.breakpoints.tabletVertical}) and (min-width: 0px) { - .pre-highlight { - margin: 0; - } - &:first-of-type .pre-highlight { - margin-right: 0; - margin-left: -${theme.space[24]}; - } - &:last-of-type .pre-highlight { - margin-left: 0; - margin-right: -${theme.space[24]}; - } - } -` -const Wrapper = styled.div` - display: flex; - gap: 0.5rem; - margin-top: ${theme.space[32]}; -` diff --git a/src/components/shortcodes/prism/index.css b/src/components/shortcodes/prism/index.css deleted file mode 100644 index c1ff848d27..0000000000 --- a/src/components/shortcodes/prism/index.css +++ /dev/null @@ -1,188 +0,0 @@ -.pre-highlight { - position: relative; -} -code[class*='language-'], -pre[class*='language-'], -pre[class*='language-'] code { - color: var(--main-font-color) !important; - font-family: 'JetBrainsMono', SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', - 'Courier New', monospace; - font-variant: no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual; - font-size: 14px; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - - border-radius: 8px; - display: inline-grid; - grid-template-rows: max-content; - width: 100%; - overflow: auto; -} - -code[class*='language-'].is-terminal, -pre[class*='language-'].is-terminal, -pre[class*='language-'].is-terminal code { - background-color: var(--main-font-color) !important; - color: var(--code-inline-bgd-color) !important; -} - -code[class*='language-'].is-terminal::selection, -pre[class*='language-'].is-terminal::selection, -code[class*='language-'].is-terminal ::selection, -pre[class*='language-'].is-terminal ::selection { - background-color: #a0aec0; -} - -@media (prefers-color-scheme: dark) { - code[class*='language-'].is-terminal, - pre[class*='language-'].is-terminal, - pre[class*='language-'].is-terminal code { - background-color: #2d3748 !important; - color: var(--main-font-color) !important; - } - .token.punctuation { - color: #a0aec0 !important; - } -} -.is-terminal .line-no { - color: var(--header-btn-color) !important; -} - -.is-terminal .copy-button svg rect { - fill: var(--tag-media-color); -} -/* Code blocks */ -pre[class*='language-'] { - padding: 1em 0; - margin: 0; - overflow: auto; -} - -:not(pre) > code[class*='language-'], -pre[class*='language-'] { - background: var(--code-bgd-color) !important; -} - -/* Inline code */ -:not(pre) > code[class*='language-'] { - padding: 0.1em; - border-radius: 0.3em; - white-space: normal; -} - -code.inline-code, -.inline-code, -inlinecode { - display: inline; - vertical-align: baseline; - padding: 0.05em 0.3em 0.2em 0.3em; - background: var(--code-inline-bgd-color); - font-size: 14px; - font-feature-settings: 'clig' 0, 'calt' 0; - font-variant: no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual; - font-family: 'JetBrainsMono'; - font-style: normal; - line-height: 24px; - border-radius: 5px; - color: var(--main-font-color); - font-weight: 500; -} - -inlinecode { - font-size: inherit; -} - -.inline-code { - background-color: var(--border-color); -} - -.top-section h1 inlinecode { - font-size: 2rem; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: var(--code-inner-color) !important; - font-style: normal !important; -} - -.token.namespace { - opacity: 0.7; -} - -.token.property, -.token.tag, -.token.type-args, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: var(--code-token4-color) !important; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: var(--code-token5-color) !important; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: var(--code-token6-color) !important; -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: var(--code-token1-color) !important; -} - -.token.function, -.token.class-name, -.token[class*='class-name'], -.token.boolean { - color: var(--code-token2-color) !important; -} - -.token.regex, -.token.important, -.token.variable { - color: var(--code-token7-color) !important; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -.token.annotation { - color: var(--code-token3-color) !important; -} diff --git a/src/components/shortcodes/prism/prism-prisma.js b/src/components/shortcodes/prism/prism-prisma.js deleted file mode 100644 index 53f3ad6198..0000000000 --- a/src/components/shortcodes/prism/prism-prisma.js +++ /dev/null @@ -1,27 +0,0 @@ -import Prism from 'prism-react-renderer/prism' -;(typeof global !== 'undefined' ? global : window).Prism = Prism -Prism.languages.prisma = Prism.languages.extend('clike', { - keyword: /\b(?:datasource|enum|generator|model|type|view)\b/, - 'type-class-name': /(\s+)[A-Z]\w+/, ///(\b)(\s+)[A-Z]\w+/ -}) - -Prism.languages.javascript['class-name'][0].pattern = - /(\b(?:model|datasource|enum|generator|type|model|view)\s+)[\w.\\]+/ - -Prism.languages.insertBefore('prisma', 'function', { - annotation: { - pattern: /(^|[^.])@+\w+/, - lookbehind: true, - alias: 'punctuation', - }, -}) - -Prism.languages.insertBefore('prisma', 'punctuation', { - 'type-args': /\b(?:references|fields|onDelete|onUpdate):/, -}) - -Prism.languages.insertBefore('prisma', 'type-class-name', { - 'not-class': /\n(\s+)[A-Z]\w+/, -}) - -Prism.languages.json5 = Prism.languages.js diff --git a/src/components/shortcodes/quiz.tsx b/src/components/shortcodes/quiz.tsx deleted file mode 100644 index 291bf2ea1f..0000000000 --- a/src/components/shortcodes/quiz.tsx +++ /dev/null @@ -1,308 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -type AnswerOptions = { - answer?: string - isCorrect: boolean -} - -interface QuestionAndAnswer { - question: string - answerOptions: AnswerOptions[] -} - -interface ChosenAnswerProps { - isCorrect: boolean - answerSubmitted?: boolean -} - -const Wrapper = styled.section` - display: flex; - flex-direction: column; - justify-content: 'flex-start; - padding: 1rem; - background-color: ${theme.colors.gray[100]}; - border-radius: 8px; - min-height: 100px; - border-left: 8px solid ${theme.colors.gray[500]}; - margin: 2rem 0; -` - -const QuestionTitle = styled.h3` - display: flex; - align-items: center; - font-size: 1.25rem; - width: 100%; - margin: 0.55rem; -` - -const AnswersWrapper = styled.label` - & > span { - align-self: center; - margin-left: 0.5rem; - } -` - -const NotificationWrapper = styled.div` - margin: ${(props) => (props.isCorrect ? '1rem 0.25rem' : '1rem 0.5rem')}; -` - -const Row = styled.div` - display: flex; - align-items: center; - height: 30px; - position: relative; - margin-left: 0.5rem; - - & > span { - font-size: 0.85rem; - } -` - -const RadioButtonLabel = styled.label` - position: absolute; - top: 15%; - width: 20px; - height: 20px; - border-radius: 50%; - background: white; - border: 2px solid ${theme.colors.gray[600]}; -` -const RadioButton = styled.input` - opacity: 0; - z-index: 1; - border-radius: 50%; - width: 20px; - height: 20px; - margin-left: 0.3125rem; - margin-right: 0.25rem; - cursor: pointer; - position: relative; - - ${(props) => - props.checked && - ` - &:checked + ${RadioButtonLabel} { - background: #3182ce; - border: 1px solid #c3dafe; - &::after { - content: ""; - display: block; - border-radius: 50%; - width: 10px; - height: 10px; - margin: 4px; - box-shadow: 1px 3px 3px 1px rgba(0, 0, 0, 0.1); - background: white; - } - } - `} - - ${(props) => - props.isCorrect === true && - props.answerSubmitted && - props.answerSubmitted === true && - ` - & + ${RadioButtonLabel} { - background: #15bd76; - border: 1px solid #A3F5D3; - &::after { - color: white; - content: "✔"; - font-size: 0.6rem; - display: flex; - justify-content: center; - align-items: center; - border-radius: 50%; - width: 10px; - height: 10px; - margin: 4px - } - } - `} - - ${(props) => - props.isCorrect === false && - props.answerSubmitted && - props.answerSubmitted === true && - ` - & + ${RadioButtonLabel} { - background: #ff4f56; - border: 1px solid #F5B7B7; - &::after { - color: white; - content: "✖"; - font-size: 0.6rem; - display: flex; - justify-content: center; - align-items: center; - border-radius: 50%; - width: 10px; - height: 10px; - margin: 0.2rem 0.2rem 0.3rem 0.28rem; - } - } - `} -` - -const Button = styled.button` - font-size: 1rem; - font-weight: 600; - padding: 0.5rem 0.75rem; - display: inline-block; - background: ${theme.colors.gray[300]}; - text-align: left; - border-radius: 5px; - line-height: 1.5; - cursor: pointer; - text-decoration: none; - outline: none; - border: none; - color: ${theme.colors.gray[700]}; - transition: 0.2s ease-out; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - &:hover { - background: ${theme.colors.gray[400]}; - } - &:active { - transform: scale(0.98); - } - &:disabled { - background: ${theme.colors.gray[400]}; - color: ${theme.colors.gray[700]}; - cursor: default; - } -` - -const NotificationContainer = styled.div` - display: flex; - width: 250px; - justify-content: flex-start; - align-items: center; - background: ${theme.colors.gray[100]}; - position: relative; - - ${(props) => - props.isCorrect === true && - ` - &::after { - order: 0; - background: #15bd76; - border: 1px solid #A3F5D3; - color: white; - content: "✔"; - font-size: 0.8rem; - display: flex; - justify-content: center; - align-items: center; - border-radius: 50%; - width: 20px; - height: 20px; - margin: 0 0.75rem 0 0.3rem; - } - `} - - ${(props) => - props.isCorrect === false && - ` - &::after { - order: 0; - background: #ff4f56; - border: 1px solid #F5B7B7; - color: white; - content: "✖"; - font-size: 0.8rem; - display: flex; - justify-content: center; - align-items: center; - border-radius: 50%; - width: 20px; - height: 20px; - margin: 0 0.75rem 0 0; - } - `} - - & > p { - order: 1; - font-size: 1rem; - font-weight: 600; - color: ${(props) => (props.isCorrect ? '#15bd76' : '#ff4f56')}; - } -` - -const AnswerNotification = ({ isCorrect }: ChosenAnswerProps) => ( - -

      {isCorrect ? `Yay, that's correct!` : `Oh no, that's incorrect!`}

      -
      -) - -const Quiz = ({ question, answerOptions }: QuestionAndAnswer) => { - const [chosenAnswer, setChosenAnswer] = React.useState({ - answer: '', - isCorrect: false, - }) - const [answerSubmitted, setAnswerSubmitted] = React.useState(false) - const [disabled, setDisabled] = React.useState(false) - - const handleSelectChange = (event: React.ChangeEvent) => { - setChosenAnswer({ - answer: event.target.value, - isCorrect: false, - }) - } - - const onSubmit = () => { - setAnswerSubmitted(true) - setDisabled(true) - const foundAnswer = answerOptions.find( - (answer) => answer.answer === chosenAnswer.answer - )?.isCorrect - if (foundAnswer) { - setChosenAnswer({ - isCorrect: true, - }) - } else { - setChosenAnswer({ - isCorrect: false, - }) - } - } - - return ( - - - {question} - - {answerOptions.map((item, index) => ( - - - handleSelectChange(event)} - /> - - {item.answer} - - - ))} - - {answerSubmitted ? ( - - ) : ( - - )} - - - ) -} - -export default Quiz diff --git a/src/components/select.tsx b/src/components/shortcodes/select.tsx similarity index 56% rename from src/components/select.tsx rename to src/components/shortcodes/select.tsx index 0045fe618b..ad26acf4e0 100644 --- a/src/components/select.tsx +++ b/src/components/shortcodes/select.tsx @@ -1,8 +1,5 @@ import * as React from 'react' import Select, { components } from 'react-select' -import styled from 'styled-components' - -import { defaultTheme as theme } from '../theme' interface SelectProps { items: any[] @@ -43,49 +40,19 @@ const SelectComponent = (props: SelectProps) => { ) } return ( - +
      - {children} -
      - - ) -} - -export default Table - -const TableWrapper = styled.div` - overflow-x: auto; - margin-top: 1em; - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - margin-right: -${theme.space[24]}; - margin-left: -${theme.space[24]}; - - table { - border-left: 0; - border-right: 0; - border-radius: 0 !important; - } - } - @media (prefers-color-scheme: dark) { - table, - th, - td, - tr { - border-color: ${theme.colors.gray[800]}; - color: ${theme.colors.gray[100]}; - } - } - - code.inline-code, - .inline-code, - inlinecode { - font-size: 13px; - } - &::-webkit-scrollbar { - width: 10px; - height: 10px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c5c6c8; - } - &::-webkit-scrollbar-track { - border-radius: 10px; - background-color: transparent; - } - &::-webkit-scrollbar-corner { - background-color: transparent; - border-color: transparent; - } - &.not-scrollable { - overflow-x: hidden; - code { - display: inline; - } - } -` diff --git a/src/components/techSwitcher.tsx b/src/components/shortcodes/techSwitcher.tsx similarity index 65% rename from src/components/techSwitcher.tsx rename to src/components/shortcodes/techSwitcher.tsx index 8a0cf0fa05..e58919e6b3 100644 --- a/src/components/techSwitcher.tsx +++ b/src/components/shortcodes/techSwitcher.tsx @@ -1,23 +1,16 @@ import * as React from 'react' -import styled from 'styled-components' -import { Typescript } from '../icons/technologies/Typescript' import SelectComponent from './select' -import PostgreSQL from '../icons/technologies/PostgreSQL' -import MySQL from '../icons/technologies/MySQL' -import SQLite from '../icons/technologies/SQLite' -import MongoDB from '../icons/technologies/MongoDB' -import JS from '../icons/technologies/JS' -import SQLServer from '../icons/technologies/MSSQL' -import PlanetScale from '../icons/technologies/PlanetScale' -import CockroachDB from '../icons/technologies/CockroachDB' import { components } from 'react-select' -import ArrowDown from '../icons/ArrowDown' +import Link from '@docusaurus/Link' +import styles from "./styles.module.scss" interface TechSwitchProps { type: string onChangeTech: (item: any) => void technologies: string[] defaultTech: string + url?: string + dbSelected?: string } interface TechItem { @@ -25,15 +18,15 @@ interface TechItem { } const icons = { - node: , - typescript: , - mysql: , - postgresql: , - sqlite: , - mongodb: , - sqlserver: , - planetscale: , - cockroachdb: , + node: `/img/technologies/nodejs.svg`, //, + typescript: `/img/technologies/typescript.svg`, //, + mysql: `/img/technologies/mysql.svg`, //, + postgresql: `/img/technologies/postgresql.svg`, //, + sqlite: `/img/technologies/sqlite.svg`, //, + mongodb: `/img/technologies/mongodb.svg`, //, + sqlserver: `/img/technologies/sqlserver.svg`, //, + planetscale: `/img/technologies/planetscale.svg`, //, + cockroachdb: `/img/technologies/cockroachdb.svg`, //, } const technologyTypes = { @@ -61,26 +54,28 @@ export const technologyNames = { cockroachdb: 'CockroachDB', } -const TechnologySwitch = ({ type, onChangeTech, technologies, defaultTech }: TechSwitchProps) => { +const TechnologySwitch = ({ type, onChangeTech, technologies, defaultTech, url, dbSelected }: TechSwitchProps) => { const langDefault = { technology: defaultTech || 'typescript' } const dbDefault = { technology: defaultTech || 'postgresql' } const defaultItem = type === 'lang' ? langDefault : dbDefault - const [selectedItem, setSelectedItem] = React.useState(defaultItem) const renderItem = (item: TechItem) => { + const href = type === "lang" ? `${url}${item.technology}-${dbSelected}` : `${url}${item.technology}` return ( - - {icons[item.technology]} - {technologyNames[item.technology]} - +
      + + + {technologyNames[item.technology]} + +
      ) } const DropdownIndicator = (props: any) => { return ( - + {/* */} ) } @@ -116,7 +111,7 @@ const TechnologySwitch = ({ type, onChangeTech, technologies, defaultTech }: Tec } return ( - +
      - +
      ) } -const Container = styled.div` - margin: 16px 1rem 0 0; - width: 180px; - text-overflow: ellipsis; - - @media only screen and (max-width: 767px) { - margin: 8px 0 0; - width: 100%; - } -` - -const SelectItem = styled.div` - display: flex; - align-items: center; - - svg { - margin-right: 10px; - } -` export default TechnologySwitch diff --git a/src/components/shortcodes/tip.tsx b/src/components/shortcodes/tip.tsx deleted file mode 100644 index f3ba3a70fc..0000000000 --- a/src/components/shortcodes/tip.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -const Wrapper = styled.section` - padding: 1rem; - background-color: ${theme.colors.gray[100]}; - border-radius: 8px; - min-height: 100px; - margin: 2rem 0; - position: relative; - - &::before { - content: '💡'; - position: absolute; - display: flex; - justify-content: center; - align-items: center; - font-size: 1.1rem; - top: -15px; - left: -10px; - width: 50px; - height: 50px; - border-bottom-right-radius: 50%; - background-color: white; - z-index: 999; - } - - & > div { - margin-left: 1.5rem; - } - - @media (prefers-color-scheme: dark) { - background-color: ${theme.colors.gray[800]}; - } -` - -const Tip = ({ children }: any) => { - return ( - -
      {children}
      -
      - ) -} - -export default Tip diff --git a/src/components/shortcodes/topBlock.tsx b/src/components/shortcodes/topBlock.tsx deleted file mode 100644 index c9f77f31c4..0000000000 --- a/src/components/shortcodes/topBlock.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' - -type TopBlockProps = { - children: any -} - -const TopBlock = ({ children, ...props }: TopBlockProps) => { - return
      {children}
      -} - -export default TopBlock diff --git a/src/components/sidebar/index.tsx b/src/components/sidebar/index.tsx deleted file mode 100644 index 1f32d464e1..0000000000 --- a/src/components/sidebar/index.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import * as React from 'react' -import styled from 'styled-components' - -import config from '../../../config' -import { useAllArticlesQuery } from '../../hooks/useAllArticlesQuery' -import { AllArticles } from '../../interfaces/AllArticles.interface' -import Tree from './tree' - -const SidebarContainer = styled.aside` - width: 272px; - height: 100%; -` - -const Sidebar = styled.div` - margin: 0; - overflow: auto; - height: auto; - - /* .tablet-only { - display: none; - background: ${theme.colors.gray[100]}; - justify-content: space-between; - padding: ${theme.space[48]} ${theme.space[64]}; - - > ul { - width: 50%; - margin-right: 50px; - - &:last-of-type { - padding-left: ${theme.space[40]}; - } - } - - @media (min-width: 641px) and (max-width: 1024px) { - display: flex; - } - } */ - - .mobile-only { - display: none; - width: 100%; - background: ${theme.colors.gray[100]}; - padding: ${theme.space[8]} ${theme.space[16]}; - @media only screen and (max-width: 1024px) { - display: flex; - > ul { - width: 100%; - } - } - } -` - -const List = styled.ul` - list-style: none; - padding: 0 7px 0 ${theme.space[16]}; - margin: -${theme.space[20]} 0 0; - @media only screen and (min-width: 1024px) { - padding-top: 16px; - } -` - -const SidebarLayout = ({ isMobile, location, slug }: any) => { - const { allMdx }: AllArticles = useAllArticlesQuery() - const bucketName = - location && location.state && location.state.bucketName ? location.state.bucketName : '/' - let bucketEdges = allMdx.edges?.filter((edge) => edge.node.fields.slug.includes(bucketName)) - let bucketEdgesMobile = bucketEdges - const bucketNames = config.header.secondLevelHeaderMenuItems.map((item: any) => item.bucketName) - - if (slug) { - const slugBucketPart = `/${slug.split('/')[1]}` - const selectedBucket = bucketNames.filter((bn: any) => bn === slugBucketPart)[0] - if (selectedBucket) { - bucketEdges = allMdx.edges?.filter((edge) => { - return edge.node.fields.slug.includes(selectedBucket) - }) - - bucketEdgesMobile = bucketEdges?.filter( - (edge) => edge.node.fields.slug !== `${selectedBucket}/index` - ) - } - } - - if (!isMobile && slug === '/') { - bucketEdges = [] - } - return !isMobile ? ( - - - - - - - - ) : ( - -
      - - - -
      -
      - ) -} - -export default SidebarLayout diff --git a/src/components/sidebar/tree.tsx b/src/components/sidebar/tree.tsx deleted file mode 100644 index 154e09da83..0000000000 --- a/src/components/sidebar/tree.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useState } from 'react' -import TreeNode from './treeNode' -import { AllEdges } from '../../interfaces/AllArticles.interface' -import { useLocation } from '@reach/router' -import { calculateTreeData } from '../../utils/treeData' - -let defaultCollapsed: any = {} - -const Tree = ({ edges }: AllEdges) => { - const location = useLocation() - let [treeData] = useState(() => { - return calculateTreeData(edges, defaultCollapsed, location) - }) - - const [collapsed, setCollapsed] = useState(defaultCollapsed) - const toggle = (label: string, toggleContent: boolean, parents?: string[]) => { - setCollapsed({ - ...collapsed, - [label]: !toggleContent ? false : !collapsed[label], - }) - if (parents) { - parents.forEach((parent) => { - if (parent && collapsed[parent] !== null) { - setCollapsed({ - ...collapsed, - [parent]: false, - }) - } - }) - } - } - return -} - -export default Tree diff --git a/src/components/sidebar/treeNode.tsx b/src/components/sidebar/treeNode.tsx deleted file mode 100644 index 56f240ece8..0000000000 --- a/src/components/sidebar/treeNode.tsx +++ /dev/null @@ -1,310 +0,0 @@ -import { defaultTheme as theme } from '../../theme' -import { useLocation } from '@reach/router' -import { graphql, useStaticQuery, withPrefix } from 'gatsby' -import * as React from 'react' -import styled from 'styled-components' - -import config from '../../../config' -import ArrowDown from '../../icons/ArrowDown' -import ArrowRight from '../../icons/ArrowRight' -import { urlGenerator } from '../../utils/urlGenerator' -import Link from '../link' - -const List = styled.ul` - list-style: none; - padding: 0; - margin: ${theme.space[12]} 0 ${theme.space[24]}; - &.has-border { - border-left: 2px solid ${theme.colors.gray[300]}; - margin-left: -${theme.space[12]}; - } -` - -const ListItem = styled.li` - font-size: ${theme.fontSizes[14]}; - line-height: 1.25; - margin-bottom: ${theme.space[12]}; - position: relative; - a { - transition: color 150ms ease 0s; - color: ${theme.colors.gray[600]} !important; - text-decoration: none; - vertical-align: middle; - &:hover { - color: ${theme.colors.gray[900]} !important; - } - - .tag { - position: absolute; - right: 0; - color: ${theme.colors.gray[500]}; - font-size: ${theme.fontSizes[14]}; - font-style: normal; - font-weight: 600; - background: ${theme.colors.gray[200]}; - border-radius: ${theme.radii.small}; - padding: 2px 5px; - text-transform: capitalize; - &.small { - font-size: 12px; - } - } - - .item-collapser { - background: transparent; - position: absolute; - left: -15px; - top: 7px; - padding: 0; - border: 0; - - .right, - .down { - transition: opacity 0.5s linear; - } - - .right.open, - .down.close { - display: none; - opacity: 0; - } - - .right.close, - .down.open { - display: block; - opacity: 1; - position: absolute; - margin-top: -4px; - } - - .down.open { - margin-top: -2px; - } - - &:hover, - &:focus, - &:active { - outline: none; - } - } - } - .active-item { - color: ${theme.colors.blue[600]} !important; - font-weight: 700; - } - &.top-level { - margin-top: ${theme.space[32]}; - > a { - font-size: 1.125rem; - color: ${theme.colors.gray[900]} !important; - font-weight: 600; - letter-spacing: -0.01em; - } - > ul { - margin-top: ${theme.space[12]}; - } - } - &.bottom-level { - margin-left: ${theme.space[20]}; - } - &.static-link { - margin-top: ${theme.space[20]}; - } - &.static-link > a { - color: ${theme.colors.gray[900]} !important; - text-transform: uppercase; - font-weight: bold; - font-size: ${theme.fontSizes[12]}; - line-height: ${theme.space[14]}; - letter-spacing: 0.02em; - &:hover { - color: ${theme.colors.gray[900]} !important; - } - } - &.last-level { - padding-left: ${theme.space[24]}; - - // .last-level { - // /*this one is last for real*/ - // padding-left: ${theme.space[16]}; - // } - } - .collapse-title { - position: relative; - cursor: pointer; - svg { - transition: transform 0.2s ease; - } - } - - @media (prefers-color-scheme: dark) { - a { - color: ${theme.colors.gray[500]} !important; - &:hover { - color: ${theme.colors.gray[400]} !important; - } - .tag { - color: ${theme.colors.gray[100]} !important; - background: ${theme.colors.gray[800]} !important; - } - } - .active-item { - color: ${theme.colors.indigo[400]} !important; - } - &.top-level, - &.static-link { - > a { - color: ${theme.colors.gray[100]} !important; - &:hover { - color: ${theme.colors.gray[100]} !important; - } - } - } - } -` - -const TreeNode = ({ - className = '', - setCollapsed, - collapsed, - url, - slug, - title, - navTitle, - items, - label, - topLevel, - staticLink, - duration, - preview, - deprecated, - earlyaccess, - lastLevel, - hidePage, - codeStyle, - parents, -}: any) => { - const SpecialPaths = config.siteMetadata.SpecialPaths - - let isCollapsed = collapsed[label] - const hasChildren = items.length !== 0 - - const collapse = () => { - Object.keys(collapsed).map((lbl) => { - if ((lbl !== label && !parents) || (lbl !== label && parents && !parents.includes(lbl))) { - collapsed[lbl] = collapsed[lbl] == false ? (collapsed[lbl] = true) : collapsed[lbl] - } - }) - setCollapsed(label, false, parents) - } - - const justExpand = (e: any) => { - setCollapsed(label, true) - e.preventDefault() - e.stopPropagation() - } - - const location = useLocation() - const level = slug ? slug.split('/').indexOf(label) : '' - - const calculatedClassName = `${className || ''} ${topLevel ? 'top-level' : ''} ${ - staticLink ? 'static-link' : '' - } ${lastLevel ? 'last-level' : ''} ${level > 2 ? 'more-padding' : ''}` - - items.sort((a: any, b: any) => { - if (a.label < b.label) { - return -1 - } - if (a.label > b.label) { - return 1 - } - return 0 - }) - - const hasExpandButton = title && hasChildren && !staticLink && !topLevel - let hasBorder: boolean = false - if (hasExpandButton) { - items.map((item: any) => (item.lastLevel = true)) - hasBorder = true - } - - // Fix for issue https://github.com/prisma/prisma2-docs/issues/161 - const [isOpen, setIsOpen] = React.useState('close') - React.useEffect(() => { - let mounted = true - - if (mounted) { - setIsOpen(isCollapsed ? 'close' : 'open') - } - - return function cleanup() { - mounted = false - } - }, [isCollapsed]) - - React.useEffect(() => { - if (lastLevel && isCurrent && hasExpandButton && collapsed[label]) setCollapsed(label, true) - }, []) - - const specialCases = - slug && - (SpecialPaths.find((e: string) => - urlGenerator(slug) - .replace(/\/index$/, '') - .endsWith(e) - ) - ? '/' - : '') - - const isCurrent = - location && - slug && - location.pathname.includes(urlGenerator(slug).replace(/\/index$/, '') + specialCases) - - return url === '/' ? null : ( - - {title && label !== 'index' && !hidePage && ( - - {hasExpandButton ? ( - - - {navTitle || title} - - ) : ( - - {navTitle || title} - - )} - {duration && {duration}} - {preview && Preview} - {deprecated && Deprecated} - {earlyaccess && Early Access} - - )} - - {!isCollapsed && hasChildren ? ( - - {items.map((item: any, index: number) => ( - - ))} - - ) : null} - - ) -} -export default TreeNode diff --git a/src/components/switcherBlock.tsx b/src/components/switcherBlock.tsx deleted file mode 100644 index f2a05b8a55..0000000000 --- a/src/components/switcherBlock.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' -import TechnologySwitch from './techSwitcher' -import { urlGenerator } from '../utils/urlGenerator' -import { withPrefix } from 'gatsby' - -const SwitcherWrapper = styled.div` - display: flex; - flex-direction: column; - @media only screen and (max-width: 767px) { - width: 100%; - } -` - -const SwitcherBlock = ({ langSwitcher, dbSwitcher, location, navigate, slug }: any) => { - const currentPath = location.pathname.replace(/\/$/, '') - let [pathTechParams] = currentPath.split('/').splice(-1) - - const isTechPath = currentPath !== withPrefix(urlGenerator(slug)) - const getTechFromParam = (type: string, defaultVal: string) => { - let tech = defaultVal - - if (isTechPath) { - if (type === 'lang') { - ;[tech] = pathTechParams.split('-').splice(dbSwitcher ? -2 : -1) - } - - if (type === 'db') { - ;[tech] = pathTechParams.split('-').splice(-1) - } - } - return tech - } - - const [langSelected, setLangSelected] = React.useState( - langSwitcher ? getTechFromParam('lang', langSwitcher[0]) : 'typescript' - ) - const [dbSelected, setDbSelected] = React.useState( - dbSwitcher ? getTechFromParam('db', dbSwitcher[0]) : 'postgresql' - ) - - const goToNewPath = () => { - let newParams = `${langSwitcher ? `${langSelected}${dbSwitcher ? '-' : ''}` : ''}${ - dbSwitcher ? `${dbSelected}` : '' - }` - - if (langSwitcher && !dbSwitcher) { - // for paths without tech or lang in the url - to redirect to one with default tech and lang - if (!langSwitcher.includes(pathTechParams.split('-').slice(-1)[0])) { - pathTechParams = `${pathTechParams}-${langSwitcher[0]}` - } - } else if (!langSwitcher && dbSwitcher) { - // for paths without tech or lang in the url - to redirect to one with default tech and lang - if (!dbSwitcher.includes(pathTechParams.split('-').slice(-1)[0])) { - pathTechParams = `${pathTechParams}-${dbSwitcher[0]}` - } - } else if (langSwitcher && dbSwitcher) { - // for paths without tech or lang in the url - to redirect to one with default tech and lang - if (!dbSwitcher.includes(pathTechParams.split('-').slice(-1)[0])) { - pathTechParams = `${pathTechParams}-${langSwitcher[0]}-${dbSwitcher[0]}` - } - } - - if (!pathTechParams.includes(newParams)) { - navigate(withPrefix(`${urlGenerator(slug)}-${newParams}${location.hash}`), { - replace: location.pathname === urlGenerator(slug), - }) - } - } - - // TODO : Simplify the function! - const techChanged = (item: any, type: string) => { - const elements = document.querySelectorAll('[id^="techswitch"]') - elements.forEach((element: any) => element.classList.remove('show')) - const elemToShow = [].slice.call(elements).filter((elem: any) => { - const elmId = elem.id.split('-no-')[0] - if (type === 'lang') { - if (dbSwitcher) { - if (elmId.includes('-*-')) { - // lang is any - return elmId.includes(`-${dbSelected}`) - } else { - return ( - elmId.includes(`-${item.technology}`) && - (elmId.includes(`-${dbSelected}`) || elmId.includes(`-*`)) - ) - } - } else { - return elmId.includes(`-${item.technology}`) - } - } else if (type === 'db') { - if (langSwitcher) { - if (elmId.slice(-1) === '*') { - // db is any - return elmId.includes(`-${langSelected}`) - } else { - return ( - elmId.includes(`-${item.technology}`) && - (elmId.includes(`-${langSelected}`) || elmId.includes(`-*`)) - ) - } - } else { - return elmId.includes(`-${item.technology}`) - } - } - }) - elemToShow && elemToShow.forEach((eShow: any) => eShow.classList.add('show')) - goToNewPath() - } - - const langChanged = (item: any) => { - techChanged(item, 'lang') - setLangSelected(item.technology) - } - - const dbChanged = (item: any) => { - techChanged(item, 'db') - setDbSelected(item.technology) - } - - React.useEffect(() => { - let mounted = true - - if (langSwitcher && !dbSwitcher && mounted) { - langChanged({ technology: langSelected }) - } else if (dbSwitcher && !langSwitcher && mounted) { - dbChanged({ technology: dbSelected }) - } else if (dbSwitcher && langSwitcher && mounted) { - langChanged({ technology: langSelected }) - dbChanged({ technology: dbSelected }) - } - - return function cleanup() { - mounted = false - } - }, [langSelected, dbSelected]) - return ( - - {langSwitcher && ( - - )} - {dbSwitcher && ( - - )} - - ) -} - -export default SwitcherBlock diff --git a/src/components/toc.tsx b/src/components/toc.tsx deleted file mode 100644 index db1a058100..0000000000 --- a/src/components/toc.tsx +++ /dev/null @@ -1,229 +0,0 @@ -import { defaultTheme as theme } from '../theme' -import * as React from 'react' -import styled from 'styled-components' - -import { TableOfContents } from '../interfaces/Article.interface' -import { stringify } from '../utils/stringify' - -const ChapterTitle = styled.div` - font-family: ${theme.fonts.text}; - font-style: normal; - font-weight: bold; - font-size: ${theme.fontSizes[14]}; - line-height: 100%; - letter-spacing: 0.01em; - text-transform: uppercase; - color: ${theme.colors.gray[900]}; - margin: 0 0; - @media (prefers-color-scheme: dark) { - color: ${theme.colors.gray[300]}; - } -` - -const HeadingList = styled.ul` - padding: 0 0 1em; - list-style-type: none; - margin: 0; - li { - font-size: ${theme.fontSizes[14]}; - padding: ${theme.space[12]} 0 0; - line-height: 1rem; - ul { - margin-left: ${theme.space[12]}; - } - a { - text-decoration: none; - color: ${theme.colors.gray[600]}; - &:hover { - color: ${theme.colors.gray[900]}; - } - } - } - @media (prefers-color-scheme: dark) { - li a { - color: ${theme.colors.gray[500]}; - &:hover { - color: ${theme.colors.gray[600]}; - } - } - } -` - -interface ItemProps { - isActive: boolean -} - -const ListItem = styled.li` - > a { - text-decoration: none; - background-image: linear-gradient(currentColor, var(--dark-color)); - background-position: 0% 100%; - background-repeat: no-repeat; - background-size: 0% 2px; - transition: background-size 0.7s; - ${(props) => (props.isActive ? 'background-size: 100% 2px;' : null)} - & > inlinecode { - background: ${(props) => (props.isActive ? `var(--dark-color)` : '')}; - color: ${(props) => (props.isActive ? 'var(--main-bgd-color)' : '#000')}; - } - } - - @media (prefers-color-scheme: dark) { - > a > inlinecode { - color: var(--main-font-color); - } - } -` - -const Headings = ({ headings, activeId, depth = 2 }: any) => { - const isActive = (url: string) => url?.replace(/inlinecode/g, '').slice(1) === activeId - const isAnyChildActive = (children: any[]) => children.some((child: any) => isActive(child.url)) - const finalDepth = depth ?? 2 - const navItems = (headings: any, activeId: any, depth: any) => ( - - {headings.map((heading: any) => ( - - - - {heading.items && - heading.items.length > 0 && - depth > 2 && - //isAnyChildActive(heading.items) && - navItems(heading.items, activeId, depth - 1)} - - ))} - - ) - return navItems(headings, activeId, finalDepth) -} - -const getIds = (headings: TableOfContents[], tocDepth: number) => { - return headings.reduce((acc: any, item: any) => { - if (item.url) { - // url has a # as first character, remove it to get the raw CSS-id - acc.push(item.url.replace(/inlinecode/g, '').slice(1)) - } - if (item.items && tocDepth > 1) { - acc.push(...getIds(item.items, tocDepth - 1)) - } - return acc - }, []) -} - -const useIntersectionObserver = ( - setActiveId: any, - idList: any[], - tocDepth: number, - headings: any -) => { - const headingElementsRef: any = React.useRef({}) - const depth = tocDepth ?? 2 - const allHeadings = headings - - const intersectionActive = React.useRef(undefined) - - const getKeyByValue: any = (obj: any, value: string) => - Object.keys(obj).find((key) => obj[key] === value) - const deepExists: any = (obj: any, query: string) => - Object.values(obj).some((v: any) => - typeof v === 'object' ? deepExists(v, query) : v === query - ) - React.useEffect(() => { - const callback = (headings: any) => { - headingElementsRef.current = headings.reduce((map: any, headingElement: any) => { - map[headingElement.target.id] = headingElement - return map - }, headingElementsRef.current) - - // Get all headings that are currently visible on the page - let visibleHeadings: any[] = [] - Object.keys(headingElementsRef.current).forEach((key) => { - const headingElement = headingElementsRef.current[key] - if (headingElement.isIntersecting) visibleHeadings.push(headingElement) - }) - - const getIndexFromId = (id: any) => idList.findIndex((heading) => heading === id) - // If there is only one visible heading, this is our "active" heading - const filteredVisible = visibleHeadings.filter( - (e) => parseInt(e.target.tagName.charAt(1)) <= depth - ) - - if (visibleHeadings.length) { - const visibleId = `#${visibleHeadings[0].target.id}` - const visibleHeadingN = document - .getElementById(visibleHeadings[0].target.id) - ?.tagName.charAt(1) - const firstH = allHeadings.filter((e: any, idx: number) => - deepExists(e, visibleId) ? e : false - ) - let secondH - if (!filteredVisible.length) { - if ( - visibleHeadings.length && - firstH.length && - firstH[0].url !== visibleId && - depth > 2 && - deepExists(allHeadings, visibleId) - ) { - secondH = firstH[0].items.filter((e: any, idx: number) => - deepExists(e, visibleId) ? e : false - ) - setActiveId(secondH[0].url.slice(1).replaceAll('inlinecode', '')) - intersectionActive.current = secondH[0].url.slice(1).replaceAll('inlinecode', '') - } else if ( - visibleHeadings.length && - firstH.length && - firstH[0].url !== visibleId && - depth === 2 && - deepExists(allHeadings, visibleId) && - parseInt(visibleHeadingN ? visibleHeadingN : '0') > depth + 1 - ) { - setActiveId(firstH[0].url.slice(1).replaceAll('inlinecode', '')) - intersectionActive.current = firstH[0].url.slice(1).replaceAll('inlinecode', '') - } else { - setActiveId(firstH[0].url.slice(1).replaceAll('inlinecode', '')) - intersectionActive.current = firstH[0].url.slice(1).replaceAll('inlinecode', '') - } - } else { - setActiveId(filteredVisible[0].target.id) - intersectionActive.current = filteredVisible[0].target.id - } - } else { - if (intersectionActive.current === Object.keys(headingElementsRef.current)[0]) { - setActiveId('') - } - } - } - - const observer = new IntersectionObserver(callback) - - idList.forEach((id: string) => { - const el: HTMLElement | null = document.getElementById(id) - if (el) { - observer.observe(el) - } - }) - - return () => observer.disconnect() - }, [setActiveId]) -} - -const TOC = ({ headings, tocDepth }: any) => { - const [activeId, setActiveId] = React.useState() - const idList = getIds(headings, tocDepth || 2) - React.useEffect(() => { - console.log(tocDepth) - }, []) - useIntersectionObserver(setActiveId, idList, tocDepth, headings) - return ( - - ) -} - -export default TOC diff --git a/src/components/tooltip/Tooltip.tsx b/src/components/tooltip/Tooltip.tsx index f6b5f17804..bc304908e6 100644 --- a/src/components/tooltip/Tooltip.tsx +++ b/src/components/tooltip/Tooltip.tsx @@ -4,8 +4,7 @@ import { mergeProps } from '@react-aria/utils' import { useTooltipTriggerState } from '@react-stately/tooltip' import React, { ReactPortal, useEffect, useLayoutEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' - -import { ArrowWrapper, TooltipWrapper } from './TooltipStyles' +import styles from './styles.module.scss' const ARROW_SIZE = 5 // in px const SPACING = 8 @@ -107,10 +106,10 @@ export function Tooltip({ id, children, target, position }: TooltipProps): React }, []) return typeof window === 'object' ? createPortal( -
      {children}
      -
      , +

, document.body ) : null @@ -150,7 +149,8 @@ type ArrowProps = { function Arrow({ arrowProps, position }: ArrowProps) { return ( - + >
) -} +} \ No newline at end of file diff --git a/src/components/tooltip/TooltipStyles.tsx b/src/components/tooltip/TooltipStyles.tsx index 10004558d9..e69de29bb2 100644 --- a/src/components/tooltip/TooltipStyles.tsx +++ b/src/components/tooltip/TooltipStyles.tsx @@ -1,57 +0,0 @@ -import styled from 'styled-components' -import { defaultTheme } from '../../theme' - -export const animationStyle: any = { - bottom: ` - animation: slide-top 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; - @keyframes slide-top { - 0% { transform: translateY(-5px); opacity: 0 } - 25% { opacity: 1 } - 100% { transform: translateY(0px); opacity: 1 } - } - `, - top: ` - animation: slide-bottom 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; - @keyframes slide-bottom { - 0% { transform: translateY(5px); opacity: 0 } - 25% { opacity: 1 } - 100% { transform: translateY(0px); opacity: 1 } - } - `, - right: ` - animation: slide-left 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; - @keyframes slide-left { - 0% { transform: translateX(-5px); opacity: 0 } - 25% { opacity: 1 } - 100% { transform: translateX(0px); opacity: 1 } - } - `, - left: ` - animation: slide-right 0.1s cubic-bezier(0, 0, 0.2, 1) forward; - @keyframes slide-right { - 0% { transform: translateX(5px); opacity: 0 } - 25% { opacity: 1 } - 100% { transform: translateX(0px); opacity: 1 } - } - `, -} - -export const TooltipWrapper = styled.div<{ placement: string }>` - ${(props) => props.placement && animationStyle[props.placement]} - .children-wrapper { - display: flex; - align-items: center; - border-radius: 0.375rem; - padding: 0.375rem 0.75rem; - background: ${defaultTheme.colors.gray[800]}; - color: white; - white-space: nowrap; - font-size: 0.875rem; /* 14px */ - line-height: 1.25rem; /* 20px */ - } -` - -export const ArrowWrapper = styled.div` - position: absolute; - border-color: #2d3748; -` diff --git a/src/components/tooltip/styles.module.scss b/src/components/tooltip/styles.module.scss new file mode 100644 index 0000000000..deeef524ad --- /dev/null +++ b/src/components/tooltip/styles.module.scss @@ -0,0 +1,52 @@ +.bottom { + animation: slide-top 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; + @keyframes slide-top { + 0% { transform: translateY(-5px); opacity: 0 } + 25% { opacity: 1 } + 100% { transform: translateY(0px); opacity: 1 } + } +} + +.top { + animation: slide-bottom 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; + @keyframes slide-bottom { + 0% { transform: translateY(5px); opacity: 0 } + 25% { opacity: 1 } + 100% { transform: translateY(0px); opacity: 1 } + } +} + +.right { + animation: slide-left 0.1s cubic-bezier(0, 0, 0.2, 1) forwards; + @keyframes slide-left { + 0% { transform: translateX(-5px); opacity: 0 } + 25% { opacity: 1 } + 100% { transform: translateX(0px); opacity: 1 } + } +} + +.left { + animation: slide-right 0.1s cubic-bezier(0, 0, 0.2, 1) forward; + @keyframes slide-right { + 0% { transform: translateX(5px); opacity: 0 } + 25% { opacity: 1 } + 100% { transform: translateX(0px); opacity: 1 } + } +} + +.childrenWrapper { + display: flex; + align-items: center; + border-radius: 0.375rem; + padding: 0.375rem 0.75rem; + background: var(--gray-800); + color: white; + white-space: nowrap; + font-size: 0.875rem; /* 14px */ + line-height: 1.25rem; /* 20px */ +} + +.arrowWrapper { + position: absolute; + border-color: #2d3748; +} \ No newline at end of file diff --git a/src/components/topSection.tsx b/src/components/topSection.tsx index 02f2b21373..4bc00f766e 100644 --- a/src/components/topSection.tsx +++ b/src/components/topSection.tsx @@ -1,88 +1,30 @@ -import { defaultTheme as theme } from '../theme' import * as React from 'react' -import styled from 'styled-components' +import styles from '../css/topSection.module.scss' -import ParentTitle from './parentTitleComp' -import SwitcherBlock from './switcherBlock' +import SwitcherBlock from './shortcodes/switcherBlock' -const TopSectionWrapper = styled.div` - position: relative; - - .tech-switch-block { - position: relative; - } - - @media (min-width: 0px) and (max-width: ${theme.breakpoints.mobile}) { - .tech-switch-block { - width: 100%; - } - } -` -const Header = styled.div` - display: flex; - justify-content: space-between; - align-items: start; - @media (min-width: 0px) and (max-width: ${theme.breakpoints.mobile}) { - flex-direction: column; - align-items: baseline; - } -` - -const MainTitle = styled.h1` - font-family: ${theme.fonts.display}; - font-size: ${theme.fontSizes[40]} !important; - font-style: normal; - font-weight: bold; - letter-spacing: -0.02em; - color: ${theme.colors.gray[900]}; - margin: 0; - margin-top: 4px; - &.inline-code { - font-size: ${theme.fontSizes[32]}; - padding: 0px 0.2em; - line-height: 3rem; - } - @media (min-width: 0px) and (max-width: ${theme.breakpoints.tabletVertical}) { - font-size: ${theme.fontSizes[24]}; - } - - @media (prefers-color-scheme: dark) { - color: ${theme.colors.gray[100]}; - } -` const TopSection = ({ location, - navigate, - title, slug, langSwitcher, dbSwitcher, - codeStyle, - hideTitle = false, }: any) => { return ( - - -
- {!hideTitle ? ( -
- {title} -
- ) : null} -
+
+
+
{(langSwitcher || dbSwitcher) && ( )}
-
-
+
+ ) } diff --git a/src/css/admonition.css b/src/css/admonition.css new file mode 100644 index 0000000000..ff5a35577e --- /dev/null +++ b/src/css/admonition.css @@ -0,0 +1,118 @@ +:root { + --if-alert-color: #2D3748; + --ifm-alert-padding-horizontal: 22px; + --ifm-alert-padding-vertical: 10px; +} +.admonitionHeading_node_modules-\@docusaurus-theme-classic-lib-theme-Admonition-Layout-styles-module:not(:last-child) { + margin-bottom: 0 !important; + font-family: Inter; + font-size: 20px; + text-transform: capitalize; + font-weight: 700; + height: 22px; + line-height: 24px; + text-align: left; +} +.alert { + --ifm-link-hover-color: #2E5297; + border-top: 2px solid var(--ifm-alert-border-color); + border-bottom: 2px solid var(--ifm-alert-border-color); + border-right: 2px solid var(--ifm-alert-border-color); + border-left: 10px solid var(--ifm-alert-border-color); +} +.alert a { + text-decoration-color: var(--link-color); +} +.alert a:hover { + color: var(--ifm-link-hover-color) !important; + text-decoration: underline; + text-decoration-color: var(--ifm-link-hover-color) !important; +} +[data-theme='light'] .alert--warning { + --ifm-alert-background-color: #FFFAF0; + --ifm-alert-background-color-highlight: rgba(255, 186, 0, 0.15); + --ifm-alert-foreground-color: #DD6B20; + --ifm-alert-border-color: #F6AD55; +} +[data-theme='light'] .alert--info { + --ifm-alert-background-color: var(--gray-100); + --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); + --ifm-alert-foreground-color: var(--gray-600); + --ifm-alert-border-color: #CBD5E0; +} + +[data-theme='light'] .alert--success { + --ifm-alert-background-color: #D9F9F6; + --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); + --ifm-alert-foreground-color: #38A169; + --ifm-alert-border-color: #68D391; +} + +[data-theme='light'] .alert--danger { + --ifm-alert-background-color: #FFF5F5; + --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); + --ifm-alert-foreground-color: #E53E3E; + --ifm-alert-border-color: #FC8181; +} + +[data-theme='dark'] { + --if-alert-color: white; +} + +.alert { + width: max-content; + max-width: 100%; +} + +[data-theme='dark'] .alert { + --ifm-link-hover-color: #5196d7; +} +[data-theme='dark'] .alert--warning { + --ifm-alert-background-color: rgba(246, 173, 85, 0.1); + --ifm-alert-background-color-highlight: rgba(255, 186, 0, 0.15); + --ifm-alert-foreground-color: #F6AD55; + --ifm-alert-border-color: #DD6B20; +} +[data-theme='dark'] .alert--info { + --ifm-alert-background-color: #2D3748; + --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); + --ifm-alert-foreground-color: var(--gray-400); + --ifm-alert-border-color: #718096; +} + +[data-theme='dark'] .alert--success { + --ifm-alert-background-color: rgba(113, 232, 223, 0.1); + --ifm-alert-background-color-highlight: rgba(113, 232, 223, 0.1); + --ifm-alert-foreground-color: #68D391; + --ifm-alert-border-color: #38A169; +} + +[data-theme='dark'] .alert--danger { + --ifm-alert-background-color: rgba(252, 129, 129, 0.1); + --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); + --ifm-alert-foreground-color: #FC8181; + --ifm-alert-border-color: #E53E3E; +} + +.alert > div:first-child > span > svg { + height: 22px !important; + width: auto !important; +} + +.alert > div:first-child > span { + height: 22px !important; +} + +.alert > div:first-child { + display: flex; + align-items: center; + margin-bottom: 0 !important; +} + +.alert > div:last-child { + color: var(--ifm-alert-color); +} + +.alert > div:last-child > p { + margin-top: 8px; +} diff --git a/src/css/all.css b/src/css/all.css new file mode 100644 index 0000000000..96e6b7665c --- /dev/null +++ b/src/css/all.css @@ -0,0 +1,1170 @@ +.fa { + font-family: var(--fa-style-family, 'Font Awesome 6 Pro'); + font-weight: var(--fa-style, 900); + } + + .fa, + .fa-classic, + .fa-sharp, + .fas, + .fa-solid, + .far, + .fa-regular, + .fasr, + .fal, + .fa-light, + .fasl, + .fat, + .fa-thin, + .fad, + .fa-duotone, + .fass, + .fa-sharp-solid, + .fab, + .fa-brands { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; + } + + .fas, + .fa-classic, + .fa-solid, + .far, + .fa-regular, + .fal, + .fa-light, + .fat, + .fa-thin { + font-family: 'Font Awesome 6 Pro'; + } + + .fab, + .fa-brands { + font-family: 'Font Awesome 6 Brands'; + } + + .fad, + .fa-classic.fa-duotone, + .fa-duotone { + font-family: 'Font Awesome 6 Duotone'; + } + + .fass, + .fasr, + .fasl, + .fa-sharp { + font-family: 'Font Awesome 6 Sharp'; + } + + .fass, + .fa-sharp { + font-weight: 900; + } + + .fa-1x { + font-size: 1em; + } + + .fa-2x { + font-size: 2em; + } + + .fa-3x { + font-size: 3em; + } + + .fa-4x { + font-size: 4em; + } + + .fa-5x { + font-size: 5em; + } + + .fa-6x { + font-size: 6em; + } + + .fa-7x { + font-size: 7em; + } + + .fa-8x { + font-size: 8em; + } + + .fa-9x { + font-size: 9em; + } + + .fa-10x { + font-size: 10em; + } + + .fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; + } + + .fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; + } + + .fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; + } + + .fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; + } + + .fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; + } + + .fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; + } + + .fa-fw { + text-align: center; + width: 1.25em; + } + + .fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; + } + + .fa-ul > li { + position: relative; + } + + .fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; + } + + .fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); + } + + .fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); + } + + .fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); + } + + .fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); + } + + .fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + } + + .fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + } + + .fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + } + + .fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); + } + + .fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); + } + + .fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); + } + + .fa-spin-reverse { + --fa-animation-direction: reverse; + } + + .fa-pulse, + .fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); + } + + @media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; + } + } + + @-webkit-keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } + } + + @keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } + } + + @-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) + translateY(0); + } + + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) + translateY(var(--fa-bounce-height, -0.5em)); + } + + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) + translateY(0); + } + + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + } + + @keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) + translateY(0); + } + + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) + translateY(var(--fa-bounce-height, -0.5em)); + } + + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) + translateY(0); + } + + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); + } + } + + @-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } + } + + @keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } + } + + @-webkit-keyframes fa-beat-fade { + 0%, + 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } + } + + @keyframes fa-beat-fade { + 0%, + 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } + } + + @-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } + } + + @keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } + } + + @-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + + 40%, + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + @keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + + 40%, + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + @-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + @keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } + + .fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + + .fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + + .fa-flip-horizontal { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); + } + + .fa-flip-vertical { + -webkit-transform: scale(1, -1); + transform: scale(1, -1); + } + + .fa-flip-both, + .fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); + } + + .fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, none)); + transform: rotate(var(--fa-rotate-angle, none)); + } + + .fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; + } + + .fa-stack-1x, + .fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); + } + + .fa-stack-1x { + line-height: inherit; + } + + .fa-stack-2x { + font-size: 2em; + } + + .fa-inverse { + color: var(--fa-inverse, #fff); + } + + /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + .fa-arrow-up-right::before { + content: '\e09f'; + } + + .fa-arrows-rotate::before { + content: '\f021'; + } + + .fa-bars::before { + content: '\f0c9'; + } + + .fa-bolt::before { + content: '\f0e7'; + } + + .fa-book-open::before { + content: '\f518'; + } + + .fa-book-open-alt::before { + content: '\e0c0'; + } + + .fa-book-open-cover::before { + content: '\e0c0'; + } + + .fa-box::before { + content: '\f466'; + } + + .fa-chart-line-up::before { + content: '\e0e5'; + } + + .fa-chart-simple::before { + content: '\e473'; + } + + .fa-chevron-down::before { + content: '\f078'; + } + + .fa-circle-exclamation::before { + content: '\f06a'; + } + + .fa-comment::before { + content: '\f075'; + } + + .fa-comment-alt-edit::before { + content: '\f4a4'; + } + + .fa-comment-quote::before { + content: '\e14c'; + } + + .fa-database::before { + content: '\f1c0'; + } + + .fa-discord::before { + content: '\f392'; + } + + .fa-envelope::before { + content: '\f0e0'; + } + + .fa-exclamation-circle::before { + content: '\f06a'; + } + + .fa-file-binary::before { + content: '\e175'; + } + + .fa-folder-magnifying-glass::before { + content: '\e18b'; + } + + .fa-folder-search::before { + content: '\e18b'; + } + + .fa-github::before { + content: '\f09b'; + } + + .fa-globe::before { + content: '\f0ac'; + } + + .fa-grid-2::before { + content: '\e196'; + } + + .fa-hands-heart::before { + content: '\f4c3'; + } + + .fa-hands-holding-heart::before { + content: '\f4c3'; + } + + .fa-headset::before { + content: '\f590'; + } + + .fa-layer-group::before { + content: '\f5fd'; + } + + .fa-message-edit::before { + content: '\f4a4'; + } + + .fa-message-pen::before { + content: '\f4a4'; + } + + .fa-navicon::before { + content: '\f0c9'; + } + + .fa-refresh::before { + content: '\f021'; + } + + .fa-server::before { + content: '\f233'; + } + + .fa-signal-stream::before { + content: '\f8dd'; + } + + .fa-slack::before { + content: '\f198'; + } + + .fa-slack-hash::before { + content: '\f198'; + } + + .fa-slash::before { + content: '\f715'; + } + + .fa-question::before { + content: '\3f' + } + + .fa-star::before { + content: '\f005'; + } + + .fa-plus::before { + content: '\2b'; + } + + .fa-rocket::before { + content: '\f135'; + } + + .fa-download::before { + content: '\f019'; + } + + .fa-book::before { + content: '\f02d'; + } + + .fa-arrow-right-arrow-left::before { + content: '\f0ec'; + } + + .fa-eye::before { + content: '\f06e'; + } + + .fa-sync::before { + content: '\f021'; + } + + .fa-terminal::before { + content: '\f120'; + } + + .fa-triangle::before { + content: '\f2ec'; + } + + .fa-twitter::before { + content: '\f099'; + } + + .fa-user::before { + content: '\f007'; + } + + .fa-users-viewfinder::before { + content: '\e595'; + } + + .fa-youtube::before { + content: '\f167'; + } + + .fa-whatsapp::before { + content: '\f232'; + } + + .fa-zap::before { + content: '\f0e7'; + } + + .sr-only, + .fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; + } + + .sr-only-focusable:not(:focus), + .fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; + } + + .fab, + .fa-brands { + font-weight: 400; + } + + :root, + :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; + } + + @font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url('/fonts/fa-brands-400.woff2') format('woff2'), + url('/fonts/fa-brands-400.woff2') format('woff2'); + } + @font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url('/fonts/fa-solid-900.woff2') format('woff2'), + url('/fonts/fa-solid-900.woff2') format('woff2'); + } + + .fa-rabbit-fast:before, + .fa-rabbit-running:before { + content: '\f709'; + } + + .fa-discord::before { + content: '\f392'; + } + + .fa-github::before { + content: '\f09b'; + } + + .fa-slack::before { + content: '\f198'; + } + + .fa-slack-hash::before { + content: '\f198'; + } + + .fa-twitter::before { + content: '\f099'; + } + + .fa-youtube::before { + content: '\f167'; + } + + .fa-x-twitter::before { + content: '\e61b'; + } + + /*! + * Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2023 Fonticons, Inc. + */ + :root, + :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; + } + + @font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 300; + font-display: block; + src: url('/fonts/fa-light-300.woff2') format('woff2'); + } + + .fal, + .fa-light { + font-weight: 300; + } + + /*! + * Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2023 Fonticons, Inc. + */ + :root, + :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Pro'; + } + + @font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url('/fonts/fa-regular-400.woff2') format('woff2'); + } + + .far, + .fa-regular { + font-weight: 400; + } + .fa-arrow-right:before { + content: '\f061'; + } + + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-MediumItalic.woff2') format('woff2'); + font-weight: 500; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-Medium.woff2') format('woff2'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-Bold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-Italic.woff2') format('woff2'); + font-weight: normal; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Inter'; + src: url('/fonts/Inter-BoldItalic.woff2') format('woff2'); + font-weight: bold; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Inter Semi'; + src: url('/fonts/Inter-SemiBoldItalic.woff2') format('woff2'); + font-weight: 600; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Inter Semi'; + src: url('/fonts/Inter-SemiBold.woff2') format('woff2'); + font-weight: 600; + font-style: normal; + font-display: swap; +} + + +@font-face { + font-family: 'Barlow'; + src: url('/fonts/Barlow-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Barlow'; + src: url('/fonts/Barlow-Bold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'JetBrainsMono'; + font-weight: 400; + font-style: normal; + font-display: swap; + src: url('/fonts/JetBrainsMono-Regular.woff2'), url('/fonts/JetBrainsMono-Regular.woff2'); +} \ No newline at end of file diff --git a/src/css/collapsible.module.scss b/src/css/collapsible.module.scss new file mode 100644 index 0000000000..6b9346ef30 --- /dev/null +++ b/src/css/collapsible.module.scss @@ -0,0 +1,58 @@ +.wrapper { + margin-bottom: 1rem; +} + +.tab { + position: relative; + overflow: hidden; + .tabContent { + transition: max-height 0.35s; + } + &:before { + content: ''; + position: absolute; + width: 8px; + height: 100%; + left: 0px; + background: #F7FAFC; + border-radius: 4px; + } + p { + margin-top: 0.5rem; + } +} + +.label { + position: relative; + display: block; + color: #0c344b; + font-weight: 600; + line-height: 1.5; + padding-left: 2rem; + cursor: pointer; + @media (prefers-color-scheme: dark) { + color: #F7FAFC; + } +} + +.tabContent { + max-height: 0; + overflow: hidden; + color: #2D3748; + transition: max-height 0.35s, padding 0.35s; + padding-left: 36px; + padding-bottom: 0; + @media (prefers-color-scheme: dark) { + color: #F7FAFC; + } +} + +.input { + position: absolute; + opacity: 0; + z-index: -1; + &:checked ~ .tab-content { + max-height: 2000px; + padding-bottom: 0.5rem; + } +} \ No newline at end of file diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000000..0431b6324d --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,1418 @@ +/** + * 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. +*/ + +.markdown h1:first-child { + margin-bottom: 0 !important; +} + +details:has(summary) > div > div { + margin-top: 0 !important; + padding-top: 0 !important; + border-top: none !important; +} +details > summary::before { + --docusaurus-details-decoration-color: var(--ifm-alert-border-color) !important; +} + +.table-icon path { + fill: var(--main-font-color); +} + +main { + padding-top: 64px; + padding-left: 16px; + padding-right: 16px; +} + + @media (min-width: 997px) { + main:has( > div > .row ){ + max-width: calc(100% - var(--doc-sidebar-width) - 20px) !important; + } + main:has( > div > .row .col--3){ + max-width: calc(100% - var(--doc-sidebar-width)) !important; + } + main { + padding-left: 32px; + padding-top: 0; + } +} +.theme-back-to-top-button { + position: absolute; + display: none; +} + code { + border: none !important; + padding: .05em .3em .2em; + } + + +pre { + background-color: var(--code-bg) !important; + color: var(--gray-500) !important; + /* LINK color: Blue + LINK hover: Dark Blue */ +} + +.header-github-link::before { + content: ''; + width: 24px; + height: 24px; + display: flex; + background-color: var(--ifm-navbar-link-color); + mask-image: 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"); + transition: background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default); +} + +.header-github-link:hover::before { + background-color: var(--ifm-navbar-link-hover-color); +} + +.theme-doc-sidebar-container { + border-right: none !important; +} + + + +.menu__link { + font-size: 0.875rem; + line-height: 1.25; + margin-bottom: 0.75rem; + margin-left: 10px; + padding: 0; + position: relative; +} +.menu__link:hover { + color: var(--main-font-color) !important; +} + +.menu__link--sublist { + margin-bottom: 0; +} +.menu__link:not(.navbar-login-btn):hover { + background: none; +} + +.theme-doc-sidebar-item-category-level-1 > .menu__list { + border-left: none; + padding-left: 0; +} + +.theme-doc-sidebar-item-category-level-1.menu__list-item { + margin-top: 1.25rem !important; + margin-bottom: 0.75rem; +} + +.theme-doc-sidebar-item-category-level-2 > .menu__list-item-collapsible > .menu__link { + font-weight: bold; + font-size: 0.75rem; + line-height: 0.875rem; + color: var(--ifm-color-content) !important; + letter-spacing: 0.02em; + text-transform: uppercase; + margin-bottom: 0; + margin-top: 8px; +} + +.theme-doc-sidebar-item-category-level-2 > ul { + border-left: none; +} +.menu__list-item-collapsible > a:not([href]), .firstTitle > div > a { + font-size: 1.125rem; + font-weight: 600; + letter-spacing: -0.01em; + color: var(--ifm-color-content) !important; + margin-bottom: 0; +} + +.menu__list { + border-left: 2px solid rgb(226, 232, 240); + margin-top: 8px; +} + +@media (min-width: 996px) { +.theme-doc-sidebar-container nav { + font-family: Inter, sans-serif; + padding-right: 8px !important; + scrollbar-width: auto; + } +} + +.theme-doc-sidebar-menu { + border-left: none !important; +} + +.menu__list-item-collapsible:hover, .menu__list-item-collapsible--active, .menu__link--active:not(.menu__link--sublist), .menu__link--active:not(.menu__link--sublist):hover { + background: none; +} +.menu__list-item { + margin-top: 0 !important; +} + +.menu__list-item-collapsible { + flex-direction: row-reverse; + margin-bottom: 0.75rem; + align-items: center; + position: relative; +} + +.theme-doc-toc-mobile > button::after { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + width: 20px; + height: 20px; +} + +.menu__link--sublist-caret:after { + content: none; +} +.menu__link--sublist-caret:before { + position: absolute; + content: ""; + width: 0px; + height: 0px; + color: inherit; + border-top: 6px solid currentColor; + border-right: 4px solid transparent; + border-bottom: 6px solid transparent; + border-left: 4px solid transparent; + top: 25%; + margin-right: 6px; + right: 100%; +} + +.menu__caret:hover { + background-color: transparent; +} + +.theme-doc-sidebar-item-category-level-1 > ul > .menu__list-item > .menu__list-item-collapsible > a::before { + content: none; +} + +/* .menu__link--sublist-caret::before { + content: none; +} */ + +.menu__caret { + position: absolute; + content: ""; + width: 0px; + padding: 0; + transform: rotate(-90deg); + border-radius: 0; + height: 0px; + color: rgb(113, 128, 150) !important; + border-top: 4.5px solid currentColor; + border-right: 4.5px solid transparent; + border-bottom: 4.5px solid transparent; + border-left: 4.5px solid transparent; + top: 3px; + right: 100%; + margin-right: -8px; +} + +html { + font-family: 'Inter', sans-serif; + -ms-text-size-adjust: none; + -webkit-text-size-adjust: none; + box-sizing: border-box; + overflow-y: scroll; + /* Issue 894 */ + font-size: 16px; +} + +::selection, +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + color: var(--white-color); + background: var(--selection-bgd-color); +} + +pre { + margin: 0; +} + +a { + color: var(--link-color); +} +.theme-doc-markdown > *:not(.top-section) a { + text-decoration: underline; +} +h3 { + display: block; + margin-block-start: 1em; + margin-block-end: 1em; +} + +h4 { + margin-block-start: 1.33em; + margin-block-end: 1.33em; +} + +h5 { + margin-block-start: 1.67em; + margin-block-end: 1.67em; +} + +h6 { + margin-block-start: 2.33em; + margin-block-end: 2.33em; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +html { + line-height: unset; + -webkit-text-size-adjust: none; +} + +body { + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI'; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Inter', sans-serif; + font-weight: 500; +} + +h1.inline-code { + display: inline-block; +} + +h2 { + margin: 0; + margin-block-end: 0; + margin-block-start: 0; +} + +section h2, +section h3, +section h4, +section h5, +section h6 { + font-weight: 600; + text-decoration: none; + color: var(--main-font-color); +} + +section h2 { + margin-bottom: 0; +} + +.title-link { + /* margin-left: -24px; + margin-right: 5px; */ + opacity: 0; +} + +h2:hover .title-link, +h3:hover .title-link, +h4:hover .title-link, +h5:hover .title-link, +h6:hover .title-link { + opacity: 1; +} + +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit; +} + +* { + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +img { + max-width: 100%; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} + +p { + margin: 1rem 0; +} + +p, +li { + font-family: 'Inter', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 16px; + line-height: 24px; +} + +kbd { + background: var(--white-color); + color: var(--gray-800); + box-shadow: 0px 1px 1px rgba(47, 55, 71, 0.6), 0px 1px 4px rgba(47, 55, 71, 0.2); + border-bottom: 1px solid rgba(47, 55, 71, 0.2); + border-radius: 4px; + padding: 2px 6px; + vertical-align: baseline; + font-size: 14px !important; + font-family: 'JetBrainsMono' !important; +} + +table { + word-break: normal; + border: 1px solid var(--border-color); + border-radius: 8px; + border-spacing: 0px; + margin: 0 0px 20px; + white-space: inherit; + max-width: 100%; + width: fit-content; +} + +table * { + font-size: 13px; +} + +table th { + text-align: left; + font-size: 14px; + font-weight: 600; + padding: 12px; +} + +table td { + padding: 12px; + border-top: 1px solid var(--border-color); + vertical-align: top; +} + +table code { + white-space: nowrap; +} + +blockquote { + font-family: Inter; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + color: var(--code-inner-color); + padding-left: 2rem; + padding-bottom: 8px; + padding-bottom: 8px; + margin: 2rem 0px; + position: relative; +} + +blockquote pre { + font-weight: normal; +} + +blockquote::before { + content: ''; + position: absolute; + width: 8px; + height: 100%; + left: 0px; + background: var(--code-bgd-color); + border-radius: 5px; +} + +blockquote code { + color: var(--code-inner-color); +} + +blockquote p { + margin: 0; +} + +hr { + margin: 2rem 0; + margin-left: -40px; + margin-right: -40px; + border: 0; + height: 1px; + background: var(--border-color); +} + + +.indigo:hover, .navbar__link--active.indigo, .menu__link--active.indigo { + color: var(--navbar-indigo-color); +} + +.teal:hover, .navbar__link--active.teal, .menu__link--active.teal { + color: var(--navbar-teal-color); +} + +.navbar__item { + padding: 8px; + border-radius: 8px; + font-family: Inter; + font-size: 16px; + line-height: 100%; + font-weight: 600; + text-decoration: none; + white-space: nowrap; + cursor: pointer; +} +.navbar__link--active { + background: var(--navbar-tab-bg); +} + +.navbar__items { + gap: 16px; +} +@media (max-width: 996px) { + .navbar__items:not(.navbar__items--right) { + width: 100%; + flex-direction: row-reverse; + justify-content: space-between; + } + .navbar__inner { + position: relative; + } + .navbar__items--right > :last-child { + left: 0; + z-index: 1; + top: calc(100% + 24px); + } + .navbar__items--right > :last-child > *{ + width: 100%; + } + .navbar-sidebar__backdrop { + z-index: 1; + } + +} + +.logo-link { + font-family: Inter, sans-serif; + font-size: 22px; + font-style: normal; + font-weight: 500; + padding-left: 22px; + position: relative; + line-height: 100%; + color: var(--ifm-navbar-link-color); + transition: transform 0.18s ease-out 0s; + background: transparent; + border: none; + padding: 0px; + cursor: pointer; + position: absolute; + left: 124px; +} +@media (max-width: 996px) { + /* .logo-link { + top: -60px; + left: 119px; + background-color: transparent !important; + } + .logo-link:hover { + transform: none !important; + } */ + .logo-link { + display: inline-block !important; + left: 108px; + } +} + +.logo-link:hover { + transform: translateY(-2px); + color: var(--main-font-color); +} + + +.navbar__logo { + width: var(--doc-sidebar-width); + padding-right: 53px; + margin-right: -1rem; + +} +@media (prefers-color-scheme: dark) { + .navbar__logo { + filter: brightness(100); + } +} +@media (max-width: 996px) { + .navbar__logo { + width: auto; + padding-right: 0; + margin: 0 auto; + } +} +@media (prefers-color-scheme: dark) { + :root[data-theme='light'] .navbar__logo { + filter: none; + } +} + + +.first-item { + margin-left: -16px; +} +@media (max-width: 996px) { + .first-item { + margin-left: 0; + } +} + + +.menu::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; + background-color: transparent; +} +.menu::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: #c5c6c8; +} +.menu::-webkit-scrollbar-track { + border-radius: 10px; + background-color: transparent; +} +.menu::-webkit-scrollbar-corner { + background-color: transparent; + border-color: transparent; +} + +.breadcrumbs__item { + cursor: default; +} +.breadcrumbs__item:has(> span.breadcrumbs__link) { + /* display: none; */ + /* background-color: pink; */ +} + + +.breadcrumbs__link { + padding: 0; + font-size: 16px; + line-height: 1.6rem; + font-weight: normal; + margin: 0px; + color: rgb(113, 128, 150) !important; +} + +.breadcrumbs__item > .breadcrumbs__link:hover { + background: none; +} +.breadcrumbs__item--active > .breadcrumbs__link { + background: none; + padding: 0; +} +.DocSearch-Logo path, .DocSearch-Logo rect { + fill: var(--docsearch-muted-color); +} +.navbar { + box-shadow: none; + border-bottom: 1px solid var(--border-color); + padding-left: 16px; + padding-right: 16px; +} +@media (max-width: 996px) { + .navbar { + padding-right: 16px; + } +} + +.breadcrumbs__item:not(:last-child):after { + background: var(--ifm-breadcrumb-separator) center no-repeat; + opacity: 1; + height: 20px; + transform: translateY(5px); + filter: none; +} + +.breadcrumbs__item[itemscope] > .breadcrumbs__link:hover { + text-decoration: underline; + background: none; + cursor: pointer; + color: rgb(74, 85, 104) !important; +} + +.breadcrumbs__link > svg { + top: 4px; +} + +/* FOOTER */ + +.footer__title { + text-transform: uppercase; + font-weight: 400; + font-size: 1rem; + color: white; + letter-spacing: 0.08em; + margin-top: 0px; + margin-bottom: 3px; + font-family: Barlow, sans-serif; +} + +.footer__item { + color: white; + font-size: 1.125rem; + display: flex; + cursor: pointer; + font-weight: 500; + box-sizing: border-box; + text-decoration: none; + line-height: 1.38889; + padding: 1rem 0px; +} +@media only screen and (min-width: 940px) { + .footer__item { + padding: 0.5rem 0px; + } +} + +.internal > i { + display: none; +} + +.footer__links { + position: relative; + margin: 0; +} + + +.footer__logo { + margin: 0 0 8px 0 !important; + height: 28px; +} + +.footer__col:last-child { + position: absolute; + height: var(--footer-bottom-height); + display: flex; + align-items: center; + top: calc(100% + 220px); + justify-content: flex-end; + padding: 0; + width: auto; + right: 0; +} +@media (min-width: 768px) { + .footer__col:last-child { + top: calc(100% + 280px); + } +} +@media (min-width: 1040px) { + .footer__col:last-child { + top: calc(100% + 300px); + } +} + + + +.footer__col:last-child > .footer__title { + display: none; +} + +.footer__col:last-child > ul { + display: flex; + gap: 20px; + font-size: 1.375rem; + color: white; +} +.footer__col:last-child .footer__item a { + font-size: 1.375rem; + color: white; +} +.footer__col:last-child .footer__item a:hover { + color: var(--brand-primary); + text-decoration: none; +} + +@media (max-width: 940px) { + .footer__col { + flex: none; + } +} + + +.footer__copyright { + text-align: left; + font-size: 1.125rem; +} + +.footer__logo { + margin: 0 0 1.45rem; +} + +.navbar__items--right { + padding-right: 90px; + flex-direction: row-reverse; + position: relative; +} +@media (max-width: 996px) { + .navbar__items--right { + padding-right: 0px; + position: static; + } +} + +.navbar-login-btn { + position: absolute; + margin-bottom: 0; + right: 0; + top: 50%; + transform: translateY(-50%); +} +@media (max-width: 996px) { + .navbar-login-btn { + top: unset; + bottom: 0; + left: 0; + margin-left: 0; + width: calc(100% - 16px); + font-family: Barlow !important; + font-size: 14px !important; + font-weight: 700 !important; + line-height: 20px !important; + letter-spacing: 0em !important; + justify-content: center; + } +} + +.navbar-login-btn:hover { + color: white; +} + +.navbar-login-btn svg { + display: none; +} + +.teal-btn { + padding: 6px 12px; + border-radius: 6px; + font-family: Barlow; + font-size: 14px; + font-weight: 700; + line-height: 20px; + background-color: #16A394; + letter-spacing: 0em; + border: 1px solid rgb(22, 163, 148); + transition: all var(--ifm-transition-fast) var(--ifm-transition-timing-default); + text-align: center; + color: white; +} + +.teal-btn:hover { + border: 1px solid rgb(24, 115, 103); + background-color: rgb(24, 115, 103); + color: white; +} + + +/* TABS */ +.tabs-container { + width: fit-content; + max-width: 100%; +} + +.tabs-container > div:has(.code-children) { + padding: 0; +} + +:root[data-theme='light'] .tabs-container > div { + border-color: #E2E8F0; +} +.tabs-container > div { + padding: 32px; + margin-top: 0 !important; + background-color: var(--main-bgd-color); + border: 1px solid var(--ifm-tabs-bg-color-active); + border-radius: 0px 8px 8px; + font-family: Inter; + font-size: 14px; + font-weight: 400; + line-height: 20px; + letter-spacing: 0em; + text-align: left; +} + +.tabs-container p { + margin: 0; +} + +.tabs__item { + padding: 6px 12px; + margin-right: 4px; + font-weight: 600; + font-size: 0.875rem; + align-items: center; + border-radius: 4px 4px 0px 0px !important; + background-color: var(--ifm-tabs-bg-color); + border: none !important; + /* color: rgb(113, 128, 150); */ + cursor: pointer; + -webkit-box-align: center; + align-items: center; + display: flex; +} + +.tabs__item:hover { + background: var(--ifm-tabs-bg-color-active); + color: var(--ifm-tabs-color-active); +} + +.tabs__item--active { + background: var(--ifm-tabs-bg-color-active); + color: var(--ifm-tabs-color-active); +} + +.tabs__item--active:hover { + background: var(--ifm-tabs-bg-color-active); + color: var(--ifm-tabs-color-active); +} + +.table-of-contents { + border: none; +} +.table-of-contents li { + padding: 0.75rem 0px 0px; + margin: 0; + line-height: 0; +} +.table-of-contents > li { + padding-top: 1.25rem; +} +.table-of-contents::before { + content: "On this page"; + font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: bold; + font-size: 0.875rem; + line-height: 100%; + letter-spacing: 0.01em; + text-transform: uppercase; + color: var(--ifm-color-content); + margin: 0px; +} +@media (max-width: 996px) { + .table-of-contents::before { + content: unset; + } +} + +.table-of-contents__link:not(:has(> code)) { + background-image: linear-gradient(currentColor,var(--dark-color)); + background-position: 0% 100%; +} +.table-of-contents__link { + text-decoration: none; + color: rgb(113, 128, 150); + font-size: 0.875rem; + line-height: 1rem; + display: inline; + width: fit-content; + background-repeat: no-repeat; + background-size: 0% 2px; + transition: background-size 0.7s ease 0s; +} +@media (prefers-color-scheme: dark) { + .table-of-contents__link { + color: rgb(160, 174, 192); + } +} + +.table-of-contents__link--active { + background-size: 100% 2px; +} + +.DocSearch-Button:hover { + background: var(--docsearch-searchbox-background); +} + +.theme-doc-sidebar-item-link-level-2:first-of-type { + display: none; +} + +.main-wrapper { + background-color: var(--ifm-background-color); + /* background-color: var(--main-bgd-color); */ +} + +.pagination-nav__link { + border: 1px solid var(--border-color); +} + +.pagination-nav__sublabel { + color: var(--ifm-color-content); +} + +.theme-doc-markdown > p { + color: var(--ifm-color-content); +} + +@media (max-width: 996px) { +.navbar-sidebar__brand { + padding-left: 16px; + padding-right: 16px; + } +} + +@media (max-width: 996px) { +.navbar-sidebar__brand > .margin-right--md { + margin-left: auto; + } +} + +@media (max-width: 996px) { +.navbar-sidebar__brand > .navbar-sidebar__close { + margin-left: unset; + } +} + +.mantine-Modal-header .mantine-Text-root { + -webkit-tap-highlight-color: transparent; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: inherit; + text-decoration: none; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-weight: 700; + font-size: 1.375rem !important; + line-height: 1.4; + margin: 0px; +} + +.mantine-Modal-header .mantine-Image-image { + margin-bottom: 0 !important; + margin-top: 0 !important; + width: revert !important; + height: revert !important; +} + +.mantine-Modal-body >div:last-child .mantine-Text-root { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + -webkit-tap-highlight-color: transparent; + color: rgb(134, 142, 150); + font-size: 0.75rem !important; + line-height: 1.55; + text-decoration: none; + font-weight: 500; +} + +.mantine-Image-image { + width: 40px !important; + height: 40px !important; + margin-bottom: -8px !important; + margin-top: -3px !important; +} + +.preview-badge ::after{ + position: absolute; + right: 0px; + font-size: 12px; + font-style: normal; + font-weight: 600; + color: var(--badge-color); + background: var(--badge-bg-color); + border-radius: 5px; + padding: 2px 5px; + text-transform: capitalize; + content: "Preview" +} + + +.table-of-contents__link--active.table-of-contents__link--active:hover code { + color: white !important; +} + +.table-of-contents__link:hover, .table-of-contents__link:hover code { + color: rgb(26, 32, 44) !important; +} + +.table-of-contents__link--active code { + color: white; + background: var(--dark-color); +} + +.pagination-nav__label { + color: var(--main-font-color); +} + +/* Buttons */ + +.button { + border-color: var(--ifm-btn-border-color); + padding: 24px 16px !important; + background-color: transparent; + color: var(--main-font-color); + display: flex; + gap: 10px; + width: fit-content; + align-items: center; +} + +.button:hover { + border-color: var(--ifm-btn-border-color-active); + color: var(--main-font-color); +} + +.button p { + font-family: Barlow !important; + font-size: 18px !important; + font-weight: 600; + line-height: 24px; + margin: 0; + text-align: left; +} + +.hidden-sidebar { + display: none !important; +} + +.theme-doc-markdown { + position: relative; +} + +.top-section { + right: 0; + display: flex; + justify-content: space-between; + align-items: start; + flex-direction: column; +} +@media (min-width: 996px) { + .top-section { + flex-direction: row; + } +} + +.theme-doc-markdown > h1, +.theme-doc-markdown > header > h1 { + font-family: Barlow, system-ui, Arial, sans-serif; + font-style: normal; + font-weight: bold; + letter-spacing: -0.02em; + color: var(--primary-font-color); + margin: 4px 0px 0px; + font-size: 2.5rem !important; + --ifm-h1-font-size: 2.5rem !important; +} + +.tech-select__single-value a { + margin: 2px; + padding-bottom: 2px; + padding-top: 2px; + visibility: visible; + /* color: rgb(51, 51, 51); */ + /* color: var(--gray-900); */ + color: inherit; + flex: 1 1 auto; + display: inline-grid; + grid-area: 1 / 1 / 2 / 3; + grid-template-columns: 0px min-content; + box-sizing: border-box; +} + +.tech-select__option a { + color: inherit !important; + background: transparent; + width: 100%; +} +.tech-select__option { + color: var(--gray-800); + background: transparent; + transition: none !important; + cursor: pointer; +} + + +.tech-select__option:hover{ + color: var(--gray-100) !important; + background-color: #2584ff; +} + +.tech-select__option--is-selected { + color: var(--gray-100); + transition: none !important; + background-color: #2584ff; +} + +@media (prefers-color-scheme: dark) { + .select-container { + .tech-select__control { + background-color: var(--gray-800); + border-color: var(--gray-700); + } + .tech-select__single-value { + color: var(--gray-100); + } + .tech-select__menu { + background-color: var(--gray-800); + + .tech-select__option { + background-color: var(--gray-800); + color: var(--gray-100); + &:hover { + background-color: var(--gray-700); + color: var(--gray-100); + } + } + } + } + [data-theme='light'] { + .select-container { + .tech-select__control { + background-color: transparent; + border-color: hsl(0, 0%, 80%); + } + .tech-select__single-value { + color: rgb(51, 51, 51); + } + .tech-select__menu { + background-color: transparent; + + .tech-select__option { + background-color: var(--gray-100); + color: rgb(51, 51, 51); + &:hover { + background-color: #2584ff; + color: var(--gray-100); + } + } + .tech-select__option--is-selected { + color: var(--gray-100); + background-color: #2584ff; + } + } + } + } +} + +[data-theme='dark'] { + .select-container { + .tech-select__control { + background-color: var(--gray-800); + border-color: var(--gray-700); + } + .tech-select__single-value { + color: var(--gray-100); + } + .tech-select__menu { + background-color: var(--gray-800); + + .tech-select__option { + background-color: var(--gray-800); + color: var(--gray-100); + &:hover { + background-color: var(--gray-700); + color: var(--gray-100); + } + } + } + } + +} + +.DocSearch .DocSearch-HitsFooter > a { + display: none; +} + +.select-container { + > div:first-child { + height: 38px; + border-color: #e2e8f0; + border-radius: 5px; + } +} + +article h1, +article h2, +article h3, +article h4, +article h5, +article h6 { + font-size: revert; + font-family: 'Inter', sans-serif; + color: var(--main-font-color); + font-weight: 600; + text-decoration: none; +} + +#kapa-widget-container { + position: fixed; + bottom: 20px; + right: 20px; + padding: 0px; + border: 2px; + z-index: 199; +} +.mantine-Text-root { + font-size: 1rem !important; +} +#kapa-widget-container .mantine-Button-root { + border: 2px solid #71e8df !important; + border-radius: 8px; + height: 4rem !important; + width: 4rem !important; +} + +[data-collapsed] { + background: transparent; + padding: 0; + margin: var(--ifm-spacing-vertical) 0 !important; + border: none !important; + box-shadow: none; + position: relative; +} + +[data-collapsed] > * { + padding-left: 2rem !important; + color: var(--ifm-alert-color); + font-weight: 600; +} + +[data-collapsed] > summary::before { + left: 16px !important; + top: 0.25rem !important; +} + +[data-collapsed]::before { + content: ""; + position: absolute; + width: 8px; + height: 100%; + left: 0px; + background: rgb(247, 250, 252); + border-radius: 5px; +} + +.language-terminal code > * { + position: relative; + margin-left: 16px; + width: fit-content; +} +.language-terminal code > *::before { + position: absolute; + content: "$"; + left: var(--ifm-pre-padding); +} +.language-terminal code .token { + margin-left: var(--ifm-pre-padding); +} + +h2 code { + font-size: revert !important; +} + +.anchor code { + background: var(--code-inline-bgd-color); + border-radius: 5px; + color: var(--main-font-color); + display: inline-block; + font-family: JetBrainsMono; + font-size: 14px; + font-style: normal; + font-variant: no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual; + line-height: 24px; + padding: .05em .3em .2em; + vertical-align: baseline; + transform: translateY(-2px); +} + +.videoWrapper { + width: 100%; + max-width: 560px; + margin: 0 auto; +} + +.videoWrapper iframe { + width: 100%; +} + +@media (max-width: 996px) { + .clean-btn { + z-index: 1; + font-weight: 600; + font-size: 18px; + position: relative; + } + .navbar { + position: relative; + } + .navbar::after { + content: ""; + height: 68px; + background-color: var(--ifm-navbar-background-color); + z-index: 0; + position: absolute; + left: 0; + width: 100%; + top: 100%; + } + + .navbar-sidebar__items:not(.navbar-sidebar__items--show-secondary) .menu__list { + border: none; + } + .navbar-sidebar__items:not(.navbar-sidebar__items--show-secondary) .menu__link--active { + text-align: left; + margin-left: 10px; + background: var(--navbar-tab-bg); + display: inline-block; + padding: 8px; + border-radius: 4px; + font-weight: 600; + } + .navbar-sidebar__items:not(.navbar-sidebar__items--show-secondary) .menu__link:not(.menu__link--active) { + font-family: Inter; + font-size: 14px; + font-weight: 600; + margin-left: 10px; + line-height: 18px; + letter-spacing: 0em; + text-align: left; + } + .menu__link:not(.navbar-login-btn):not(.menu__link--active) { + color: var(--ifm-navbar-link-color); + } + .menu__link { + font-size: 16px !important; + } + .navbar-sidebar__items > .menu:first-child .menu__link { + padding: 8px; + } + .menu__caret { + top: 6px; + + } + .theme-doc-sidebar-item-category-level-1.menu__list-item { + margin-top: 0 !important; + } + .menu__list-item-collapsible > a:not([href]), .firstTitle > div > a { + font-size: 20px !important; + } + .navbar-sidebar--show .logo-link { + display: none !important; + } + .navbar-sidebar { + z-index: 1; + } +} diff --git a/src/css/docsearch.css b/src/css/docsearch.css new file mode 100644 index 0000000000..b7556891a4 --- /dev/null +++ b/src/css/docsearch.css @@ -0,0 +1,128 @@ +/* SEARCH BAR STYLING */ + +[data-theme='light'] .DocSearch mark { + background: rgb(235, 248, 255); + padding: 2px; + font-weight: bold; + color: rgb(49, 130, 206) !important; +} + +[data-theme='dark'] .DocSearch mark { + background: rgba(235, 248, 255, 0.05); + padding: 2px; + font-weight: bold; + color: rgb(49, 130, 206) !important; +} + + +.DocSearch-HitsFooter > a { + display: none; +} + +.DocSearch-Hit-source { + display: none; +} +.DocSearch-Hit-icon { + display: none; +} +.DocSearch-Hit a { + /* padding: var(--docsearch-spacing); */ +} +.DocSearch-SearchBar { + margin-bottom: 16px; +} +.DocSearch-LoadingIndicator svg, .DocSearch-MagnifierLabel svg { + width: 16px !important; + height: 16px !important; +} +.DocSearch-LoadingIndicator svg, .DocSearch-MagnifierLabel svg path { + stroke: rgb(74, 85, 104); +} + +[data-theme='light'] .searchQueryInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module, .searchVersionInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module { + border-color: rgba(226, 232, 240, 1) !important; +} +.searchQueryInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module:focus, .searchVersionInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module:focus { + border-color: rgba(113, 128, 150, 1) !important; +} +[data-theme='dark'] .searchQueryInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module, .searchVersionInput_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module { + border-color: rgba(9, 10, 21, 1) !important; +} + +.algoliaLogo_node_modules-\@docusaurus-theme-search-algolia-lib-theme-SearchPage-styles-module { + filter: grayscale(100%); + opacity: 0.4; +} + +html[data-theme='light'] { + --ifm-toc-border-color: rgba(226, 232, 240, 1); + --docsearch-highlight-color: var(--docsearch-hit-background); + --docsearch-modal-width: 1248px; + + --docsearch-text-color: var(--ifm-font-color-base); + /* --docsearch-highlight-color: var(--teal-600); */ + --docsearch-searchbox-shadow: inset 0 0 0 2px #718096; + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgba(94, 100, 112, 0.7); + /* Modal */ + --docsearch-modal-background: var(--gray-200); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-color-secondary); + --docsearch-searchbox-focus-background: var(--ifm-color-white) !important; + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: rgb(49, 130, 206); + --docsearch-hit-background: var(--ifm-color-white); + /* Footer */ + --docsearch-footer-background: var(--ifm-color-white); +} +html[data-theme='dark'] { + --docsearch-modal-width: 1248px; + + --docsearch-text-color: var(--ifm-font-color-base); + --docsearch-muted-color: var(--gray-500); + --docsearch-container-background: rgba(47, 55, 69, 0.7); + /* Modal */ + --docsearch-modal-background: #090A15; + /* Search box */ + --docsearch-searchbox-background: var(--ifm-background-color); + --docsearch-searchbox-focus-background: var(--gray-800) !important; + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: rgb(49, 130, 206); + --docsearch-hit-background: var(--ifm-color-emphasis-100); + /* Footer */ + --docsearch-footer-background: #1A202C; + --docsearch-key-gradient: linear-gradient( + -26.5deg, + var(--ifm-color-emphasis-200) 0%, + var(--ifm-color-emphasis-100) 100% + ); + --docsearch-highlight-color: var(--docsearch-hit-background); + --docsearch-searchbox-shadow: inset 0 0 0 2px #718096; + --docsearch-footer-shadow: 0px -4px 8px 0px #00000033, 0px 1px 0px 0px #494C6A80 inset; + --docsearch-modal-shadow: 0px 3px 8px 0px #000309, 1px 1px 0px 0px #2C2E40 inset; +} +@media (prefers-color-scheme: dark) { + html[data-theme='dark'] { + --docsearch-modal-background: #090A15; + --docsearch-footer-background: #1A202C; + --docsearch-footer-shadow: 0px -4px 8px 0px #00000033, 0px 1px 0px 0px #494C6A80 inset; + --docsearch-modal-shadow: 0px 3px 8px 0px #000309, 1px 1px 0px 0px #2C2E40 inset; + --docsearch-muted-color: var(--gray-500); + --docsearch-searchbox-background: var(--ifm-background-color); + + --docsearch-key-shadow: inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,0.3); + --docsearch-searchbox-focus-background: var(--gray-800) !important; + } + html[data-theme='light'] { + --docsearch-footer-background: var(--ifm-color-white); + --docsearch-modal-background: var(--gray-200); + --docsearch-modal-shadow: inset 1px 1px 0 0 hsla(0,0%,100%,0.5),0 3px 8px 0 #555a64; + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-searchbox-background: var(--ifm-color-secondary); + + --docsearch-searchbox-focus-background: var(--ifm-color-white) !important; + --docsearch-key-shadow: inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,0.4); + } +} \ No newline at end of file diff --git a/src/css/gettingStarted.module.scss b/src/css/gettingStarted.module.scss new file mode 100644 index 0000000000..f14523214e --- /dev/null +++ b/src/css/gettingStarted.module.scss @@ -0,0 +1,160 @@ +.borderBox { + padding: 24px 24px 32px 24px; + border-radius: 8px; + background: var(--main-bgd-color); + a { + text-decoration: underline; + } + > * { + font-family: Inter; + text-align: left; + letter-spacing: 0em; + line-height: 20px; + font-size: 14px; + :first-child { + margin-top: 0; + } + :last-child { + margin-bottom: 0; + } + } +} + +.boxTitle { + font-family: Barlow, system-ui, Arial, sans-serif; + font-style: normal; + font-weight: bold; + font-size: 2.5rem !important; + line-height: 48px; + letter-spacing: -0.8px; +} + +.grid { + gap: 16px; + display: grid; + margin-top: 24px; + grid-template-columns: none; + @media (min-width: 600px) { + grid-template-columns: 1fr 1fr; + } + a { + + border-color: var(--ifm-btn-border-color); + background: transparent; + color: var(--main-font-color); + &:hover { + border-color: var(--ifm-btn-border-color-active); + background: transparent; + } + } +} + +.linkCardWrapper { + border: 1px solid var(--border-color); + padding: 20px 24px; + border-radius: 8px; + color: var(--main-font-color); + transition: all 300ms ease-out; + display: flex; + flex-direction: column; + text-decoration: none !important; + background: transparent; + &:hover { + border-color: var(--ifm-btn-border-color-active); + background: transparent; + } + .title { + display: inline-block; + h6 { + font-size: 18px; + display: inline-block; + margin: 0; + font-family: Barlow; + font-weight: 600; + line-height: 24px; + letter-spacing: 0px; + text-align: left; + } + } + p { + font-family: Inter; + font-size: 14px; + font-weight: 400; + line-height: 20px; + letter-spacing: 0em; + margin-bottom: 0; + text-align: left; + } +} + +.tab { + padding: 15px; + background-color: var(--main-bgd-color); + border: 1px solid var(--indigo-600); + border-radius: 0px 8px 8px 8px; + font-family: Inter; + font-size: 14px; + font-weight: 400; + line-height: 20px; + letter-spacing: 0em; + text-align: left; + p { + margin-top: 0; + } +} + +.squareWrapper { + width: 90px; + height: 90px; + text-decoration: none; + padding: 22px; + display: inline-block; + border: 1px solid var(--border-color); + background: var(--header-bg-color); + border-radius: 8px; + transition: all 300ms ease-out; + cursor: pointer; + + border-color: var(--ifm-btn-border-color); + background: transparent; + color: var(--main-font-color); + &:hover { + border-color: var(--ifm-btn-border-color-active); + background: transparent; + } + &:active, + &:focus { + background: var(--code-inline-bgd-color); + border-color: var(--indigo-700); + } + img { + width: 100%; + height: 100%; + margin-bottom: 0; + object-fit: contain; + } +} + +.list { + display: grid; + gap: 16px; + margin-top: 16px; + justify-content: space-between; + grid-template-columns: repeat(2, auto); + @media (min-width: 1240px) { + grid-template-columns: repeat(6, auto); + } + @media (min-width: 1025px) and (max-width: 1240px) { + grid-template-columns: repeat(3, auto); + } + @media (min-width: 768px) and (max-width: 1025px) { + grid-template-columns: repeat(6, auto); + } + @media (min-width: 480px) and (max-width: 768px) { + grid-template-columns: repeat(4, auto); + } + @media (min-width: 410px) and (max-width: 479px) { + grid-template-columns: repeat(3, auto); + } + +} \ No newline at end of file diff --git a/src/css/primitives.ts b/src/css/primitives.ts new file mode 100644 index 0000000000..94f318527f --- /dev/null +++ b/src/css/primitives.ts @@ -0,0 +1,253 @@ +export const gray = { + "100": "#F7FAFC", + "200": "#EDF2F7", + "300": "#E2E8F0", + "400": "#CBD5E0", + "500": "#A0AEC0", + "600": "#718096", + "700": "#4A5568", + "800": "#2D3748", + "900": "#1A202C", +} +export const black = "#1A202C" + +export const blueGray = { + "100": "#F7FAFC", + "200": "#EDF2F7", + "300": "#E2E8F0", + "400": "#CBD5E0", + "500": "#A0AEC0", + "600": "#718096", + "700": "#4A5568", + "800": "#2D3748", + "900": "#1A202C", +} + +export const teal = { + "100": "#D9F9F6", + "200": "#B7F4EE", + "300": "#92EFE6", + "400": "#71E8DF", + "500": "#04C8BB", + "600": "#16A394", + "700": "#187367", + "800": "#154F47", + "900": "#154F47", +} + +export const purple = { + "100": "#FAE8FA", + "200": "#F5C9F4", + "300": "#F4A0F1", + "400": "#E76DE3", + "500": "#C742C1", + "600": "#B024AD", + "700": "#891A8A", + "800": "#5B115F", + "900": "#5B115F", +} + +export const indigo = { + "100": "#EBF4FF", + "200": "#C3DAFE", + "300": "#A3BFFA", + "400": "#7F9CF5", + "500": "#667EEA", + "600": "#5A67D8", + "700": "#4C51BF", + "800": "#434190", + "900": "#434190", +} + +export const green = { + "100": "#F0FFF4", + "200": "#C6F6D5", + "300": "#9AE6B4", + "400": "#68D391", + "500": "#48BB78", + "600": "#38A169", + "700": "#276749", + "800": "#22543D", + "900": "#22543D", +} + +export const orange = { + "100": "#FFFAF0", + "200": "#FEEBC8", + "300": "#FBD38D", + "400": "#F6AD55", + "500": "#ED8936", + "600": "#DD6B20", + "700": "#C05621", + "800": "#9C4221", + "900": "#9C4221", +} + +export const red = { + "100": "#FFF5F5", + "200": "#FED7D7", + "300": "#FEB2B2", + "400": "#FC8181", + "500": "#F56565", + "600": "#E53E3E", + "700": "#C53030", + "800": "#9B2C2C", + "900": "#9B2C2C", +} + +export const pink = { + "100": "#FFF5F7", + "200": "#FED7E2", + "300": "#FBB6CE", + "400": "#F687B3", + "500": "#ED64A6", + "600": "#D53F8C", + "700": "#B83280", + "800": "#97266D", + "900": "#702459", +} + +export const blue = { + "100": "#EBF8FF", + "200": "#BEE3F8", + "300": "#90CDF4", + "400": "#63B3ED", + "500": "#4299E1", + "600": "#3182CE", + "700": "#2B6CB0", + "800": "#2C5282", + "900": "#2A4365", +} + +export const yellow = { + "100": "#FFFFF0", + "200": "#FEFCBF", + "300": "#FAF089", + "400": "#F6E05E", + "500": "#ECC94B", + "600": "#D69E2E", + "700": "#B7791F", + "800": "#975A16", + "900": "#744210", +} + +export const colors = { + gray, + red, + indigo, + teal, + blueGray, + green, + purple, + orange, + pink, + yellow, + black, + white: "#fff", + blue, + text: { + primary: `white`, + secondary: `#E2E8F0`, + terciary: `#A0AEC0`, + disabled: `#4A5568`, + darkPrimary: gray[800], + darkSecondary: gray[600] + }, + surface: { + primary: "#090A15", + brand: { + gray: "#1A202C", + darker: "#7F9CF5", + light: "#282B6B", + default: "#5A67D8" + } + } +} + +export const fonts = { + text: `"Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`, + display: `"Barlow", system-ui, Arial, sans-serif`, + mono: `"JetBrains Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace`, + heading: `'Barlow', sans-serif`, +} + +export const baseFontSizes = { + 12: ".75rem", + 14: ".875rem", + 16: "1rem", + 18: "1.125rem", + 20: "1.25rem", + 22: "1.375rem", + 24: "1.5rem", + 26: "1.625rem", + 28: "1.75rem", + 30: "1.875rem", + 32: "2rem", + 36: "2.25rem", + 38: "2.375rem", + 40: "2.5rem", + 48: "3rem", + 56: "3.5rem", + 64: "4rem", + 72: "4.5rem", +} + +export const fontSizes = { + ...baseFontSizes, + small: baseFontSizes[14], + body: baseFontSizes[16], + large: baseFontSizes[20], + display: baseFontSizes[48], + displaySmall: baseFontSizes[24], + displayLarge: baseFontSizes[72], +} + +export const baseSpace = { + 0: "0rem", + 1: "1px", + 2: "0.125rem", + 4: "0.25rem", + 5: `${5 / 16}rem`, // Maybe don't use this even though it's from design? + 6: `${6 / 16}rem`, // Maybe don't use this even though it's from design? + 8: "0.5rem", + 12: "0.75rem", + 14: "0.875rem", + 15: `${15 / 16}rem`, + 16: "1rem", + 18: "1.125rem", + 20: "1.25rem", + 22: "1.375rem", + 24: "1.5rem", + 26: `${26 / 16}rem`, + 30: `${30 / 16}rem`, + 32: "2rem", + 40: "2.5rem", + 45: `${45 / 16}rem`, + 48: "3rem", + 64: "4rem", + 80: "5rem", + 96: "6rem", + 128: "8rem", + 160: "10rem", + 192: "12rem", + 224: "14rem", + 256: "16rem", +} + +export const space = { + ...baseSpace, + none: baseSpace[0], + one: baseSpace[1], + small: baseSpace[8], + medium: baseSpace[12], + large: baseSpace[20], +} + +export const breakpoints = { + mobile: 360, + tabletVertical: 768, + desktopSmall: 940, + tabletHorizontal: 1024, + desktopLarge: 1440, + +} \ No newline at end of file diff --git a/src/css/prism.css b/src/css/prism.css new file mode 100644 index 0000000000..ffe04df2ec --- /dev/null +++ b/src/css/prism.css @@ -0,0 +1,194 @@ +.pre-highlight { + position: relative; +} + +code[class*='language-'], +pre[class*='language-'], +pre[class*='language-'] code { + color: var(--main-font-color) !important; + font-family: 'JetBrainsMono', SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', + 'Courier New', monospace; + font-variant: no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual; + font-size: 14px; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + + border-radius: 8px; + display: inline-grid; + grid-template-rows: max-content; + width: 100%; + overflow: auto; +} + +code[class*='language-'].is-terminal, +pre[class*='language-'].is-terminal, +pre[class*='language-'].is-terminal code { + background-color: var(--main-font-color) !important; + color: var(--code-inline-bgd-color) !important; +} + +code[class*='language-'].is-terminal::selection, +pre[class*='language-'].is-terminal::selection, +code[class*='language-'].is-terminal ::selection, +pre[class*='language-'].is-terminal ::selection { + background-color: #a0aec0; +} + +@media (prefers-color-scheme: dark) { + + code[class*='language-'].is-terminal, + pre[class*='language-'].is-terminal, + pre[class*='language-'].is-terminal code { + background-color: #2d3748 !important; + color: var(--main-font-color) !important; + } +} + +.is-terminal .line-no { + color: var(--header-btn-color) !important; +} + +.is-terminal .copy-button svg rect { + fill: var(--tag-media-color); +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em 0 0 0; + margin: 0; + overflow: auto; +} + +pre[class*='language-'] > code { + padding-bottom: 1em; +} + +:not(pre)>code[class*='language-'], +pre[class*='language-'] { + background: var(--code-bgd-color) !important; +} + +/* Inline code */ +:not(pre)>code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +code.inline-code, +.inline-code, +inlinecode { + display: inline; + vertical-align: baseline; + padding: 0.05em 0.3em 0.2em 0.3em; + background: var(--code-inline-bgd-color); + font-size: 14px; + font-feature-settings: 'clig' 0, 'calt' 0; + font-variant: no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual; + font-family: 'JetBrainsMono'; + font-style: normal; + line-height: 24px; + border-radius: 5px; + color: var(--main-font-color); + font-weight: 500; +} + +inlinecode { + font-size: inherit; +} + +.inline-code { + background-color: var(--border-color); +} + +.top-section h1 inlinecode { + font-size: 2rem; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: var(--code-inner-color) !important; + font-style: normal !important; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.type-args, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: var(--code-token4-color) !important; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: var(--code-token5-color) !important; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: var(--code-token6-color) !important; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: var(--code-token1-color) !important; +} + +.token.function, +.token.class-name, +.token[class*='class-name'], +.token.boolean { + color: var(--code-token2-color) !important; +} + +.token.regex, +.token.important, +.token.variable { + color: var(--code-token7-color) !important; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.annotation { + color: var(--code-token3-color) !important; +} \ No newline at end of file diff --git a/src/css/theming.css b/src/css/theming.css new file mode 100644 index 0000000000..76594a6057 --- /dev/null +++ b/src/css/theming.css @@ -0,0 +1,465 @@ + +/* You can override the default Infima variables here. */ +/* PRIMITIVES */ +.details_node_modules-\@docusaurus-theme-classic-lib-theme-Details-styles-module { + --docusaurus-details-decoration-color: transparent !important; +} +:root { + --docsearch-modal-width: 1248px; + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 14px; + --ifm-menu-link-sublist-icon: url("/icons/triangle-right.svg"); + --ifm-breadcrumb-separator: url("/icons/breadcrumb.svg"); + --navbar-teal-color: rgb(24, 115, 103); + --navbar-tab-bg: rgb(237, 242, 247); + --navbar-indigo-color: rgb(76, 81, 191); + --ifm-navbar-height: 80px; + --ifm-color-content: #2D3748; + --ifm-breadcrumb-spacing: 4px; + --ifm-navbar-link-color: rgb(45, 55, 72); + --ifm-footer-background-color: rgb(26, 32, 44); + --ifm-navbar-link-hover-color: rgb(45, 55, 72); + --ifm-link-hover-decoration: none; + --ifm-hover-overlay: var(--indigo-700); + --ifm-color-primary: var(--indigo-600); + --ifm-heading-color: var(--ifm-color-content); + --ifm-menu-color-background-active: var(--main-bgd-color); + --ifm-navbar-sidebar-width: 384px; + --ifm-spacing-horizontal: 8px; + --ifm-pagination-nav-color-hover: #718096; + --ifm-card-background-color: white; + --ifm-link-hover-color: #2E5297; + --code-bg: var(--gray-200); + --docusaurus-added-code-line-bg: rgba(71, 187, 120, 0.1); + --docusaurus-deleted-code-line-bg: rgba(229, 62, 62, 0.1); + --docusaurus-edited-code-line-bg: rgba(10, 104, 255, 0.2); + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.05); + --ifm-blockquote-border-color: transparent; + --ifm-toc-padding-horizontal: 1rem; + --docusaurus-details-decoration-color: transparent; + + --ifm-btn-border-color-active: #718096; + --ifm-btn-border-color: #E2E8F0; + + --ifm-tabs-color-active: #fff; + --ifm-tabs-bg-color: #E2E8F0; + --ifm-tabs-bg-color-active: #718096; + --ifm-tabs-color: #718096; + --main-font-color: #2d3748; + --primary-font-color: var(--gray-800); + --secondary-font-color: #4a5568; + --icon-svg-color: #5A67D8; + --icon-wrapper-bg: rgb(235, 244, 255); + --teal-link-color: #16A394; + --indigo-link-color: #5A67D8; + --teal-card-bg: linear-gradient(102deg, #FFF 6.22%, #E8FFFD 87.23%); + --indigo-card-bg: linear-gradient(102deg, #FFF 6.22%, #F4F5FF 87.23%); + --orm-card-bg: #fff; + --grid-border-color: #cbd5e0; + --community-bgd-color: var(--gray-100); + --shadow-card-bg: #fff; + --badge-bg-color: rgb(237, 242, 247); + --badge-color: rgb(160, 174, 192); + + --main-bgd-color: #f7fafc; + --header-bg-color: #ffffff; + --selection-bgd-color: #0c344b; + --white-color: #ffffff; + --link-color: #3182ce; + --border-color: #e2e8f0; + --code-bgd-color: #f6f8fa; + --code-inline-bgd-color: #edf2f7; + --list-bullet-color: #a0aec0; + --search-highlight-bg-color: #ebf8ff; + --tag-media-color: #2d3748; + --gradient1-color: #2f3747; + --gradient2-color: #0d0f14; + --header-btn-color: #4a5568; + --ifm-footer-background-color: rgb(26, 32, 44); + --footer-bottom-height: 75px; + --brand-primary: rgb(90, 103, 216); + --ifm-hover-overlay: var(--indigo-700); + /* Code blocks */ + --code-inner-color: #718096; + --code-token1-color: #d5408c; + --code-token2-color: #805ad5; + --code-token3-color: #319795; + --code-token4-color: #dd6b21; + --code-token5-color: #690; + --code-token6-color: #9a6e3a; + --code-token7-color: #e90; + --code-linenum-color: #cbd5e0; + --code-added-color: #47bb78; + --code-added-bg-color: #d9f4e6; + --code-deleted-color: #e53e3e; + --code-deleted-bg-color: #f5e4e7; + --code-highlight-color: #a0aec0; + --code-highlight-bg-color: #e2e8f0; + --code-edit-bg-color: #c3dafe; + --code-result-bg-color: #e7edf3; + --ifm-color-primary: var(--indigo-600); + /* Buttons */ + --red-color: #ff4f56; + --green-color: #15bd76; + --grey-color: #3d556b; + --grey-bg-color: #8fa6b2; + --dark-color: rgb(12, 52, 75); + + margin: 0; + font-family: 'Inter', sans-serif; + font-weight: normal; + word-wrap: break-word; + color: var(--main-font-color); + background-color: var(--white-color); + + --homepage-header-bg: rgb(247, 250, 252); + /* Colors */ + --indigo-100: #EBF4FF; + --indigo-200: #C3DAFE; + --indigo-300: #A3BFFA; + --indigo-400: #7F9CF5; + --indigo-500: #667EEA; + --indigo-600: #5A67D8; + --indigo-700: #4C51BF; + --indigo-700: #434190; + + --gray-100: #F7FAFC; + --gray-200: #EDF2F7; + --gray-300: #E2E8F0; + --gray-400: #CBD5E0; + --gray-500: #A0AEC0; + --gray-600: #718096; + --gray-700: #4A5568; + --gray-800: #2D3748; + --gray-900: #1A202C; + --gray-1000: #090a15; + @media (max-width: 996px) { + --ifm-menu-link-sublist-icon: url("/icons/chevron-up-solid.svg"); + --ifm-navbar-padding-horizontal: 0; + } +} +:root[data-theme='light'] { + --docusaurus-added-code-line-bg: rgba(71, 187, 120, 0.1); + --docusaurus-deleted-code-line-bg: rgba(229, 62, 62, 0.1); + --docusaurus-edited-code-line-bg: rgba(10, 104, 255, 0.2); +} +/* For readability concerns, you should choose a lighter palette in dark mode. */ +/* PRIMITES WITH THEME DEFINED BY TOGGLER */ +html[data-theme='dark'] { + --ifm-blockquote-border-color: transparent; + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --navbar-teal-color: rgb(113, 232, 223); + --navbar-tab-bg: rgb(45, 55, 72); + --navbar-indigo-color: rgb(127, 156, 245); + --ifm-color-content: rgb(247, 250, 252); + --ifm-navbar-link-color: #e2e8f0; + --ifm-footer-background-color: rgb(26, 32, 44); + --code-bg: #1A202C; + --ifm-hover-overlay: var(--indigo-700); + /* Generic */ + --ifm-btn-border-color-active: #718096; + --ifm-btn-border-color: #2D3748; + --ifm-tabs-color: #A0AEC0; + --ifm-tabs-bg-color: #1A202C; + --ifm-tabs-bg-color-active: #2D3748; + --main-font-color: #e2e8f0; + --primary-font-color: rgb(247, 250, 252); + --secondary-font-color: rgb(203, 213, 224); + --icon-wrapper-bg: rgb(90, 103, 216); + --icon-svg-color: #F7FAFC; + --teal-link-color: #71E8DF; + --indigo-link-color: #7F9CF5; + --teal-card-bg: linear-gradient(128deg, #090A15 31.75%, #0D3A38 112.39%); + --indigo-card-bg: linear-gradient(128deg, #090A15 31.75%, #181A48 112.39%); + --orm-card-bg: var(--gray-900); + --grid-border-color: var(--gray-700); + --community-bgd-color: var(--gray-900); + --shadow-card-bg: var(--gray-900); + --badge-color: rgb(247, 250, 252); + --badge-bg-color: rgb(45, 55, 72); + --ifm-card-background-color: var(--gray-900); + --ifm-link-hover-color: #5196d7; + + --main-bgd-color: #1a202c; + --border-color: #2d3748; + --header-bg-color: #1a202c; + --selection-bgd-color: #0c344b; + --white-color: #ffffff; + --link-color: #3182ce; + --code-bgd-color: #2d3748; + --code-inline-bgd-color: #2d3748; + --list-bullet-color: #a0aec0; + --search-highlight-bg-color: #ebf8ff; + --tag-media-color: #2d3748; + --gradient1-color: #2f3747; + --gradient2-color: #0d0f14; + --header-btn-color: #4a5568; + --navbar-teal-color: rgb(113, 232, 223); + --navbar-tab-bg: rgb(45, 55, 72); + --navbar-indigo-color: rgb(127, 156, 245); + --ifm-color-content: rgb(247, 250, 252); + --ifm-navbar-background-color: var(--gray-1000); + --ifm-navbar-link-color: #e2e8f0; + /* Code blocks */ + --code-inner-color: #718096; + --code-token1-color: #d5408c; + --code-token2-color: #805ad5; + --code-token3-color: #319795; + --code-token4-color: #dd6b21; + --code-token5-color: #690; + --code-token6-color: #9a6e3a; + --code-token7-color: #e90; + --code-linenum-color: #cbd5e0; + --code-added-color: #47bb78; + --code-added-bg-color: #d9f4e6; + --code-deleted-color: #e53e3e; + --code-deleted-bg-color: #f5e4e7; + --code-highlight-color: #a0aec0; + --code-highlight-bg-color: #4a5568; + --code-edit-bg-color: #c3dafe; + --code-result-bg-color: #e7edf3; + /* Buttons */ + --red-color: #ff4f56; + --green-color: #15bd76; + --grey-color: #3d556b; + --grey-bg-color: #8fa6b2; + --dark-color: rgb(12, 52, 75); + --homepage-header-bg: var(--gray-900); +} + +/* PRIMITES WITH THEME DEFINED */ +@media (prefers-color-scheme: dark) { + /* Theme: Dark OS + Light docs = Light docs */ + :root[data-theme='light'] { + --ifm-color-primary: #2e8555; + --ifm-background-color: #fff; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --main-font-color: #2d3748; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 14px; + --ifm-breadcrumb-separator: url("/icons/breadcrumb.svg"); + --navbar-teal-color: rgb(24, 115, 103); + --navbar-tab-bg: rgb(237, 242, 247); + --navbar-indigo-color: rgb(76, 81, 191); + --ifm-navbar-height: 80px; + --ifm-color-content: #2D3748; + --ifm-breadcrumb-spacing: 4px; + --ifm-navbar-link-color: rgb(45, 55, 72); + --ifm-footer-background-color: rgb(26, 32, 44); + --ifm-navbar-link-hover-color: rgb(45, 55, 72); + --ifm-link-hover-decoration: none; + --ifm-hover-overlay: var(--indigo-700); + --ifm-color-primary: var(--indigo-600); + --ifm-heading-color: var(--ifm-color-content); + --ifm-navbar-background-color: #fff; + --docsearch-key-shadow: inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,0.4); + --code-bg: var(--gray-200); + --ifm-tabs-color: #718096; + --ifm-tabs-bg-color: #E2E8F0; + --ifm-tabs-bg-color-active: #718096; + --ifm-btn-border-color-active: #718096; + --ifm-btn-border-color: #E2E8F0; + + --ifm-card-background-color: white; + --main-font-color: #2d3748; + --secondary-font-color: #4a5568; + --primary-font-color: var(--gray-800); + --icon-wrapper-bg: rgb(235, 244, 255); + --icon-svg-color: #5A67D8; + --teal-link-color: #16A394; + --indigo-link-color: #5A67D8; + --teal-card-bg: linear-gradient(102deg, #FFF 6.22%, #E8FFFD 87.23%); + --indigo-card-bg: linear-gradient(102deg, #FFF 6.22%, #F4F5FF 87.23%); + --orm-card-bg: #fff; + --grid-border-color: #cbd5e0; + --community-bgd-color: var(--gray-100); + --shadow-card-bg: #fff; + --badge-bg-color: rgb(237, 242, 247); + --badge-color: rgb(160, 174, 192); + + --main-bgd-color: #f7fafc; + --header-bg-color: #ffffff; + --selection-bgd-color: #0c344b; + --white-color: #ffffff; + --link-color: #3182ce; + --border-color: #e2e8f0; + --code-bgd-color: #f6f8fa; + --code-inline-bgd-color: #edf2f7; + --list-bullet-color: #a0aec0; + --search-highlight-bg-color: #ebf8ff; + --tag-media-color: #2d3748; + --gradient1-color: #2f3747; + --gradient2-color: #0d0f14; + --header-btn-color: #4a5568; + --ifm-footer-background-color: rgb(26, 32, 44); + --footer-bottom-height: 75px; + --ifm-link-hover-color: #2E5297; + --brand-primary: rgb(90, 103, 216); + --ifm-hover-overlay: var(--indigo-700); + /* Code blocks */ + --code-inner-color: #718096; + --code-token1-color: #d5408c; + --code-token2-color: #805ad5; + --code-token3-color: #319795; + --code-token4-color: #dd6b21; + --code-token5-color: #690; + --code-token6-color: #9a6e3a; + --code-token7-color: #e90; + --code-linenum-color: #cbd5e0; + --code-added-color: #47bb78; + --code-added-bg-color: #d9f4e6; + --code-deleted-color: #e53e3e; + --code-deleted-bg-color: #f5e4e7; + --code-highlight-color: #a0aec0; + --code-highlight-bg-color: #e2e8f0; + --code-edit-bg-color: #c3dafe; + --code-result-bg-color: #e7edf3; + --ifm-color-primary: var(--indigo-600); + /* Buttons */ + --red-color: #ff4f56; + --green-color: #15bd76; + --grey-color: #3d556b; + --grey-bg-color: #8fa6b2; + --dark-color: rgb(12, 52, 75); + + margin: 0; + font-family: 'Inter', sans-serif; + font-weight: normal; + word-wrap: break-word; + color: var(--main-font-color); + background-color: var(--white-color); + --homepage-header-bg: rgb(247, 250, 252); + /* Colors */ + --indigo-100: #EBF4FF; + --indigo-200: #C3DAFE; + --indigo-300: #A3BFFA; + --indigo-400: #7F9CF5; + --indigo-500: #667EEA; + --indigo-600: #5A67D8; + --indigo-700: #4C51BF; + --indigo-700: #434190; + + --gray-100: #F7FAFC; + --gray-200: #EDF2F7; + --gray-300: #E2E8F0; + --gray-400: #CBD5E0; + --gray-500: #A0AEC0; + --gray-600: #718096; + --gray-700: #4A5568; + --gray-800: #2D3748; + --gray-900: #1A202C; + --gray-1000: #090a15; + } + :root[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --navbar-teal-color: rgb(113, 232, 223); + --navbar-tab-bg: rgb(45, 55, 72); + --navbar-indigo-color: rgb(127, 156, 245); + --ifm-color-content: rgb(247, 250, 252); + --ifm-navbar-link-color: #e2e8f0; + --ifm-footer-background-color: rgb(26, 32, 44); + --ifm-hover-overlay: var(--indigo-700); + /* Generic */ + + + --ifm-btn-border-color-active: #718096; + --ifm-btn-border-color: #2D3748; + --ifm-tabs-color: #A0AEC0; + --ifm-tabs-bg-color: #1A202C; + --ifm-tabs-bg-color-active: #2D3748; + --main-font-color: #e2e8f0; + --primary-font-color: rgb(247, 250, 252); + --secondary-font-color: rgb(203, 213, 224); + --icon-wrapper-bg: rgb(90, 103, 216); + --icon-svg-color: #F7FAFC; + --teal-link-color: #71E8DF; + --indigo-link-color: #7F9CF5; + --teal-card-bg: linear-gradient(128deg, #090A15 31.75%, #0D3A38 112.39%); + --indigo-card-bg: linear-gradient(128deg, #090A15 31.75%, #181A48 112.39%); + --orm-card-bg: var(--gray-900); + --grid-border-color: var(--gray-700); + --community-bgd-color: var(--gray-900); + --shadow-card-bg: var(--gray-900); + --badge-color: rgb(247, 250, 252); + --badge-bg-color: rgb(45, 55, 72); + --code-bg: #1A202C; + + --ifm-card-background-color: var(--gray-900); + --main-bgd-color: #1a202c; + --border-color: #2d3748; + --header-bg-color: #1a202c; + --selection-bgd-color: #0c344b; + --white-color: #ffffff; + --link-color: #3182ce; + --ifm-link-hover-color: #5196d7; + --code-bgd-color: #2d3748; + --code-inline-bgd-color: #2d3748; + --list-bullet-color: #a0aec0; + --search-highlight-bg-color: #ebf8ff; + --tag-media-color: #2d3748; + --gradient1-color: #2f3747; + --gradient2-color: #0d0f14; + --header-btn-color: #4a5568; + --navbar-teal-color: rgb(113, 232, 223); + --navbar-tab-bg: rgb(45, 55, 72); + --navbar-indigo-color: rgb(127, 156, 245); + --ifm-color-content: rgb(247, 250, 252); + --ifm-navbar-background-color: var(--gray-1000); + --ifm-navbar-link-color: #e2e8f0; + /* Code blocks */ + --code-inner-color: #718096; + --code-token1-color: #d5408c; + --code-token2-color: #805ad5; + --code-token3-color: #319795; + --code-token4-color: #dd6b21; + --code-token5-color: #690; + --code-token6-color: #9a6e3a; + --code-token7-color: #e90; + --code-linenum-color: #cbd5e0; + --code-added-color: #47bb78; + --code-added-bg-color: #d9f4e6; + --code-deleted-color: #e53e3e; + --code-deleted-bg-color: #f5e4e7; + --code-highlight-color: #a0aec0; + --code-highlight-bg-color: #4a5568; + --code-edit-bg-color: #c3dafe; + --code-result-bg-color: #e7edf3; + /* Buttons */ + --red-color: #ff4f56; + --green-color: #15bd76; + --grey-color: #3d556b; + --grey-bg-color: #8fa6b2; + --dark-color: rgb(12, 52, 75); + + --homepage-header-bg: var(--gray-900); + } +} + +html[data-theme='dark'] { + --ifm-background-color: var(--gray-1000); + --main-bgd-color: #1a202c; + --border-color: #2d3748; + --white-color: white; +} diff --git a/src/css/topSection.module.scss b/src/css/topSection.module.scss new file mode 100644 index 0000000000..3d54c1fc62 --- /dev/null +++ b/src/css/topSection.module.scss @@ -0,0 +1,23 @@ +.topSectionWrapper { + position: relative; + + .tech-switch-block { + position: relative; + } + + @media (min-width: 0px) and (max-width: 360px) { + .tech-switch-block { + width: 100%; + } + } +} + +.header { + display: flex; + justify-content: space-between; + align-items: start; + @media (min-width: 0px) and (max-width: 360px) { + flex-direction: column; + align-items: baseline; + } +} diff --git a/src/data/indexData.ts b/src/data/indexData.ts new file mode 100644 index 0000000000..7c9caf3077 --- /dev/null +++ b/src/data/indexData.ts @@ -0,0 +1,199 @@ +export const ProductLinkData = { + porm: { + title: 'Build with Prisma ORM', + icon: 'database', + description: + 'Open source Node.js and TypeScript ORM with an intuitive data model, automated migrations, type-safety, and auto-completion.', + links: [ + { + url: 'getting-started', + title: 'Getting started', + }, + { + url: 'https://github.com/prisma/prisma-examples', + title: 'Example projects', + external: true, + }, + ], + }, + pdp: { + title: 'Grow as your app evolves', + icon: 'triangle', + description: + 'Expand your application capabilities with global database caching, connection pooling and real-time database events.', + links: [ + { + url: 'accelerate', + title: 'Prisma Accelerate', + }, + { + url: 'pulse', + title: 'Prisma Pulse', + }, + ], + }, +} + +export const ORMCardLinkData = { + components: [ + { + url: 'orm/prisma-schema', + title: 'Prisma Schema', + }, + { + url: 'orm/tools/prisma-cli', + title: 'Prisma CLI', + }, + { + url: 'orm/prisma-client', + title: 'Prisma Client', + }, + { + url: 'orm/tools/prisma-studio', + title: 'Prisma Studio', + }, + { + url: 'orm/prisma-migrate', + title: 'Prisma Migrate', + }, + ], + reference: [ + { + url: 'orm/reference/prisma-client-reference', + title: 'Prisma Client API reference', + }, + { + url: 'orm/reference/prisma-schema-reference', + title: 'Prisma schema reference', + }, + { + url: 'orm/reference/error-reference', + title: 'Error message reference', + }, + { + url: 'orm/reference/prisma-cli-reference', + title: 'Prisma CLI reference', + }, + ], +} + +export const ORMGeneralLinkData = [ + { + title: `What is Prisma ORM`, + description: 'An overview of what Prisma ORM is and how it works.', + url: 'orm/overview/introduction/what-is-prisma', + icon: 'fa-regular fa-question', + }, + { + title: `CRUD`, + description: 'How to perform CRUD operations with your generated Prisma Client API. ', + url: 'orm/prisma-client/queries/crud', + icon: 'fa-solid fa-arrow-right-arrow-left', + }, + { + title: `Prisma ORM in your stack`, + description: + 'Use Prisma ORM to build a GraphQL or REST API, or as part of a fullstack application.', + url: 'orm/overview/prisma-in-your-stack', + icon: 'fa-solid fa-server', + }, + { + title: `Preview features`, + description: 'Available preview features and how to enable them.', + url: 'orm/reference/preview-features', + icon: 'fa-solid fa-eye', + }, + { + title: `Adopting Prisma ORM`, + description: 'Migrate to Prisma ORM from other ORMs.', + url: 'orm/more/migrating-to-prisma', + icon: 'fa-solid fa-download', + }, + { + title: `Deployment guides`, + description: + 'Deploy Node.js applications with Prisma Client to platforms like Vercel, AWS Lambda, Netlify and Heroku.', + url: 'orm/prisma-client/deployment', + icon: 'fa-solid fa-book', + }, +] + +export const DatabaseData = [ + { + title: 'PostgreSQL', + icon: "postgresqlsimple", + darkIcon: "postgresqldark", + url: 'orm/overview/databases/postgresql', + }, + { + title: 'MySQL', + icon: "mysqlsimple", + darkIcon: "mysqlsimple", + url: 'orm/overview/databases/mysql', + }, + { + title: 'SQL Server', + icon: "sqlserver", + darkIcon: "sqlserver", + url: 'orm/overview/databases/sql-server', + }, + { + title: 'SQLite', + icon: "sqlite", + darkIcon: "sqlite", + url: 'orm/overview/databases/sqlite', + }, + { + title: 'MongoDB', + icon: "mongodbsimple", + darkIcon: "mongodbsimple", + url: 'orm/overview/databases/mongodb', + }, + { + title: 'CockroachDB', + icon: "cockroachdb", + darkIcon: "cockroachdbdark", + url: 'orm/overview/databases/cockroachdb', + }, + { + title: 'Planetscale', + icon: "planetscale", + darkIcon: "planetscaledark", + url: 'orm/overview/databases/planetscale', + }, + { + title: 'MariaDB', + icon: "mariadb", + darkIcon: "mariadbdark", + url: 'orm/overview/databases/mysql', + }, +] + +export const CommunityLinksData = [ + { + id: 'discord', + title: 'Discord', + description: + 'Chat in real-time, hang out, and share ideas with community members and our team.', + icon: 'fa-brands fa-discord', + link: 'https://pris.ly/discord', + linkText: 'Join our server', + }, + { + id: 'github', + title: 'GitHub', + description: + 'Browse the Prisma ORM source code, send feedback, or join the discussion on GitHub.', + icon: 'fa-brands fa-github', + link: 'https://github.com/prisma', + linkText: 'Contribute in GitHub', + }, + { + id: 'X', + title: 'X', + description: 'Stay up-to-date, join the discussion, and connect with the community on X.', + icon: 'fa-brands fa-x-twitter', + link: 'https://twitter.com/prisma', + linkText: 'Follow us on X', + }, +] diff --git a/src/hooks/useAllArticlesQuery.ts b/src/hooks/useAllArticlesQuery.ts deleted file mode 100644 index 938d02862c..0000000000 --- a/src/hooks/useAllArticlesQuery.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { AllArticles } from '../interfaces/AllArticles.interface' - -export const useAllArticlesQuery = () => { - const { allMdx }: AllArticles = useStaticQuery(graphql` - query { - allMdx { - edges { - node { - frontmatter { - title - duration - navTitle - staticLink - preview - deprecated - earlyaccess - langSwitcher - hideTitle - search - wide - dbSwitcher - hidePage - codeStyle - } - fields { - slug - modSlug - } - } - } - } - } - `) - - return { allMdx } -} diff --git a/src/hooks/useLayoutQuery.ts b/src/hooks/useLayoutQuery.ts deleted file mode 100644 index 227e04d651..0000000000 --- a/src/hooks/useLayoutQuery.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { LayoutQueryData } from '../interfaces/Layout.interface' - -export const useLayoutQuery = () => { - const { site }: LayoutQueryData = useStaticQuery(graphql` - query SiteTitleQuery { - site { - siteMetadata { - # change siteMetaData in 'gatsby-config.js' - title - footer { - newsletter { - text - } - } - header { - secondLevelHeaderMenuItems { - type - to - bucketName - text - hidden - } - } - } - } - } - `) - - return { site } -} diff --git a/src/hooks/useWindowDimensions.ts b/src/hooks/useWindowDimensions.ts deleted file mode 100644 index aed018c897..0000000000 --- a/src/hooks/useWindowDimensions.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useState, useEffect } from 'react' - -function getWindowDimensions() { - let width = 0 - let height = 0 - if (typeof window !== `undefined`) { - width = window.innerWidth - height = window.innerHeight - } - - return { - width, - height, - } -} - -export default function useWindowDimensions() { - const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()) - - useEffect(() => { - function handleResize() { - setWindowDimensions(getWindowDimensions()) - } - - window.addEventListener('resize', handleResize) - return () => window.removeEventListener('resize', handleResize) - }, []) - - return windowDimensions -} diff --git a/src/html.tsx b/src/html.tsx deleted file mode 100644 index 70359fa411..0000000000 --- a/src/html.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' - -const HTML = (props: any) => { - return ( - - - - {/* Kapa.ai script */} - - - {/* OneTrust Cookies Consent Notice start for prisma.io */} - - {/* OneTrust Cookies Consent Notice end for prisma.io */} - - {props.headComponents} - - - {props.preBodyComponents} -
- {props.postBodyComponents} - - {/* Start of Reo Javascript */} - - {/* End of Reo Javascript */} - - - ) -} - -HTML.propTypes = { - htmlAttributes: PropTypes.object, - headComponents: PropTypes.array, - bodyAttributes: PropTypes.object, - preBodyComponents: PropTypes.array, - body: PropTypes.string, - postBodyComponents: PropTypes.array, -} - -export default HTML diff --git a/src/icons/ArrowDown.tsx b/src/icons/ArrowDown.tsx deleted file mode 100644 index 929495bb97..0000000000 --- a/src/icons/ArrowDown.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/ArrowEmail.tsx b/src/icons/ArrowEmail.tsx deleted file mode 100644 index f07ee8b624..0000000000 --- a/src/icons/ArrowEmail.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - Subscribe to Prisma newsletter - - - -) diff --git a/src/icons/ArrowRight.tsx b/src/icons/ArrowRight.tsx deleted file mode 100644 index 5b0ef038b9..0000000000 --- a/src/icons/ArrowRight.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/Clear.tsx b/src/icons/Clear.tsx deleted file mode 100644 index cd9a65288f..0000000000 --- a/src/icons/Clear.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/Code.tsx b/src/icons/Code.tsx deleted file mode 100644 index f45120a4ad..0000000000 --- a/src/icons/Code.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - -) diff --git a/src/icons/Copy.tsx b/src/icons/Copy.tsx deleted file mode 100644 index f138e2454e..0000000000 --- a/src/icons/Copy.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - -) diff --git a/src/icons/Database.tsx b/src/icons/Database.tsx deleted file mode 100644 index be006b5f26..0000000000 --- a/src/icons/Database.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - -) diff --git a/src/icons/Display.tsx b/src/icons/Display.tsx deleted file mode 100644 index d2ecf34c04..0000000000 --- a/src/icons/Display.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - -) diff --git a/src/icons/Down.tsx b/src/icons/Down.tsx deleted file mode 100644 index 9a7e866f5a..0000000000 --- a/src/icons/Down.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - This page was not helpful. - - - -) diff --git a/src/icons/DownChevron.tsx b/src/icons/DownChevron.tsx deleted file mode 100644 index c9476482c7..0000000000 --- a/src/icons/DownChevron.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/Email.tsx b/src/icons/Email.tsx deleted file mode 100644 index b01ce0eabf..0000000000 --- a/src/icons/Email.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - -) diff --git a/src/icons/ExternalLink.tsx b/src/icons/ExternalLink.tsx deleted file mode 100644 index ea2511a40e..0000000000 --- a/src/icons/ExternalLink.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - - - -) diff --git a/src/icons/Facebook.tsx b/src/icons/Facebook.tsx deleted file mode 100644 index 700a080887..0000000000 --- a/src/icons/Facebook.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - -) diff --git a/src/icons/File.tsx b/src/icons/File.tsx deleted file mode 100644 index 9750bdecff..0000000000 --- a/src/icons/File.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - -) diff --git a/src/icons/Git.tsx b/src/icons/Git.tsx deleted file mode 100644 index 62a99e4528..0000000000 --- a/src/icons/Git.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/GitGrey.tsx b/src/icons/GitGrey.tsx deleted file mode 100644 index 6f33f5441c..0000000000 --- a/src/icons/GitGrey.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - -) diff --git a/src/icons/Github.tsx b/src/icons/Github.tsx deleted file mode 100644 index eea7bd2c80..0000000000 --- a/src/icons/Github.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/HashLink.tsx b/src/icons/HashLink.tsx deleted file mode 100644 index 7eecc35987..0000000000 --- a/src/icons/HashLink.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - - -) diff --git a/src/icons/Logo.tsx b/src/icons/Logo.tsx deleted file mode 100644 index af6a85248b..0000000000 --- a/src/icons/Logo.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -export default (props: any) => ( - - - -) - -const Logo = styled.svg<{ fill?: string }>` - height: 26px; - ${(p) => (p.fill ? `fill: ${p.fill}` : `fill: #2d3748`)}; -` diff --git a/src/icons/Prisma.tsx b/src/icons/Prisma.tsx deleted file mode 100644 index 262465a1d4..0000000000 --- a/src/icons/Prisma.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/PrismaLogoGrey.tsx b/src/icons/PrismaLogoGrey.tsx deleted file mode 100644 index 77e49abe51..0000000000 --- a/src/icons/PrismaLogoGrey.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - -) diff --git a/src/icons/RightChevron.tsx b/src/icons/RightChevron.tsx deleted file mode 100644 index 241cdca9b5..0000000000 --- a/src/icons/RightChevron.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/SQLServer.tsx b/src/icons/SQLServer.tsx deleted file mode 100644 index 138a8eff54..0000000000 --- a/src/icons/SQLServer.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react' - -export default () => ( - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/src/icons/Search.tsx b/src/icons/Search.tsx deleted file mode 100644 index bb11919b08..0000000000 --- a/src/icons/Search.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - -) diff --git a/src/icons/SearchSlash.tsx b/src/icons/SearchSlash.tsx deleted file mode 100644 index c3ef840575..0000000000 --- a/src/icons/SearchSlash.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - -) diff --git a/src/icons/Slack.tsx b/src/icons/Slack.tsx deleted file mode 100644 index b76c378b11..0000000000 --- a/src/icons/Slack.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - - - - - - - - -) diff --git a/src/icons/Twitter.tsx b/src/icons/Twitter.tsx deleted file mode 100644 index dcf49999ff..0000000000 --- a/src/icons/Twitter.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - -) diff --git a/src/icons/Up.tsx b/src/icons/Up.tsx deleted file mode 100644 index 7bf5741f06..0000000000 --- a/src/icons/Up.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - This page was helpful. - - - -) diff --git a/src/icons/UpChevron.tsx b/src/icons/UpChevron.tsx deleted file mode 100644 index 651bffef9d..0000000000 --- a/src/icons/UpChevron.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - -) diff --git a/src/icons/Youtube.tsx b/src/icons/Youtube.tsx deleted file mode 100644 index 94b53a7aed..0000000000 --- a/src/icons/Youtube.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - - -) diff --git a/src/icons/home/CLI.tsx b/src/icons/home/CLI.tsx deleted file mode 100644 index 29c78b74d4..0000000000 --- a/src/icons/home/CLI.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import * as React from 'react' -export default () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/src/icons/home/DbLink.tsx b/src/icons/home/DbLink.tsx deleted file mode 100644 index d3a8b178c8..0000000000 --- a/src/icons/home/DbLink.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import * as React from 'react' -export default () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/src/icons/home/Schema.tsx b/src/icons/home/Schema.tsx deleted file mode 100644 index a6e4d19949..0000000000 --- a/src/icons/home/Schema.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import * as React from 'react' -export default () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/src/icons/technologies/CockroachDB.tsx b/src/icons/technologies/CockroachDB.tsx deleted file mode 100644 index ded9f92451..0000000000 --- a/src/icons/technologies/CockroachDB.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react' - -// Placeholder - -export default () => ( - - - - - - - - -) diff --git a/src/icons/technologies/CockroachDBDark.tsx b/src/icons/technologies/CockroachDBDark.tsx deleted file mode 100644 index f7e896fc7c..0000000000 --- a/src/icons/technologies/CockroachDBDark.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' - -export default () => ( - - - - - - - - - - - - - - - -) diff --git a/src/icons/technologies/CockroachDBgradient.tsx b/src/icons/technologies/CockroachDBgradient.tsx deleted file mode 100644 index 296bea95d6..0000000000 --- a/src/icons/technologies/CockroachDBgradient.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' - -export default () => ( - - - - - - - - - - -) diff --git a/src/icons/technologies/Flow.tsx b/src/icons/technologies/Flow.tsx deleted file mode 100644 index bcc1d5328f..0000000000 --- a/src/icons/technologies/Flow.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - - - - - - - - - - -) diff --git a/src/icons/technologies/Go.tsx b/src/icons/technologies/Go.tsx deleted file mode 100644 index 10eb505f10..0000000000 --- a/src/icons/technologies/Go.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react' - -export default () => ( - - - - - - - - - - - - - - -) diff --git a/src/icons/technologies/MariaDB.tsx b/src/icons/technologies/MariaDB.tsx deleted file mode 100644 index 494499b83b..0000000000 --- a/src/icons/technologies/MariaDB.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' - -export default () => ( - - - - - - - - - - -) diff --git a/src/icons/technologies/NodeJS.tsx b/src/icons/technologies/NodeJS.tsx deleted file mode 100644 index 53b9b26ecc..0000000000 --- a/src/icons/technologies/NodeJS.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from 'react' - -export const NodeJS = () => ( - - - - -) diff --git a/src/icons/technologies/SQLServer.tsx b/src/icons/technologies/SQLServer.tsx deleted file mode 100644 index 138a8eff54..0000000000 --- a/src/icons/technologies/SQLServer.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react' - -export default () => ( - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/src/icons/technologies/SQLite.tsx b/src/icons/technologies/SQLite.tsx deleted file mode 100644 index d51fabeacf..0000000000 --- a/src/icons/technologies/SQLite.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react' - -export default (props: any) => ( - - - - - - - - - {/* */} - - - - -) diff --git a/src/images/favicon-16x16.png b/src/images/favicon-16x16.png deleted file mode 100644 index 20f88aa3f0..0000000000 Binary files a/src/images/favicon-16x16.png and /dev/null differ diff --git a/src/images/home-bg.svg b/src/images/home-bg.svg deleted file mode 100644 index 01a1f48b4a..0000000000 --- a/src/images/home-bg.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/images/list-dot.png b/src/images/list-dot.png deleted file mode 100644 index 2d634b16d8..0000000000 Binary files a/src/images/list-dot.png and /dev/null differ diff --git a/src/interfaces/AllArticles.interface.ts b/src/interfaces/AllArticles.interface.ts deleted file mode 100644 index 98cf54c0c4..0000000000 --- a/src/interfaces/AllArticles.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { EdgeNode } from './EdgeNode.interface' - -export interface AllEdges { - edges?: [EdgeNode] | EdgeNode[] -} - -export interface AllArticles { - allMdx: AllEdges -} -export interface AllArticlesQueryData { - data: AllArticles -} diff --git a/src/interfaces/Article.interface.ts b/src/interfaces/Article.interface.ts deleted file mode 100644 index 643e5506aa..0000000000 --- a/src/interfaces/Article.interface.ts +++ /dev/null @@ -1,56 +0,0 @@ -export interface ArticleFields { - slug: string - modSlug: string -} - -export interface ArticleFrontmatter { - title: string - navTitle?: string - metaTitle?: string - metaDescription?: string - langSwitcher?: string[] - dbSwitcher?: string[] - search?: boolean - wide?: boolean - staticLink?: boolean - duration?: string - preview?: boolean - earlyaccess?: boolean - toc?: boolean - hidePage?: boolean - tocDepth?: number - codeStyle?: boolean - deprecated?: boolean - hideTitle?: boolean -} - -export interface ArticleData { - mdx: { - fields: ArticleFields - tableOfContents: TableOfContents - body: string - parent: any - frontmatter: ArticleFrontmatter - } - site: { - siteMetadata: { - docsLocation: string - } - } -} - -export interface ArticleQueryData { - data: ArticleData -} - -export interface Fields { - fields: ArticleFields -} - -export interface TableOfContents { - items: { - url: string - title: string - items?: any[] - }[] -} diff --git a/src/interfaces/EdgeNode.interface.ts b/src/interfaces/EdgeNode.interface.ts deleted file mode 100644 index c6c81e2eb3..0000000000 --- a/src/interfaces/EdgeNode.interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ArticleFrontmatter } from './Article.interface' -import { ArticleFields } from './Article.interface' - -export interface EdgeNode { - node: { - frontmatter: { [Property in keyof ArticleFrontmatter]: ArticleFrontmatter[Property] } - fields: { [Property in keyof ArticleFields]: ArticleFields[Property] } - } -} diff --git a/src/interfaces/Layout.interface.ts b/src/interfaces/Layout.interface.ts deleted file mode 100644 index 6e59c29ec7..0000000000 --- a/src/interfaces/Layout.interface.ts +++ /dev/null @@ -1,33 +0,0 @@ -export interface HeaderProps { - secondLevelHeaderMenuItems: { - hidden: boolean - text: string - type: string - to: string - bucketName: string - }[] - wide?: boolean -} - -export interface FooterProps { - newsletter: { text: string } -} - -interface SiteMeta { - siteMetadata: { - header: HeaderProps - title: string - footer: FooterProps - } -} - -export interface LayoutQueryData { - site: SiteMeta -} - -export interface CreatePageContext { - pageContext: { - seoTitle: string - seoDescription: string - } -} diff --git a/src/pages/404.tsx b/src/pages/404.tsx deleted file mode 100644 index 6434c24f51..0000000000 --- a/src/pages/404.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { defaultTheme as theme } from '../theme' -import * as React from 'react' -import styled from 'styled-components' - -import Layout from '../components/layout' - -const NotFoundWrapper = styled.div` - font-family: 'Inter'; - margin-top: 200px; - padding: ${theme.space[40]}; - display: flex; - flex-direction: column; - align-items: center; - h1 { - font-weight: bold; - } -` - -const NotFoundPage = () => ( - - -

404 | NOT FOUND

- You just hit a route that doesn't exist! -
-
-) - -export default NotFoundPage diff --git a/src/pages/index.module.scss b/src/pages/index.module.scss new file mode 100644 index 0000000000..dd6e57fa29 --- /dev/null +++ b/src/pages/index.module.scss @@ -0,0 +1,513 @@ +/** + * CSS/SCSS files with the .module.{css,scss} suffix will be treated as modules + * and scoped locally. + */ + +.mainHome { + padding: 0; + @media (max-width: 996px){ + margin-top: 32px; + } +} + +.linkCardWrapper { + border: 1px solid var(--border-color); + padding: 20px 24px; + border-radius: 8px; + color: var(--main-font-color); + transition: all 300ms ease-out; + display: flex; + justify-content: center; + flex-direction: column; + text-decoration: none !important; + background: transparent; + &:hover { + border-color: var(--ifm-btn-border-color-active); + background: transparent; + } + .title { + display: inline-block; + h6 { + font-size: 18px; + display: inline-block; + margin: 0; + font-family: Barlow; + font-weight: 600; + line-height: 24px; + letter-spacing: 0px; + text-align: left; + } + } + p { + font-family: Inter; + font-size: 14px; + font-weight: 400; + line-height: 20px; + letter-spacing: 0em; + margin-bottom: 0; + text-align: left; + } +} +.icon { + width: 64px; + height: 64px; + flex-shrink: 0; + border-radius: 8px; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--icon-svg-color); +} + +.h3 { + font-family: 'Barlow', sans-serif; + font-weight: bold; + font-size: 28px; + letter-spacing: -0.02em; + line-height: 110%; + + @media (min-width: 940px) { + font-size: 36px; + } +} + +.h4 { + font-family: 'Barlow'; + margin: 0; + font-size: 24px; + font-style: normal; + font-weight: 700; + line-height: 110%; + /* 26.4px */ + letter-spacing: -0.48px; +} + +.body { + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + font-weight: normal; + font-size: 18px; + letter-spacing: 0em; + line-height: 140%; +} + +.homepageTopSection { + padding: 64px 12px; + background: #f7fafc; + display: flex; + flex-wrap: wrap; + gap: 40px; + background: var(--homepage-header-bg); +} + +.linkGrid { + display: flex; + max-width: 338px; + gap: 16px; + width: 100%; + flex-wrap: wrap; + justify-content: space-between; + + a, + button { + min-width: calc(50% - 8px); + white-space: nowrap; + font-family: 'Inter'; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 100%; + /* 16px */ + letter-spacing: -0.32px; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + svg { + display: none; + } +} + +.productCardsWrapper { + max-width: 1240px; + width: 100%; + gap: 40px; + margin: 0 auto; + display: flex; + flex-wrap: wrap; +} + +%productCard { + display: grid; + grid-template-rows: auto 1fr auto; + padding: 32px; + width: 100%; + border-radius: 8px; + box-shadow: 0px 18px 42px 0px rgba(23, 43, 77, 0.08), + 0px 4px 26px 0px rgba(23, 43, 77, 0.05), + 0px 0px 46px 0px rgba(23, 43, 77, 0.01); + + h3 { + display: flex; + align-items: center; + gap: 16px; + margin: 0 0 24px 0; + } + + .body { + margin-bottom: 16px; + } + + @media (min-width: 768px) { + width: calc(50% - 20px); + } + +} + +.productCardIndigo { + @extend %productCard; + background: var(--indigo-card-bg); + + a, + button { + color: var(--indigo-link-color) + } + + .icon { + background: var(--indigo-600) + } + +} + +.productCardTeal { + @extend %productCard; + background: var(--teal-card-bg); + + a, + button { + color: var(--teal-link-color) + } + + .icon { + background: var(--teal-link-color); + } + +} + +.ormLinkSectionWrapper { + max-width: 1272px; + margin: 0 auto; + padding: 60px 16px 24px; + + h4 { + color: var(--main-font-color); + margin-bottom: 40px; + } + + >div { + display: grid; + gap: 40px; + grid-template-columns: 100%; + + @media (min-width: 768px) { + grid-template-columns: 1fr 1fr; + } + } +} + +.ormLinkWrapper { + display: flex !important; + gap: 24px; + text-decoration: none; + + h5 { + display: inline-block; + color: var(--main-font-color); + font-size: 18px; + font-style: normal; + font-weight: 700; + line-height: 100%; + /* 18px */ + margin: 0 0 10px 0; + letter-spacing: -0.36px; + font-family: 'Barlow'; + + >span { + font-family: 'Inter'; + } + } + + p { + color: var(--secondary-font-color); + text-overflow: ellipsis; + font-family: 'Inter'; + margin: 0; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 140%; + /* 22.4px */ + } + + >div:last-of-type { + display: inline-block; + } + + .icon { + background: var(--icon-wrapper-bg); + } + + &:hover { + h5 { + text-decoration: underline; + } + } +} + +.ormCardsSection { + max-width: 1262px; + margin: 0 auto; + padding: 40px 11px; +} + +.ormCardsWrapper { + gap: 40px; + display: flex; + flex-direction: column; + + h4 { + margin-bottom: 8px; + } + + .productCardIndigo { + padding: 40px; + background: var(--orm-card-bg); + grid-template-rows: auto auto 1fr; + + >p { + color: var(--secondary-font-color); + margin: 0 0 24px 0; + font-family: 'Inter'; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 140%; + /* 22.4px */ + } + } + + .linkGrid { + gap: 12px; + + a { + min-width: calc(50% - 8px); + width: fit-content; + white-space: nowrap; + } + } + + @media (min-width: 768px) { + flex-direction: row; + } +} + +.databasesSection { + max-width: 1272px; + margin: 0 auto; + padding: 40px 16px; + + h4 { + margin-bottom: 24px; + } + + .body { + color: var(--secondary-font-color); + margin-bottom: 40px; + } + + @media (min-width: 768px) { + padding: 24px 16px 108px; + } +} + +.databaseGrid { + display: flex; + flex-direction: column; + flex-wrap: wrap; + gap: 24px; + + a { + text-decoration: none; + color: unset; + } + + @media only screen and (min-width: 1024px) { + display: grid; + column-gap: 24px; + grid-template-columns: repeat(4, 1fr); + } + + @media (min-width: 940px) and (max-width: 1024px) { + display: grid; + column-gap: 24px; + grid-template-columns: repeat(3, 1fr); + } +} + +.databaseEntry { + height: 84px; + display: flex; + align-items: center; + justify-content: start; + gap: 16px; + flex-basis: 21%; + border-radius: 8px; + padding: 25px 24px; + position: relative; + cursor: pointer; + img { + margin: auto 0; + max-height: 36px; + } + + span { + color: var(--main-font-color); + text-transform: capitalize; + font-family: 'Inter'; + font-weight: 600; + font-size: 24px; + line-height: 1; + } + + @media only screen and (min-width: 940px) { + padding: 0 0; + } +} + +.communityLinksSection { + background: var(--community-bgd-color); + + >div { + padding: 80px 16px; + margin: 0 auto; + max-width: 1272px; + text-align: left; + + a { + text-decoration: none; + } + } + + .sectionHero { + h3 { + margin-top: 0; + margin-bottom: 24px; + color: var(--primary-font-color); + } + + p { + color: var(--secondary-font-color); + margin-bottom: 60px; + margin-top: 0; + } + } +} + +.communityLinkWrapper { + display: grid; + gap: 16px; + text-align: left; + grid-template-columns: 24px 1fr; + height: 100%; + text-decoration: none; + + >div { + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 16px; + } + + h4 { + margin-bottom: 6px; + margin-top: 0; + line-height: 110%; + font-size: 24px; + font-weight: 700; + font-family: 'Barlow'; + color: var(--primary-font-color); + } + + .body { + color: var(--secondary-font-color); + margin: 0; + } + + .link { + color: var(--indigo-link-color); + font-family: 'Inter'; + font-size: 18px; + font-style: normal; + font-weight: 600; + line-height: 88%; + /* 15.84px */ + } +} + +.communityLinksRow { + display: grid; + gap: 24px; + grid-template-rows: repeat(3, minmax(0, 1fr)); + + i { + margin-top: 4px; + color: var(--indigo-600); + } + + @media only screen and (min-width: 768px) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-rows: none; + } + + @media only screen and (min-width: 940px) { + grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-rows: none; + } +} + +.communityLinkCard { + box-shadow: 0px 5px 3px rgba(23, 43, 77, 0.04), 0px 8px 5px rgba(23, 43, 77, 0.08); + background: var(--shadow-card-bg); + border-radius: 8px; + overflow: hidden; + width: 100%; + cursor: pointer; + max-width: 100%; + margin: 0; + transition: transform 100ms ease; + + &:hover { + transform: scale(1.02); + } + + .content { + padding: 32px 24px; + text-align: left; + + p { + color: #4a5568; + } + + a { + text-decoration: none; + } + + &:hover .link>span:first-of-type { + text-decoration: underline; + } + } +} \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index fd45349dd1..c9b77f4611 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,795 +1,184 @@ -import { useLocation } from '@reach/router' -import { graphql, useStaticQuery } from 'gatsby' -import * as React from 'react' -import styled from 'styled-components' - -import { Icon } from '../components/Icon' -import Layout from '../components/layout' -import Link from '../components/link' -import SEO from '../components/seo' -import ShadowCard from '../components/shadow-card' -import CockroachDB from '../icons/technologies/CockroachDB' -import CockroachDBDark from '../icons/technologies/CockroachDBDark' -import MariaDB from '../icons/technologies/MariaDB' -import MariaDBDark from '../icons/technologies/MariaDBDark' -import MongoDBSimple from '../icons/technologies/MongoDBSimple' -import MySQLSimple from '../icons/technologies/MySQLSimple' -import PlanetScale from '../icons/technologies/PlanetScale' -import PlanetscaleDark from '../icons/technologies/PlanetscaleDark' -import PostgresSQLDark from '../icons/technologies/PostgresSQLDark' -import PostgresSQLSimple from '../icons/technologies/PostgresSQLSimple' -import SQLite from '../icons/technologies/SQLite' -import SQLServer from '../icons/technologies/SQLServer' -import { defaultTheme as theme } from '../theme' - -export const Body = styled.div` - font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, - 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; - font-weight: normal; - font-size: 18px; - letter-spacing: 0em; - line-height: 140%; -` - -export const H3 = styled.h3` - font-family: 'Barlow', sans-serif; - font-weight: bold; - font-size: 28px; - letter-spacing: -0.02em; - line-height: 110%; - @media (min-width: 940px) { - font-size: 36px; - } -` - -const H4 = styled.h4` - font-family: 'Barlow'; - margin: 0; - font-size: 24px; - font-style: normal; - font-weight: 700; - line-height: 110%; /* 26.4px */ - letter-spacing: -0.48px; -` - -const TopSection = styled.div` - padding: 109px 12px 64px; - background: #f7fafc; - display: flex; - flex-wrap: wrap; - gap: 40px; - - @media (prefers-color-scheme: dark) { - background: #242c3a; - } -` - -const IconWrapper = styled.div` - width: 64px; - height: 64px; - flex-shrink: 0; - border-radius: 8px; - display: inline-flex; - align-items: center; - justify-content: center; - .dark { - display: none; - } - - .light { - display: block; - } - @media (prefers-color-scheme: dark) { - .dark { - display: block; - } - - .light { - display: none; - } - } -` - -const ProductCard = styled.div<{ color?: string }>` - display: grid; - grid-template-rows: auto 1fr auto; - padding: 32px; - width: 100%; - border-radius: 8px; - background: ${(p) => - p.color === 'teal' - ? 'linear-gradient(102.41deg, #FFFFFF 6.22%, #E8FFFD 87.23%)' - : 'linear-gradient(102.41deg, #FFFFFF 6.22%, #F4F5FF 87.23%)'}; - box-shadow: 0px 18px 42px 0px rgba(23, 43, 77, 0.08), 0px 4px 26px 0px rgba(23, 43, 77, 0.05), - 0px 0px 46px 0px rgba(23, 43, 77, 0.01); - a, - button { - color: ${(props) => (props.color === 'teal' ? '#16A394' : '#5A67D8')}; - } - @media (min-width: 768px) { - width: calc(50% - 20px); - } - ${H3} { - display: flex; - align-items: center; - gap: 16px; - margin: 0 0 24px 0; - } - ${Body} { - margin-bottom: 16px; - } - ${IconWrapper} { - background: ${(props) => (props.color === 'teal' ? '#16A394' : '#5A67D8')}; - } - - @media (prefers-color-scheme: dark) { - a, - button { - color: ${(props) => - props.color === 'teal' ? `${theme.colors.teal[400]}` : `${theme.colors.indigo[400]}`}; - } - background: ${(p) => - p.color === 'teal' - ? `linear-gradient(287.43deg, rgba(4, 200, 187, 0.17) -34.29%, rgba(4, 200, 187, 0) 98.22%),linear-gradient(99.45deg, #1A202C -40.85%, #27303E 91.67%)` - : `linear-gradient(283.66deg, rgba(102, 126, 234, 0.2418) -32.46%, rgba(102, 126, 234, 0) 96.55%), linear-gradient(99.45deg, #1A202C -40.85%, #27303E 91.67%)`}; - } -` - -const ProductCardsWrapper = styled.div` - max-width: 1240px; - width: 100%; - gap: 40px; - margin: 0 auto; - display: flex; - flex-wrap: wrap; -` - -const LinkGrid = styled.div` - display: flex; - max-width: 338px; - gap: 16px; - width: 100%; - flex-wrap: wrap; - justify-content: space-between; - a, - button { - min-width: calc(50% - 8px); - white-space: nowrap; - font-family: 'Inter'; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 100%; /* 16px */ - letter-spacing: -0.32px; - text-decoration: none; - &:hover { - text-decoration: underline; - } - } - svg { - display: none; - } -` - -const PrismaORMSection = styled.div` - max-width: 1272px; - margin: 0 auto; - padding: 60px 16px 24px; - h4 { - color: #2d3748; - margin-bottom: 40px; - } - @media (prefers-color-scheme: dark) { - h4 { - color: ${theme.colors.gray[100]}; - } - } -` - -const ORMLinkWrapper = styled(Link)` - display: flex !important; - gap: 24px; - text-decoration: none; - - h5 { - display: inline-block; - color: #2d3748; - font-size: 18px; - font-style: normal; - font-weight: 700; - line-height: 100%; /* 18px */ - margin: 0 0 10px 0; - letter-spacing: -0.36px; - font-family: 'Barlow'; - > span { - font-family: 'Inter'; - } - } - > div:last-of-type { - display: inline-block; - } - ${IconWrapper} { - background: #ebf4ff; - } - p { - color: #4a5568; - text-overflow: ellipsis; - font-family: 'Inter'; - margin: 0; - font-size: 16px; - font-style: normal; - font-weight: 400; - line-height: 140%; /* 22.4px */ - } - &:hover h5 { - text-decoration: underline; - } - @media (prefers-color-scheme: dark) { - h5 { - color: ${theme.colors.gray[100]}; - } - p { - color: ${theme.colors.gray[400]}; - } - ${IconWrapper} { - background: ${theme.colors.indigo[600]}; - } - } -` - -const ORMLinkContainer = styled.div` - display: grid; - gap: 40px; - grid-template-columns: 100%; - @media (min-width: 768px) { - grid-template-columns: 1fr 1fr; - } -` - -const ORMCardsSection = styled.div` - max-width: 1262px; - margin: 0 auto; - padding: 40px 11px; -` - -const ORMCardsWrapper = styled.div` - gap: 40px; - display: flex; - flex-direction: column; - @media (min-width: 768px) { - flex-direction: row; - } -` - -const ORMProductCard = styled(ProductCard)` - padding: 40px; - background: #ffffff; - grid-template-rows: auto auto 1fr; - ${H4} { - margin-bottom: 8px; - } - > p { - color: #4a5568; - margin: 0 0 24px 0; - font-family: 'Inter'; - font-size: 16px; - font-style: normal; - font-weight: 400; - line-height: 140%; /* 22.4px */ - } - ${LinkGrid} { - gap: 12px; - a { - min-width: calc(50% - 8px); - width: fit-content; - white-space: nowrap; - } - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[800]}; - > p { - color: ${theme.colors.gray[400]}; - } - } -` - -const DatabasesSection = styled.div` - max-width: 1272px; - margin: 0 auto; - padding: 40px 16px; - @media (min-width: 768px) { - padding: 24px 16px 108px; - } - ${H4} { - margin-bottom: 24px; - } - ${Body} { - color: #4a5568; - margin-bottom: 40px; - } - @media (prefers-color-scheme: dark) { - ${Body} { - color: ${theme.colors.gray[400]}; - } - } -` - -const DatabaseGrid = styled.div` - display: flex; - flex-direction: column; - flex-wrap: wrap; - gap: 24px; - @media only screen and (min-width: 1024px) { - display: grid; - column-gap: 44px; - grid-template-columns: repeat(4, 1fr); - } - @media (min-width: 940px) and (max-width: 1024px) { - display: grid; - column-gap: 44px; - grid-template-columns: repeat(3, 1fr); - } - a { - text-decoration: none; - color: unset; - } - .entry { - height: 84px; - display: flex; - align-items: center; - justify-content: start; - gap: 16px; - flex-basis: 21%; - border-radius: 8px; - padding: 25px 24px; - background-color: white; - position: relative; - cursor: pointer; - &::after { - content: ''; - position: absolute; - border-radius: 8px; - inset: 0; - border: 1px solid #cbd5e0; - background-color: transparent; - cursor: pointer; - } - - &:hover { - background-color: #f7fafc; - &::after { - border: 2px solid #5a67d8; - } - } - @media only screen and (min-width: 940px) { - padding: 0 24px; - } - img { - max-height: 36px; - } - span { - color: #2d3748; - text-transform: capitalize; - font-family: 'Inter'; - font-weight: 600; - font-size: 24px; - line-height: 1; - } - } - - .dark { - display: none; - } - - .light { - display: flex; - } - - @media (prefers-color-scheme: dark) { - .dark { - display: flex; - } - - .light { - display: none; - } - } - - @media (prefers-color-scheme: dark) { - .entry { - background: transparent; - &::after { - border-color: ${theme.colors.gray[700]}; - } - &:hover { - background-color: transparent; - } - span { - color: ${theme.colors.gray[300]}; - } - } - } -` - -const DatabaseData = [ - { - title: 'PostgreSQL', - icon: , - darkIcon: , - url: 'orm/overview/databases/postgresql', - }, - { - title: 'MySQL', - icon: , - darkIcon: , - url: 'orm/overview/databases/mysql', - }, - { - title: 'SQL Server', - icon: , - darkIcon: , - url: 'orm/overview/databases/sql-server', - }, - { - title: 'SQLite', - icon: , - darkIcon: , - url: 'orm/overview/databases/sqlite', - }, - { - title: 'MongoDB', - icon: , - darkIcon: , - url: 'orm/overview/databases/mongodb', - }, - { - title: 'CockroachDB', - icon: , - darkIcon: , - url: 'orm/overview/databases/cockroachdb', - }, - { - title: 'Planetscale', - icon: , - darkIcon: , - url: 'orm/overview/databases/planetscale', - }, - { - title: 'MariaDB', - icon: , - darkIcon: , - url: 'orm/overview/databases/mysql', - }, -] - -const CommunitySection = styled.div` - background: #f7fafc; - > div { - padding: 80px 16px; - margin: 0 auto; - max-width: 1272px; - text-align: left; - a { - text-decoration: none; - } - .section-hero { - ${H3} { - margin-top: 0; - margin-bottom: 24px; - color: #2d3748; - } - p { - color: #4a5568; - margin-bottom: 60px; - margin-top: 0; - } - } - - .community-link-wrapper { - display: grid; - gap: 16px; - text-align: left; - grid-template-columns: 24px 1fr; - height: 100%; - text-decoration: none; - > div { - display: flex; - flex-direction: column; - justify-content: space-between; - gap: 16px; - } - h4 { - margin-bottom: 6px; - margin-top: 0; - line-height: 110%; - font-size: 24px; - font-weight: 700; - font-family: 'Barlow'; - color: #1a202c; - } - ${Body} { - color: #4a5568; - margin: 0; - } - .link { - color: #5a67d8; - font-family: 'Inter'; - font-size: 18px; - font-style: normal; - font-weight: 600; - line-height: 88%; /* 15.84px */ - } - } - } - - @media (prefers-color-scheme: dark) { - background: ${theme.colors.gray[800]}; - > div { - .community-link-wrapper { - h4 { - color: ${theme.colors.gray[100]}; - } - ${Body} { - color: ${theme.colors.gray[400]}; - } - .link { - color: ${theme.colors.indigo[400]}; - } - } - .section-hero { - ${H3} { - color: ${theme.colors.gray[100]}; - } - p { - color: ${theme.colors.gray[400]}; - } - } - } - } -` - -const CommunityLinksRow = styled.div` - display: grid; - gap: 24px; - grid-template-rows: repeat(3, minmax(0, 1fr)); - @media only screen and (min-width: 768px) { - grid-template-columns: repeat(2, minmax(0, 1fr)); - grid-template-rows: none; - } - @media only screen and (min-width: 940px) { - grid-template-columns: repeat(3, minmax(0, 1fr)); - grid-template-rows: none; - } - i { - margin-top: 4px; - } -` +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; + +import Layout from '@theme/Layout'; +import Heading from '@theme/Heading'; + +import { Icon } from '@site/src/components/Icon'; +import { + CommunityLinksData, + DatabaseData, + ORMGeneralLinkData, + ORMCardLinkData, + ProductLinkData +} from '@site/src/data/indexData'; + +import styles from './index.module.scss'; + +function HomepageCard({ + className, heading, body, links +}: { + className: string, heading: JSX.Element, body: JSX.Element, links: JSX.Element[] +}): JSX.Element { + return ( +
+ {heading} + {body} +
+ {links} +
+
+ ) +} -const Homepage = () => { - const { site } = useStaticQuery(query) - const changeHitsStatus = (status: boolean) => setShowDocsBtn(!status) - const [showDocsBtn, setShowDocsBtn] = React.useState(true) - const { - siteMetadata: { - title, - description, - homepage: { GeneralLinkData, CommunityLinksData, CardLinks, ORMPlatformLinkData }, - }, - } = site - const location = useLocation() +function HomepageProductCards() { + return ( +
+
+ {Object.keys(ProductLinkData).map((e: keyof typeof ProductLinkData) => { + const cardHeader = +
+ +
+ {ProductLinkData[e].title} +
+ const cardBody =
{ProductLinkData[e].description}
+ const cardLinks = ProductLinkData[e].links.map((link) => ( + + {link.title} {link.external ? <>↗ : <>→} + + )) + return + })} +
+
+ ) +} +function HomepageORMLinksSection() { return ( - - - - {Object.keys(ORMPlatformLinkData).map((e: string) => ( - -

- - - - {ORMPlatformLinkData[e].title} -

- {ORMPlatformLinkData[e].description} - - {ORMPlatformLinkData[e].links.map((e: any) => ( - - {e.title} {e.external ? <>↗ : <>→} - - ))} - -
- ))} -
-
- -

Prisma ORM

- - {GeneralLinkData.map((generalLink: any, index: number) => ( - - - - - -
-
- {generalLink.title} -
-

{generalLink.description}

-
-
- ))} -
-
- - - -

Components

-

- Open source Node.js and TypeScript ORM with an intuitive data model, automated - migrations, type-safety, and auto-completion. -

+
+ Prisma ORM +
+ {ORMGeneralLinkData.map((link, index) => ( + +
+ +
- - {CardLinks.components.map((card: any) => ( - {card.title} → - ))} - +
{link.title}
+

{link.description}

- + + ))} +
+
+ ) +} - -

Reference

-

- Open source Node.js and TypeScript ORM with an intuitive data model, automated - migrations, type-safety, and auto-completion. -

-
- - {CardLinks.reference.map((card: any) => ( - {card.title} → - ))} - +function HomepageORMCards() { + return ( +
+
+ {Object.keys(ORMCardLinkData).map((e) => { + const cardHeader = {e[0].toUpperCase() + e.substring(1).toLowerCase()}; + const cardBody =

Open source Node.js and TypeScript ORM with an intuitive data model, automated migrations, type-safety, and auto-completion.

+ const links = ORMCardLinkData[e].map((card) => ({card.title} →)) + return + })} +
+
+ ) +} + +function HomepageDatabasesSection() { + return ( +
+ Databases +
+ Prisma ORM works seamlessly across most popular databases and service providers.
+ Refer to our Database features matrix for information about supported features and types for each database. +
+
+ ) +} + +function HomepageCommunitySection() { + return ( + ) } -export default Homepage - -export const query = graphql` - query Homepage { - site { - siteMetadata { - title - description - homepage { - GeneralLinkData { - title - description - url - icon - } - CardLinks { - components { - url - title - } - reference { - url - title - } - } - CommunityLinksData { - id - title - description - icon - link - linkText - } - ORMPlatformLinkData { - porm { - title - description - icon - links { - url - title - external - } - } - pdp { - title - icon - description - links { - url - title - } - } - } - } - } - } - } -` - -export const Head = () => { - const { site } = useStaticQuery(query) +export default function Home(): JSX.Element { const { - siteMetadata: { title, description }, - } = site - return + siteConfig: { title }, + } = useDocusaurusContext(); + return ( + +
+ + + + + +
+
+ ); } + diff --git a/src/styles/all.css b/src/styles/all.css deleted file mode 100644 index eaf63bb31d..0000000000 --- a/src/styles/all.css +++ /dev/null @@ -1,1050 +0,0 @@ -.fa { - font-family: var(--fa-style-family, 'Font Awesome 6 Pro'); - font-weight: var(--fa-style, 900); -} - -.fa, -.fa-classic, -.fa-sharp, -.fas, -.fa-solid, -.far, -.fa-regular, -.fasr, -.fal, -.fa-light, -.fasl, -.fat, -.fa-thin, -.fad, -.fa-duotone, -.fass, -.fa-sharp-solid, -.fab, -.fa-brands { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: var(--fa-display, inline-block); - font-style: normal; - font-variant: normal; - line-height: 1; - text-rendering: auto; -} - -.fas, -.fa-classic, -.fa-solid, -.far, -.fa-regular, -.fal, -.fa-light, -.fat, -.fa-thin { - font-family: 'Font Awesome 6 Pro'; -} - -.fab, -.fa-brands { - font-family: 'Font Awesome 6 Brands'; -} - -.fad, -.fa-classic.fa-duotone, -.fa-duotone { - font-family: 'Font Awesome 6 Duotone'; -} - -.fass, -.fasr, -.fasl, -.fa-sharp { - font-family: 'Font Awesome 6 Sharp'; -} - -.fass, -.fa-sharp { - font-weight: 900; -} - -.fa-1x { - font-size: 1em; -} - -.fa-2x { - font-size: 2em; -} - -.fa-3x { - font-size: 3em; -} - -.fa-4x { - font-size: 4em; -} - -.fa-5x { - font-size: 5em; -} - -.fa-6x { - font-size: 6em; -} - -.fa-7x { - font-size: 7em; -} - -.fa-8x { - font-size: 8em; -} - -.fa-9x { - font-size: 9em; -} - -.fa-10x { - font-size: 10em; -} - -.fa-2xs { - font-size: 0.625em; - line-height: 0.1em; - vertical-align: 0.225em; -} - -.fa-xs { - font-size: 0.75em; - line-height: 0.08333em; - vertical-align: 0.125em; -} - -.fa-sm { - font-size: 0.875em; - line-height: 0.07143em; - vertical-align: 0.05357em; -} - -.fa-lg { - font-size: 1.25em; - line-height: 0.05em; - vertical-align: -0.075em; -} - -.fa-xl { - font-size: 1.5em; - line-height: 0.04167em; - vertical-align: -0.125em; -} - -.fa-2xl { - font-size: 2em; - line-height: 0.03125em; - vertical-align: -0.1875em; -} - -.fa-fw { - text-align: center; - width: 1.25em; -} - -.fa-ul { - list-style-type: none; - margin-left: var(--fa-li-margin, 2.5em); - padding-left: 0; -} - -.fa-ul > li { - position: relative; -} - -.fa-li { - left: calc(var(--fa-li-width, 2em) * -1); - position: absolute; - text-align: center; - width: var(--fa-li-width, 2em); - line-height: inherit; -} - -.fa-border { - border-color: var(--fa-border-color, #eee); - border-radius: var(--fa-border-radius, 0.1em); - border-style: var(--fa-border-style, solid); - border-width: var(--fa-border-width, 0.08em); - padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); -} - -.fa-pull-left { - float: left; - margin-right: var(--fa-pull-margin, 0.3em); -} - -.fa-pull-right { - float: right; - margin-left: var(--fa-pull-margin, 0.3em); -} - -.fa-beat { - -webkit-animation-name: fa-beat; - animation-name: fa-beat; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); - animation-timing-function: var(--fa-animation-timing, ease-in-out); -} - -.fa-bounce { - -webkit-animation-name: fa-bounce; - animation-name: fa-bounce; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); -} - -.fa-fade { - -webkit-animation-name: fa-fade; - animation-name: fa-fade; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); -} - -.fa-beat-fade { - -webkit-animation-name: fa-beat-fade; - animation-name: fa-beat-fade; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); -} - -.fa-flip { - -webkit-animation-name: fa-flip; - animation-name: fa-flip; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); - animation-timing-function: var(--fa-animation-timing, ease-in-out); -} - -.fa-shake { - -webkit-animation-name: fa-shake; - animation-name: fa-shake; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, linear); - animation-timing-function: var(--fa-animation-timing, linear); -} - -.fa-spin { - -webkit-animation-name: fa-spin; - animation-name: fa-spin; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 2s); - animation-duration: var(--fa-animation-duration, 2s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, linear); - animation-timing-function: var(--fa-animation-timing, linear); -} - -.fa-spin-reverse { - --fa-animation-direction: reverse; -} - -.fa-pulse, -.fa-spin-pulse { - -webkit-animation-name: fa-spin; - animation-name: fa-spin; - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); - animation-timing-function: var(--fa-animation-timing, steps(8)); -} - -@media (prefers-reduced-motion: reduce) { - .fa-beat, - .fa-bounce, - .fa-fade, - .fa-beat-fade, - .fa-flip, - .fa-pulse, - .fa-shake, - .fa-spin, - .fa-spin-pulse { - -webkit-animation-delay: -1ms; - animation-delay: -1ms; - -webkit-animation-duration: 1ms; - animation-duration: 1ms; - -webkit-animation-iteration-count: 1; - animation-iteration-count: 1; - -webkit-transition-delay: 0s; - transition-delay: 0s; - -webkit-transition-duration: 0s; - transition-duration: 0s; - } -} - -@-webkit-keyframes fa-beat { - 0%, - 90% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 45% { - -webkit-transform: scale(var(--fa-beat-scale, 1.25)); - transform: scale(var(--fa-beat-scale, 1.25)); - } -} - -@keyframes fa-beat { - 0%, - 90% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 45% { - -webkit-transform: scale(var(--fa-beat-scale, 1.25)); - transform: scale(var(--fa-beat-scale, 1.25)); - } -} - -@-webkit-keyframes fa-bounce { - 0% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - - 10% { - -webkit-transform: scale( - var(--fa-bounce-start-scale-x, 1.1), - var(--fa-bounce-start-scale-y, 0.9) - ) - translateY(0); - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) - translateY(0); - } - - 30% { - -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) - translateY(var(--fa-bounce-height, -0.5em)); - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) - translateY(var(--fa-bounce-height, -0.5em)); - } - - 50% { - -webkit-transform: scale( - var(--fa-bounce-land-scale-x, 1.05), - var(--fa-bounce-land-scale-y, 0.95) - ) - translateY(0); - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) - translateY(0); - } - - 57% { - -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - } - - 64% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - - 100% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } -} - -@keyframes fa-bounce { - 0% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - - 10% { - -webkit-transform: scale( - var(--fa-bounce-start-scale-x, 1.1), - var(--fa-bounce-start-scale-y, 0.9) - ) - translateY(0); - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) - translateY(0); - } - - 30% { - -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) - translateY(var(--fa-bounce-height, -0.5em)); - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) - translateY(var(--fa-bounce-height, -0.5em)); - } - - 50% { - -webkit-transform: scale( - var(--fa-bounce-land-scale-x, 1.05), - var(--fa-bounce-land-scale-y, 0.95) - ) - translateY(0); - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) - translateY(0); - } - - 57% { - -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - } - - 64% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - - 100% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } -} - -@-webkit-keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); - } -} - -@keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); - } -} - -@-webkit-keyframes fa-beat-fade { - 0%, - 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - -webkit-transform: scale(1); - transform: scale(1); - } - - 50% { - opacity: 1; - -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); - transform: scale(var(--fa-beat-fade-scale, 1.125)); - } -} - -@keyframes fa-beat-fade { - 0%, - 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - -webkit-transform: scale(1); - transform: scale(1); - } - - 50% { - opacity: 1; - -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); - transform: scale(var(--fa-beat-fade-scale, 1.125)); - } -} - -@-webkit-keyframes fa-flip { - 50% { - -webkit-transform: rotate3d( - var(--fa-flip-x, 0), - var(--fa-flip-y, 1), - var(--fa-flip-z, 0), - var(--fa-flip-angle, -180deg) - ); - transform: rotate3d( - var(--fa-flip-x, 0), - var(--fa-flip-y, 1), - var(--fa-flip-z, 0), - var(--fa-flip-angle, -180deg) - ); - } -} - -@keyframes fa-flip { - 50% { - -webkit-transform: rotate3d( - var(--fa-flip-x, 0), - var(--fa-flip-y, 1), - var(--fa-flip-z, 0), - var(--fa-flip-angle, -180deg) - ); - transform: rotate3d( - var(--fa-flip-x, 0), - var(--fa-flip-y, 1), - var(--fa-flip-z, 0), - var(--fa-flip-angle, -180deg) - ); - } -} - -@-webkit-keyframes fa-shake { - 0% { - -webkit-transform: rotate(-15deg); - transform: rotate(-15deg); - } - - 4% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - - 8%, - 24% { - -webkit-transform: rotate(-18deg); - transform: rotate(-18deg); - } - - 12%, - 28% { - -webkit-transform: rotate(18deg); - transform: rotate(18deg); - } - - 16% { - -webkit-transform: rotate(-22deg); - transform: rotate(-22deg); - } - - 20% { - -webkit-transform: rotate(22deg); - transform: rotate(22deg); - } - - 32% { - -webkit-transform: rotate(-12deg); - transform: rotate(-12deg); - } - - 36% { - -webkit-transform: rotate(12deg); - transform: rotate(12deg); - } - - 40%, - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} - -@keyframes fa-shake { - 0% { - -webkit-transform: rotate(-15deg); - transform: rotate(-15deg); - } - - 4% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - - 8%, - 24% { - -webkit-transform: rotate(-18deg); - transform: rotate(-18deg); - } - - 12%, - 28% { - -webkit-transform: rotate(18deg); - transform: rotate(18deg); - } - - 16% { - -webkit-transform: rotate(-22deg); - transform: rotate(-22deg); - } - - 20% { - -webkit-transform: rotate(22deg); - transform: rotate(22deg); - } - - 32% { - -webkit-transform: rotate(-12deg); - transform: rotate(-12deg); - } - - 36% { - -webkit-transform: rotate(12deg); - transform: rotate(12deg); - } - - 40%, - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.fa-rotate-90 { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} - -.fa-rotate-180 { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} - -.fa-rotate-270 { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); -} - -.fa-flip-horizontal { - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); -} - -.fa-flip-vertical { - -webkit-transform: scale(1, -1); - transform: scale(1, -1); -} - -.fa-flip-both, -.fa-flip-horizontal.fa-flip-vertical { - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); -} - -.fa-rotate-by { - -webkit-transform: rotate(var(--fa-rotate-angle, none)); - transform: rotate(var(--fa-rotate-angle, none)); -} - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; -} - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; - z-index: var(--fa-stack-z-index, auto); -} - -.fa-stack-1x { - line-height: inherit; -} - -.fa-stack-2x { - font-size: 2em; -} - -.fa-inverse { - color: var(--fa-inverse, #fff); -} - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.fa-arrow-up-right::before { - content: '\e09f'; -} - -.fa-arrows-rotate::before { - content: '\f021'; -} - -.fa-bars::before { - content: '\f0c9'; -} - -.fa-bolt::before { - content: '\f0e7'; -} - -.fa-book-open::before { - content: '\f518'; -} - -.fa-book-open-alt::before { - content: '\e0c0'; -} - -.fa-book-open-cover::before { - content: '\e0c0'; -} - -.fa-box::before { - content: '\f466'; -} - -.fa-chart-line-up::before { - content: '\e0e5'; -} - -.fa-chart-simple::before { - content: '\e473'; -} - -.fa-chevron-down::before { - content: '\f078'; -} - -.fa-circle-exclamation::before { - content: '\f06a'; -} - -.fa-comment::before { - content: '\f075'; -} - -.fa-comment-alt-edit::before { - content: '\f4a4'; -} - -.fa-comment-quote::before { - content: '\e14c'; -} - -.fa-database::before { - content: '\f1c0'; -} - -.fa-discord::before { - content: '\f392'; -} - -.fa-envelope::before { - content: '\f0e0'; -} - -.fa-exclamation-circle::before { - content: '\f06a'; -} - -.fa-file-binary::before { - content: '\e175'; -} - -.fa-folder-magnifying-glass::before { - content: '\e18b'; -} - -.fa-folder-search::before { - content: '\e18b'; -} - -.fa-github::before { - content: '\f09b'; -} - -.fa-globe::before { - content: '\f0ac'; -} - -.fa-grid-2::before { - content: '\e196'; -} - -.fa-hands-heart::before { - content: '\f4c3'; -} - -.fa-hands-holding-heart::before { - content: '\f4c3'; -} - -.fa-headset::before { - content: '\f590'; -} - -.fa-layer-group::before { - content: '\f5fd'; -} - -.fa-message-edit::before { - content: '\f4a4'; -} - -.fa-message-pen::before { - content: '\f4a4'; -} - -.fa-navicon::before { - content: '\f0c9'; -} - -.fa-refresh::before { - content: '\f021'; -} - -.fa-server::before { - content: '\f233'; -} - -.fa-signal-stream::before { - content: '\f8dd'; -} - -.fa-slack::before { - content: '\f198'; -} - -.fa-slack-hash::before { - content: '\f198'; -} - -.fa-slash::before { - content: '\f715'; -} - -.fa-star::before { - content: '\f005'; -} - -.fa-sync::before { - content: '\f021'; -} - -.fa-terminal::before { - content: '\f120'; -} - -.fa-triangle::before { - content: '\f2ec'; -} - -.fa-twitter::before { - content: '\f099'; -} - -.fa-user::before { - content: '\f007'; -} - -.fa-users-viewfinder::before { - content: '\e595'; -} - -.fa-youtube::before { - content: '\f167'; -} - -.fa-zap::before { - content: '\f0e7'; -} - -.sr-only, -.fa-sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.sr-only-focusable:not(:focus), -.fa-sr-only-focusable:not(:focus) { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.fab, -.fa-brands { - font-weight: 400; -} - -:root, -:host { - --fa-style-family-brands: 'Font Awesome 6 Brands'; - --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; -} - -@font-face { - font-family: 'Font Awesome 6 Brands'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url('/docs/fonts/fa-brands-400.woff2') format('woff2'), - url('/fonts/fa-brands-400.woff2') format('woff2'); -} -@font-face { - font-family: 'Font Awesome 6 Pro'; - font-style: normal; - font-weight: 900; - font-display: block; - src: url('/docs/fonts/fa-solid-900.woff2') format('woff2'), - url('/fonts/fa-solid-900.woff2') format('woff2'); -} - -.fa-rabbit-fast:before, -.fa-rabbit-running:before { - content: '\f709'; -} - -.fa-discord::before { - content: '\f392'; -} - -.fa-github::before { - content: '\f09b'; -} - -.fa-slack::before { - content: '\f198'; -} - -.fa-slack-hash::before { - content: '\f198'; -} - -.fa-twitter::before { - content: '\f099'; -} - -.fa-youtube::before { - content: '\f167'; -} - -.fa-x-twitter::before { - content: '\e61b'; -} - -/*! - * Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license (Commercial License) - * Copyright 2023 Fonticons, Inc. - */ -:root, -:host { - --fa-style-family-classic: 'Font Awesome 6 Pro'; - --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; -} - -@font-face { - font-family: 'Font Awesome 6 Pro'; - font-style: normal; - font-weight: 300; - font-display: block; - src: url('/docs/fonts/fa-light-300.woff2') format('woff2'), - url('/fonts/fa-light-300.woff2') format('woff2'); -} - -.fal, -.fa-light { - font-weight: 300; -} - -/*! - * Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license (Commercial License) - * Copyright 2023 Fonticons, Inc. - */ -:root, -:host { - --fa-style-family-classic: 'Font Awesome 6 Pro'; - --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Pro'; -} - -@font-face { - font-family: 'Font Awesome 6 Pro'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url('/docs/fonts/fa-regular-400.woff2') format('woff2'), - url('/fonts/fa-regular-400.woff2') format('woff2'); -} - -.far, -.fa-regular { - font-weight: 400; -} -.fa-arrow-right:before { - content: '\f061'; -} diff --git a/src/styles/layout.css b/src/styles/layout.css deleted file mode 100644 index 0a3a40b3a0..0000000000 --- a/src/styles/layout.css +++ /dev/null @@ -1,632 +0,0 @@ -/** Inter Regular */ -@font-face { - font-family: 'Inter'; - font-weight: 400; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/Inter-Regular.woff2'), url('/fonts/Inter-Regular.woff2'); -} - -/** Inter Medium */ -@font-face { - font-family: 'Inter'; - font-weight: 500; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/Inter-Medium.woff2'), url('/fonts/Inter-Medium.woff2'); -} - -/** Inter Italic */ -@font-face { - font-family: 'Inter'; - font-weight: 400; - font-style: italic; - font-display: swap; - src: url('/docs/fonts/Inter-Italic.woff2'), url('/fonts/Inter-Italic.woff2'); -} - -/** Inter SemiBold */ -@font-face { - font-family: 'Inter'; - font-weight: 600; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/Inter-SemiBold.woff2'), url('/fonts/Inter-SemiBold.woff2'); -} - -/** Inter SemiBold Italic */ -@font-face { - font-family: 'Inter'; - font-weight: 600; - font-style: italic; - font-display: swap; - src: url('/docs/fonts/Inter-SemiBoldItalic.woff2'), url('/fonts/Inter-SemiBoldItalic.woff2'); -} - -/** Inter Bold */ -@font-face { - font-family: 'Inter'; - font-weight: 700; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/Inter-Bold.woff2'), url('/fonts/Inter-Bold.woff2'); -} - -/** Inter Bold Italic */ -@font-face { - font-family: 'Inter'; - font-weight: 700; - font-style: italic; - font-display: swap; - src: url('/docs/fonts/Inter-BoldItalic.woff2'), url('/fonts/Inter-BoldItalic.woff2'); -} - -/** Barlow Bold */ -@font-face { - font-family: 'Barlow'; - font-weight: 600; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/Barlow-Bold.woff2'), url('/fonts/Barlow-Bold.woff2'); -} - -@font-face { - font-family: 'JetBrainsMono'; - font-weight: 400; - font-style: normal; - font-display: swap; - src: url('/docs/fonts/JetBrainsMono-Regular.woff2'), url('/fonts/JetBrainsMono-Regular.woff2'); -} - -html { - font-family: 'Inter', sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - box-sizing: border-box; - overflow-y: scroll; - /* Issue 894 */ - font-size: 16px; -} - -body { - /* Generic */ - --main-font-color: #2d3748; - --main-bgd-color: #f7fafc; - --header-bg-color: #ffffff; - --selection-bgd-color: #0c344b; - --white-color: #ffffff; - --link-color: #3182ce; - --border-color: #e2e8f0; - --code-bgd-color: #f6f8fa; - --code-inline-bgd-color: #edf2f7; - --list-bullet-color: #a0aec0; - --search-highlight-bg-color: #ebf8ff; - --tag-media-color: #2d3748; - --gradient1-color: #2f3747; - --gradient2-color: #0d0f14; - --header-btn-color: #4a5568; - /* Code blocks */ - --code-inner-color: #718096; - --code-token1-color: #d5408c; - --code-token2-color: #805ad5; - --code-token3-color: #319795; - --code-token4-color: #dd6b21; - --code-token5-color: #690; - --code-token6-color: #9a6e3a; - --code-token7-color: #e90; - --code-linenum-color: #cbd5e0; - --code-added-color: #47bb78; - --code-added-bg-color: #d9f4e6; - --code-deleted-color: #e53e3e; - --code-deleted-bg-color: #f5e4e7; - --code-highlight-color: #a0aec0; - --code-highlight-bg-color: #e2e8f0; - --code-edit-bg-color: #c3dafe; - --code-result-bg-color: #e7edf3; - /* Buttons */ - --red-color: #ff4f56; - --green-color: #15bd76; - --grey-color: #3d556b; - --grey-bg-color: #8fa6b2; - --dark-color: rgb(12, 52, 75); - - margin: 0; - font-family: 'Inter', sans-serif; - font-weight: normal; - word-wrap: break-word; - color: var(--main-font-color); - background-color: var(--white-color); -} - -@media (prefers-color-scheme: dark) { - body { - /* Generic */ - --main-font-color: #e2e8f0; - --main-bgd-color: #1a202c; - --border-color: #2d3748; - --header-bg-color: #1a202c; - --selection-bgd-color: #0c344b; - --white-color: #ffffff; - --link-color: #7f9cf5; - --code-bgd-color: #2d3748; - --code-inline-bgd-color: #2d3748; - --list-bullet-color: #a0aec0; - --search-highlight-bg-color: #ebf8ff; - --tag-media-color: #2d3748; - --gradient1-color: #2f3747; - --gradient2-color: #0d0f14; - --header-btn-color: #4a5568; - /* Code blocks */ - --code-inner-color: #718096; - --code-token1-color: #d5408c; - --code-token2-color: #805ad5; - --code-token3-color: #319795; - --code-token4-color: #dd6b21; - --code-token5-color: #690; - --code-token6-color: #9a6e3a; - --code-token7-color: #e90; - --code-linenum-color: #cbd5e0; - --code-added-color: #47bb78; - --code-added-bg-color: #d9f4e6; - --code-deleted-color: #e53e3e; - --code-deleted-bg-color: #f5e4e7; - --code-highlight-color: #a0aec0; - --code-highlight-bg-color: #4a5568; - --code-edit-bg-color: #c3dafe; - --code-result-bg-color: #e7edf3; - /* Buttons */ - --red-color: #ff4f56; - --green-color: #15bd76; - --grey-color: #3d556b; - --grey-bg-color: #8fa6b2; - --dark-color: rgb(12, 52, 75); - - color: var(--main-font-color); - background-color: var(--main-bgd-color); - } - .gatsby-resp-image-image { - box-shadow: none !important; - } - kbd { - background: var(--main-bgd-color) !important; - } - .planetscale { - path { - fill: #e2e8f0 !important; - } - } -} - -::selection, -pre[class*='language-']::selection, -pre[class*='language-'] ::selection, -code[class*='language-']::selection, -code[class*='language-'] ::selection { - color: var(--white-color); - background: var(--selection-bgd-color); -} - -pre { - margin: 0; -} - -a { - color: var(--link-color); -} - -h3 { - display: block; - margin-block-start: 1em; - margin-block-end: 1em; -} - -h4 { - margin-block-start: 1.33em; - margin-block-end: 1.33em; -} - -h5 { - margin-block-start: 1.67em; - margin-block-end: 1.67em; -} - -h6 { - margin-block-start: 2.33em; - margin-block-end: 2.33em; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-inline-start: 0px; - margin-inline-end: 0px; -} - -html { - line-height: unset; - -webkit-text-size-adjust: unset; -} - -body { - font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI'; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: 'Inter', sans-serif; - font-weight: 500; -} - -h1.inline-code { - display: inline-block; -} - -h2 { - margin: 0; - margin-block-end: 0; - margin-block-start: 0; -} - -section h2, -section h3, -section h4, -section h5, -section h6 { - margin-top: 2em; - font-weight: 600; - text-decoration: none; - color: var(--main-font-color); -} - -section h2 { - margin-bottom: 0; -} - -.title-link { - /* margin-left: -24px; - margin-right: 5px; */ - opacity: 0; -} - -h2:hover .title-link, -h3:hover .title-link, -h4:hover .title-link, -h5:hover .title-link, -h6:hover .title-link { - opacity: 1; -} - -h2 code, -h3 code, -h4 code, -h5 code, -h6 code { - font-size: inherit; -} - -* { - box-sizing: border-box; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -img { - max-width: 100%; - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} - -p { - margin: 1rem 0; -} - -p, -li { - font-family: 'Inter', sans-serif; - font-style: normal; - font-weight: normal; - font-size: 16px; - line-height: 24px; -} - -kbd { - background: var(--white-color); - box-shadow: 0px 1px 1px rgba(47, 55, 71, 0.6), 0px 1px 4px rgba(47, 55, 71, 0.2); - border-bottom: 1px solid rgba(47, 55, 71, 0.2); - border-radius: 4px; - padding: 2px 6px; - vertical-align: baseline; - font-size: 14px !important; - font-family: 'JetBrainsMono' !important; -} - -table { - width: 100%; - word-break: normal; - border: 1px solid var(--border-color); - border-radius: 8px; - border-spacing: 0px; - margin: 0 0px 20px; - white-space: inherit; -} - -table * { - font-size: 13px; -} - -table th { - text-align: left; - font-size: 14px; - font-weight: 600; - padding: 12px; -} - -table td { - padding: 12px; - border-top: 1px solid var(--border-color); - vertical-align: top; -} - -table code { - white-space: nowrap; -} - -blockquote { - font-family: Inter; - font-style: normal; - font-weight: 600; - font-size: 16px; - line-height: 24px; - color: var(--code-inner-color); - padding-left: 2rem; - padding-bottom: 8px; - padding-bottom: 8px; - margin: 2rem 0px; - position: relative; -} - -blockquote pre { - font-weight: normal; -} - -blockquote::before { - content: ''; - position: absolute; - width: 8px; - height: 100%; - left: 0px; - background: var(--code-bgd-color); - border-radius: 5px; -} - -blockquote code { - color: var(--code-inner-color); -} - -blockquote p { - margin: 0; -} - -hr { - margin: 2rem 0; - margin-left: -40px; - margin-right: -40px; - border: 0; - height: 1px; - background: var(--border-color); -} - -.list { - padding: 0; - margin-left: 24px; -} - -.list li { - padding-left: 8px; - /* text-indent: -1em; */ - margin-top: 10px; -} - -.list li::marker { - content: '\2022'; - color: var(--list-bullet-color); - display: inline-block; - width: 1em; - margin-left: -1em; - font-size: 20px; -} - -.o-list li { - margin-top: 10px; -} - -.clearfix { - clear: both; -} - -.list li pre .line-no { - width: 45px; -} - -@media (min-width: 0px) and (max-width: 767px) { - hr { - margin-left: -24px; - margin-right: -24px; - } - .pre-highlight { - margin-right: -24px; - margin-left: -24px; - } - - .pre-highlight pre { - border-radius: 0; - } - - .tab-content .copy-button { - right: 40px; - } - - .list li pre .pre-highlight { - margin-left: 0; - margin-right: 0; - } -} - -/* TEMP */ - -a.question, -span.concept, -span.api, -span.guide { - background: #bee3f8; - border-radius: 4px; - padding: 2px; - color: #3182ce; - font-weight: 600; - font-size: 12px; - line-height: 24px; - text-decoration: none; -} - -span.api::before { - content: 'API'; -} - -span.concept::before { - content: 'CONCEPT'; -} - -span.guide::before { - content: 'GUIDE'; -} - -a.question { - border-radius: 10px; - padding: 2px 6px; -} - -a.question::before { - content: '?'; -} - -.videoWrapper { - position: relative; - padding-bottom: 56.25%; /* 16:9 */ - height: 0; -} -.videoWrapper iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.gatsby-resp-image-wrapper { - margin-left: 0 !important; -} - -/* - - - nav.toc { - position: fixed; - top: 0; - right: 0; - width: 250px; - } - - ul.toc-list > li { - list-style-type: none; - margin-left: 24px; - font-size: 13px; - } - - ul.toc-list > li > a { - color: #c2c2c2; - text-decoration: none; - border-bottom: 0; - transition: 1s all ease-in-out; - } - - ul.toc-list > li.is-current > a { - color: black !important; - } */ - -/* - We want to hide YouTube videos in Percy snapshots since they can provide - unstable results. - - https://docs.percy.io/docs/percy-specific-css#percy-css-media-query - */ -@media only percy { - iframe { - visibility: hidden; - } - - section img { - visibility: hidden; - } - - /* hide cookie banner */ - #onetrust-consent-sdk { - display: none; - } -} - -/* Kapa.ai overrides */ -#kapa-widget-container .mantine-Button-root { - z-index: 1000; -} - -#kapa-widget-container .mantine-Image-root { - height: 2rem; -} - -#kapa-widget-container .mantine-Text-root { - font-size: 1rem; - color: #71e8df; - filter: drop-shadow(0px 0.724px 1.251px rgba(14, 18, 28, 0.02)) - drop-shadow(0px 1.608px 2.909px rgba(14, 18, 28, 0.04)) - drop-shadow(0px 2.793px 5.225px rgba(14, 18, 28, 0.06)) - drop-shadow(0px 4.55px 8.671px rgba(14, 18, 28, 0.07)) - drop-shadow(0px 7.485px 14.285px rgba(14, 18, 28, 0.08)) - drop-shadow(0px 13.358px 24.966px rgba(14, 18, 28, 0.09)) - drop-shadow(0px 33px 54px rgba(14, 18, 28, 0.07)); -} - -#kapa-widget-container .mantine-Image-image { - width: 2.5rem !important; - height: 2.5rem !important; -} - -#kapa-widget-container .mantine-Button-root { - height: 4rem !important; - width: 4rem !important; - border-radius: 8px; - border: 2px solid #71e8df !important; -} - -#kapa-widget-container .mantine-Stack-root { - margin-top: 0px !important; -} - -.mantine-Modal-body img { - margin-bottom: 0; -} - -.gatsby-resp-image-wrapper { - margin-left: inherit !important; -} diff --git a/src/templates/docs.tsx b/src/templates/docs.tsx deleted file mode 100644 index 0efabfa11b..0000000000 --- a/src/templates/docs.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { RouterProps, navigate } from '@reach/router' -import { graphql } from 'gatsby' -import MDXRenderer from 'gatsby-plugin-mdx/mdx-renderer' -import * as React from 'react' -import Layout from '../components/layout' -import PageBottom from '../components/pageBottom' -import SEO from '../components/seo' -import TopSection from '../components/topSection' -import { ArticleQueryData } from '../interfaces/Article.interface' -import { CreatePageContext } from '../interfaces/Layout.interface' - -type ArticleLayoutProps = ArticleQueryData & RouterProps & CreatePageContext - -const ArticleLayout = ({ data, ...props }: ArticleLayoutProps) => { - if (!data) { - return null - } - const { - mdx: { - fields: { slug, modSlug }, - frontmatter: { title, langSwitcher, dbSwitcher, toc, tocDepth, codeStyle, wide, hideTitle }, - body, - parent, - tableOfContents, - }, - site: { - siteMetadata: { docsLocation }, - }, - } = data - return ( - -
- -
- {body} - -
- ) -} - -export default ArticleLayout - -export const Head = ({ pageContext: { seoTitle, seoDescription } }: ArticleLayoutProps) => { - return -} - -export const query = graphql` - query ($id: String!) { - site { - siteMetadata { - docsLocation - } - } - mdx(fields: { id: { eq: $id } }) { - fields { - slug - modSlug - } - body - parent { - ... on File { - relativePath - } - } - tableOfContents - frontmatter { - title - metaTitle - metaDescription - langSwitcher - search - wide - dbSwitcher - hideTitle - toc - tocDepth - codeStyle - } - } - } -` diff --git a/src/theme/@types/image.d.ts b/src/theme/@types/image.d.ts deleted file mode 100644 index aa89b66acd..0000000000 --- a/src/theme/@types/image.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module '*.svg' { - const content: any - export default content -} - -declare module '*.webp' { - const content: any - export default content -} diff --git a/src/theme/@types/index.d.ts b/src/theme/@types/index.d.ts deleted file mode 100644 index a74abe11a7..0000000000 --- a/src/theme/@types/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import 'styled-components' - -import { defaultTheme } from '../index' - -// and extend them! -declare module 'styled-components' { - type DefaultPrismaTheme = typeof defaultTheme - export interface DefaultTheme extends DefaultPrismaTheme {} -} diff --git a/src/theme/@types/styledComponentsOverride.d.ts b/src/theme/@types/styledComponentsOverride.d.ts deleted file mode 100644 index 6ac90e42bb..0000000000 --- a/src/theme/@types/styledComponentsOverride.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CSSProp } from 'styled-components' - -interface MyTheme {} - -declare module 'react' { - interface Attributes { - css?: CSSProp - } -} diff --git a/src/theme/Admonition/Icon/Warning.tsx b/src/theme/Admonition/Icon/Warning.tsx new file mode 100644 index 0000000000..dd49e288fb --- /dev/null +++ b/src/theme/Admonition/Icon/Warning.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +export default function AdmonitionIconCaution(props) { + return ( + + + + ); +} diff --git a/src/theme/CodeBlock/Container/index.tsx b/src/theme/CodeBlock/Container/index.tsx new file mode 100644 index 0000000000..682d928a3e --- /dev/null +++ b/src/theme/CodeBlock/Container/index.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import clsx from 'clsx'; +import {ThemeClassNames, usePrismTheme} from '@docusaurus/theme-common'; +import {getPrismCssVariables} from '@docusaurus/theme-common/internal'; +import styles from './styles.module.scss'; +export default function CodeBlockContainer({as: As, ...props}) { + const prismTheme = usePrismTheme(); + const prismCssVariables = getPrismCssVariables(prismTheme); + return ( + + ); +} diff --git a/src/theme/CodeBlock/Container/styles.module.scss b/src/theme/CodeBlock/Container/styles.module.scss new file mode 100644 index 0000000000..2ec3769213 --- /dev/null +++ b/src/theme/CodeBlock/Container/styles.module.scss @@ -0,0 +1,42 @@ +.codeBlockContainer { + background: var(--prism-background-color); + color: var(--prism-color); + box-shadow: var(--ifm-global-shadow-lw); + border-radius: var(--ifm-code-border-radius); + max-width: 100%; + + ::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; + background-color: transparent; + } + ::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: #c5c6c8; + } + ::-webkit-scrollbar-track { + border-radius: 10px; + background-color: transparent; + } + ::-webkit-scrollbar-corner { + background-color: transparent; + border-color: transparent; + } +} + +.file { + font-weight: 600; + color: rgb(113, 128, 150); + font-size: 0.875rem; + font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + margin-bottom: 0.5rem; + > span { + color: inherit; + display: inline-flex; + -webkit-box-align: center; + align-items: center; + svg { + margin-right: 0.5rem; + } + } +} \ No newline at end of file diff --git a/src/theme/CodeBlock/Content/Element.tsx b/src/theme/CodeBlock/Content/Element.tsx new file mode 100644 index 0000000000..16411be351 --- /dev/null +++ b/src/theme/CodeBlock/Content/Element.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.scss'; +import Container from '../Container'; +//
 tags in markdown map to CodeBlocks. They may contain JSX children. When
+// the children is not a simple string, we just return a styled block without
+// actually highlighting.
+export default function CodeBlockJSX({children, className, wrap = false}) {
+  return (
+    
+      {children}
+    
+  );
+}
diff --git a/src/theme/CodeBlock/Content/String.tsx b/src/theme/CodeBlock/Content/String.tsx
new file mode 100644
index 0000000000..7d924e918f
--- /dev/null
+++ b/src/theme/CodeBlock/Content/String.tsx
@@ -0,0 +1,104 @@
+import React from 'react';
+import clsx from 'clsx';
+import {useThemeConfig, usePrismTheme} from '@docusaurus/theme-common';
+import {
+  parseCodeBlockTitle,
+  parseLanguage,
+  parseLines,
+  containsLineNumbers,
+  useCodeWordWrap,
+} from '@docusaurus/theme-common/internal';
+import {Highlight} from 'prism-react-renderer';
+import styles from './styles.module.scss';
+import Container from '../Container';
+import WordWrapButton from '../WordWrapButton';
+import CopyButton from '../CopyButton';
+import Line from '../Line';
+// Prism languages are always lowercase
+// We want to fail-safe and allow both "php" and "PHP"
+// See https://github.com/facebook/docusaurus/issues/9012
+function normalizeLanguage(language) {
+  return language?.toLowerCase();
+}
+export default function CodeBlockString({
+  children,
+  className: blockClassName = '',
+  metastring,
+  title: titleProp,
+  showLineNumbers: showLineNumbersProp,
+  language: languageProp,
+  wrap = false
+}) {
+  const {
+    prism: {defaultLanguage, magicComments},
+  } = useThemeConfig();
+  const language = normalizeLanguage(
+    languageProp ?? parseLanguage(blockClassName) ?? defaultLanguage,
+  );
+  const prismTheme = usePrismTheme();
+  const wordWrap = useCodeWordWrap();
+  // We still parse the metastring in case we want to support more syntax in the
+  // future. Note that MDX doesn't strip quotes when parsing metastring:
+  // "title=\"xyz\"" => title: "\"xyz\""
+  const title = parseCodeBlockTitle(metastring) || titleProp;
+  const {lineClassNames, code} = parseLines(children, {
+    metastring,
+    language,
+    magicComments,
+  });
+  const showLineNumbers =
+    showLineNumbersProp ?? containsLineNumbers(metastring);
+  return (
+    
+      {title && 
{title}
} +
+ + {({className, style, tokens, getLineProps, getTokenProps}) => ( +
+              
+                {tokens.map((line, i) => (
+                  
+                ))}
+              
+            
+ )} +
+
+ {(wordWrap.isEnabled || wordWrap.isCodeScrollable) && ( + wordWrap.toggle()} + isEnabled={wordWrap.isEnabled} + /> + )} + {!metastring?.includes("no-copy") && } +
+
+
+ ); +} diff --git a/src/theme/CodeBlock/Content/styles.module.scss b/src/theme/CodeBlock/Content/styles.module.scss new file mode 100644 index 0000000000..109cdbf9f4 --- /dev/null +++ b/src/theme/CodeBlock/Content/styles.module.scss @@ -0,0 +1,82 @@ +.codeBlockContent { + position: relative; + /* rtl:ignore */ + direction: ltr; + border-radius: inherit; +} + +.codeBlockTitle { + border-bottom: 1px solid var(--ifm-color-emphasis-300); + font-size: var(--ifm-code-font-size); + font-weight: 500; + padding: 0.75rem var(--ifm-pre-padding); + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.codeBlock { + --ifm-pre-background: var(--prism-background-color); + margin: 0; +} + +.codeBlockTitle + .codeBlockContent .codeBlock { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.codeBlockLines { + float: left; + min-width: 100%; + > span { + padding: 0 0 0 calc(var(--ifm-pre-padding) * 2); + } +} + +.codeBlockLinesWithNumbering { + display: table; + > span:not(.codeHighlighted) { + margin-left: calc(var(--ifm-pre-padding) * -1); + padding: 0 0 0 var(--ifm-pre-padding); + } +} + +@media print { + .codeBlockLines { + white-space: pre-wrap; + } +} + +.buttonGroup { + display: flex; + column-gap: 0.2rem; + position: absolute; + /* rtl:ignore */ + right: calc(var(--ifm-pre-padding) / 2); + top: calc(var(--ifm-pre-padding) / 2); +} + +.buttonGroup button { + display: flex; + align-items: center; + background: var(--prism-background-color); + color: var(--prism-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: var(--ifm-global-radius); + padding: 0.4rem; + line-height: 0; + transition: opacity var(--ifm-transition-fast) ease-in-out; + opacity: 0; +} + +.buttonGroup button:focus-visible, +.buttonGroup button:hover { + opacity: 1 !important; +} + +:global(.theme-code-block:hover) .buttonGroup button { + opacity: 0.4; +} + +.wrap { + white-space: wrap !important; +} \ No newline at end of file diff --git a/src/theme/CodeBlock/CopyButton/index.js b/src/theme/CodeBlock/CopyButton/index.js new file mode 100644 index 0000000000..fd430b473c --- /dev/null +++ b/src/theme/CodeBlock/CopyButton/index.js @@ -0,0 +1,53 @@ +import React, {useCallback, useState, useRef, useEffect} from 'react'; +import clsx from 'clsx'; +import copy from 'copy-text-to-clipboard'; +import {translate} from '@docusaurus/Translate'; +import IconCopy from '@theme/Icon/Copy'; +import IconSuccess from '@theme/Icon/Success'; +import styles from './styles.module.css'; +export default function CopyButton({code, className}) { + const [isCopied, setIsCopied] = useState(false); + const copyTimeout = useRef(undefined); + const handleCopyCode = useCallback(() => { + copy(code); + setIsCopied(true); + copyTimeout.current = window.setTimeout(() => { + setIsCopied(false); + }, 1000); + }, [code]); + useEffect(() => () => window.clearTimeout(copyTimeout.current), []); + return ( + + ); +} diff --git a/src/theme/CodeBlock/CopyButton/styles.module.css b/src/theme/CodeBlock/CopyButton/styles.module.css new file mode 100644 index 0000000000..d5268e900b --- /dev/null +++ b/src/theme/CodeBlock/CopyButton/styles.module.css @@ -0,0 +1,40 @@ +:global(.theme-code-block:hover) .copyButtonCopied { + opacity: 1 !important; +} + +.copyButtonIcons { + position: relative; + width: 1.125rem; + height: 1.125rem; +} + +.copyButtonIcon, +.copyButtonSuccessIcon { + position: absolute; + top: 0; + left: 0; + fill: currentColor; + opacity: inherit; + width: inherit; + height: inherit; + transition: all var(--ifm-transition-fast) ease; +} + +.copyButtonSuccessIcon { + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0.33); + opacity: 0; + color: #00d600; +} + +.copyButtonCopied .copyButtonIcon { + transform: scale(0.33); + opacity: 0; +} + +.copyButtonCopied .copyButtonSuccessIcon { + transform: translate(-50%, -50%) scale(1); + opacity: 1; + transition-delay: 0.075s; +} diff --git a/src/theme/CodeBlock/Line/index.tsx b/src/theme/CodeBlock/Line/index.tsx new file mode 100644 index 0000000000..fe1d8094e6 --- /dev/null +++ b/src/theme/CodeBlock/Line/index.tsx @@ -0,0 +1,49 @@ +import React, { useEffect } from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.scss'; +export default function CodeBlockLine({ + line, + classNames, + showLineNumbers, + getLineProps, + getTokenProps, +}) { + if (line.length === 1 && line[0].content === '\n') { + line[0].content = ''; + } + const highlightedLine = classNames?.find((e:string) => e.includes("code-highlight")) + const lineProps = getLineProps({ + line, + className: clsx( + classNames, + showLineNumbers ? styles.codeLine : styles.noLineNumbers, + highlightedLine && (showLineNumbers ? styles.highlightedNumbers : styles.highlightedLine) + ), + }); + const lineTokens = line.map((token, key) => ( + + )); + return ( + + {showLineNumbers ? ( + <> + + {!highlightedLine && } + {lineTokens} + + + ) : ( + + {lineTokens} + + )} +
+
+ ); +} diff --git a/src/theme/CodeBlock/Line/styles.module.scss b/src/theme/CodeBlock/Line/styles.module.scss new file mode 100644 index 0000000000..0175bea115 --- /dev/null +++ b/src/theme/CodeBlock/Line/styles.module.scss @@ -0,0 +1,91 @@ +/* Intentionally has zero specificity, so that to be able to override +the background in custom CSS file due bug https://github.com/facebook/docusaurus/issues/3678 */ + +:global(.theme-code-block-added-line) { + background-color: var(--docusaurus-added-code-line-bg); + display: block; + padding: 0 var(--ifm-pre-padding) 0 42px; + position: relative; +} +:global(.theme-code-block-added-line)::before { + content: "+" !important; + position: absolute; + left: 16px; + color: #47bb78;; +} +:global(.theme-code-block-deleted-line) { + background-color: var(--docusaurus-deleted-code-line-bg); + display: block; + padding: 0 var(--ifm-pre-padding) 0 42px; + position: relative; +} +:global(.theme-code-block-deleted-line)::before { + content: "-" !important; + position: absolute; + left: 16px; + color: #e53e3e;; +} + +:global(.theme-code-block-edited-line) { + background-color: var(--docusaurus-edited-code-line-bg); + display: block; + padding: 0 var(--ifm-pre-padding) 0 42px; + position: relative; +} +:global(.theme-code-block-edited-line)::before { + content: "✎" !important; + position: absolute; + left: 16px; + color: #a0aec0;; +} + +:global(.theme-code-block-highlighted-line) { + background-color: var(--docusaurus-highlighted-code-line-bg); + display: block; + position: relative; +} + +.codeLine { + display: table-row; + counter-increment: line-count; + padding-left: 0; +} + + + +.noLineNumbers { + margin: 0 -16px 0 0; +} + +.noLineNumbers:not( .code-highlight ) { + padding: 0 0 0 calc(var(--ifm-pre-padding)) !important; + margin: 0; +} + +.codeLineNumber { + display: table-cell; + text-align: right; + width: min-content; + left: 0; + padding: 0 var(--ifm-pre-padding); + overflow-wrap: normal; +} + +.codeLineNumber::before { + content: counter(line-count); + opacity: 0.4; +} + +:global(.theme-code-block-highlighted-line) .codeLineNumber::before { + opacity: 0.8; +} + +.codeLineContent { + padding-right: var(--ifm-pre-padding); +} +.highlightedNumbers { + margin: 0 !important; + .codeHighlighted { + margin-left: var(--ifm-pre-padding); + } +} diff --git a/src/theme/CodeBlock/WordWrapButton/index.js b/src/theme/CodeBlock/WordWrapButton/index.js new file mode 100644 index 0000000000..3a4136b630 --- /dev/null +++ b/src/theme/CodeBlock/WordWrapButton/index.js @@ -0,0 +1,27 @@ +import React from 'react'; +import clsx from 'clsx'; +import {translate} from '@docusaurus/Translate'; +import IconWordWrap from '@theme/Icon/WordWrap'; +import styles from './styles.module.css'; +export default function WordWrapButton({className, onClick, isEnabled}) { + const title = translate({ + id: 'theme.CodeBlock.wordWrapToggle', + message: 'Toggle word wrap', + description: + 'The title attribute for toggle word wrapping button of code block lines', + }); + return ( + + ); +} diff --git a/src/theme/CodeBlock/WordWrapButton/styles.module.css b/src/theme/CodeBlock/WordWrapButton/styles.module.css new file mode 100644 index 0000000000..fdbc894646 --- /dev/null +++ b/src/theme/CodeBlock/WordWrapButton/styles.module.css @@ -0,0 +1,8 @@ +.wordWrapButtonIcon { + width: 1.2rem; + height: 1.2rem; +} + +.wordWrapButtonEnabled .wordWrapButtonIcon { + color: var(--ifm-color-primary); +} diff --git a/src/theme/CodeBlock/index.tsx b/src/theme/CodeBlock/index.tsx new file mode 100644 index 0000000000..7574067b46 --- /dev/null +++ b/src/theme/CodeBlock/index.tsx @@ -0,0 +1,46 @@ +import React, {isValidElement, useEffect} from 'react'; +import useIsBrowser from '@docusaurus/useIsBrowser'; +import CodeBlockString from './Content/String'; +import CodeBlockJSX from './Content/Element'; +import styles from "./Container/styles.module.scss" +/** + * Best attempt to make the children a plain string so it is copyable. If there + * are react elements, we will not be able to copy the content, and it will + * return `children` as-is; otherwise, it concatenates the string children + * together. + */ +function maybeStringifyChildren(children) { + if (React.Children.toArray(children).some((el) => isValidElement(el))) { + return children; + } + // The children is now guaranteed to be one/more plain strings + return Array.isArray(children) ? children.join('') : children; +} +export default function CodeBlock({children: rawChildren, ...props}) { + // The Prism theme on SSR is always the default theme but the site theme can + // be in a different mode. React hydration doesn't update DOM styles that come + // from SSR. Hence force a re-render after mounting to apply the current + // relevant styles. + const isBrowser = useIsBrowser(); + const children = maybeStringifyChildren(rawChildren); + const wrap = Boolean(props?.metastring?.split(" ").find(e => e === "wrap")) + const file = + props?.metastring?.includes("file") ? + props?.metastring?.split(" ").find((e: string) => e.includes("file")).replace("file=", "") : false + const CodeBlockComp = + typeof children === 'string' ? CodeBlockString : CodeBlockJSX; + return ( + <> + {file &&
+ + + {file} + +
} + {/* @ts-ignore */} + + {children} + + + ); +} diff --git a/src/theme/DocBreadcrumbs/Items/Home/index.tsx b/src/theme/DocBreadcrumbs/Items/Home/index.tsx new file mode 100644 index 0000000000..d0d7c7a3ac --- /dev/null +++ b/src/theme/DocBreadcrumbs/Items/Home/index.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import {translate} from '@docusaurus/Translate'; +import IconHome from '@theme/Icon/Home'; +import styles from './styles.module.css'; +export default function HomeBreadcrumbItem() { + const homeHref = useBaseUrl('/'); + return ( +
  • + + + +
  • + ); +} diff --git a/src/theme/DocBreadcrumbs/Items/Home/styles.module.css b/src/theme/DocBreadcrumbs/Items/Home/styles.module.css new file mode 100644 index 0000000000..533d764872 --- /dev/null +++ b/src/theme/DocBreadcrumbs/Items/Home/styles.module.css @@ -0,0 +1,7 @@ +.breadcrumbHomeIcon { + position: relative; + top: 1px; + vertical-align: top; + height: 1.1rem; + width: 1.1rem; +} diff --git a/src/theme/DocBreadcrumbs/index.tsx b/src/theme/DocBreadcrumbs/index.tsx new file mode 100644 index 0000000000..574ecd0202 --- /dev/null +++ b/src/theme/DocBreadcrumbs/index.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from 'react'; +import clsx from 'clsx'; +import {ThemeClassNames} from '@docusaurus/theme-common'; +import { + useSidebarBreadcrumbs, + useHomePageRoute, +} from '@docusaurus/theme-common/internal'; +import Link from '@docusaurus/Link'; +import {translate} from '@docusaurus/Translate'; +import HomeBreadcrumbItem from '@theme/DocBreadcrumbs/Items/Home'; +import styles from './styles.module.css'; +// TODO move to design system folder +function BreadcrumbsItemLink({children, href}) { + const className = 'breadcrumbs__link'; + return href ? ( + + {children} + + ) : ( + // TODO Google search console doesn't like breadcrumb items without href. + // The schema doesn't seem to require `id` for each `item`, although Google + // insist to infer one, even if it's invalid. Removing `itemProp="item + // name"` for now, since I don't know how to properly fix it. + // See https://github.com/facebook/docusaurus/issues/7241 + {children} + ); +} +// TODO move to design system folder +function BreadcrumbsItem({children, active, index, addMicrodata}) { + return ( +
  • + {children} + +
  • + ); +} +export default function DocBreadcrumbs() { + const breadcrumbs = useSidebarBreadcrumbs(); + const homePageRoute = useHomePageRoute(); + if (!breadcrumbs) { + return null; + } + const repeatedBreadcrumbs = () => { + if (breadcrumbs.length === 2) { + if (breadcrumbs[0].label === breadcrumbs[1].label) return false + else return true + } + return true + } + return ( + repeatedBreadcrumbs() && breadcrumbs.length > 1 && + ); +} diff --git a/src/theme/DocBreadcrumbs/styles.module.css b/src/theme/DocBreadcrumbs/styles.module.css new file mode 100644 index 0000000000..72da4671a4 --- /dev/null +++ b/src/theme/DocBreadcrumbs/styles.module.css @@ -0,0 +1,4 @@ +.breadcrumbsContainer { + --ifm-breadcrumb-size-multiplier: 0.8; + margin-bottom: 0.8rem; +} diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx new file mode 100644 index 0000000000..d261c30618 --- /dev/null +++ b/src/theme/DocCard/index.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import { + findFirstSidebarItemLink, + useDocById, +} from '@docusaurus/theme-common/internal'; +import isInternalUrl from '@docusaurus/isInternalUrl'; +import {translate} from '@docusaurus/Translate'; +import Heading from '@theme/Heading'; +import styles from './styles.module.scss'; +function CardContainer({href, children}) { + return ( + + {children} + + ); +} +function CardLayout({href, icon, title, description}) { + return ( + + + {title} + + + ); +} +function CardCategory({item}) { + const href = findFirstSidebarItemLink(item); + // Unexpected: categories that don't have a link have been filtered upfront + if (!href) { + return null; + } + return ( + + ); +} +function CardLink({item}) { + const icon = isInternalUrl(item.href) ? '📄️' : '🔗'; + const doc = useDocById(item.docId ?? undefined); + return ( + + ); +} +export default function DocCard({item}) { + switch (item.type) { + case 'link': + return ; + case 'category': + return ; + default: + throw new Error(`unknown item type ${JSON.stringify(item)}`); + } +} diff --git a/src/theme/DocCard/styles.module.scss b/src/theme/DocCard/styles.module.scss new file mode 100644 index 0000000000..40d4900f6e --- /dev/null +++ b/src/theme/DocCard/styles.module.scss @@ -0,0 +1,42 @@ +.cardContainer { + --ifm-link-color: var(--ifm-color-emphasis-800); + --ifm-link-hover-color: var(--ifm-color-emphasis-700); + --ifm-link-hover-decoration: none; + + border: 1px solid var(--ifm-btn-border-color); + transition: all var(--ifm-transition-fast) ease; + transition-property: border; + color: var(--main-font-color); + background-color: transparent; + text-decoration: none !important; + align-items: center; + justify-content: center; + display: flex; + height: 100%; + @media (min-width: 997px) { + display: block; + height: auto; + } +} + +.cardContainer:hover { + border-color: var(--ifm-btn-border-color-active); +} + +.cardContainer *:last-child { + margin-bottom: 0; +} + +.cardTitle { + font-family: Barlow; + font-size: 18px; + font-weight: 600; + line-height: 24px; + text-align: center; + @media (min-width: 997px) { + text-align: left; + } +} +.col6 { + --ifm-col-width: 50% !important; +} diff --git a/src/theme/DocCardList/index.tsx b/src/theme/DocCardList/index.tsx new file mode 100644 index 0000000000..86c88db1e8 --- /dev/null +++ b/src/theme/DocCardList/index.tsx @@ -0,0 +1,33 @@ +import React, { useEffect, useState } from 'react'; +import clsx from 'clsx'; +import { + useCurrentSidebarCategory, + filterDocCardListItems, +} from '@docusaurus/theme-common'; +import DocCard from '../DocCard'; +import { useLocation } from '@docusaurus/router'; +import styles from "../DocCard/styles.module.scss" +function DocCardListForCurrentSidebarCategory({className}) { + const category = useCurrentSidebarCategory(); + return ; +} +export default function DocCardList(props) { + const {items, className} = props; + const location = useLocation() + if (!items) { + return ; + } + const [filteredItems, setFilteredItems] = useState(filterDocCardListItems(items)) + useEffect(() => { + setFilteredItems(filteredItems.filter((e: any) => e?.href?.slice(0, -1) !== location.pathname)) + }, [items]) + return ( +
    + {filteredItems.map((item, index) => ( +
    + +
    + ))} +
    + ); +} diff --git a/src/theme/DocSidebarItem/Category/index.tsx b/src/theme/DocSidebarItem/Category/index.tsx new file mode 100644 index 0000000000..4978294d1d --- /dev/null +++ b/src/theme/DocSidebarItem/Category/index.tsx @@ -0,0 +1,198 @@ +import React, {useEffect, useMemo, useState} from 'react'; +import clsx from 'clsx'; +import { + ThemeClassNames, + useThemeConfig, + usePrevious, + Collapsible, + useCollapsible, +} from '@docusaurus/theme-common'; +import { + isActiveSidebarItem, + findFirstSidebarItemLink, + useDocSidebarItemsExpandedState, + isSamePath, +} from '@docusaurus/theme-common/internal'; +import Link from '@docusaurus/Link'; +import {translate} from '@docusaurus/Translate'; +import useIsBrowser from '@docusaurus/useIsBrowser'; +import DocSidebarItems from '@theme/DocSidebarItems'; +import styles from '../Link/styles.module.css'; +// If we navigate to a category and it becomes active, it should automatically +// expand itself +function useAutoExpandActiveCategory({isActive, collapsed, updateCollapsed}) { + const wasActive = usePrevious(isActive); + useEffect(() => { + const justBecameActive = isActive && !wasActive; + if (justBecameActive && collapsed) { + updateCollapsed(false); + } + }, [isActive, wasActive, collapsed, updateCollapsed]); +} +/** + * When a collapsible category has no link, we still link it to its first child + * during SSR as a temporary fallback. This allows to be able to navigate inside + * the category even when JS fails to load, is delayed or simply disabled + * React hydration becomes an optional progressive enhancement + * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188 + * see https://github.com/facebook/docusaurus/issues/3030 + */ +function useCategoryHrefWithSSRFallback(item) { + const isBrowser = useIsBrowser(); + return useMemo(() => { + if (item.href && !item.linkUnlisted) { + return item.href; + } + // In these cases, it's not necessary to render a fallback + // We skip the "findFirstCategoryLink" computation + if (isBrowser || !item.collapsible) { + return undefined; + } + return findFirstSidebarItemLink(item); + }, [item, isBrowser]); +} +function CollapseButton({collapsed, categoryLabel, onClick}) { + return ( + + ); +} +export default function NavbarMobileSidebarHeader() { + return ( +
    + + /docs + + +
    + ); +} diff --git a/src/theme/Navbar/MobileSidebar/Header/styles.module.scss b/src/theme/Navbar/MobileSidebar/Header/styles.module.scss new file mode 100644 index 0000000000..5722f478a8 --- /dev/null +++ b/src/theme/Navbar/MobileSidebar/Header/styles.module.scss @@ -0,0 +1,8 @@ +.docsLink { + color: var(--ifm-navbar-link-color); + font-family: Inter, sans-serif; + font-size: 22px; + font-style: normal; + font-weight: 500; + margin-left: -28px; +} \ No newline at end of file diff --git a/src/theme/SearchBar/index.tsx b/src/theme/SearchBar/index.tsx new file mode 100644 index 0000000000..8054b766e1 --- /dev/null +++ b/src/theme/SearchBar/index.tsx @@ -0,0 +1,266 @@ +import React, { useCallback, useMemo, useRef, useState } from 'react' +import { createPortal } from 'react-dom' +import { DocSearchButton, useDocSearchKeyboardEvents } from '@docsearch/react' +import Head from '@docusaurus/Head' +import Link from '@docusaurus/Link' +import { useHistory } from '@docusaurus/router' +import { + isRegexpStringMatch, + useSearchLinkCreator, +} from '@docusaurus/theme-common' +import { + useAlgoliaContextualFacetFilters, + useSearchResultUrlProcessor, +} from '@docusaurus/theme-search-algolia/client' +import Translate from '@docusaurus/Translate' +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' +import translations from '@theme/SearchTranslations' + +import type { AutocompleteState } from '@algolia/autocomplete-core' +import type { + DocSearchModal as DocSearchModalType, + DocSearchModalProps, +} from '@docsearch/react' +import type { + InternalDocSearchHit, + StoredDocSearchHit, +} from '@docsearch/react/dist/esm/types' +import type { SearchClient } from 'algoliasearch/lite' + +type DocSearchProps = Omit< + DocSearchModalProps, + 'onClose' | 'initialScrollY' +> & { + contextualSearch?: string + externalUrlRegex?: string + searchPagePath: boolean | string +} + +let DocSearchModal: typeof DocSearchModalType | null = null + +function Hit({ + hit, + children, +}: { + hit: InternalDocSearchHit | StoredDocSearchHit + children: React.ReactNode +}) { + return {children} +} + +type ResultsFooterProps = { + state: AutocompleteState + onClose: () => void +} + +function ResultsFooter({ state, onClose }: ResultsFooterProps) { + const createSearchLink = useSearchLinkCreator() + + return ( + + + {'See all {count} results'} + + + ) +} + +type FacetFilters = Required< + Required['searchParameters'] +>['facetFilters'] + +function mergeFacetFilters(f1: FacetFilters, f2: FacetFilters): FacetFilters { + const normalize = ( + f: FacetFilters + ): readonly string[] | readonly (string | readonly string[])[] => + typeof f === 'string' ? [f] : f + return [...normalize(f1), ...normalize(f2)] as FacetFilters +} + +function DocSearch({ + contextualSearch, + externalUrlRegex, + ...props +}: DocSearchProps) { + const { siteMetadata } = useDocusaurusContext() + const processSearchResultUrl = useSearchResultUrlProcessor() + + const contextualSearchFacetFilters = + useAlgoliaContextualFacetFilters() as FacetFilters + + const configFacetFilters: FacetFilters = + props.searchParameters?.facetFilters ?? [] + + const facetFilters: FacetFilters = contextualSearch + ? // Merge contextual search filters with config filters + mergeFacetFilters(contextualSearchFacetFilters, configFacetFilters) + : // ... or use config facetFilters + configFacetFilters + + // We let user override default searchParameters if she wants to + const searchParameters: DocSearchProps['searchParameters'] = { + ...props.searchParameters, + facetFilters, + } + + const history = useHistory() + const searchContainer = useRef(null) + const searchButtonRef = useRef(null) + const [isOpen, setIsOpen] = useState(false) + const [initialQuery, setInitialQuery] = useState( + undefined + ) + + const importDocSearchModalIfNeeded = useCallback(() => { + if (DocSearchModal) { + return Promise.resolve() + } + + return Promise.all([ + import('@docsearch/react/modal') as Promise< + typeof import('@docsearch/react') + >, + import('@docsearch/react/style'), + import('./styles.css'), + ]).then(([{ DocSearchModal: Modal }]) => { + DocSearchModal = Modal + }) + }, []) + + const onOpen = useCallback(() => { + importDocSearchModalIfNeeded().then(() => { + searchContainer.current = document.createElement('div') + document.body.insertBefore( + searchContainer.current, + document.body.firstChild + ) + setIsOpen(true) + }) + }, [importDocSearchModalIfNeeded, setIsOpen]) + + const onClose = useCallback(() => { + setIsOpen(false) + searchContainer.current?.remove() + searchButtonRef.current?.focus() + }, [setIsOpen]) + + const onInput = useCallback( + (event: KeyboardEvent) => { + importDocSearchModalIfNeeded().then(() => { + setIsOpen(true) + setInitialQuery(event.key) + }) + }, + [importDocSearchModalIfNeeded, setIsOpen, setInitialQuery] + ) + + const navigator = useRef({ + navigate({ itemUrl }: { itemUrl?: string }) { + // Algolia results could contain URL's from other domains which cannot + // be served through history and should navigate with window.location + if (isRegexpStringMatch(externalUrlRegex, itemUrl)) { + window.location.href = itemUrl! + } else { + history.push(itemUrl!) + } + }, + }).current + + const transformItems = useRef( + (items) => + props.transformItems + ? // Custom transformItems + props.transformItems(items) + : // Default transformItems + items.map((item) => ({ + ...item, + url: processSearchResultUrl(item.url), + })) + ).current + + const resultsFooterComponent: DocSearchProps['resultsFooterComponent'] = + useMemo( + () => + // eslint-disable-next-line react/no-unstable-nested-components + ( + footerProps: Omit + ): JSX.Element => + , + [onClose] + ) + + const transformSearchClient = useCallback( + (searchClient: SearchClient) => { + searchClient.addAlgoliaAgent( + 'docusaurus', + siteMetadata.docusaurusVersion + ) + + return searchClient + }, + [siteMetadata.docusaurusVersion] + ) + + useDocSearchKeyboardEvents({ + isOpen, + onOpen, + onClose, + onInput, + searchButtonRef, + }) + + return ( + <> + + {/* This hints the browser that the website will load data from Algolia, + and allows it to preconnect to the DocSearch cluster. It makes the first + query faster, especially on mobile. */} + + + + + + {isOpen && + DocSearchModal && + searchContainer.current && + createPortal( + , + searchContainer.current + )} + + ) +} + +export default function SearchBar(): JSX.Element { + const { siteConfig } = useDocusaurusContext() + return +} diff --git a/src/theme/SearchBar/styles.css b/src/theme/SearchBar/styles.css new file mode 100644 index 0000000000..fdf8dff9a4 --- /dev/null +++ b/src/theme/SearchBar/styles.css @@ -0,0 +1,14 @@ +:root { + --docsearch-primary-color: var(--ifm-color-primary); + --docsearch-text-color: var(--ifm-font-color-base); +} + +.DocSearch-Button { + margin: 0; + transition: all var(--ifm-transition-fast) + var(--ifm-transition-timing-default); +} + +.DocSearch-Container { + z-index: calc(var(--ifm-z-index-fixed) + 1); +} diff --git a/src/theme/TabItem/index.tsx b/src/theme/TabItem/index.tsx new file mode 100644 index 0000000000..78ba69713f --- /dev/null +++ b/src/theme/TabItem/index.tsx @@ -0,0 +1,20 @@ +import React, { useEffect } from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.scss'; +export default function TabItem({children, hidden, className, code = false, table = false, terminal = false }) { + return ( +
    +
    {children}
    +
    + ); +} diff --git a/src/theme/TabItem/styles.module.scss b/src/theme/TabItem/styles.module.scss new file mode 100644 index 0000000000..caadb0b548 --- /dev/null +++ b/src/theme/TabItem/styles.module.scss @@ -0,0 +1,31 @@ +.tabItem > *:last-child { + margin-bottom: 0; +} + +.children { + width: min-content; +} + +.tableChildren { + width: auto; + padding: 0 16px; +} + +.codeChildren { + width: max-content; + max-width: 100%; +} + +.terminal { + > div > div { + padding: 0; + } +} + +:global(.code-children > div) { + width: 100%; +} + +:global(.empty-code-tab) { + padding: 1rem; +} \ No newline at end of file diff --git a/src/theme/Tabs/index.tsx b/src/theme/Tabs/index.tsx new file mode 100644 index 0000000000..3a038c55b4 --- /dev/null +++ b/src/theme/Tabs/index.tsx @@ -0,0 +1,123 @@ +import React, {cloneElement} from 'react'; +import clsx from 'clsx'; +import { + useScrollPositionBlocker, + useTabs, + sanitizeTabsChildren, +} from '@docusaurus/theme-common/internal'; +import useIsBrowser from '@docusaurus/useIsBrowser'; +import styles from './styles.module.scss'; +function TabList({className, block, selectedValue, selectValue, tabValues}) { + const tabRefs = []; + const {blockElementScrollPositionUntilNextRender} = + useScrollPositionBlocker(); + const handleTabChange = (event) => { + const newTab = event.currentTarget; + const newTabIndex = tabRefs.indexOf(newTab); + const newTabValue = tabValues[newTabIndex].value; + if (newTabValue !== selectedValue) { + blockElementScrollPositionUntilNextRender(newTab); + selectValue(newTabValue); + } + }; + const handleKeydown = (event) => { + let focusElement = null; + switch (event.key) { + case 'Enter': { + handleTabChange(event); + break; + } + case 'ArrowRight': { + const nextTab = tabRefs.indexOf(event.currentTarget) + 1; + focusElement = tabRefs[nextTab] ?? tabRefs[0]; + break; + } + case 'ArrowLeft': { + const prevTab = tabRefs.indexOf(event.currentTarget) - 1; + focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1]; + break; + } + default: + break; + } + focusElement?.focus(); + }; + return ( +
      + {tabValues.map(({value, label, attributes}) => ( +
    • tabRefs.push(tabControl)} + onKeyDown={handleKeydown} + onClick={handleTabChange} + {...attributes} + className={clsx('tabs__item', styles.tabItem, attributes?.className, { + 'tabs__item--active': selectedValue === value, + })}> + {label ?? value} +
    • + ))} +
    + ); +} +function TabContent({lazy, children, selectedValue, transparent, code, terminal}) { + const childTabs = (Array.isArray(children) ? children : [children]).filter( + Boolean, + ); + if (lazy) { + const selectedTabItem = childTabs.find( + (tabItem) => tabItem.props.value === selectedValue, + ); + if (!selectedTabItem) { + // fail-safe or fail-fast? not sure what's best here + return null; + } + return cloneElement(selectedTabItem, {className: 'margin-top--md'}); + } + return ( +
    + {childTabs.map((tabItem, i) => + cloneElement(tabItem, { + key: i, + hidden: tabItem.props.value !== selectedValue, + code: code, + terminal: terminal + }), + )} +
    + ); +} +function TabsComponent(props) { + const tabs = useTabs(props); + return ( +
    + + +
    + ); +} +export default function Tabs(props) { + const isBrowser = useIsBrowser(); + return ( + + {sanitizeTabsChildren(props.children)} + + ); +} diff --git a/src/theme/Tabs/styles.module.scss b/src/theme/Tabs/styles.module.scss new file mode 100644 index 0000000000..c82285257f --- /dev/null +++ b/src/theme/Tabs/styles.module.scss @@ -0,0 +1,25 @@ +.tabList { + margin-bottom: var(--ifm-leading); +} + +.tabItem { + margin-top: 0 !important; +} + +.transparent { + background-color: revert !important; + border: none !important; + pre { + padding-top: var(--ifm-pre-padding); + background: var(--code-bgd-color) !important; + } +} + +.code { + pre { + padding-bottom: 0 !important; + code { + padding-bottom: var(--ifm-pre-padding) !important; + } + } +} \ No newline at end of file diff --git a/src/theme/breakpoints.ts b/src/theme/breakpoints.ts deleted file mode 100644 index 2b8e8f898f..0000000000 --- a/src/theme/breakpoints.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const mobile = 360 -export const tabletVertical = 768 -export const desktopSmall = 940 -export const tabletHorizontal = 1024 -export const desktopLarge = 1440 diff --git a/src/theme/components/buttons.ts b/src/theme/components/buttons.ts deleted file mode 100644 index bf8cf17466..0000000000 --- a/src/theme/components/buttons.ts +++ /dev/null @@ -1,199 +0,0 @@ -import * as t from '../primitives' - -const buttonDefault = { - transition: 'background-color .1s ease, color .2s ease', - backgroundColor: 'transparent', // t.gray['500'] - color: t.colors.text, - fontFamily: t.fonts.text, - fontWeight: 700, - hover: { - backgroundColor: 'transparent', // t.gray['600'] - }, -} - -export const buttonsDefault = { - primary: { - ...buttonDefault, - color: 'white', - backgroundColor: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - border: `1px solid ${t.indigo[700]}`, - backgroundColor: t.indigo[700], - color: 'white', - }, - active: { - border: `1px solid ${t.indigo[800]}`, - backgroundColor: t.indigo[800], - color: 'white', - }, - indigo: { - backgroundColor: t.indigo[600], - color: 'white', - border: `1px solid ${t.indigo[600]}`, - hover: { - border: `1px solid ${t.indigo[700]}`, - backgroundColor: t.indigo[700], - color: 'white', - }, - active: { - border: `1px solid ${t.indigo[800]}`, - backgroundColor: t.indigo[800], - color: 'white', - }, - }, - teal: { - backgroundColor: t.teal[600], - color: 'white', - border: `1px solid ${t.teal[600]}`, - hover: { - border: `1px solid ${t.teal[700]}`, - backgroundColor: t.teal[700], - color: 'white', - }, - active: { - border: `1px solid ${t.teal[800]}`, - backgroundColor: t.teal[800], - color: 'white', - }, - }, - white: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid white`, - hover: { - border: `1px solid white`, - backgroundColor: 'white', - color: t.indigo[700], - }, - active: { - border: `1px solid white`, - backgroundColor: 'white', - color: t.indigo[800], - }, - }, - }, - - secondary: { - ...buttonDefault, - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - color: t.indigo[700], - border: `1px solid ${t.indigo[700]}`, - }, - active: { - backgroundColor: 'white', - color: t.indigo[800], - border: `1px solid ${t.indigo[800]}`, - }, - indigo: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[700]}`, - color: t.indigo[700], - }, - active: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[800]}`, - color: t.indigo[800], - }, - }, - teal: { - backgroundColor: 'white', - color: t.teal[600], - border: `1px solid ${t.teal[600]}`, - hover: { - border: `1px solid ${t.teal[700]}`, - backgroundColor: 'white', - color: t.teal[700], - }, - active: { - border: `1px solid ${t.teal[800]}`, - backgroundColor: 'white', - color: t.teal[800], - }, - }, - white: { - backgroundColor: 'white', - color: t.indigo[600], - border: `1px solid ${t.indigo[600]}`, - hover: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[700]}`, - color: t.indigo[700], - }, - active: { - backgroundColor: 'white', - border: `1px solid ${t.indigo[800]}`, - color: t.indigo[800], - }, - }, - }, - - link: { - ...buttonDefault, - backgroundColor: 'transparent', - color: t.indigo[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - indigo: { - backgroundColor: 'transparent', - color: t.indigo[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - }, - teal: { - backgroundColor: 'transparent', - color: t.teal[600], - border: 'none', - hover: { - backgroundColor: 'transparent', - color: t.teal[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.teal[800], - border: 'none', - }, - }, - white: { - backgroundColor: 'transparent', - border: 'none', - color: t.indigo[600], - hover: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - active: { - backgroundColor: 'transparent', - color: t.indigo[800], - border: 'none', - }, - }, - }, -} diff --git a/src/theme/components/centerCard.ts b/src/theme/components/centerCard.ts deleted file mode 100644 index 3fbd3bb30a..0000000000 --- a/src/theme/components/centerCard.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as t from '../primitives' - -export const centerCardDefault = { - backgroundColor: 'white', - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: t.gray['800'], - navItemHoverColor: t.indigo[600], - - mobileMenuButtonColor: t.gray['800'], - mobileLinkDividerColor: t.gray['300'], -} - -export const centerCardDark: typeof centerCardDefault = { - backgroundColor: t.black, - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: 'white', - navItemHoverColor: t.indigo[300], - - mobileLinkDividerColor: t.gray['700'], - mobileMenuButtonColor: 'white', -} diff --git a/src/theme/components/contentCard.ts b/src/theme/components/contentCard.ts deleted file mode 100644 index 2fd79f48c8..0000000000 --- a/src/theme/components/contentCard.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as t from '../primitives' - -export const contentCardDefault = { - backgroundColor: 'white', - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: t.gray['800'], - navItemHoverColor: t.indigo[600], - - mobileMenuButtonColor: t.gray['800'], - mobileLinkDividerColor: t.gray['300'], -} - -export const contentCardDark: typeof contentCardDefault = { - backgroundColor: t.black, - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: 'white', - navItemHoverColor: t.indigo[300], - - mobileLinkDividerColor: t.gray['700'], - mobileMenuButtonColor: 'white', -} diff --git a/src/theme/components/darkCard.ts b/src/theme/components/darkCard.ts deleted file mode 100644 index eb109c8799..0000000000 --- a/src/theme/components/darkCard.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as t from '../primitives' - -export const darkCardDefault = { - backgroundColor: 'black', - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: t.gray['800'], - navItemHoverColor: t.indigo[600], - - mobileMenuButtonColor: t.gray['800'], - mobileLinkDividerColor: t.gray['300'], -} - -export const darkCardDark: typeof darkCardDefault = { - backgroundColor: t.black, - mobileNavigationBreakpoint: 940, - placeholder: '/placeholder.png', - icon: '/card-icon.svg', - navItemColor: 'white', - navItemHoverColor: t.indigo[300], - - mobileLinkDividerColor: t.gray['700'], - mobileMenuButtonColor: 'white', -} diff --git a/src/theme/components/footer.ts b/src/theme/components/footer.ts deleted file mode 100644 index a23ed3ccff..0000000000 --- a/src/theme/components/footer.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as t from '../primitives' - -export const footerDefault = { - mobileBreakpoint: 940, - - backgroundColor: 'white', - titleColor: t.gray[700], - titleSize: t.baseFontSizes[16], - - linkColor: t.gray[800], - linkHoverColor: { - indigo: t.indigo[600], - teal: t.teal[700], - white: t.indigo[600], - }, - linkSize: t.baseFontSizes[18], - - logoUrl: 'https://prismalens.vercel.app/header/logo-dark.svg', -} - -export const footerDark: typeof footerDefault = { - mobileBreakpoint: 940, - - backgroundColor: t.blueGray[900], - titleColor: 'white', - titleSize: t.baseFontSizes[16], - - linkColor: 'white', - linkHoverColor: { - indigo: t.indigo[600], - teal: t.teal[600], - white: t.indigo[600], - }, - linkSize: t.baseFontSizes[18], - - logoUrl: 'https://prismalens.vercel.app/header/logo-white.svg', -} diff --git a/src/theme/components/header.ts b/src/theme/components/header.ts deleted file mode 100644 index 08cebd2d2f..0000000000 --- a/src/theme/components/header.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as t from '../primitives' - -export const headerDefault = { - backgroundColor: 'white', - mobileNavigationBreakpoint: 1040, - logoUrl: 'https://prismalens.vercel.app/header/logo-dark.svg', - navItemColor: t.gray['800'], - navItemHoverColor: { - indigo: t.indigo[600], - teal: t.teal[700], - white: t.indigo[600], - }, - mobileMenuButtonColor: t.gray['800'], - mobileLinkDividerColor: t.gray['300'], - // Dropdown Panel on Mobile - mobileDropdownPanelBackgroundColor: t.blueGray['100'], - mobileDropdownPanelHeadingColor: t.gray['600'], - mobileDropdownPanelLinkTitleColor: t.gray['800'], - mobileDropdownPanelLinkSubTitleColor: t.blueGray['600'], -} - -export const headerDark: typeof headerDefault = { - backgroundColor: t.black, - logoUrl: 'https://prismalens.vercel.app/header/logo-white.svg', - mobileNavigationBreakpoint: 1040, - navItemColor: 'white', - navItemHoverColor: { - indigo: t.indigo[300], - teal: t.teal[300], - white: t.indigo[300], - }, - mobileLinkDividerColor: t.gray['700'], - mobileMenuButtonColor: 'white', - // Dropdown Panel on Mobile - mobileDropdownPanelBackgroundColor: t.gray['800'], - mobileDropdownPanelHeadingColor: t.gray['400'], - mobileDropdownPanelLinkTitleColor: 'white', - mobileDropdownPanelLinkSubTitleColor: 'white', -} diff --git a/src/theme/components/hero.ts b/src/theme/components/hero.ts deleted file mode 100644 index 8e1359ad9a..0000000000 --- a/src/theme/components/hero.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as t from '../primitives' - -export const heroDefault = { - backgroundColor: 'white', - mobileNavigationBreakpoint: 940, - leftGrid: '/grid-left.svg', - rightGrid: '/grid-right.svg', - navItemColor: t.gray['800'], - navItemHoverColor: t.indigo[600], - - mobileMenuButtonColor: t.gray['800'], - mobileLinkDividerColor: t.gray['300'], -} - -export const heroDark: typeof heroDefault = { - backgroundColor: t.black, - mobileNavigationBreakpoint: 940, - leftGrid: '/grid-left.svg', - rightGrid: '/grid-right.svg', - navItemColor: 'white', - navItemHoverColor: t.indigo[300], - - mobileLinkDividerColor: t.gray['700'], - mobileMenuButtonColor: 'white', -} diff --git a/src/theme/components/labels.ts b/src/theme/components/labels.ts deleted file mode 100644 index a34726a558..0000000000 --- a/src/theme/components/labels.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as t from '../primitives' - -const labelDefault = { - backgroundColor: t.gray[500], - color: 'white', - fontSize: t.fontSizes[14], - padding: `${t.baseSpace[5]} ${t.baseSpace[8]}`, - borderRadius: '4px', -} - -export const labelsDefault = { - default: labelDefault, - primary: { ...labelDefault, backgroundColor: t.indigo[600] }, - secondary: { ...labelDefault, backgroundColor: t.teal[600] }, -} diff --git a/src/theme/css/button.ts b/src/theme/css/button.ts deleted file mode 100644 index e61e2719f5..0000000000 --- a/src/theme/css/button.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { defaultTheme } from '../' -import * as t from '../primitives' - -type ColorType = 'indigo' | 'teal' | 'white' -type BtnType = 'primary' | 'secondary' | 'link' | undefined - -export const buttonCss = ( - type: BtnType, - color: ColorType, - icon: undefined | 'left' | 'right', - disabled: boolean, - transparent: boolean -) => { - const btnType = defaultTheme.buttons[type ?? 'primary'] - return ` - display: inline-flex; - justify-content: center; - max-width: 100%; - text-align: left; - z-index: 1000; - margin: ${type !== 'link' ? '4px;' : icon === 'left' ? `4px 4px 4px 12px;` : `4px 12px 4px 4px;`} - width: max-content; - align-items: center; - box-sizing: border-box; - border-radius: 6px; - text-decoration: none; - cursor: ${disabled ? 'auto' : 'pointer'}; - position: relative; - line-height: 1; - transition: ${btnType.transition}; - font-family: ${btnType.fontFamily}; - font-weight: ${btnType.fontWeight}; - font-size: 18px; - border: none; - ${!disabled ? `border: ${color ? btnType[color]?.border : btnType.border};` : ``} - background-color: ${ - disabled - ? t.colors.gray[300] - : transparent - ? 'transparent !important' - : color - ? btnType[color]?.backgroundColor - : btnType.backgroundColor - }; - color: ${ - disabled - ? t.colors.gray[600] - : color - ? transparent - ? btnType[color]?.backgroundColor - : btnType[color]?.color - : transparent - ? btnType.backgroundColor - : btnType.color - }; - padding: ${ - type !== 'link' - ? !icon - ? '16px 24px' - : icon === 'left' - ? '16px 24px 16px 40px' - : '16px 40px 16px 24px' - : icon === 'left' - ? '0 0 0 10px' - : '0 10px 0 0' - }; - ${ - icon === 'left' - ? ` - flex-direction: row-reverse; - ` - : `` - } - ${ - !disabled - ? ` - &:hover { - ${ - type !== 'link' && `border: ${color ? btnType[color]?.hover.border : btnType.hover.border};` - } - background-color: ${ - color ? btnType[color]?.hover.backgroundColor : btnType.hover.backgroundColor - }; - color: ${btnType[color]?.hover[transparent ? `backgroundColor` : `color`]}; - ${type !== 'primary' ? `border-color: ${btnType[color]?.hover.color};` : ``} - &:before { - background-color: ${color ? btnType[color]?.hover.color : btnType.hover.color}; - } - > .btn-arrow { - transform: translate(4px, -50%); - } - };` - : `` - } - &:focus { - &:after { - content: ""; - position: absolute; - ${ - type === 'link' - ? ` - width: calc(100% + 20px); - height: calc(100% + 20px); - left: -8px; - top: -8px; - ` - : ` - width: calc(100% + 4px); - height: calc(100% + 4px); - left: -4px; - top: -4px; - ` - } - border-radius: 9px; - box-sizing: content-box; - border: 2px solid ${color ? btnType[color]?.hover.color : btnType.hover.color}; - } - } - &:active { - ${ - type !== 'link' && !disabled - ? `border: ${color ? btnType[color]?.active.border : btnType.active.border};` - : `` - } - background-color: ${ - !disabled - ? color - ? btnType[color]?.active.backgroundColor - : btnType.active.backgroundColor - : t.colors.gray[300] - }; - - color: ${ - !disabled - ? btnType[color]?.active[transparent ? `backgroundColor` : `color`] - : t.colors.gray[600] - }; - ${ - type !== 'primary' && !disabled - ? `border-color: ${btnType[color]?.active[transparent ? `backgroundColor` : `color`]};` - : `` - } - &:before { - background-color: ${ - color - ? btnType[color]?.active[transparent ? `backgroundColor` : `color`] - : btnType.active.color - }; - } - } - ${ - type === 'link' && - ` - &:before { - content: ""; - position: absolute; - height: 2px; - width: calc(100% - 9px); - ${icon === 'left' ? `right: 0;` : `left: 0;`} - bottom: -4px; - background-color: ${color ? btnType[color]?.color : btnType.color}; - }; - ` - } -` -} diff --git a/src/theme/dark.ts b/src/theme/dark.ts deleted file mode 100644 index 5d8fb7b32c..0000000000 --- a/src/theme/dark.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as breakpoints from './breakpoints' -import { buttonsDefault } from './components/buttons' -import { centerCardDark } from './components/centerCard' -import { contentCardDark } from './components/contentCard' -import { darkCardDark } from './components/darkCard' -import { footerDark } from './components/footer' -import { headerDark } from './components/header' -import { heroDark } from './components/hero' -import { labelsDefault } from './components/labels' -import * as t from './primitives' - -const theme = { - breakpoints, - - bodyBackgroundColor: 'white', - - header: headerDark, - footer: footerDark, - hero: heroDark, - - labels: labelsDefault, - - buttons: buttonsDefault, - - centerCard: centerCardDark, - contentCard: contentCardDark, - darkCard: darkCardDark, - - fonts: t.fonts, - fontSizes: t.fontSizes, - colors: t.colors, - space: t.space, - transitions: { - standard: '0.1s ease-in', - }, - shadows: { - small: '0px 4px 8px rgba(60,45,111,0.1), 0px 1px 3px rgba(60,45,111,0.15)', - }, - radii: { - small: '5px', - medium: '8px', - }, -} - -export default theme diff --git a/src/theme/default.ts b/src/theme/default.ts deleted file mode 100644 index 01ceca7fef..0000000000 --- a/src/theme/default.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as breakpoints from './breakpoints' -import { buttonsDefault } from './components/buttons' -import { centerCardDefault } from './components/centerCard' -import { contentCardDefault } from './components/contentCard' -import { darkCardDefault } from './components/darkCard' -import { footerDefault } from './components/footer' -import { headerDefault } from './components/header' -import { heroDefault } from './components/hero' -import { labelsDefault } from './components/labels' -import * as t from './primitives' - -const theme = { - breakpoints, - - bodyBackgroundColor: 'white', - - header: headerDefault, - footer: footerDefault, - hero: heroDefault, - - labels: labelsDefault, - - buttons: buttonsDefault, - centerCard: centerCardDefault, - contentCard: contentCardDefault, - darkCard: darkCardDefault, - - fonts: t.fonts, - fontSizes: t.fontSizes, - colors: t.colors, - space: t.space, - transitions: { - standard: '0.1s ease-in', - }, - shadows: { - small: '0px 4px 8px rgba(60,45,111,0.1), 0px 1px 3px rgba(60,45,111,0.15)', - }, - radii: { - small: '5px', - medium: '8px', - }, -} - -export default theme diff --git a/src/theme/index.ts b/src/theme/index.ts deleted file mode 100644 index 28687fa1e7..0000000000 --- a/src/theme/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as darkTheme } from './dark' -export { default as defaultTheme } from './default' diff --git a/src/theme/primitives.ts b/src/theme/primitives.ts deleted file mode 100644 index 22be5d9980..0000000000 --- a/src/theme/primitives.ts +++ /dev/null @@ -1,223 +0,0 @@ -export const gray = { - 100: '#F7FAFC', - 200: '#EDF2F7', - 300: '#E2E8F0', - 400: '#CBD5E0', - 500: '#A0AEC0', - 600: '#718096', - 700: '#4A5568', - 800: '#2D3748', - 900: '#1A202C', -} -export const black = '#1A202C' - -export const blueGray = { - 100: '#F7FAFC', - 200: '#EDF2F7', - 300: '#E2E8F0', - 400: '#CBD5E0', - 500: '#A0AEC0', - 600: '#718096', - 700: '#4A5568', - 800: '#2D3748', - 900: '#1A202C', -} - -export const teal = { - 100: '#D9F9F6', - 200: '#B7F4EE', - 300: '#92EFE6', - 400: '#71E8DF', - 500: '#04C8BB', - 600: '#16A394', - 700: '#187367', - 800: '#154F47', -} - -export const purple = { - 100: '#FAE8FA', - 200: '#F5C9F4', - 300: '#F4A0F1', - 400: '#E76DE3', - 500: '#C742C1', - 600: '#B024AD', - 700: '#891A8A', - 800: '#5B115F', -} - -export const indigo = { - 100: '#EBF4FF', - 200: '#C3DAFE', - 300: '#A3BFFA', - 400: '#7F9CF5', - 500: '#667EEA', - 600: '#5A67D8', - 700: '#4C51BF', - 800: '#434190', -} - -export const green = { - 100: '#F0FFF4', - 200: '#C6F6D5', - 300: '#9AE6B4', - 400: '#68D391', - 500: '#48BB78', - 600: '#38A169', - 700: '#276749', - 800: '#22543D', -} - -export const orange = { - 100: '#FFFAF0', - 200: '#FEEBC8', - 300: '#FBD38D', - 400: '#F6AD55', - 500: '#ED8936', - 600: '#DD6B20', - 700: '#C05621', - 800: '#9C4221', -} - -export const red = { - 100: '#FFF5F5', - 200: '#FED7D7', - 300: '#FEB2B2', - 400: '#FC8181', - 500: '#F56565', - 600: '#E53E3E', - 700: '#C53030', - 800: '#9B2C2C', -} - -export const pink = { - 100: '#FFF5F7', - 200: '#FED7E2', - 300: '#FBB6CE', - 400: '#F687B3', - 500: '#ED64A6', - 600: '#D53F8C', - 700: '#B83280', - 800: '#97266D', - 900: '#702459', -} - -export const blue = { - 100: '#EBF8FF', - 200: '#BEE3F8', - 300: '#90CDF4', - 400: '#63B3ED', - 500: '#4299E1', - 600: '#3182CE', - 700: '#2B6CB0', - 800: '#2C5282', - 900: '#2A4365', -} - -export const yellow = { - 100: '#FFFFF0', - 200: '#FEFCBF', - 300: '#FAF089', - 400: '#F6E05E', - 500: '#ECC94B', - 600: '#D69E2E', - 700: '#B7791F', - 800: '#975A16', - 900: '#744210', -} - -export const colors: { [key: string]: any } = { - gray, - red, - indigo, - teal, - blueGray, - green, - purple, - orange, - pink, - yellow, - black, - white: '#fff', - blue, - text: gray[800], - textSecondary: gray[600], -} - -export const fonts = { - text: `"Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`, - display: `"Barlow", system-ui, Arial, sans-serif`, - mono: `"JetBrains Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace`, - heading: `'Barlow', sans-serif`, -} - -export const baseFontSizes = { - 12: '.75rem', - 14: '.875rem', - 16: '1rem', - 18: '1.125rem', - 20: '1.25rem', - 22: '1.375rem', - 24: '1.5rem', - 26: '1.625rem', - 28: '1.75rem', - 30: '1.875rem', - 32: '2rem', - 36: '2.25rem', - 38: '2.375rem', - 40: '2.5rem', - 48: '3rem', - 56: '3.5rem', - 64: '4rem', - 72: '4.5rem', -} - -export const fontSizes = { - ...baseFontSizes, - small: baseFontSizes[14], - body: baseFontSizes[16], - large: baseFontSizes[20], - display: baseFontSizes[48], - displaySmall: baseFontSizes[24], - displayLarge: baseFontSizes[72], -} - -export const baseSpace = { - 0: '0rem', - 1: '1px', - 2: '0.125rem', - 4: '0.25rem', - 5: `${5 / 16}rem`, // Maybe don't use this even though it's from design? - 6: `${6 / 16}rem`, // Maybe don't use this even though it's from design? - 8: '0.5rem', - 12: '0.75rem', - 14: '0.875rem', - 15: `${15 / 16}rem`, - 16: '1rem', - 18: '1.125rem', - 20: '1.25rem', - 22: '1.375rem', - 24: '1.5rem', - 26: `${26 / 16}rem`, - 30: `${30 / 16}rem`, - 32: '2rem', - 40: '2.5rem', - 45: `${45 / 16}rem`, - 48: '3rem', - 64: '4rem', - 80: '5rem', - 96: '6rem', - 128: '8rem', - 160: '10rem', - 192: '12rem', - 224: '14rem', - 256: '16rem', -} - -export const space = { - ...baseSpace, - none: baseSpace[0], - one: baseSpace[1], - small: baseSpace[8], - medium: baseSpace[12], - large: baseSpace[20], -} diff --git a/src/theme/prism-include-languages.ts b/src/theme/prism-include-languages.ts new file mode 100644 index 0000000000..cf66987061 --- /dev/null +++ b/src/theme/prism-include-languages.ts @@ -0,0 +1,32 @@ +import siteConfig from '@generated/docusaurus.config' +import type * as PrismNamespace from 'prismjs' +import type { Optional } from 'utility-types' + +export default function prismIncludeLanguages(PrismObject: typeof PrismNamespace): void { + const { + themeConfig: { prism }, + } = siteConfig + const { additionalLanguages } = prism as { additionalLanguages: string[] } + + // Prism components work on the Prism instance on the window, while prism- + // react-renderer uses its own Prism instance. We temporarily mount the + // instance onto window, import components to enhance it, then remove it to + // avoid polluting global namespace. + // You can mutate PrismObject: registering plugins, deleting languages... As + // long as you don't re-assign it + globalThis.Prism = PrismObject + + additionalLanguages.forEach((lang) => { + if (lang === 'php') { + // eslint-disable-next-line global-require + require('prismjs/components/prism-markup-templating.js') + } + // eslint-disable-next-line global-require, import/no-dynamic-require + require(`prismjs/components/prism-${lang}`) + }) + + require('@site/src/theme/prism-prisma.js') + + // @ts-ignore + delete (globalThis as Optional).Prism +} \ No newline at end of file diff --git a/src/theme/prism-prisma.js b/src/theme/prism-prisma.js new file mode 100644 index 0000000000..57144da313 --- /dev/null +++ b/src/theme/prism-prisma.js @@ -0,0 +1,25 @@ +Prism.languages.prisma = Prism.languages.extend('clike', { + keyword: /\b(?:datasource|enum|generator|model|type|view)\b/, + 'type-class-name': /(\s+)[A-Z]\w+/, ///(\b)(\s+)[A-Z]\w+/ +}) + +Prism.languages.javascript['class-name'][0].pattern = + /(\b(?:model|datasource|enum|generator|type|model|view)\s+)[\w.\\]+/ + +Prism.languages.insertBefore('prisma', 'function', { + annotation: { + pattern: /(^|[^.])@+\w+/, + lookbehind: true, + alias: 'punctuation', + }, +}) + +Prism.languages.insertBefore('prisma', 'punctuation', { + 'type-args': /\b(?:references|fields|onDelete|onUpdate):/, +}) + +Prism.languages.insertBefore('prisma', 'type-class-name', { + 'not-class': /\n(\s+)[A-Z]\w+/, +}) + +Prism.languages.json5 = Prism.languages.js \ No newline at end of file diff --git a/src/theme/styles.module.scss b/src/theme/styles.module.scss new file mode 100644 index 0000000000..af8b2cc578 --- /dev/null +++ b/src/theme/styles.module.scss @@ -0,0 +1,43 @@ +.codeWithResult { + margin-top: 2rem; + margin-bottom: 1.25rem; + .cmd{ + pre { + border-radius: 8px 8px 0 0; + } + } + .result { + background-color: var(--main-font-color) !important; + color: var(--code-inline-bgd-color) !important; + border-radius: 0px 0px 8px 8px; + .showBtn { + font-family: Inter; + font-style: normal; + font-weight: 600; + font-size: 12px; + line-height: 100%; + letter-spacing: 0.01em; + color: var(--code-inner-color); + height: 24px; + display: flex; + -webkit-box-align: center; + align-items: center; + cursor: pointer; + padding: 1rem; + } + pre { + background-color: var(--main-font-color) !important; + color: var(--code-inline-bgd-color) !important; + border-radius: 0px 0px 8px 8px; + } + } + pre { + margin-top: 0px; + code { + color: inherit !important; + span { + color: inherit !important; + } + } + } +} \ No newline at end of file diff --git a/src/utils/goToNavItem.ts b/src/utils/goToNavItem.ts deleted file mode 100644 index 8570f3bc66..0000000000 --- a/src/utils/goToNavItem.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const goToNav = (pathname: string) => { - var currentElem = document.getElementById(pathname.replace(/\/$/, '')) - const sidebarElem = document.getElementById('sidebar-holder') - if (currentElem && sidebarElem) { - var topPos = currentElem.getBoundingClientRect().top - 250 - sidebarElem.scrollTo(0, topPos) - } -} diff --git a/src/utils/parentTitle.ts b/src/utils/parentTitle.ts deleted file mode 100644 index 0fd9fe1c38..0000000000 --- a/src/utils/parentTitle.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { urlGenerator } from './urlGenerator' - -const newParams = (langSwitcher: any, dbSwitcher: any) => - `${langSwitcher ? `${langSwitcher[0]}${dbSwitcher ? '-' : ''}` : ''}${ - dbSwitcher ? `${dbSwitcher[0]}` : '' - }` - -export const getParentTitle = (slug: string, allMdx?: any) => { - const allContent = - allMdx && - allMdx.edges && - allMdx.edges.map((mdx: any) => ({ - ...mdx.node.fields, - title: mdx.node.frontmatter.title, - staticLink: mdx.node.frontmatter.staticLink, - codeStyle: mdx.node.frontmatter.codeStyle, - langSwitcher: mdx.node.frontmatter.langSwitcher, - dbSwitcher: mdx.node.frontmatter.dbSwitcher, - })) - - allContent?.map((content: any) => { - content.parentTitle = [] - const parts = content.slug.split('/') - const slicedParts = parts.slice( - 1, - parts[parts.length - 1] === 'index' ? parts.length - 2 : parts.length - 1 - ) - slicedParts.forEach((part: any) => { - const parent = allContent.find((ac: any) => { - const parentParts = ac.slug.split('/') - return ( - parentParts[parentParts.length - 1] === 'index' && - parentParts[parentParts.length - 2] === part - ) - }) - if (parent) { - const newParamsParent = newParams(parent.langSwitcher, parent.dbSwitcher) - // const parts = parent.slug.split('/') - // const topLevel = parts.length == 3 && parts[parts.length - 1] === 'index' ? true : false - content.parentTitle.push({ - title: parent?.title, - codeStyle: parent?.codeStyle, - link: `${urlGenerator(parent.modSlug)}${newParamsParent ? '-' + newParamsParent : ''}`, - // link: topLevel || parent.staticLink ? null : urlGenerator(parent.modSlug), - }) - } - }) - }) - const currentSlug = allContent.find((mdx: any) => mdx.modSlug === slug) - return currentSlug ? currentSlug.parentTitle : [] -} diff --git a/src/utils/stats.js b/src/utils/stats.js deleted file mode 100644 index b2abe0c0db..0000000000 --- a/src/utils/stats.js +++ /dev/null @@ -1,38 +0,0 @@ -const ReactGA = require('react-ga') - -const GA_TRACKING_ID = 'UA-74131346-14' -const GA_ADDRESS = 'https://www.prisma.io/gastats.js' -const COLLECT_ADDRESS = 'https://stats.prisma.workers.dev' - -module.exports = { - init() { - ReactGA.initialize(GA_TRACKING_ID, { - gaAddress: GA_ADDRESS, - }) - - const ga = ReactGA.ga() - ga('set', 'anonymizeIp', true) - ga((u) => { - // Override sendHitTask to proxy tracking requests - u.set('sendHitTask', (model) => { - const xhr = new XMLHttpRequest() - xhr.open('POST', COLLECT_ADDRESS, true) - xhr.send(model.get('hitPayload')) - }) - }) - }, - - trackPage(page) { - const { host } = window.location - - if ( - host.includes('netlify') || - host.includes('localhost') || - host.includes('percy') || - host.includes('vercel') - ) { - return - } - ReactGA.pageview(page) - }, -} diff --git a/src/utils/stringify.ts b/src/utils/stringify.ts deleted file mode 100644 index 752d53f43d..0000000000 --- a/src/utils/stringify.ts +++ /dev/null @@ -1,41 +0,0 @@ -export function stringify(children: any): string { - if (typeof children === 'string') { - return children - } - - if (typeof children === 'undefined') { - return '' - } - - if (children === null) { - return '' - } - - if (children.props && children.props.children) { - children = children.props.children - } - if (children.props && children.props.children) { - children = children.props.children - } - - /** - * Necessary because now the pointer changed!!!! - */ - if (typeof children === 'string') { - return children - } - - if (Array.isArray(children)) { - return children - .map((el) => { - if (typeof el === 'string') { - return el - } else { - return stringify(el) - } - }) - .join('') - } - - return '' -} diff --git a/src/utils/treeData.ts b/src/utils/treeData.ts deleted file mode 100644 index 8e2e1735d1..0000000000 --- a/src/utils/treeData.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { urlGenerator } from './urlGenerator' -import { ArticleFields, ArticleFrontmatter } from '../interfaces/Article.interface' - -interface TreeNode { - node: { - fields: ArticleFields - frontmatter: ArticleFrontmatter - } -} - -const getCollpaseState = (part: string, location: any) => { - const mainpath = location.pathname.replace(/^\/|\/$/g, '').split('/') - const subpath = urlGenerator(part) - .replace(/^\/|\/$/g, '') - .split('/') - - const state = subpath.every((val) => mainpath.includes(val)) - return !state -} - -// TODO::Simplify the function -export const calculateTreeData = (edges: any, defaultCollapsed: any, location: any) => { - const tree = edges.reduce( - ( - accu: any, - { - node: { - fields: { slug, modSlug }, - frontmatter: { - title, - navTitle, - staticLink, - duration, - preview, - deprecated, - earlyaccess, - dbSwitcher, - langSwitcher, - hidePage, - codeStyle, - hideTitle, - }, - }, - }: TreeNode - ) => { - const parts = slug.split('/') - const topLevel = parts.length == 3 && parts[parts.length - 1] === 'index' ? true : false - let { items: prevItems } = accu - const slicedParts = parts.slice(1, -1) - const newParams = `${langSwitcher ? `${langSwitcher[0]}${dbSwitcher ? '-' : ''}` : ''}${ - dbSwitcher ? `${dbSwitcher[0]}` : '' - }` - for (const part of slicedParts) { - let tmp = prevItems && prevItems.find(({ label }: any) => label == part) - if (tmp) { - if (!tmp.items) { - tmp.items = [] - } - } else { - tmp = { - label: part, - items: [], - topLevel, - preview, - deprecated, - earlyaccess, - staticLink, - } - prevItems.push(tmp) - } - if (parts[parts.length - 1] === 'index' && parts[parts.length - 2] === part) { - tmp.url = `${urlGenerator(modSlug)}${newParams ? '-' + newParams : ''}` - tmp.slug = slug - tmp.title = title - tmp.navTitle = navTitle - tmp.staticLink = staticLink - tmp.duration = duration - tmp.preview = preview - tmp.deprecated = deprecated - tmp.earlyaccess = earlyaccess - tmp.topLevel = topLevel - tmp.hidePage = hidePage - tmp.codeStyle = codeStyle - tmp.parentLabel = parts[parts.length - 3] - tmp.parents = parts.filter((part) => part !== 'index') - tmp.hideTitle = hideTitle - if (defaultCollapsed && location) { - defaultCollapsed[part.toLowerCase()] = - tmp.topLevel || tmp.staticLink ? null : getCollpaseState(modSlug, location) - } - } - - prevItems = tmp.items - } - const slicedLength = parts.length - 1 - const existingItem = prevItems.find(({ label }: any) => label === parts[slicedLength]) - - if (!existingItem) { - prevItems.push({ - label: parts[slicedLength], - url: `${urlGenerator(modSlug)}${newParams ? '-' + newParams : ''}`, - slug: slug, - items: [], - title, - navTitle, - hideTitle, - staticLink, - duration, - preview, - deprecated, - earlyaccess, - topLevel, - hidePage, - codeStyle, - parentLabel: parts[parts.length - 3], - parents: parts.filter((part) => part !== 'index'), - }) - } - - return accu - }, - { items: [] } - ) - return tree -} diff --git a/plugins/gatsby-remark-check-links-numberless/gatsby-node.js b/static/.nojekyll similarity index 100% rename from plugins/gatsby-remark-check-links-numberless/gatsby-node.js rename to static/.nojekyll diff --git a/static/_redirects b/static/_redirects new file mode 100644 index 0000000000..e134a484f3 --- /dev/null +++ b/static/_redirects @@ -0,0 +1,709 @@ +/docs/page-data/docs/* /docs/page-data/index/:splat +/docs/faq/* https://v1.prisma.io/docs/1.34/faq/:splat +/docs/-a002 https://v1.prisma.io/docs/1.34/get-started/ +/docs/-t002 https://v1.prisma.io/docs/1.34/get-started/ +/docs/-t002/ https://v1.prisma.io/docs/1.34/get-started/ +/docs/prisma-admin/ https://v1.prisma.io/docs/1.34/prisma-admin/ +/docs/prisma-cli-and-configuration/ https://v1.prisma.io/docs/1.34/prisma-cli-and-configuration/ +/docs/prisma-client/ https://v1.prisma.io/docs/1.34/prisma-client/ +/docs/prisma-server/ https://v1.prisma.io/docs/1.34/prisma-server/ +/docs/quickstart/ https://v1.prisma.io/docs/1.34/get-started/ +/docs/releases-and-maintenance/ https://v1.prisma.io/docs/1.34/releases-and-maintenance/ +/docs/datamodel-and-migrations/ https://v1.prisma.io/docs/1.34/datamodel-and-migrations +/docs/get-started/01-setting-up-prisma-new-database-GO-g002/ https://v1.prisma.io/docs/1.34/get-started +/docs/get-started/01-setting-up-prisma-new-database-JAVASCRIPT-a002/ https://v1.prisma.io/docs/1.34/get-started +/docs/get-started/01-setting-up-prisma-demo-server-a001/ https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-demo-server-JAVASCRIPT-a001/ +/docs/get-started/01-setting-up-prisma-existing-database-a003/ https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-demo-server-JAVASCRIPT-a001/ +/docs/get-started/01-setting-up-prisma-new-database-a002/ https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-new-database-JAVASCRIPT-a002/ +/docs/datamodel-and-migrations/datamodel-MYSQL-knul/ https://v1.prisma.io/docs/1.34/datamodel-and-migrations +/docs/data-model-and-migrations/introspection-mapping-to-existing-db-soi1/ https://v1.prisma.io/docs/1.34/data-model-and-migrations/introspection-mapping-to-existing-db-soi1/ +/docs/understand-prisma/how-prisma-works-under-the-hood-j8ff/ https://v1.prisma.io/docs/1.34/understand-prisma/how-prisma-works-under-the-hood-j8ff/ +/docs/understand-prisma/prisma-basics-datamodel-client-and-server-fgz4/ https://v1.prisma.io/docs/1.34/understand-prisma/prisma-basics-datamodel-client-and-server-fgz4/ +/docs/understand-prisma/prisma-introduction-what-why-how-j9ff/ https://v1.prisma.io/docs/1.34/understand-prisma/prisma-introduction-what-why-how-j9ff/ +/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-mongoose-ys8c/ https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-mongoose-ys8c/ +/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk/ https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk/ +/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-typeorm-k9fh/ https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-typeorm-k9fh/ +/docs/prisma-client/basic-data-access/reading-data-GO-go05/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-GO-go05/ +/docs/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/ +/docs/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/ +/docs/prisma-client/basic-data-access/writing-data-GO-go08/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-GO-go08/ +/docs/prisma-client/basic-data-access/writing-data-JAVASCRIPT-rsc6/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-JAVASCRIPT-rsc6/ +/docs/prisma-client/basic-data-access/writing-data-TYPESCRIPT-rsc7/ https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-TYPESCRIPT-rsc7/ +/docs/prisma-client/features/check-existence-GO-go01/ https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-GO-go01/ +/docs/prisma-client/features/check-existence-JAVASCRIPT-pyl1/ https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-JAVASCRIPT-pyl1/ +/docs/prisma-client/features/check-existence-TYPESCRIPT-pyl2/ https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-TYPESCRIPT-pyl2/ +/docs/prisma-client/features/realtime-GO-go06/ https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-GO-go06/ +/docs/prisma-client/features/realtime-JAVASCRIPT-rsc8/ https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-JAVASCRIPT-rsc8/ +/docs/prisma-client/features/realtime-TYPESCRIPT-rsc9/ https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-TYPESCRIPT-rsc9/ +/docs/prisma-client/setup/constructor-GO-go02/ https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-GO-go02/ +/docs/prisma-client/setup/constructor-JAVASCRIPT-rsc4/ https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-JAVASCRIPT-rsc4/ +/docs/prisma-client/setup/constructor-TYPESCRIPT-rsc5/ https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-TYPESCRIPT-rsc5/ +/docs/prisma-client/setup/generating-the-client-GO-r3c3/ https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-GO-r3c3/ +/docs/prisma-client/setup/generating-the-client-JAVASCRIPT-rsc1/ https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-JAVASCRIPT-rsc1/ +/docs/prisma-client/setup/generating-the-client-TYPESCRIPT-r3c2/ https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-TYPESCRIPT-r3c2/ +/docs/run-prisma-server/database-connector-MYSQL-jgfs/ https://v1.prisma.io/docs/1.34/prisma-server/database-connector-MYSQL-jgfs/ +/docs/guides/database-workflows/setting-up-a-database/postgresql /docs/dataguide/postgresql/setting-up-a-local-postgresql-database +/docs/guides/database-workflows/setting-up-a-database/mysql /docs/dataguide/mysql/setting-up-a-local-mysql-database +/docs/guides/database-workflows/setting-up-a-database/sqlite /docs/dataguide/sqlite/setting-up-a-local-sqlite-database +/docs/guides/database-workflows/import-and-export-data/postgresql /docs/dataguide/postgresql/inserting-and-modifying-data/importing-and-exporting-data-in-postgresql +/docs/guides/database-workflows/import-and-export-data/mysql /docs/dataguide/mysql/importing-and-exporting-data-in-mysql +/docs/guides/database-workflows/import-and-export-data/sqlite /docs/dataguide/sqlite/importing-and-exporting-data-in-sqlite +/docs/guides/database-workflows/* /docs/guides/general-guides/database-workflows/:splat +/docs/guides/troubleshooting /docs/support/help-articles +/docs/guides/troubleshooting/autocompletion-in-graphql-resolvers-with-js /docs/support/help-articles/autocompletion-in-graphql-resolvers-with-js +/docs/getting-started/quickstart-typescript /docs/getting-started/quickstart +/docs/getting-started/quickstart-javascript /docs/getting-started/quickstart +/docs/getting-started/quickstart-node /docs/getting-started/quickstart +/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-file /docs/reference/tools-and-interfaces/prisma-schema +/docs/reference/tools-and-interfaces/prisma-client/api /docs/reference/tools-and-interfaces/prisma-client +/docs/reference/tools-and-interfaces/prisma-client/api /docs/reference/tools-and-interfaces/prisma-client +/docs/guides/upgrade-from-prisma-1/should-you-upgrade /docs/guides/upgrade-from-prisma-1/how-to-upgrade +/docs/reference/tools-and-interfaces/prisma-schema/models /docs/reference/tools-and-interfaces/prisma-schema/data-model +/docs/concepts/overview/api-comparisons/prisma-and-typeorm /docs/concepts/more/comparisons/prisma-and-typeorm +/docs/concepts/overview/api-comparisons/prisma-and-sequelize /docs/concepts/more/comparisons/prisma-and-sequelize +/docs/concepts/overview/api-comparisons/prisma-and-mongoose /docs/concepts/more/comparisons/prisma-and-mongoose +/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-typeorm /docs/concepts/more/comparisons/prisma-and-typeorm +/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-sequelize /docs/concepts/more/comparisons/prisma-and-sequelize +/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-mongoose /docs/concepts/more/comparisons/prisma-and-mongoose +/docs/getting-started/setup-prisma/start-from-scratch-sql-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-sql-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-sql-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch-sql-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql +/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-file /docs/reference/tools-and-interfaces/prisma-schema +/docs/reference/tools-and-interfaces/prisma-client/api /docs/reference/tools-and-interfaces/prisma-client +/docs/guides/upgrade-from-prisma-1/should-you-upgrade /docs/guides/upgrade-from-prisma-1/how-to-upgrade +/docs/reference/tools-and-interfaces/prisma-schema/models /docs/reference/tools-and-interfaces/prisma-schema/data-model +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql +/docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch /docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch-typescript +/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities /docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql +/docs/guides/upgrade-from-prisma-1/how-to-upgrade /docs/guides/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade +/docs/guides/upgrade-from-prisma-1/schema-incompatibilities /docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql +/docs/guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgres /docs/guides/upgrade-guides/upgrade-from-prisma-1 +/docs/guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus +/docs/guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus +/docs/guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first +/docs/guides/upgrade-from-prisma-1/upgrading-a-rest-api /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api +/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-reference /docs/reference/api-reference/prisma-schema-reference +/docs/reference/tools-and-interfaces/prisma-cli/command-reference /docs/reference/api-reference/command-reference +/docs/reference/database-connectors/database-features /docs/orm/reference/supported-databases +/docs/reference/database-connectors/connection-urls /docs/orm/reference/connection-urls +/docs/more/supported-databases /docs/orm/reference/supported-databases +/docs/reference/tools-and-interfaces/* /docs/concepts/components/:splat +/docs/reference/database-connectors/* /docs/concepts/database-connectors/:splat +/docs/reference/more/* /docs/concepts/more/:splat +/docs/understand-prisma/introduction /docs/concepts/overview/what-is-prisma +/docs/understand-prisma/data-modeling /docs/concepts/overview/what-is-prisma/data-modeling +/docs/understand-prisma/* /docs/concepts/overview/:splat +/docs/understand-prisma/api-comparisons/* /docs/concepts/overview/why-prisma/api-comparisons +/docs/more/* /docs/about/:splat +/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate /docs/getting-started/setup-prisma/start-from-scratch-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch-sql /docs/getting-started/setup-prisma +/docs/guides/prisma-guides/prisma-migrate-guides /docs/guides/prisma-guides/add-prisma-migrate-to-a-project +/docs/guides/prisma-guides/prisma-migrate-guides/add-prisma-migrate-to-a-project /docs/guides/prisma-guides/add-prisma-migrate-to-a-project +/docs/concepts/components/prisma-client/distinct /docs/concepts/components/prisma-client/aggregation-grouping-summarizing#select-distinct +/docs/concepts/components/prisma-client/configuring-the-prisma-client-api /docs/concepts/components/prisma-client/generating-prisma-client/customizing-the-prisma-client-api +/docs/concepts/components/prisma-client/constructor /docs/reference/api-reference/prisma-client-reference#prismaclient +/docs/concepts/components/prisma-client/field-selection /docs/concepts/components/prisma-client/select-fields +/docs/concepts/components/prisma-client/error-reference /docs/reference/api-reference/error-reference +/docs/concepts/components/prisma-client/sorting /docs/concepts/components/prisma-client/filtering-and-sorting +/docs/concepts/components/prisma-client/filtering /docs/concepts/components/prisma-client/filtering-and-sorting +/docs/concepts/components/prisma-client/aggregations /docs/concepts/components/prisma-client/aggregation-grouping-summarizing +/docs/concepts/components/prisma-client/working-with-json /docs/concepts/components/prisma-client/working-with-advanced-types +/docs/concepts/components/prisma-client/group-by /docs/concepts/components/prisma-client/aggregation-grouping-summarizing#group-by-preview +/docs/concepts/components/prisma-client/advanced-usage-of-generated-types /docs/concepts/components/prisma-client/working-with-generated-types +/docs/concepts/components/preview-features/native-types/native-types-mappings /docs/reference/api-reference/prisma-schema-reference#model-field-scalar-types +/docs/concepts/components/preview-features/native-types /docs/concepts/components/prisma-schema/data-model#native-types-mapping +/docs/concepts/components/prisma-client/generating-prisma-client /docs/concepts/components/prisma-client/working-with-prismaclient/generating-prisma-client +/docs/concepts/components/prisma-client/generating-prisma-client/customizing-the-prisma-client-api /docs/concepts/components/prisma-client/working-with-prismaclient/use-custom-model-and-field-names +/docs/concepts/components/prisma-client/connection-management /docs/concepts/components/prisma-client/working-with-prismaclient/connection-management +/docs/concepts/components/prisma-client/logging /docs/concepts/components/prisma-client/working-with-prismaclient/logging +/docs/concepts/components/prisma-client/error-formatting /docs/concepts/components/prisma-client/working-with-prismaclient/error-formatting +/docs/concepts/components/prisma-client/deployment /docs/guides/deployment/deployment +/docs/concepts/components/prisma-migrate/prisma-migrate-flows /docs/concepts/components/prisma-migrate +/docs/guides/prisma-guides/seed-database /docs/guides/application-lifecycle/seed-database +/docs/guides/prisma-guides/add-prisma-migrate-to-a-project /docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project +/docs/about/creating-bug-reports /docs/support/creating-bug-reports +/docs/concepts/components/prisma-client/working-with-generated-types /docs/concepts/components/prisma-client/advanced-type-safety/operating-against-partial-structures-of-model-types +/docs/reference/utility-types-reference /docs/reference/api-reference/prisma-client-reference#prismavalidator +/docs/concepts/components/prisma-client/query-engine /docs/concepts/components/prisma-engines/query-engine +/docs/concepts/overview/under-the-hood /docs/concepts/components/prisma-engines +/docs/guides/application-lifecycle/add-prisma-migrate-to-a-project /docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project +/docs/guides/deployment/patching-production /docs/guides/database/patching-production +/docs/guides/deployment/production-troubleshooting /docs/guides/database/production-troubleshooting +/docs/guides/application-lifecycle/* /docs/guides/database/:splat +/docs/guides/deployment/deploying-to-azure-functions /docs/guides/deployment/deployment-guides/deploying-to-azure-functions +/docs/guides/deployment/deploying-to-heroku /docs/guides/deployment/deployment-guides/deploying-to-heroku +/docs/guides/deployment/deploying-to-vercel /docs/guides/deployment/deployment-guides/deploying-to-vercel +/docs/guides/deployment/deploying-to-aws-lambda /docs/guides/deployment/deployment-guides/deploying-to-aws-lambda +/docs/guides/deployment/deploying-to-netlify /docs/guides/deployment/deployment-guides/deploying-to-netlify +/docs/guides/general-guides/database-workflows/cascading-deletes/* /docs/concepts/components/prisma-schema/relations/referential-actions +/docs/guides/database/advanced-database-tasks/cascading-deletes/* /docs/concepts/components/prisma-schema/relations/referential-actions +/docs/guides/general-guides/database-workflows/data-validation/* /docs/guides/database/advanced-database-tasks/data-validation/:splat +/docs/guides/general-guides/database-workflows/sql-views https://github.com/prisma/prisma/issues/678 +/docs/guides/general-guides/database-workflows/sql-views-postgres https://github.com/prisma/prisma/issues/678 +/docs/guides/database/advanced-database-tasks/sql-views-postgres https://github.com/prisma/prisma/issues/678 +/docs/guides/general-guides/database-workflows/sql-views-mysql https://github.com/prisma/prisma/issues/678 +/docs/guides/database/advanced-database-tasks/sql-views-mysql https://github.com/prisma/prisma/issues/678 +/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes /docs/concepts/components/prisma-schema/data-model#defining-a-unique-field +/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes/mysql /docs/concepts/components/prisma-schema/data-model#defining-a-unique-field +/docs/guides/database/advanced-database-tasks/unique-constraints-and-indexes/postgresql /docs/concepts/components/prisma-schema/data-model#defining-a-unique-field +/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes/sqlite /docs/concepts/components/prisma-schema/data-model#defining-a-unique-field +/docs/guides/general-guides/database-workflows/foreign-keys /docs/concepts/components/prisma-schema/relations#relational-databases +/docs/guides/general-guides/database-workflows/foreign-keys/mysql /docs/concepts/components/prisma-schema/relations#relational-databases +/docs/guides/general-guides/database-workflows/foreign-keys/postgresql /docs/concepts/components/prisma-schema/relations#relational-databases +/docs/guides/general-guides/database-workflows/foreign-keys/sqlite /docs/concepts/components/prisma-schema/relations#relational-databases +/docs/guides/prisma-guides/* /docs/guides/performance-and-optimization/:splat +/docs/mongodb /docs/concepts/database-connectors/mongodb +/docs/guides/database/developing-with-prisma-migrate/advanced-migrate-scenarios /docs/guides/database/developing-with-prisma-migrate/customizing-migrations +/docs/concepts/components/prisma-migrate/type-mapping /docs/concepts/components/prisma-migrate/supported-types-and-db-features +/docs/concepts/components/prisma-client/working-with-advanced-types /docs/concepts/components/prisma-client/working-with-fields +/docs/concepts/more/codemod /docs/guides/upgrade-guides/upgrading-versions/codemods +/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/next-steps-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/introspection-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/next-steps-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/introspection-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch/next-steps-typescript-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-typescript-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/introspection-typescript-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-typescript-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-typescript-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-typescript-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-mysql +/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-mysql +/docs/getting-started/setup-prisma/start-from-scratch/next-steps-node-mysql /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-node-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/introspection-node-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-node-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-node-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-mysql +/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-node-mysql /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-mysql +/docs/concepts/more/environment-variables /docs/guides/development-environment/environment-variables +/docs/concepts/more/environment-variables/managing-env-files-and-setting-variables /docs/guides/development-environment/environment-variables/managing-env-files-and-setting-variables +/docs/concepts/more/environment-variables/using-multiple-env-files /docs/guides/development-environment/environment-variables/using-multiple-env-files +/docs/concepts/more/editor-setup /docs/guides/development-environment/editor-setup +/docs/about/about-the-docs /docs/about/prisma-docs/about-the-docs +/docs/about/whats-new-in-prisma-docs /docs/about/prisma-docs/whats-new-in-prisma-docs +/docs/about/limitations /docs/about/prisma/limitations +/docs/about/roadmap /docs/about/prisma/roadmap +/docs/about/faq /docs/about/prisma/faq +/docs/about/releases /docs/about/prisma/releases +/docs/about/example-projects /docs/about/prisma/example-projects +/docs/about/style-guide /docs/about/prisma-docs/style-guide +/docs/about/style-guide/mdx-examples /docs/about/prisma-docs/style-guide/mdx-examples +/docs/about/style-guide/frontmatter /docs/about/prisma-docs/style-guide/frontmatter +/docs/about/style-guide/template /docs/about/prisma-docs/style-guide/template +/docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch-typescript /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-sqlserver +/docs/concepts/database-connectors/microsoft-sql-server /docs/concepts/database-connectors/sql-server +/docs/concepts/components/preview-features/sql-server/sql-server-connection-string /docs/concepts/database-connectors/sql-server +/docs/concepts/components/preview-features/sql-server/sql-server-local /docs/concepts/database-connectors/sql-server/sql-server-local +/docs/concepts/components/preview-features/sql-server/sql-server-docker /docs/concepts/database-connectors/sql-server/sql-server-docker +/docs/concepts/components/preview-features/sql-server /docs/concepts/database-connectors/sql-server +/docs/guides/upgrade-guides/upgrading-to-latest /docs/guides/upgrade-guides/upgrading-versions +/docs/guides/upgrade-guides/upgrading-to-use-preview-features/enabling-named-constraints /docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints +/docs/concepts/components/prisma-schema/relations/referential-actions/cyclic-referential-actions /docs/concepts/components/prisma-schema/relations/referential-actions/special-rules-for-referential-actions +/docs/concepts/components/prisma-schema/index-configuration /docs/concepts/components/prisma-schema/indexes +/docs/concepts/components/prisma-data-platform /docs/concepts/data-platform +/docs/about/prisma/platform-releases /docs/concepts/data-platform/about-platform/platform-releases +/docs/support /docs/guides/database/troubleshooting-orm +/docs/support/* /docs/guides/database/troubleshooting-orm/:splat +/docs/concepts/data-platform /docs/data-platform +/docs/concepts/data-platform/* /docs/data-platform/:splat +/docs/data-platform/about-platform /docs/data-platform/about +/docs/data-platform/about-platform/* /docs/data-platform/about/:splat +/docs/data-platform/about/platform-limits-and-status /docs/data-platform/about/limits-and-status +/docs/data-platform/about/platform-releases /docs/data-platform/about/releases +/docs/data-platform/accounts /docs/data-platform/account +/docs/concepts/components/prisma-schema/relations/referential-integrity /docs/concepts/components/prisma-schema/relations/relation-mode +/docs/data-platform/billing/early-adopter-plan /docs/data-platform/billing/plans-and-quotas +/docs/data-platform/projects/add-project* /docs/data-platform/projects/create +/docs/data-platform/members/user-roles /docs/data-platform/members/roles-permissions +/docs/data-platform/members/data-collaborators /docs/data-platform/members/add +/docs/data-platform/environments/edit-settings/change-database-connection-string /docs/data-platform/troubleshooting/cannot-change-db-of-env +/docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project /docs/guides/migrate/developing-with-prisma-migrate/add-prisma-migrate-to-a-project +/docs/guides/database/developing-with-prisma-migrate/team-development /docs/guides/migrate/developing-with-prisma-migrate/team-development +/docs/guides/database/developing-with-prisma-migrate/baselining /docs/guides/migrate/developing-with-prisma-migrate/baselining +/docs/guides/database/developing-with-prisma-migrate/enable-native-database-functions /docs/guides/migrate/developing-with-prisma-migrate/enable-native-database-functions +/docs/guides/database/developing-with-prisma-migrate/include-unsupported-database-features /docs/guides/migrate/developing-with-prisma-migrate/include-unsupported-database-features +/docs/guides/database/developing-with-prisma-migrate/customizing-migrations /docs/guides/migrate/developing-with-prisma-migrate/customizing-migrations +/docs/guides/database/developing-with-prisma-migrate/squashing-migrations /docs/guides/migrate/developing-with-prisma-migrate/squashing-migrations +/docs/guides/database/developing-with-prisma-migrate/generating-down-migrations /docs/guides/migrate/developing-with-prisma-migrate/generating-down-migrations +/docs/guides/database/developing-with-prisma-migrate/troubleshooting-development /docs/guides/migrate/developing-with-prisma-migrate/troubleshooting-development +/docs/guides/database/developing-with-prisma-migrate /docs/guides/migrate/developing-with-prisma-migrate +/docs/guides/database/seed-database /docs/guides/migrate/seed-database +/docs/guides/database/prototyping-schema-db-push /docs/guides/migrate/prototyping-schema-db-push +/docs/guides/database/patching-production /docs/guides/migrate/patching-production +/docs/guides/database/production-troubleshooting /docs/guides/migrate/production-troubleshooting +/docs/guides/database/using-prisma-with-planetscale /docs/guides/database/planetscale +/docs/guides/database/using-prisma-with-cockroachdb /docs/guides/database/cockroachdb +/docs/guides/database/using-prisma-with-mongodb /docs/guides/database/mongodb +/docs/guides/database/multi-schema /docs/guides/other/multi-schema +/docs/guides/database/prisma-type-system /docs/guides/other/prisma-type-system +/docs/guides/database/troubleshooting-orm/creating-bug-reports /docs/guides/other/troubleshooting-orm/creating-bug-reports +/docs/guides/database/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js /docs/guides/other/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js +/docs/guides/database/troubleshooting-orm/help-articles/working-with-many-to-many-relations /docs/guides/other/troubleshooting-orm/help-articles/working-with-many-to-many-relations +/docs/guides/database/troubleshooting-orm/help-articles/finding-entities-based-on-relation /docs/guides/other/troubleshooting-orm/help-articles/finding-entities-based-on-relation +/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices /docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices +/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo /docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo +/docs/guides/database/troubleshooting-orm/help-articles/pkg-issue /docs/guides/other/troubleshooting-orm/help-articles/pkg-issue +/docs/guides/database/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries /docs/guides/other/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries +/docs/guides/database/troubleshooting-orm/help-articles /docs/guides/other/troubleshooting-orm/help-articles +/docs/guides/database/troubleshooting-orm /docs/guides/other/troubleshooting-orm +/docs/guides/database/advanced-database-tasks/data-validation/postgresql /docs/guides/other/advanced-database-tasks/data-validation/postgresql +/docs/guides/database/advanced-database-tasks/data-validation /docs/guides/other/advanced-database-tasks/data-validation +/docs/guides/database/advanced-database-tasks /docs/guides/other/advanced-database-tasks +/docs/concepts/components/prisma-cli/installation /docs/reference/api-reference/command-reference#installation +/docs/guides/other/troubleshooting-orm/help-articles/finding-entities-based-on-relation /docs/concepts/components/prisma-client/relation-queries#filter-on-presence-of-related-records +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgres /docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql +/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-node-postgres /docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-node-postgresql +/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgres /docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgres /docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql +/docs/guides/migrate/deployment/deploy-database-changes-with-prisma-migrate /docs/guides/deployment/deploy-database-changes-with-prisma-migrate +/docs/guides/deployment/deployment /docs/guides/deployment/deploy-prisma +/docs/guides/deployment/deployment-guides/deploying-to-heroku /docs/guides/deployment/traditional/deploy-to-heroku +/docs/guides/deployment/deployment-guides/deploying-to-koyeb /docs/guides/deployment/traditional/deploy-to-koyeb +/docs/guides/deployment/deployment-guides /docs/guides/deployment/deploy-prisma +/docs/guides/deployment/deployment-guides/deploying-to-azure-functions /docs/guides/deployment/serverless/deploy-to-azure-functions +/docs/guides/deployment/deployment-guides/deploying-to-vercel /docs/guides/deployment/serverless/deploy-to-vercel +/docs/guides/deployment/deployment-guides/deploying-to-aws-lambda /docs/guides/deployment/serverless/deploy-to-aws-lambda +/docs/guides/deployment/deployment-guides/deploying-to-netlify /docs/guides/deployment/serverless/deploy-to-netlify +/docs/guides/deployment/deployment-guides/deploying-to-deno-deploy /docs/guides/deployment/edge/deploy-to-deno-deploy +/docs/guides/deployment/deployment-guides/deploying-to-cloudflare-workers /docs/guides/deployment/edge/deploy-to-cloudflare-workers +/docs/guides/deployment/deployment-guides/deploying-migrations-from-a-local-environment /docs/guides/deployment/deploy-migrations-from-a-local-environment +/docs/guides/deployment/deployment-guides/caveats-when-deploying-to-aws-platforms /docs/guides/deployment/caveats-when-deploying-to-aws-platforms +/docs/guides/deployment/deployment-guides/deploying-to-a-different-os /docs/guides/deployment/deploy-to-a-different-os +/docs/guides/deployment/deployment-guides/use-prisma-with-serverless-framework /docs/guides/deployment/serverless/deploy-to-aws-lambda +/docs/guides/deployment/use-prisma-with-serverless-framework /docs/guides/deployment/serverless/deploy-to-aws-lambda +/docs/data-platform/about/releases /docs/data-platform/platform-console/maturity-levels +/docs/data-platform/about/limits-and-status /docs/data-platform/classic-projects/about/limits-and-status +/docs/data-platform/about /docs/data-platform/classic-projects/about +/docs/data-platform/data-proxy/use-data-proxy /docs/data-platform/classic-projects/data-proxy/use-data-proxy +/docs/data-platform/data-proxy/deploy /docs/data-platform/classic-projects/data-proxy/deploy +/docs/data-platform/data-proxy/prisma-cli-with-data-proxy /docs/data-platform/classic-projects/data-proxy/prisma-cli-with-data-proxy +/docs/data-platform/data-proxy/considerations-limitations /docs/data-platform/classic-projects/data-proxy/considerations-limitations +/docs/data-platform/data-proxy /docs/data-platform/classic-projects/data-proxy +/docs/data-platform/static-ips /docs/data-platform/classic-projects/platform/static-ips +/docs/data-platform/projects/create /docs/data-platform/classic-projects/platform/projects/create +/docs/data-platform/projects/edit-settings /docs/data-platform/classic-projects/platform/projects/edit-settings +/docs/data-platform/projects/delete-project /docs/data-platform/classic-projects/platform/projects/delete-project +/docs/data-platform/projects /docs/data-platform/classic-projects/platform/projects +/docs/data-platform/environments/view-all /docs/data-platform/classic-projects/platform/environments/view-all +/docs/data-platform/environments/create /docs/data-platform/classic-projects/platform/environments/create +/docs/data-platform/environments/edit-settings/edit-name-and-url-handle /docs/data-platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle +/docs/data-platform/environments/edit-settings/change-default-environment /docs/data-platform/classic-projects/platform/environments/edit-settings/change-default-environment +/docs/data-platform/environments/edit-settings /docs/data-platform/classic-projects/platform/environments/edit-settings +/docs/data-platform/environments/delete /docs/data-platform/classic-projects/platform/environments/delete +/docs/data-platform/environments /docs/data-platform/classic-projects/platform/environments +/docs/data-platform/members/roles-permissions /docs/data-platform/classic-projects/platform/members/roles-permissions +/docs/data-platform/members/add /docs/data-platform/classic-projects/platform/members/add +/docs/data-platform/members/change-role /docs/data-platform/classic-projects/platform/members/change-role +/docs/data-platform/members/remove /docs/data-platform/classic-projects/platform/members/remove +/docs/data-platform/members /docs/data-platform/classic-projects/platform/members +/docs/data-platform/data-browser /docs/data-platform/classic-projects/platform/data-browser +/docs/data-platform/query-console /docs/data-platform/classic-projects/platform/query-console +/docs/data-platform/schema-viewer /docs/data-platform/classic-projects/platform/schema-viewer +/docs/data-platform/account /docs/data-platform/classic-projects/platform/account +/docs/data-platform/github-integration /docs/data-platform/classic-projects/platform/github-integration +/docs/data-platform/billing/plans-and-quotas /docs/data-platform/classic-projects/platform/billing/plans-and-quotas +/docs/data-platform/billing/manage-plans /docs/data-platform/classic-projects/platform/billing/manage-plans +/docs/data-platform/billing/invoices /docs/data-platform/classic-projects/platform/billing/invoices +/docs/data-platform/billing/data-proxy-usage /docs/data-platform/classic-projects/platform/billing/data-proxy-usage +/docs/data-platform/billing/payment-method-and-billing-information /docs/data-platform/classic-projects/platform/billing/payment-method-and-billing-information +/docs/data-platform/billing /docs/data-platform/classic-projects/platform/billing +/docs/data-platform/troubleshooting/connection-to-db-timed-out /docs/data-platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out +/docs/data-platform/troubleshooting/cannot-change-db-of-env /docs/data-platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env +/docs/data-platform/troubleshooting/cannot-edit-schema-file /docs/data-platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file +/docs/data-platform/troubleshooting/schema-file-does-not-update /docs/data-platform/classic-projects/platform/troubleshooting/schema-file-does-not-update +/docs/data-platform/troubleshooting /docs/data-platform/platform-console/support +/docs/data-platform/contact-support /docs/data-platform/platform-console/support +/docs/data-platform/cloud-projects/platform/account /docs/data-platform/platform-console/concepts +/docs/data-platform/cloud-projects/platform/projects /docs/data-platform/platform-console/concepts/projects +/docs/data-platform/cloud-projects/platform/organizations /docs/data-platform/platform-console/concepts/workspaces +/docs/data-platform/cloud-projects/platform/billing /docs/data-platform/platform-console/concepts/workspaces +/docs/data-platform/cloud-projects/platform /docs/data-platform/platform-console +/docs/data-platform/cloud-projects/faq /docs/data-platform/platform-console/limits +/docs/data-platform/cloud-projects/support /docs/data-platform/platform-console/support +/docs/data-platform/cloud-projects/about-cloud-projects /docs/data-platform/platform-console/about +/docs/data-platform/cloud-projects /docs/data-platform/platform-console +/docs/data-platform/classic-projects/about/releases /docs/data-platform/platform-console/maturity-levels +/docs/data-platform/classic-projects/about/limits-and-status /docs/data-platform/platform-console/limits +/docs/data-platform/classic-projects/about /docs/data-platform/platform-console/about +/docs/data-platform/classic-projects/contact-support /docs/data-platform/platform-console/support +/docs/guides/performance-and-optimization/connection-management/configure-pg-bouncer /docs/guides/performance-and-optimization/connection-management/configure-for-external-connection-pooler +/docs/data-platform/classic-projects/platform/billing https://www.prisma.io/pricing +/docs/data-platform/accelerate/testing /docs/data-platform/accelerate/evaluating +/docs/data-platform/classic-projects/platform/billing/plans-and-quotas https://www.prisma.io/pricing +/docs/data-platform/classic-projects/platform/billing/manage-plans https://www.prisma.io/pricing +/docs/concepts/components/prisma-schema /docs/orm/prisma-schema +/docs/concepts/components/prisma-client/working-with-prismaclient /docs/orm/prisma-client +/docs/concepts/components/prisma-client/transactions /docs/orm/prisma-client/queries/transactions +/docs/concepts/components/prisma-migrate/get-started /docs/orm/prisma-migrate/getting-started +/docs/concepts/components/prisma-migrate/db-push /docs/orm/prisma-migrate/workflows/prototyping-your-schema +/docs/concepts/components/prisma-cli /docs/orm/tools/prisma-cli +/docs/concepts/components/prisma-engines /docs/orm/more/under-the-hood/engines +/docs/concepts/database-connectors/mongodb /docs/orm/ +/docs/concepts/database-connectors /docs/orm/overview +/docs/concepts/more/telemetry /docs/orm/tools/prisma-cli#telemetry +/docs/concepts/more /docs/orm/more +/docs/concepts /docs/orm +/docs/concepts/overview/why-prisma /docs/orm/overview/introduction/why-prisma +/docs/concepts/overview/should-you-use-prisma /docs/orm/overview/introduction/should-you-use-prisma +/docs/concepts/overview/what-is-prisma/data-modeling /docs/orm/overview/introduction/data-modeling +/docs/concepts/overview/what-is-prisma /docs/orm/overview/introduction/what-is-prisma +/docs/concepts/components/database-drivers /docs/orm/overview/databases/database-drivers +/docs/concepts/database-connectors/postgresql /docs/orm/overview/databases/postgresql +/docs/concepts/database-connectors/mysql /docs/orm/overview/databases/mysql +/docs/concepts/database-connectors/sqlite /docs/orm/overview/databases/sqlite +/docs/guides/database/mongodb /docs/orm/overview/databases/mongodb +/docs/concepts/database-connectors/cockroachdb /docs/orm/overview/databases/cockroachdb +/docs/concepts/database-connectors/sql-server/sql-server-local /docs/orm/overview/databases/sql-server/sql-server-local +/docs/concepts/database-connectors/sql-server/sql-server-docker /docs/orm/overview/databases/sql-server/sql-server-docker +/docs/concepts/database-connectors/sql-server /docs/orm/overview/databases/sql-server +/docs/guides/database/planetscale /docs/orm/overview/databases/planetscale +/docs/guides/database/cockroachdb /docs/orm/overview/databases/cockroachdb +/docs/guides/database/supabase /docs/orm/overview/databases/supabase +/docs/guides/database/neon /docs/orm/overview/databases/neon +/docs/guides/database/turso /docs/orm/overview/databases/turso +/docs/concepts/overview/prisma-in-your-stack/fullstack /docs/orm/overview/prisma-in-your-stack/fullstack +/docs/concepts/overview/prisma-in-your-stack/is-prisma-an-orm /docs/orm/overview/prisma-in-your-stack/is-prisma-an-orm +/docs/concepts/overview/prisma-in-your-stack /docs/orm/overview/prisma-in-your-stack +/docs/concepts/overview /docs/orm/overview +/docs/concepts/components/prisma-client/working-with-prismaclient/generating-prisma-client /docs/orm/prisma-client/setup-and-configuration/generating-prisma-client +/docs/concepts/components/prisma-client/working-with-prismaclient/instantiate-prisma-client /docs/orm/prisma-client/setup-and-configuration/instantiate-prisma-client +/docs/concepts/components/prisma-client/read-replicas /docs/orm/prisma-client/setup-and-configuration/read-replicas +/docs/concepts/components/prisma-client/working-with-prismaclient/use-custom-model-and-field-names /docs/orm/prisma-client/setup-and-configuration/custom-model-and-field-names +/docs/concepts/components/prisma-client/working-with-prismaclient/logging /docs/orm/prisma-client/observability-and-logging/logging +/docs/concepts/components/prisma-client/working-with-prismaclient/error-formatting /docs/orm/prisma-client/setup-and-configuration/error-formatting +/docs/concepts/components/prisma-client/database-polyfills /docs/orm/prisma-client/setup-and-configuration/database-polyfills +/docs/concepts/components/prisma-client/working-with-prismaclient/connection-management /docs/orm/prisma-client/setup-and-configuration/databases-connections/connection-management +/docs/concepts/components/prisma-client/working-with-prismaclient/connection-pool /docs/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool +/docs/guides/performance-and-optimization/connection-management/configure-for-external-connection-pooler /docs/orm/prisma-client/setup-and-configuration/databases-connections/pgbouncer +/docs/guides/performance-and-optimization/connection-management /docs/orm/prisma-client/setup-and-configuration/databases-connections +/docs/concepts/components/prisma-client/crud /docs/orm/prisma-client/queries/crud +/docs/concepts/components/prisma-client/select-fields /docs/orm/prisma-client/queries/select-fields +/docs/concepts/components/prisma-client/relation-queries /docs/orm/prisma-client/queries/relation-queries +/docs/concepts/components/prisma-client/filtering-and-sorting /docs/orm/prisma-client/queries/filtering-and-sorting +/docs/concepts/components/prisma-client/pagination /docs/orm/prisma-client/queries/pagination +/docs/concepts/components/prisma-client/aggregation-grouping-summarizing /docs/orm/prisma-client/queries/aggregation-grouping-summarizing +/docs/guides/performance-and-optimization/prisma-client-transactions-guide /docs/orm/prisma-client/queries/transactions +/docs/concepts/components/prisma-client/full-text-search /docs/orm/prisma-client/queries/full-text-search +/docs/concepts/components/prisma-client/custom-validation /docs/orm/prisma-client/queries/custom-validation +/docs/concepts/components/prisma-client/computed-fields /docs/orm/prisma-client/queries/computed-fields +/docs/concepts/components/prisma-client/excluding-fields /docs/orm/prisma-client/queries/excluding-fields +/docs/concepts/components/prisma-client/custom-models /docs/orm/prisma-client/queries/custom-models +/docs/concepts/components/prisma-client/case-sensitivity /docs/orm/prisma-client/queries/case-sensitivity +/docs/concepts/components/prisma-client/raw-database-access /docs/orm/prisma-client/queries/raw-database-access/raw-queries +/docs/guides/other/advanced-database-tasks/typesafe-raw-sql/safeql /docs/orm/prisma-client/queries/raw-database-access/custom-and-type-safe-queries +/docs/guides/performance-and-optimization/query-optimization-performance /docs/orm/prisma-client/queries/query-optimization-performance +/docs/concepts/components/prisma-client/composite-types /docs/orm/prisma-client/special-fields-and-types/composite-types +/docs/concepts/components/prisma-client/null-and-undefined /docs/orm/prisma-client/special-fields-and-types/null-and-undefined +/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields /docs/orm/prisma-client/special-fields-and-types/working-with-json-fields +/docs/concepts/components/prisma-client/working-with-fields/working-with-scalar-lists-arrays /docs/orm/prisma-client/special-fields-and-types/working-with-scalar-lists-arrays +/docs/concepts/components/prisma-client/working-with-fields/working-with-composite-ids-and-constraints /docs/orm/prisma-client/special-fields-and-types/working-with-composite-ids-and-constraints +/docs/concepts/components/prisma-client/working-with-fields /docs/orm/prisma-client/special-fields-and-types +/docs/concepts/components/prisma-client/client-extensions/model /docs/orm/prisma-client/client-extensions/model +/docs/concepts/components/prisma-client/client-extensions/client /docs/orm/prisma-client/client-extensions/client +/docs/concepts/components/prisma-client/client-extensions/query /docs/orm/prisma-client/client-extensions/query +/docs/concepts/components/prisma-client/client-extensions/result /docs/orm/prisma-client/client-extensions/result +/docs/concepts/components/prisma-client/client-extensions/shared-extensions /docs/orm/prisma-client/client-extensions/shared-extensions +/docs/concepts/components/prisma-client/client-extensions/type-utilities /docs/orm/prisma-client/client-extensions/type-utilities +/docs/concepts/components/prisma-client/client-extensions/extension-examples /docs/orm/prisma-client/client-extensions/extension-examples +/docs/concepts/components/prisma-client/middleware/soft-delete-middleware /docs/orm/prisma-client/client-extensions/middleware/soft-delete-middleware +/docs/concepts/components/prisma-client/middleware/logging-middleware /docs/orm/prisma-client/client-extensions/middleware/logging-middleware +/docs/concepts/components/prisma-client/middleware/session-data-middleware /docs/orm/prisma-client/client-extensions/middleware/session-data-middleware +/docs/concepts/components/prisma-client/middleware /docs/orm/prisma-client/client-extensions/middleware +/docs/concepts/components/prisma-client/client-extensions /docs/orm/prisma-client/client-extensions +/docs/concepts/components/prisma-client/advanced-type-safety/operating-against-partial-structures-of-model-types /docs/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types +/docs/guides/other/prisma-type-system /docs/orm/prisma-client/type-safety/prisma-type-system +/docs/concepts/components/prisma-client/advanced-type-safety/prisma-validator /docs/orm/prisma-client/type-safety/prisma-validator +/docs/concepts/components/prisma-client/advanced-type-safety /docs/orm/prisma-client/type-safety +/docs/guides/testing/unit-testing /docs/orm/prisma-client/testing/unit-testing +/docs/guides/testing/integration-testing /docs/orm/prisma-client/testing/integration-testing +/docs/guides/testing /docs/orm/prisma-client/testing +/docs/guides/deployment/deploy-prisma /docs/orm/prisma-client/deployment/deploy-prisma +/docs/guides/deployment/traditional/deploy-to-heroku /docs/orm/prisma-client/deployment/traditional/deploy-to-heroku +/docs/guides/deployment/traditional/deploy-to-koyeb /docs/orm/prisma-client/deployment/traditional/deploy-to-koyeb +/docs/guides/deployment/traditional /docs/orm/prisma-client/deployment/traditional +/docs/guides/deployment/serverless/deploy-to-azure-functions /docs/orm/prisma-client/deployment/serverless/deploy-to-azure-functions +/docs/guides/deployment/serverless/deploy-to-vercel /docs/orm/prisma-client/deployment/serverless/deploy-to-vercel +/docs/guides/deployment/serverless/deploy-to-aws-lambda /docs/orm/prisma-client/deployment/serverless/deploy-to-aws-lambda +/docs/guides/deployment/serverless/deploy-to-netlify /docs/orm/prisma-client/deployment/serverless/deploy-to-netlify +/docs/guides/deployment/serverless /docs/orm/prisma-client/deployment/serverless +/docs/concepts/components/prisma-client/module-bundlers /docs/orm/prisma-client/deployment/module-bundlers +/docs/guides/deployment/edge/deploy-to-cloudflare-workers /docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare-workers +/docs/guides/deployment/edge/deploy-to-deno-deploy /docs/orm/prisma-client/deployment/edge/deploy-to-deno-deploy +/docs/guides/deployment/edge /docs/orm/prisma-client/deployment/edge +/docs/guides/deployment/deploy-database-changes-with-prisma-migrate /docs/orm/prisma-client/deployment/deploy-database-changes-with-prisma-migrate +/docs/guides/deployment/deploy-migrations-from-a-local-environment /docs/orm/prisma-client/deployment/deploy-migrations-from-a-local-environment +/docs/guides/deployment/caveats-when-deploying-to-aws-platforms /docs/orm/prisma-client/deployment/caveats-when-deploying-to-aws-platforms +/docs/guides/deployment/deploy-to-a-different-os /docs/orm/prisma-client/deployment/deploy-to-a-different-os +/docs/guides/deployment /docs/orm/prisma-client/deployment +/docs/concepts/components/prisma-client/metrics /docs/orm/prisma-client/observability-and-logging/metrics +/docs/concepts/components/prisma-client/opentelemetry-tracing /docs/orm/prisma-client/observability-and-logging/opentelemetry-tracing +/docs/concepts/components/prisma-client/debugging /docs/orm/prisma-client/debugging-and-troubleshooting/debugging +/docs/concepts/components/prisma-client/handling-exceptions-and-errors /docs/orm/prisma-client/debugging-and-troubleshooting/handling-exceptions-and-errors +/docs/concepts/components/prisma-client /docs/orm/prisma-client +/docs/guides/migrate/developing-with-prisma-migrate/add-prisma-migrate-to-a-project /docs/orm/prisma-migrate/getting-started +/docs/concepts/components/prisma-migrate/mental-model /docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model +/docs/concepts/components/prisma-migrate/migration-histories /docs/orm/prisma-migrate/understanding-prisma-migrate/migration-histories +/docs/concepts/components/prisma-migrate/shadow-database /docs/orm/prisma-migrate/understanding-prisma-migrate/shadow-database +/docs/concepts/components/prisma-migrate/prisma-migrate-limitations-issues /docs/orm/prisma-migrate/understanding-prisma-migrate/limitations-and-known-issues +/docs/concepts/components/prisma-migrate/legacy-migrate /docs/orm/prisma-migrate/understanding-prisma-migrate/legacy-migrate +/docs/guides/migrate/seed-database /docs/orm/prisma-migrate/workflows/seeding +/docs/guides/migrate/developing-with-prisma-migrate/team-development /docs/orm/prisma-migrate/workflows/team-development +/docs/concepts/components/prisma-migrate/supported-types-and-db-features /docs/orm/prisma-migrate/workflows/native-database-types +/docs/guides/migrate/developing-with-prisma-migrate/enable-native-database-functions /docs/orm/prisma-migrate/workflows/native-database-functions +/docs/guides/migrate/prototyping-schema-db-push /docs/orm/prisma-migrate/workflows/prototyping-your-schema +/docs/guides/migrate/developing-with-prisma-migrate/troubleshooting-development /docs/orm/prisma-migrate/workflows/troubleshooting +/docs/guides/migrate/developing-with-prisma-migrate/baselining /docs/orm/prisma-migrate/workflows/baselining +/docs/guides/migrate/developing-with-prisma-migrate/customizing-migrations /docs/orm/prisma-migrate/workflows/customizing-migrations +/docs/guides/migrate/data-migration /docs/orm/prisma-migrate/workflows/data-migration +/docs/guides/migrate/developing-with-prisma-migrate/squashing-migrations /docs/orm/prisma-migrate/workflows/squashing-migrations +/docs/guides/migrate/developing-with-prisma-migrate/generating-down-migrations /docs/orm/prisma-migrate/workflows/generating-down-migrations +/docs/guides/migrate/production-troubleshooting /docs/orm/prisma-migrate/workflows/patching-and-hotfixing +/docs/guides/migrate/developing-with-prisma-migrate/include-unsupported-database-features /docs/orm/prisma-migrate/workflows/unsupported-database-features +/docs/concepts/components/prisma-migrate/migrate-development-production /docs/orm/prisma-migrate/workflows/development-and-production +/docs/concepts/components/prisma-migrate /docs/orm/prisma-migrate +/docs/concepts/components/prisma-schema/data-sources /docs/orm/prisma-schema/overview/data-sources +/docs/concepts/components/prisma-schema/generators /docs/orm/prisma-schema/overview/generators +/docs/concepts/components/prisma-schema/data-model /docs/orm/prisma-schema/data-model/models +/docs/concepts/components/prisma-schema/relations/one-to-one-relations /docs/orm/prisma-schema/data-model/relations/one-to-one-relations +/docs/concepts/components/prisma-schema/relations/one-to-many-relations /docs/orm/prisma-schema/data-model/relations/one-to-many-relations +/docs/concepts/components/prisma-schema/relations/many-to-many-relations /docs/orm/prisma-schema/data-model/relations/many-to-many-relations +/docs/concepts/components/prisma-schema/relations/self-relations /docs/orm/prisma-schema/data-model/relations/self-relations +/docs/concepts/components/prisma-schema/relations/referential-actions/special-rules-for-referential-actions /docs/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions +/docs/concepts/components/prisma-schema/relations/referential-actions /docs/orm/prisma-schema/data-model/relations/referential-actions +/docs/concepts/components/prisma-schema/relations/relation-mode /docs/orm/prisma-schema/data-model/relations/relation-mode +/docs/concepts/components/prisma-schema/relations/troubleshooting-relations /docs/orm/prisma-schema/data-model/relations/troubleshooting-relations +/docs/concepts/components/prisma-schema/relations /docs/orm/prisma-schema/data-model/relations +/docs/concepts/components/prisma-schema/indexes /docs/orm/prisma-schema/data-model/indexes +/docs/concepts/components/prisma-schema/views /docs/orm/prisma-schema/data-model/views +/docs/concepts/components/prisma-schema/names-in-underlying-database /docs/orm/prisma-schema/data-model/database-mapping +/docs/guides/other/multi-schema /docs/orm/prisma-schema/data-model/multi-schema +/docs/concepts/components/prisma-schema/features-without-psl-equivalent /docs/orm/prisma-schema/data-model/unsupported-database-features +/docs/concepts/components/introspection /docs/orm/prisma-schema/introspection +/docs/concepts/components/prisma-schema/postgresql-extensions /docs/orm/prisma-schema/postgresql-extensions +/docs/concepts/components/prisma-studio /docs/orm/tools/prisma-studio +/docs/concepts/components /docs/orm/tools +/docs/reference/api-reference/prisma-client-reference /docs/orm/reference/prisma-client-reference +/docs/reference/api-reference/prisma-schema-reference /docs/orm/reference/prisma-schema-reference +/docs/reference/api-reference/command-reference /docs/orm/reference/prisma-cli-reference +/docs/reference/api-reference/error-reference /docs/orm/reference/error-reference +/docs/reference/api-reference/environment-variables-reference /docs/orm/reference/environment-variables-reference +/docs/reference/database-reference/database-features /docs/orm/reference/database-features +/docs/reference/database-reference/supported-databases /docs/orm/reference/supported-databases +/docs/reference/database-reference/connection-urls /docs/orm/reference/connection-urls +/docs/reference/system-requirements /docs/orm/reference/system-requirements +/docs/concepts/components/preview-features/client-preview-features /docs/orm/reference/preview-features/client-preview-features +/docs/concepts/components/preview-features/cli-preview-features /docs/orm/reference/preview-features/cli-preview-features +/docs/concepts/components/preview-features /docs/orm/reference/preview-features +/docs/reference /docs/orm/reference +/docs/concepts/components/prisma-engines/query-engine /docs/orm/more/under-the-hood/engines +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5 /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5 +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-4 /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4 +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions +/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3 /docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3 +/docs/guides/upgrade-guides/upgrading-versions/codemods /docs/orm/more/upgrade-guides/upgrading-versions/codemods +/docs/guides/upgrade-guides/upgrading-versions /docs/orm/more/upgrade-guides/upgrading-versions +/docs/guides/upgrade-guides/upgrading-to-use-preview-features /docs/orm/more/upgrade-guides/upgrading-to-use-preview-features +/docs/guides/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade +/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrade-from-mongodb-beta /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrade-from-mongodb-beta +/docs/guides/upgrade-guides/upgrade-from-prisma-1 /docs/orm/more/upgrade-guides/upgrade-from-prisma-1 +/docs/concepts/more/comparisons/prisma-and-typeorm /docs/orm/more/comparisons/prisma-and-typeorm +/docs/concepts/more/comparisons/prisma-and-sequelize /docs/orm/more/comparisons/prisma-and-sequelize +/docs/concepts/more/comparisons/prisma-and-mongoose /docs/orm/more/comparisons/prisma-and-mongoose +/docs/concepts/more/comparisons/prisma-and-drizzle /docs/orm/more/comparisons/prisma-and-drizzle +/docs/concepts/more/comparisons /docs/orm/more/comparisons +/docs/guides/migrate-to-prisma/migrate-from-typeorm /docs/orm/more/migrating-to-prisma/migrate-from-typeorm +/docs/guides/migrate-to-prisma/migrate-from-sequelize /docs/orm/more/migrating-to-prisma/migrate-from-sequelize +/docs/guides/migrate-to-prisma/migrate-from-mongoose /docs/orm/more/migrating-to-prisma/migrate-from-mongoose +/docs/guides/migrate-to-prisma /docs/orm/more/migrating-to-prisma +/docs/guides/development-environment/environment-variables/env-files /docs/orm/more/development-environment/environment-variables/env-files +/docs/guides/development-environment/environment-variables/managing-env-files-and-setting-variables /docs/orm/more/development-environment/environment-variables/managing-env-files-and-setting-variables +/docs/guides/development-environment/environment-variables/using-multiple-env-files /docs/orm/more/development-environment/environment-variables/using-multiple-env-files +/docs/guides/development-environment/environment-variables /docs/orm/more/development-environment/environment-variables +/docs/guides/development-environment/editor-setup /docs/orm/more/development-environment/editor-setup +/docs/guides/development-environment /docs/orm/more/development-environment +/docs/guides/other/troubleshooting-orm/creating-bug-reports /docs/orm/more/help-and-troubleshooting/creating-bug-reports +/docs/guides/other/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js /docs/orm/more/help-and-troubleshooting/help-articles/autocompletion-in-graphql-resolvers-with-js +/docs/guides/other/troubleshooting-orm/help-articles/working-with-many-to-many-relations /docs/orm/more/help-and-troubleshooting/help-articles/working-with-many-to-many-relations +/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices /docs/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-dev-practices +/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo /docs/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-monorepo +/docs/guides/other/troubleshooting-orm/help-articles/pkg-issue /docs/orm/more/help-and-troubleshooting/help-articles/pkg-issue +/docs/guides/other/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries /docs/orm/more/help-and-troubleshooting/help-articles/comparing-columns-through-raw-queries +/docs/guides/other/troubleshooting-orm/help-articles/vercel-caching-issue /docs/orm/more/help-and-troubleshooting/help-articles/vercel-caching-issue +/docs/guides/other/troubleshooting-orm/help-articles/netlify-caching-issue /docs/orm/more/help-and-troubleshooting/help-articles/netlify-caching-issue +/docs/guides/other/advanced-database-tasks/data-validation/postgresql /docs/orm/more/help-and-troubleshooting/help-articles/check-constraints +/docs/guides/other/troubleshooting-orm/help-articles /docs/orm/more/help-and-troubleshooting/help-articles +/docs/about/prisma/releases /docs/orm/more/releases +/docs/data-platform/accelerate/what-is-accelerate /docs/accelerate/what-is-accelerate +/docs/data-platform/accelerate/getting-started /docs/accelerate/getting-started +/docs/data-platform/accelerate/concepts /docs/accelerate/concepts +/docs/data-platform/accelerate/api-reference /docs/accelerate/api-reference +/docs/data-platform/accelerate/limitations /docs/accelerate/limitations +/docs/data-platform/accelerate/evaluating /docs/accelerate/evaluating +/docs/data-platform/accelerate/faq /docs/accelerate/faq +/docs/data-platform/accelerate/feedback /docs/accelerate/feedback +/docs/guides/migrate/developing-with-prisma-migrate /docs/orm/prisma-migrate +/docs/guides/migrate/patching-production /docs/orm/prisma-migrate/workflows/patching-and-hotfixing +/docs/guides/migrate /docs/orm/prisma-migrate +/docs/guides/database /docs/orm/overview/databases +/docs/guides/performance-and-optimization/metrics /docs/orm/prisma-client/observability-and-logging/metrics +/docs/guides/performance-and-optimization/query-tracing /docs/orm/prisma-client/observability-and-logging/opentelemetry-tracing +/docs/guides/performance-and-optimization /docs/orm/prisma-client/queries/query-optimization-performance +/docs/guides/upgrade-guides /docs/orm/more/upgrade-guides +/docs/guides/other/troubleshooting-orm /docs/orm/more/help-and-troubleshooting +/docs/guides/other/advanced-database-tasks/typesafe-raw-sql /docs/orm/prisma-client/queries/raw-database-access/custom-and-type-safe-queries +/docs/guides/other/advanced-database-tasks/data-validation /docs/orm/prisma-client/queries/custom-validation +/docs/guides/other/advanced-database-tasks /docs/orm +/docs/guides/other /docs/orm +/docs/guides /docs/orm +/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql +/docs/data-platform/pulse/what-is-pulse /docs/pulse/what-is-pulse +/docs/data-platform/pulse/getting-started /docs/pulse/getting-started +/docs/data-platform/pulse/concepts /docs/pulse/concepts +/docs/data-platform/pulse/api-reference /docs/pulse/api-reference +/docs/data-platform/pulse/current-limitations /docs/pulse/current-limitations +/docs/data-platform/pulse/faq /docs/pulse/faq +/docs/data-platform/pulse/feedback /docs/pulse/feedback +/docs/reference/api-reference /docs/orm/reference +/docs/reference/database-reference /docs/orm/reference +/docs/data-platform/platform-console/about /docs/platform/platform-console/about +/docs/data-platform/platform-console/concepts/workspaces /docs/platform/platform-console/concepts/workspaces +/docs/data-platform/platform-console/concepts/projects /docs/platform/platform-console/concepts/projects +/docs/data-platform/platform-console/concepts /docs/platform/platform-console/concepts +/docs/data-platform/platform-console/maturity-levels /docs/platform/platform-console/maturity-levels +/docs/data-platform/platform-console/limits /docs/platform/platform-console/limits +/docs/data-platform/platform-console/support /docs/platform/platform-console/support +/docs/data-platform/platform-console /docs/platform/platform-console +/docs/data-platform/classic-projects/data-proxy/use-data-proxy /docs/platform/classic-projects/data-proxy/use-data-proxy +/docs/data-platform/classic-projects/data-proxy/deploy /docs/platform/classic-projects/data-proxy/deploy +/docs/data-platform/classic-projects/data-proxy/prisma-cli-with-data-proxy /docs/platform/classic-projects/data-proxy/prisma-cli-with-data-proxy +/docs/data-platform/classic-projects/data-proxy/considerations-limitations /docs/platform/classic-projects/data-proxy/considerations-limitations +/docs/data-platform/classic-projects/data-proxy /docs/platform/classic-projects/data-proxy +/docs/data-platform/classic-projects/platform/static-ips /docs/platform/classic-projects/platform/static-ips +/docs/data-platform/classic-projects/platform/projects/create /docs/platform/classic-projects/platform/projects/create +/docs/data-platform/classic-projects/platform/projects/edit-settings /docs/platform/classic-projects/platform/projects/edit-settings +/docs/data-platform/classic-projects/platform/projects/delete-project /docs/platform/classic-projects/platform/projects/delete-project +/docs/data-platform/classic-projects/platform/projects /docs/platform/classic-projects/platform/projects +/docs/data-platform/classic-projects/platform/environments/view-all /docs/platform/classic-projects/platform/environments/view-all +/docs/data-platform/classic-projects/platform/environments/create /docs/platform/classic-projects/platform/environments/create +/docs/data-platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle /docs/platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle +/docs/data-platform/classic-projects/platform/environments/edit-settings/change-default-environment /docs/platform/classic-projects/platform/environments/edit-settings/change-default-environment +/docs/data-platform/classic-projects/platform/environments/edit-settings /docs/platform/classic-projects/platform/environments/edit-settings +/docs/data-platform/classic-projects/platform/environments/delete /docs/platform/classic-projects/platform/environments/delete +/docs/data-platform/classic-projects/platform/environments /docs/platform/classic-projects/platform/environments +/docs/data-platform/classic-projects/platform/members/roles-permissions /docs/platform/classic-projects/platform/members/roles-permissions +/docs/data-platform/classic-projects/platform/members/add /docs/platform/classic-projects/platform/members/add +/docs/data-platform/classic-projects/platform/members/change-role /docs/platform/classic-projects/platform/members/change-role +/docs/data-platform/classic-projects/platform/members/remove /docs/platform/classic-projects/platform/members/remove +/docs/data-platform/classic-projects/platform/members /docs/platform/classic-projects/platform/members +/docs/data-platform/classic-projects/platform/data-browser /docs/platform/classic-projects/platform/data-browser +/docs/data-platform/classic-projects/platform/query-console /docs/platform/classic-projects/platform/query-console +/docs/data-platform/classic-projects/platform/schema-viewer /docs/platform/classic-projects/platform/schema-viewer +/docs/data-platform/classic-projects/platform/account /docs/platform/classic-projects/platform/account +/docs/data-platform/classic-projects/platform/github-integration /docs/platform/classic-projects/platform/github-integration +/docs/data-platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out /docs/platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out +/docs/data-platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env /docs/platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env +/docs/data-platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file /docs/platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file +/docs/data-platform/classic-projects/platform/troubleshooting/schema-file-does-not-update /docs/platform/classic-projects/platform/troubleshooting/schema-file-does-not-update +/docs/data-platform/classic-projects/platform/troubleshooting /docs/platform/classic-projects/platform/troubleshooting +/docs/data-platform/classic-projects/platform /docs/platform/classic-projects/platform +/docs/data-platform/classic-projects/support /docs/platform/classic-projects/support +/docs/data-platform/classic-projects /docs/platform/classic-projects +/docs/data-platform /docs/platform +/docs/about/prisma/example-projects https://github.com/prisma/prisma-examples/ +/docs/about/prisma/roadmap /docs/orm/more/releases#roadmap +/docs/about/prisma/faq /docs/support +/docs/about/prisma/limitations /docs/orm/prisma-schema/data-model/models#limitations +/docs/about/prisma /docs/about +/docs/data-platform/accelerate /docs/accelerate +/docs/data-platform/pulse /docs/pulse +/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql +/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql /docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql +/docs/concepts/overview/prisma-in-your-stack/graphql /docs/orm/overview/prisma-in-your-stack/graphql +/docs/concepts/overview/prisma-in-your-stack/rest /docs/orm/overview/prisma-in-your-stack/rest +/docs/accelerate/concepts /docs/accelerate +/docs/platform/classic-projects/data-proxy/* /docs/accelerate +/docs/platform/classic-projects/platform/* /docs/platform +/docs/platform/classic-projects/support https://www.prisma.io/support +/docs/platform/classic-projects /docs/platform +/docs/platform/platform-console/about /docs/platform/about +/docs/platform/platform-console/concepts/workspaces /docs/platform/concepts/workspaces +/docs/platform/platform-console/concepts/projects /docs/platform/concepts/projects +/docs/platform/platform-console/maturity-levels /docs/platform/maturity-levels +/docs/platform/platform-console/limits /docs/platform/limits +/docs/platform/platform-console/support /docs/platform/support +/docs/platform/platform-console /docs/platform +/docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare-workers /docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare +/docs/orm/prisma-client/deployment/module-bundlers /docs/orm/prisma-client/deployment/module-bundlers +/docs/pulse/current-limitations /docs/pulse/known-limitations 301 +/docs/pulse/current-limitations#change-events-are-not-persisted /docs/pulse/known-limitations#database-events-are-not-persisted 301 +/pulse/current-limitations /pulse/known-limitations 301 +/pulse/getting-started#configuring-replication-slot /pulse/database-setup/general-database-instructions#enable-logical-replication 301 diff --git a/static/ai_button.svg b/static/ai_button.svg deleted file mode 100644 index 1c632110c0..0000000000 --- a/static/ai_button.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/static/ai_logo.png b/static/ai_logo.png deleted file mode 100644 index 74d2ee4a59..0000000000 Binary files a/static/ai_logo.png and /dev/null differ diff --git a/static/fonts/Barlow-Bold.woff2 b/static/fonts/Barlow-Bold.woff2 index 4e73de50c2..5a99c42ec0 100644 Binary files a/static/fonts/Barlow-Bold.woff2 and b/static/fonts/Barlow-Bold.woff2 differ diff --git a/static/fonts/Barlow-Regular.woff2 b/static/fonts/Barlow-Regular.woff2 new file mode 100644 index 0000000000..04e90b0939 Binary files /dev/null and b/static/fonts/Barlow-Regular.woff2 differ diff --git a/static/fonts/Barlow-SemiBold.woff2 b/static/fonts/Barlow-SemiBold.woff2 deleted file mode 100644 index 77b92f377b..0000000000 Binary files a/static/fonts/Barlow-SemiBold.woff2 and /dev/null differ diff --git a/static/fonts/Inter-Bold.woff2 b/static/fonts/Inter-Bold.woff2 index 3813d99430..87e7b0a694 100644 Binary files a/static/fonts/Inter-Bold.woff2 and b/static/fonts/Inter-Bold.woff2 differ diff --git a/static/fonts/Inter-BoldItalic.woff2 b/static/fonts/Inter-BoldItalic.woff2 index ec305f36d8..501ebfc15e 100644 Binary files a/static/fonts/Inter-BoldItalic.woff2 and b/static/fonts/Inter-BoldItalic.woff2 differ diff --git a/static/fonts/Inter-Italic.woff2 b/static/fonts/Inter-Italic.woff2 index 4fb825a4ac..aa2ed52bc6 100644 Binary files a/static/fonts/Inter-Italic.woff2 and b/static/fonts/Inter-Italic.woff2 differ diff --git a/static/fonts/Inter-Medium.woff2 b/static/fonts/Inter-Medium.woff2 index effc911a0d..a2905b2603 100644 Binary files a/static/fonts/Inter-Medium.woff2 and b/static/fonts/Inter-Medium.woff2 differ diff --git a/static/fonts/Inter-MediumItalic.woff2 b/static/fonts/Inter-MediumItalic.woff2 index 420a657eac..326dd14829 100644 Binary files a/static/fonts/Inter-MediumItalic.woff2 and b/static/fonts/Inter-MediumItalic.woff2 differ diff --git a/static/fonts/Inter-Regular.woff2 b/static/fonts/Inter-Regular.woff2 index 59ed376834..5011ab8f91 100644 Binary files a/static/fonts/Inter-Regular.woff2 and b/static/fonts/Inter-Regular.woff2 differ diff --git a/static/fonts/Inter-SemiBold.woff2 b/static/fonts/Inter-SemiBold.woff2 index 08f0dc7aba..02a6fb928b 100644 Binary files a/static/fonts/Inter-SemiBold.woff2 and b/static/fonts/Inter-SemiBold.woff2 differ diff --git a/static/fonts/Inter-SemiBoldItalic.woff2 b/static/fonts/Inter-SemiBoldItalic.woff2 index cdf2cb112d..070164c1b6 100644 Binary files a/static/fonts/Inter-SemiBoldItalic.woff2 and b/static/fonts/Inter-SemiBoldItalic.woff2 differ diff --git a/static/fonts/JetBrainsMono-Regular.woff2 b/static/fonts/JetBrainsMono-Regular.woff2 index cc9a1ae35f..86e501f205 100644 Binary files a/static/fonts/JetBrainsMono-Regular.woff2 and b/static/fonts/JetBrainsMono-Regular.woff2 differ diff --git a/static/fonts/fa-brands-400.woff2 b/static/fonts/fa-brands-400.woff2 index 76fbd53382..f27ea1a4de 100644 Binary files a/static/fonts/fa-brands-400.woff2 and b/static/fonts/fa-brands-400.woff2 differ diff --git a/static/fonts/fa-light-300.woff2 b/static/fonts/fa-light-300.woff2 index 1f5e395d13..87ee1769f3 100644 Binary files a/static/fonts/fa-light-300.woff2 and b/static/fonts/fa-light-300.woff2 differ diff --git a/static/fonts/fa-regular-400.woff2 b/static/fonts/fa-regular-400.woff2 index 377777b767..7266a63f39 100644 Binary files a/static/fonts/fa-regular-400.woff2 and b/static/fonts/fa-regular-400.woff2 differ diff --git a/static/fonts/fa-solid-900.woff2 b/static/fonts/fa-solid-900.woff2 index 0fdabda469..bf573acd03 100644 Binary files a/static/fonts/fa-solid-900.woff2 and b/static/fonts/fa-solid-900.woff2 differ diff --git a/static/icons/breadcrumb.svg b/static/icons/breadcrumb.svg new file mode 100644 index 0000000000..9f1f05b719 --- /dev/null +++ b/static/icons/breadcrumb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/chevron-up-solid.svg b/static/icons/chevron-up-solid.svg new file mode 100644 index 0000000000..24fbd45ed3 --- /dev/null +++ b/static/icons/chevron-up-solid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/icons/technologies/cockroachdbgradient.svg b/static/icons/technologies/cockroachdbgradient.svg new file mode 100644 index 0000000000..80edaa3041 --- /dev/null +++ b/static/icons/technologies/cockroachdbgradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/technologies/mongodbsimple.svg b/static/icons/technologies/mongodbsimple.svg new file mode 100644 index 0000000000..c544636f49 --- /dev/null +++ b/static/icons/technologies/mongodbsimple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/technologies/mysqlsimple.svg b/static/icons/technologies/mysqlsimple.svg new file mode 100644 index 0000000000..49fa851770 --- /dev/null +++ b/static/icons/technologies/mysqlsimple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/technologies/planetscale.svg b/static/icons/technologies/planetscale.svg new file mode 100644 index 0000000000..eb481abea5 --- /dev/null +++ b/static/icons/technologies/planetscale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/technologies/postgresqlsimple.svg b/static/icons/technologies/postgresqlsimple.svg new file mode 100644 index 0000000000..e458a949b2 --- /dev/null +++ b/static/icons/technologies/postgresqlsimple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/technologies/sqlserver.svg b/static/icons/technologies/sqlserver.svg new file mode 100644 index 0000000000..513c4cfd68 --- /dev/null +++ b/static/icons/technologies/sqlserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/triangle-right.svg b/static/icons/triangle-right.svg new file mode 100644 index 0000000000..222c1a4c6e --- /dev/null +++ b/static/icons/triangle-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/content/300-accelerate/images/accelerate-in-dev.png b/static/img/accelerate/accelerate-in-dev.png similarity index 100% rename from content/300-accelerate/images/accelerate-in-dev.png rename to static/img/accelerate/accelerate-in-dev.png diff --git a/content/300-accelerate/images/accelerate-in-prod.png b/static/img/accelerate/accelerate-in-prod.png similarity index 100% rename from content/300-accelerate/images/accelerate-in-prod.png rename to static/img/accelerate/accelerate-in-prod.png diff --git a/content/300-accelerate/images/accelerate-update-database-connection-string.png b/static/img/accelerate/accelerate-update-database-connection-string.png similarity index 100% rename from content/300-accelerate/images/accelerate-update-database-connection-string.png rename to static/img/accelerate/accelerate-update-database-connection-string.png diff --git a/content/300-accelerate/images/accelerate.png b/static/img/accelerate/accelerate.png similarity index 100% rename from content/300-accelerate/images/accelerate.png rename to static/img/accelerate/accelerate.png diff --git a/content/300-accelerate/images/swr.png b/static/img/accelerate/swr.png similarity index 100% rename from content/300-accelerate/images/swr.png rename to static/img/accelerate/swr.png diff --git a/content/300-accelerate/images/ttl.png b/static/img/accelerate/ttl.png similarity index 100% rename from content/300-accelerate/images/ttl.png rename to static/img/accelerate/ttl.png diff --git a/content/300-accelerate/images/ttl_and_swr.png b/static/img/accelerate/ttl_and_swr.png similarity index 100% rename from content/300-accelerate/images/ttl_and_swr.png rename to static/img/accelerate/ttl_and_swr.png diff --git a/static/img/docs-social.png b/static/img/docs-social.png new file mode 100644 index 0000000000..17ca200216 Binary files /dev/null and b/static/img/docs-social.png differ diff --git a/src/images/favicon-32x32.png b/static/img/favicon.png similarity index 100% rename from src/images/favicon-32x32.png rename to static/img/favicon.png diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/1-create-database.jpg b/static/img/getting-started/1-create-database.jpg similarity index 100% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/1-create-database.jpg rename to static/img/getting-started/1-create-database.jpg diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/2-create-user.jpg b/static/img/getting-started/2-create-user.jpg similarity index 100% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/2-create-user.jpg rename to static/img/getting-started/2-create-user.jpg diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/3-create-posts.jpg b/static/img/getting-started/3-create-posts.jpg similarity index 100% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/120-mongodb/3-create-posts.jpg rename to static/img/getting-started/3-create-posts.jpg diff --git a/content/100-getting-started/images/prisma-client-install-and-generate.png b/static/img/getting-started/prisma-client-install-and-generate.png similarity index 100% rename from content/100-getting-started/images/prisma-client-install-and-generate.png rename to static/img/getting-started/prisma-client-install-and-generate.png diff --git a/content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/prisma-client-node-module.png b/static/img/getting-started/prisma-client-node-module.png similarity index 100% rename from content/100-getting-started/02-setup-prisma/200-add-to-existing-project/110-relational-databases/prisma-client-node-module.png rename to static/img/getting-started/prisma-client-node-module.png diff --git a/content/doc-images/prisma-db-pull-generate-schema.png b/static/img/getting-started/prisma-db-pull-generate-schema.png similarity index 100% rename from content/doc-images/prisma-db-pull-generate-schema.png rename to static/img/getting-started/prisma-db-pull-generate-schema.png diff --git a/content/100-getting-started/images/prisma-evolve-app-workflow.png b/static/img/getting-started/prisma-evolve-app-workflow.png similarity index 100% rename from content/100-getting-started/images/prisma-evolve-app-workflow.png rename to static/img/getting-started/prisma-evolve-app-workflow.png diff --git a/static/img/logo-dark.svg b/static/img/logo-dark.svg new file mode 100644 index 0000000000..8db99f452c --- /dev/null +++ b/static/img/logo-dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo-white.svg b/static/img/logo-white.svg new file mode 100644 index 0000000000..a5f22571d5 --- /dev/null +++ b/static/img/logo-white.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo.svg b/static/img/logo.svg new file mode 100644 index 0000000000..8db99f452c --- /dev/null +++ b/static/img/logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/doc-images/baseline-production-from-local.png b/static/img/orm/baseline-production-from-local.png similarity index 100% rename from content/doc-images/baseline-production-from-local.png rename to static/img/orm/baseline-production-from-local.png diff --git a/content/doc-images/connect-sql-server.png b/static/img/orm/connect-sql-server.png similarity index 100% rename from content/doc-images/connect-sql-server.png rename to static/img/orm/connect-sql-server.png diff --git a/content/doc-images/cursor-1.png b/static/img/orm/cursor-1.png similarity index 100% rename from content/doc-images/cursor-1.png rename to static/img/orm/cursor-1.png diff --git a/content/doc-images/cursor-2.png b/static/img/orm/cursor-2.png similarity index 100% rename from content/doc-images/cursor-2.png rename to static/img/orm/cursor-2.png diff --git a/content/doc-images/cursor-3.png b/static/img/orm/cursor-3.png similarity index 100% rename from content/doc-images/cursor-3.png rename to static/img/orm/cursor-3.png diff --git a/content/doc-images/offset-skip-take.png b/static/img/orm/offset-skip-take.png similarity index 100% rename from content/doc-images/offset-skip-take.png rename to static/img/orm/offset-skip-take.png diff --git a/static/img/orm/prisma-db-pull-generate-schema.png b/static/img/orm/prisma-db-pull-generate-schema.png new file mode 100644 index 0000000000..4328184337 Binary files /dev/null and b/static/img/orm/prisma-db-pull-generate-schema.png differ diff --git a/content/doc-images/prisma-evolve-app-workflow.png b/static/img/orm/prisma-evolve-app-workflow.png similarity index 100% rename from content/doc-images/prisma-evolve-app-workflow.png rename to static/img/orm/prisma-evolve-app-workflow.png diff --git a/content/doc-images/prisma-migrate-development-workflow.png b/static/img/orm/prisma-migrate-development-workflow.png similarity index 100% rename from content/doc-images/prisma-migrate-development-workflow.png rename to static/img/orm/prisma-migrate-development-workflow.png diff --git a/static/img/pulse/add-group.png b/static/img/pulse/add-group.png new file mode 100644 index 0000000000..083ac2897d Binary files /dev/null and b/static/img/pulse/add-group.png differ diff --git a/static/img/pulse/aws-rds-create-parameter-group.png b/static/img/pulse/aws-rds-create-parameter-group.png new file mode 100644 index 0000000000..20e969cb77 Binary files /dev/null and b/static/img/pulse/aws-rds-create-parameter-group.png differ diff --git a/static/img/pulse/pulse-usecase.png b/static/img/pulse/pulse-usecase.png new file mode 100644 index 0000000000..2bc05b4742 Binary files /dev/null and b/static/img/pulse/pulse-usecase.png differ diff --git a/static/img/pulse/railway-database-url.png b/static/img/pulse/railway-database-url.png new file mode 100644 index 0000000000..565c9eab05 Binary files /dev/null and b/static/img/pulse/railway-database-url.png differ diff --git a/static/img/pulse/railway-template-configure.png b/static/img/pulse/railway-template-configure.png new file mode 100644 index 0000000000..a190ef7936 Binary files /dev/null and b/static/img/pulse/railway-template-configure.png differ diff --git a/static/img/pulse/replication-slot-submission.png b/static/img/pulse/replication-slot-submission.png new file mode 100644 index 0000000000..7815f39f95 Binary files /dev/null and b/static/img/pulse/replication-slot-submission.png differ diff --git a/static/img/pulse/set-logical-replication-parameter.png b/static/img/pulse/set-logical-replication-parameter.png new file mode 100644 index 0000000000..451aa42ab0 Binary files /dev/null and b/static/img/pulse/set-logical-replication-parameter.png differ diff --git a/static/img/pulse/supabase-direct-database-connection.png b/static/img/pulse/supabase-direct-database-connection.png new file mode 100644 index 0000000000..c7cbf59ab2 Binary files /dev/null and b/static/img/pulse/supabase-direct-database-connection.png differ diff --git a/static/img/pulse/what-is-pulse.png b/static/img/pulse/what-is-pulse.png new file mode 100644 index 0000000000..8443201104 Binary files /dev/null and b/static/img/pulse/what-is-pulse.png differ diff --git a/static/img/technologies/cockroachdb.svg b/static/img/technologies/cockroachdb.svg new file mode 100644 index 0000000000..9af463e9ed --- /dev/null +++ b/static/img/technologies/cockroachdb.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/static/img/technologies/cockroachdbdark.svg b/static/img/technologies/cockroachdbdark.svg new file mode 100644 index 0000000000..9f223f6e91 --- /dev/null +++ b/static/img/technologies/cockroachdbdark.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/technologies/cockroachdbgradient.svg b/static/img/technologies/cockroachdbgradient.svg new file mode 100644 index 0000000000..a09d52314c --- /dev/null +++ b/static/img/technologies/cockroachdbgradient.svg @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/static/img/technologies/flow.svg b/static/img/technologies/flow.svg new file mode 100644 index 0000000000..bf45c87c65 --- /dev/null +++ b/static/img/technologies/flow.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/technologies/go.svg b/static/img/technologies/go.svg new file mode 100644 index 0000000000..2e04b15109 --- /dev/null +++ b/static/img/technologies/go.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/icons/technologies/JS.tsx b/static/img/technologies/js.svg similarity index 95% rename from src/icons/technologies/JS.tsx rename to static/img/technologies/js.svg index dd6c4e7643..fb449b8a8f 100644 --- a/src/icons/technologies/JS.tsx +++ b/static/img/technologies/js.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( ( d="M14.0653 19.7432L15.9226 18.7016C16.4115 19.475 17.0469 20.0431 18.1711 20.0431C19.1163 20.0431 19.7189 19.5854 19.7189 18.9541C19.7189 18.1966 19.0998 17.9282 18.057 17.4865L17.4869 17.2496C15.8412 16.5711 14.7495 15.7189 14.7495 13.9197C14.7495 12.2626 16.0529 11 18.0897 11C19.5398 11 20.5825 11.4893 21.332 12.7677L19.556 13.8723C19.1649 13.1938 18.7414 12.9255 18.0897 12.9255C17.4216 12.9255 16.998 13.3358 16.998 13.8723C16.998 14.5352 17.4216 14.8035 18.3992 15.2139L18.9694 15.4506C20.9083 16.2555 22 17.0761 22 18.9225C22 20.9111 20.387 22 18.22 22C16.1019 22 14.7332 21.0216 14.0653 19.7432Z" fill="#000" /> - -) + \ No newline at end of file diff --git a/static/img/technologies/mariadb.svg b/static/img/technologies/mariadb.svg new file mode 100644 index 0000000000..ef34e995a6 --- /dev/null +++ b/static/img/technologies/mariadb.svg @@ -0,0 +1,47 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/icons/technologies/MariaDBDark.tsx b/static/img/technologies/mariadbdark.svg similarity index 99% rename from src/icons/technologies/MariaDBDark.tsx rename to static/img/technologies/mariadbdark.svg index 50a0a6cfbd..cc5e9791c8 100644 --- a/src/icons/technologies/MariaDBDark.tsx +++ b/static/img/technologies/mariadbdark.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( xlinkHref="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAJCCAMAAAEQNLY4AAAAnFBMVEX///////////8fMF8pNF8tPWkzOV47SnM9PV5HQl5JV31RRl1XZIdbSl1lT11lcZFwU11zfpt6V1yBi6WEXFyOYFyPmK+YZVudpLmiY0uiaVuobVarscOsbVuud2KzgG22clq5ini5vs2/lIPAdlrFno/Hy9fLp5rRsaXV2OHWu7Dcxbzizsfj5evo2NLu4t3x8vXz7On59fT////HuKzxAAAAA3RSTlMgQIDf+k4bAAAAAWJLR0QzN9V8XgAAPbVJREFUeNrsXQljmzqzzfdk7Jjg2MQOXoIbx5fQ0JSUlv//357ZjCQkkEBgIDO3t01YhuFwNBqNtru7/6mVu/8L1QooBIUCghBSpRA5sahSGKlbOc4cOWoUXvQdEXLmB8dRgqGfvK5zWDimEoVOJtNAyVeeZvqQItrw9dVTmOmbuGoUGiUG1lLoKFaY61Oj8JArDFQoPF31HZECbzNznPI3llOIHEehQnPhkILM+go95BSEbaCIQvvosKSuQuRwpJ5Cz5HUV6GQa15NhZsyfTUUsj5tUkYifTUUOjyFCNVSyNVXU2HsBR4RKZg+CYXLy9WH7E7NdQ1S4QppJRoLChGXGVZm4KVallGIEJdo8Rmky0ZffN7GJzTZcG7rbDmvczFwgRTGh4hfPGoqRCJXDSnGzl+I9WoaosmFsjqFpKSoQsRQmCoiiw2mEEmAn16jo+z5IgoRml3KW/QnOmLljQgrv8ZAZQoR/m8E0eWn6Aakackdl58u/wcIf3qJwvQgSu+9WouyO2b0seQX0lFcFboouSq6YnZ9op1ZcDUl/ZFWWLQQpXdEGFE3VykkvkCuMDmqoeLNpQqx80WFGY7iCoMqhdcPgH+UkHEMpfqC9PyMrRD7O7rFReQrJV/NRHlJCfglxaD/NuOrDOJYcD0WSdpKiX7swtu8XaTswn3hwO9yhfuvry9RhfHP/yosTG/4sd+nv0X/7l/TX/df6b//4r/jc9EL/UvPv+z3BYUfHx+xpn97TOE++hP+2ocf2NH0rzfsuvwNKIXRVaTCyLT9R6ZkTyr8KFOY/L1nKvxB3ndV+FWpMEzeMdz/2WMKqaP4K3/ueQozeUu+HkWhN+Kf8L/rifdPSKaBQgUK/6c6MR6qthAUgsJK0RE6K1K4jhOxkxNaq1G4dZzLn8mqkMeuqS9usF7+P9Jpzrva+uIXLjaD6ylE/DTsXRMDncNMDW2ydN1JU8TD0rRzA30LRQonZQbWUOg5ihVWZYkl1VmOWoUPeKpOb6zwXiSpW6O4KVCINuJpZ3nTEnlAdj2FJ9m0c7m6J/k8thiJGfq8Ggr5+qbcbNFdLX0lmcQShQduHrsk0V6iUKuVaOcrXOI5cJnEePGQe7l4fr3Tci22PlGFfOBThQjRiZByhZkdJ8YN0fE5ko2+ELcgRGcmVdnKO8ZdqwtyjEvdkgJXy8GeTiLJVAkHSwWCo4+xWXnstGK9/GSzFKLCD1UKE50WldRlKHQFDM4fYyHieVeFRp4PR/m/UV7cCi+vlBDTjFKQtoVlT+1EYVBUiNxM4TXtu0Npuc0zqt7FcxhYOtZGXAtRlgBHIcpzpwjLi4cJ9jZCBOA8DFGIZ4iv748pXGLAFRTqTIXoenUhwxz9kLbB1rTC+F+PoTDTxFPoZcRjKMzTzoRClCTazyEyigo1xitfrksUrmmFBsrpm99hkh+loPDKw6sFV4XJgeTmiEBm1OOEyK+cgmwgRkkp0MbAy0GqHPlJDjw/fzlmhOs0MZ56M/vyo9WBt3mrSIzvBY4QCve/yhPjRF78i5FULShMte2v6en435c9kW5OM71YZjc5kufFc4XvaV78mkYu5r1f9nECOn14oilJVKdZZLbC1z1PYWTPnlSYnkyz04xX3l9z4wyFmSFSCvdJV8D+D6Fw/0kovGIYHQnZCjP5m3y8DzLf/Z5ky78+Uo7lZ94gmQYKVShUnWkHA8FAMBAM7JuBQfkwslsZmKVYTnFyxeiTgWdEpM6i7qJLyN0bAxPrJhfUtvFP23jkZm8+cZrmm8Tf1jlcsJvzBnPfxMAHVhrS7k0pDsTT1Tcx0KCt25R/264NRDXQ69LAaU37ujKQwT63RwZqEn0btzCwWHqPqGLUepcGHqQ6h7o2EPE6r/pgoIHke9e6MtBCx/Lev5sZeEbo2amQexn7lBk4QxtHUFDXBmoLR0bk7GtqIHJkJbJv2ZGB8tal3bvdtOoWThf21Tbwvo55J9SVgYGQPY+IHGFQ3nuv0kAkiNeK+rYdGWgSZmypkROrY24S2z7hQKaWgTo6MR/Kko3DudRTayCr8pqyH+TOCsNQrsEBYWKgzEBU21dc75zkHf6peabqT4wo6wTe30fXEZJVUzSbGhhcSfcs/nHQ0/V1zDBs18Bkkq5hSfuhlbRL6Spg1ROmGSPJsIKB3RvISsiKkr28XJD1iZs3sUqqaZaBRQvFS6Pvlpuf1+jE2K2sYVP0mUUD3aKzQ/FcYgXNePJFvfT3q4HRs6sNjEbIkBYitMNuxL/HdRJ2mE/Iztt5+XVGfiHD4txAXczA6P+A/OTYdOHrKWKW+JkiAwa6Fr8y08AwHltp0YPcqg3ELYwpmVJ6TWpAxedex9FpjKLDMhDhhUQTKCQG9amSIlP4gLg5RQMZI2zLDbzmJYrTYf6PBToOhUs8WNTAQsHjGWjgHGRcwjCQ/NRuWMvAmRCCdCFhlGPaQC+/IC6b7vUXLeG7KAddMqVU9uWlECQflncDpdT0sPM64htIHdOKF0aaUvUW7iOqOEg0NPBuquxOj+0Hi3UO3kYy8FUrMlkyqjoNopnWDdxnUlMf78aPj7/YIxoZ+NXohXkPr6233EASzmx05xt58o11bUjdSZxJ7/jDuOZ6suoT4x8j/5U2MIyWKKCupbQVXxxTEP39SSj4oj9BKYL7fTzs8k3MwA/CwAiLt1IDPwi1tQz8mZn0mZ77zTfwB4ngfv9OIfibg+C+gYEUecIC6XCNn0wOZr9+MDiYXvMZyhgIjhoMBAPBQNUG/q/nchf2HUEwEAwEA8FAMBAMBAPBwH4bqJV3kt/YQLdyJM2NDMzW2n5w+mggNkpzs3B6Z2C6OEsyeso5omgMVZ8MTIerrOJxXYftqmpYf8cGevfXwTfxP4spb2mvGxm4yIcuxfOZHhfRqOD+GHjv4AAu4s99QP1x1PRAsFU8L6c/NYnu1JjV1KWBpzqzru5u94GjJZ/sHgULtlNrWlN3Bq7qTbvqzECt7rS1rgws8u/cKwNR7Xl1HcV/xWHEZq8MfKoLYEcGFj7woV8Gek1mJnZh4IFh4K5HBk4YK4mKAtiFgajZ1Mlb2NcrAxF7pdPeGIg4U6+sfhh4XjSffNo5fHEZ7oWB3BmyqA8GuqW77knMu2rHQDQtmc72JDc7VrlxAUJKp+8qbvqie9Xzi9UZtyz9sMQEz3XnBp7RpK0J0ErKxH2LM7QbW+fLzYM+dGygPa0xBTrozMBgUmuOdtiVgTUmuaMuDdw4TusANjDQ7GgSvrJkkHAR7sZA3akNoN2FgZ6QPVuWfXIANtySp1wWuIGLik0N1BooVrVRXmjSnYFiBNyS60BcJ7V0wEHREuEwF1rQWjfwUci+Z+5CEG0bSFJrQU5Umj/nNt3fxkAeLkXhXei2aKCbP3ZRuZQGvlBZbQjFDLTSif95Z8wqe5hhua61ZNk3wQG0665GUm2gcc+rs4qTotdMACdxya2JYaWBW4Z5scvlL02ajjnBm3ExeWtBWGXghAOfJ16WcsDWLXDQp8qj8LpUqE6urW4hucdX1hSrClTZJ2KgfiTWDxKqqZZTRfYJGEiURtHlDFDujMKWDVxGxfi0nUuxG9VsIdVC0IqdxlKmftLu6zTRu0tgBiitCG0FytowUHplqI4NXKqzLoRBtmDg+Ax0OzDQb+Zhqv3PpcK0GYd1UQMZjxDuNyjvaOW0TEoX1SsaaDFiZeEqVRBBcmkz7JAtYCDjGRJ1vlVuPmVs9qPFfw7TQL++gaGogdjSKDktGKNVmAaiqiNKDAyzpg1uIBIzMCgzcHdND/hWrDn6W08X37Es6isusytC1oI/qKaBiH/Awoqcm+9omF6DGOvNzLB1fAp5Co8y0BQxkFx2K/ot759M0fOjZb/Mq4EXUN0dAUG8bo6VtjR5BmabPWYGGiKFxErwIJVgBQ5v5Np5i5z6RgENJdtAjTBQY67Yw3QpOITxjoKp6jPeagoYax4RG2wyiiuz2JSmRBgGLouPdFnPjT8f20DEXF2q2kBfyMBkpbKA+j1NM7BLocE/EslMGEEkYiABAbGmGq1glh0OCgYyHSDXQIvvcDkGYutnebiBM/bbUJjuahrI2hKJbyDKi1nmoAqhCsdAS9TANWUgvTwfw0BsLcDkb5dwWIZaAxFtYPEj3fHigvgHjaQi/QHWHANDcQN3BQNRlYEzTOk1I5+4ZJtXiotHiASnzTGwUBcLGZgvFolmxFJ68d+6oIEiflBLa1DMQL+Qu73jR0REhJscn1GLY/IMFKpJGPFgWF2KKQMZhdvPD2lcA43KunjGiKgtbLVPAQNDvImQBULYw5Dmcg2MPl9y946IZpjNptIulDuOl2E0IWht67DEQHL9XKaBrLZUZV1sGLinOzNP5J2qXrppssG8X8+fmR41MrF86qGxuJD6AAPD8OdbKjXViazOKLc6JGXgW+MVJtl3/v34yH78amrgVyyKDcStevvVzMBGjBExsBEHaQPxz/1GLSIZ79O93/9Lf30nyfFWXIywwMH46G+2OjEDiWcWDcTP/tozl9wsMzC95J11R4mBH5F8YR8su6lo4FuIrymJX5sc/nu9Fv/E2Y/JGpjv+R2vrCLOKcUfuCqugcnfX8Rve6ZHYRm4j/eux1bYxNWJIljfwE/ig7EN/IffImxgEYA6Bu7TZU5LDQxvaqDAJ/6VU7mugR/YsY8KA7+kDdwXAZUz8GfkA97SN41ufom9HcfA/c+QcCzR7ZjL+/xiuJl4PeD6BoYvMdF/MB0frTE+9Zqdfd0X15ilDfxXpk403Pp4+8DtL4ty/hKXhv+9UXHSb0YNWB02QcAKBoKBYCAYCAaCgWDgwA3s+4reACAACAIAAoAAIAAIAgACgAAgAAgCAAKAACAAODpxdx4AWFN8rdaaI98eQNdKd0TZFHegBgCZkqyKMV89b7H9Ch5X6dJfqDDqHwDMxURocmAtmzY5TOLlCw6rucRav98MwBl3LU4U/XecZwtogA9kCLFCbbrkUbqcz+rhcH/Fz5FaZvXbABigRXGVuRTRyelxG3Mwxc8IAUBacPhy/E5p8X16dqbO6pAuOARxIKPmoFZDfrjUwVlVMkn/oGQFTrP+Y0YLIDpULjR43F4gfGgE32gB9JDoWo31C++YATQeBBfP1Rs/apQAcjdOaLJ28zcCsLr4Rg1gU83DRgggEvF8S1VPGx2A7rSrwjtOAM1Vt/iNDUDt2DF+IwMQOV3jNyoA/YkQfjoAyImenyrxmygn4IgAFGi8PSLxlYq/G4DmQmx3KtUEHAmAARLbhgIA5JTekwh+9zF+OwCwAN9BKHV1aIWAgwfQE4QvK8AaAEg0PMT3cLvnrvz4XQEMkEjaj945JgQAk6BZfOdKYmsgGwAMgxmaHB1JWbRFwIEBuMT3VqpBQPf7AhitT7hx6gpqjYD9B9COBkA+Oo3kgFqqgvsMYLw913TjqJAWCdg/AINoIOT9s6NQHlrEr08AXqpXdH90lMsJtdQI6ROAl/L67LQkbRbgPgDoXoc8tiPZuDZzjAC6aOq0LIt2CXhLAA10dFqXDVK6iVt/ADQmThdyxc8MxwSgJ5ZCbi4r1HIBvgmA+tTpSKbt49c9gNqmK/iw3a2XowFQpPdRtftrJwtzGwCRQnrxgsd5083f+wvgequyePLi5gMxK2RMACK17o1XbxThG0cRdu/V4seOI+cXYFFRzOEDqDTyizA5cPBjy9AB1KvbHdvtarWaR3L592m7rQpPpPBrsQx3AaDN8VeHByQs04fVFu/g3ZbGzR1SsHUAbVZpe0JNpSRv1S2CLQHontNFHYop5gVSIKXtjk4RVAOgv4wXdLgUs+1JZIBFutEap5fsuqIGVw48/MzibnH8PeJ6AqAhOk5gU7YJN//bMNBc8dIu1/4Btux6CKBoUnRVtjOuDNddHT1w6OcT/QQFsfrIwFm8FMs2lkP54G5FY3tMtGCPXGMFy7YZsdEwz72OAy8uy1hbLm/kxTzfQlyBzArld9Fin2V3tfAZMfNU2ww8VT0ShfrjvvVsQQcABuihrDtMXXdOQMUvpzar1+4ALARlm0k7flsnMwjpM7wwHDaAzIBh3cJAKHzwwua6Z++tZTADLNdZ8T3dd5DlGx+ACD2eVpNaoTgAGHUkYy0yr1emDYSB3tIwLK+PlsEitAAgAAgAAoB9Fe227VxlAAq+hKU6tG3SWOMmptds0wtiqwPQFaOBpXxBhyYtjvI+Ab8aQEEMRQA0hAqS3UJxa5DNYWS53DW3k8kiUx/BUrgnSgRAIV026pe/4ptjMyC0irkjXeyFxAFEAvj1IDtSDWBurV4GYIKgrgBAS2Cmj13d++q7rpAz81zBSsMtVVhhjU2aywIwFKKgAIBXr6GVVjN8AA1m95iLX57dS20MwFbps6sE0lVXvj1hLwvAs0oALbcMweSkz6wxNV79xgBQozN9jFcI2NVqIA1giHd1sQAUq8GqAUxftATB7BSj742x00RaeOwigMXIoYCCx+grMFMIZQHEESoCmGit7g+tBjCzi4ugS5S/IvuK93iFEs8ZfUFr5PW0mEUXIgDgLv/iJICWxHiaagCvGHAQ9K+Pspivy64pmACa5TWBXzLadFkDQOwaViAtNjdCDEA7L3waF7/k0jVp3k4suORgTRwNSjEJlAMoNgylEkCcVnbRy+H4kUYbFf2aRQBtgWtKwqTGAKbGBu5uKT4qrhJAQksBQdJqXeJ9yaYf52L8sFdVrDRFABIusrJ9LwSgEXIQpEqVi1dclW5EEkCrCpGdLIB+OYBFt1AHQI8K7ggEA1YtqeHhY5cAurXCmHMJgOklVhMAC5kYDMGiV+c6RN6nkQDQrRoiKRsHmtglPACtSjVVABYVXBFk1IpL7IhWEcgjSQArIZGsRJZVTTkixm0E4DpkIsjQ7eOBWvmzTWkAK9qmkmGMQDIhu2rZAECm44kPzpgW4geDsny8hqQBTPcmFMy5lQNIPZ4HYPNKhK2A39RhvATi0k8WwLT9ovEBEQMwyw6dw3IANZFIsBaAGYKcE2eKM1QZSKIHzZUH8PpOZ0bAZlZVIu7OnPE6PEgAXTuPpKv2mysH0OPV4tyYgqZI3kbSDGtpYKnFWgDi6THdsAwNyzEyAOTKklempCdGlAPI706yOMcZr7xkJe9qA8hKMRq8MIaJnV+SdW8jmaBG7IR8hqqe48CK241aG0NhpQSGdgCAACBf9pEo0PP360YAvu1pGSKAX21aPi4AY6i+mGrebgfg13CK8Ff39jYE8Gf8ih/04c+Pi2S/RD9/EqfTI39fo5t/MdS+p1rZAP56iSn1lzp8URrf9449m2dB7Bj/i65+/R2GzKv/vvGsUwYgv2y/4UeKBajcL7yWniVO/eOdqSzCn/jVrxLWqQMwec+vqzFvsgC+RK//UrAxOfk3R7L43v+u133W9IGJAbmb/ydqXcNK5IMqZZn9H9EvP+UAxJ3AX+rcX54PfIuE7yBFAdzT9u0FrVMIIPlYyggJAOl3JooUhwD/viI/VR/AL5K81Oky6xQWYZJzb0oB/CgBsNRBCQL4Qd655//aMoBvLTGQD+CP6MCPpkW4NwCSRfiFcpD1AeS6p/jAuxof+EKEYr87BzB5zp/4xz/0u+AH9nIA/sVOcqpo3sn05vdqAD+xe18xUncKYPoGmbyU1j7iAIb/yuKwz4ogTTgOJLV8hrcA8NIkuFrwmwvvD8kifOVvdMlHEYyP68mfrEbQqyCA2Dd++ReGbQEIAglVABAABABBAEAAEAAEAEEAQAAQAAQAQQBAxQD+D6SR3AGHGjIQIAAAAUAAEAAEAQABQAAQAAQBAAFAABAABAEAAUAAEAAEAQABQAAQAAQBAAFAABAABAEAAUAAsMfi2S4AWF+sRttk3wF8zXbjvgP0JPa+AACvXu+cLOCI5gCghPg7g1g+dLLJd2sHACvknKzg+7Dabp1ckONMAEAB6kXEW5wcWtDpguACAKyC74LOo8MQdECnefTDZjEBALlyKbtbFnzO/Wa+QYdVgiUAyKtvEdow4XNW8+f75weUkrFyyfJvCqCJphhmx9VF0p8v7u/y33GeAegBgAzR0VMOX1rfXitg5Cy26W8PtTemHTeAGspr3ucsXEkd4PZpdYFw2rAEjxtAHeX0O12j56QwTy/orTaPh/i3Rf2dke++CX7OtcGxTQvwYhuX4hTcNQBYkB1yGAAmZXa7iLCbpgA22Zp7vAD6CG95HFP8skrXOTw6m+fEBU6abG0+XgDp6PlpkrdHTvfOBcnkTzP8xgug9uDwZXWKCu/lz6opfqMF0EJOuRxjADcn1Ay/0QJYhV9WrpviN1YA0bMQfhP+vvHfG8DdRAS+LXe/7G8PoFABvke1MwhjB3C2qYbvhJoX37EC6AkQcKWi+I4VQHTqqPiOFEDroRK/iq2PvzmASAg/VU8bH4Cz5y7xGx+AfiUBpxf8fACwdg3yhBqkT8cP4G7eaQEeH4BCBdgFAHmiPws0QFQScGQABkIEtAHA+m0Q1QQcF4DVbZC5ohTCSAEUa4PYACBHtGMVfhvlJXhMANpzIQICgPULcBzDGAAgpwBXZwHjOQ1nAJAp60fnFiV4NAD6Av1wzwBgEweYjVAFAJn4HR3BEmwCgKwcwkZwGIfaTMxoADQfHFECqi7BowDQvncAwCb4CQ2EibvSAcD6+KUEXAKAtP8TxC8F0AUAqfp3KojfYzsleOgAooUjRUAAkJCz4EBUAJCTfxEYhkVG0errkAEDaKG548gS0AUAs+AFSdCvxRI8UABdhM8DFpANAEjCt3DkJJ1rPQMA48L76MhKSsAzALjkriFRJofWSvCwADwjND06NeQeAAxDf4bQyqknqK0ocDAAejpC96ea8F3XS/C+KYC2htBk69SXRXsluPcA+stonYOD00jQdwVwjVCdmIUHoPmtAIxX51wcHQWSJhJUzU0aAIA7TRl4bZfg/gEYrzT5eHIUyjcCMHJ6D0dHrWSJhN3YAdwh2RxLDwjYGwADvR30vgmAZ/kElXQdrI8XwDWaHJzWBLXYjusFgAZ6cFqUU7sl+OYAzmpnWCQzWeME0KiTHa1Xgu0RAmi1Ve8Wx2S1RsAbAui3V/GyVv4cHYD6pAP48r0a7JEBGEiMauk1AW8E4LoT+uVBdBsdwrcEUJt3g19OwGBUALYfuzjXBd7bLsE3ADBAB6drAq5HBKCHnM7xa7EEdw5gh/itUAcluGsAg+7wO6ExAtgdfg4aI4BIXWdRVc/JdIwALrfK8HvmcXlDjuYYFYDeXGUB5Z0g28CjAlChA1zwADwhfEDluADUTioJyGHz9JGB3zgAtBXm7jfcsZaIhd84AERqQ5QtZ2WYgv8bC4Aq8TsingtE6LBAowRQf1IcI/OXJholgKLTyoUJiCpbH7ichw6g2hQCtjuXGAFVLzjWOYBB9bo4h+1qtXqYX+Th8sO2rMkyR7w6BHFl4ACWjD44ruaoRCbz1ZY55L6y+TsmABFnXZenKRKWC5BHfKiGHAFbGlzZDYABYlUgh3vURB7kCDjkbs0ZA79TM/QQc7L1qfQGf5gArlnzPA6oucgV4AEO7XAtI7H7iRnENRVGCd5W3LLrP4BX0BK5Xzzzp45jIZppWe5FdpZl6M0J6HPvCfoMYDwz5lJTlgdwVKSrc9oHvr3UpAGcZwXV7hhBBQDaohNj8FK2rlTr7wweFBuH4xiCsAxBq5cAesKzAfPSO5Mgg2tqAgTEx7D5nVYkTQEUXjztOlCq1qTJwMZwXHC+zXVC+rLDMtwQwOVEIgGgYs6pu2MQMFmZDd+lwewskGkGoCs4UGilLi3CWPHpwALII6t0raVpIg0BPEft/dVmG0v1IAsVO3kUCXjiEuwSWEUF37Baa4co8IH5Rz5UjdJT8RpG0QO2PgCr5TAmsAzDsM4GJ2d6UDrMOygSsNWJXN21REzOsJeJ2hisEAOeboyfKgA5ayHOFTdEbZqAp5YnMXQEoFfeRaGuHU/nsZ5vzT81AJqsLo/DRP1iIxqVhpnfHj8VAOoPzME/6rNIdAzdfqdvJwAu6R6j4xW9mdr4CxFMX6mLLW8LIHrOYujtdrXIOyZ01SWLyKMe28ywdAwgqyO7haEAS7wAT9Btw2eVAPr2+pq40y4RdUvv5OU18GnSF/qFA1qA8dq9sml/AuEYAdSS3tHnSb/gGwyAUQSznXcyWmicAJJ1lN0jy+4Gh5/VL9OGBeDs3DvTBlKELcMwz720bFx7rAOAACAACAIAAoAAIAAIMhYAAwCwgbh9yxzUBNBGgu0tpJh9DTbTs1gdDZZb1djOumJ9pQAuBYcFqe5hnDXot7R4o1RnngCAEstO3wkBgwRtVgsgagNA9tZKgpfVB9BXh7O4aC0ByMCm/phqQQCRmMlqu4L9BhlUq2KihC8CIFIIoC90leJs8br+GvhWsfoh503sigDi1aawIxQFsPJj2K309ZzrBjEWp/4+s0e7F17RFe24FwDwLDQ+tw8DfQQAxFyrWcqRQJCCAgCaItjYwwEwGuRAd+4xjDfFXkgAQE1kiDgaEIAMa1nGKwNQZI6CPSwAM1J0CmCpQxXY9SSa0yrUABZtul30+XUBDKlCzAXQVQigVk1AThzjY/HD1XVbkWRYRD/7eeWX+m4/Osx6hbPGGKZAXFwFIFXpdQJgCQVLx6y4VHSqFW3OXtckI1iX/U3oiXAmIxCtBHBHoN9mEY6jGLeUgslZzgN5LSkGgBZFZCaALkOhKw8gScE2AYy/d1hKweQk84Hs6c8aE0CfbkKxANS5jVtJAN0KANeqAIyZFZZRMD2nMx54LW2zXYS+i5XRIoDJVPbAu87HZgB4dX7LGB1bzxtdkgCGONcZYAmuWnYn5gLDMgqmpyxeMErakVYoRQC1wicqApjipwWFlIMuDSAeKRcBFA3LxAA0whIKZmXBLcQxNnN9hKSsawUAiwYXAJwxc9RJW9OSBTAsAXAnPL9UDEArLKHg9VH06wa82FCnnZ3FjsNpANeoqqJSAqCrSwxFFAPQDfkUzJ0xHcfwgx+dDaBZDmDAL1b1AfT4+UChTFAlgOerzRw4cq5Tr2eVtE00JoBhOYBlbqkOgEaeF6y/RkUlgObVaJtJQR+RCFPvtBRqzlvsgfckgH5ZY9GrASDmNVkAmmoA1ChHEXAJSAG4K63GbAaA53IAtdIE3UweQDf3OfVXDr0TcYEo5FIQI2CyXAt5oy3WELDYYJMAVsQVLQAo0skjBKAeloebPgawJ/i+a1kAzxXTa5oDeM3yWLp4RSIEoIWXuxmPgMkvFm6dLkZtIQD1CkbsVAFIxPuVCAoB6HJZRYabuN9YC+WT8NedlQNY2TKoV4mYXOWaUGVcBaBLaKYp6PPzurrI+xIAGl0DSIcxnGi1GYDr0r4DqmFVlSAqml8MKDoEkBtAkDW73wjAGaPHeUY2DcJBA1iqXGBRgbtQ+CHF3zXKSqMRgOeOAfSrARTICcoCiFOwkELFra58tMZI6XcKoI7FCTzlagA0OCppAhIvbEhXIl0DiEfKpQAGTQHchUwKBuwspIFdt+sQQF8SQEvEY1f3zN0JRDE++8W1onKJWsSXBdCq+CLLOp1KpgiAXgMA10XFGQUDXsNODEBdFkDFbeFZZb+wEh8443f3MQhIPM8oz2egegD6pWVFHMAdmW7hAOU1BpClYJdQkHVKF/mqeFNTBkCrVKFcPtATGBsTCvUs1QAwOThjtbQJs7WSp/tIHsCwLM25lALQpjsL2aaeBdYMFwDQYNdf1Tn4kiGKqA6AJX0ErlRKf1kYwMt8m0BBW5jdxOInywjATS5lUC0AQ26S05PpVHIZn5/bJ1iZ2b+rjmLckEfBqiLPGanto5oAhpzvZkl0a66ZxYcxxFdwksWdbBRT9iLsbA1ddSYFyKsDoMccaKflQx1KAHSp7Tr4dvt4SrpZRnrGUWGJxk3FdcTNrBzWAfBaVvVr88qf4YNtrCIphfqL6u+hcSdfCWcnbJEbiJ1XDLyzphaAubeL5g6aBk4UGQD9UAzAMGwJQItzfFlAQufZVQ9A9rvqoRSALr9Wk95GqBpAjXPG5gb4Fq/KIDx9XQAZ2HihOIDariyskl/irBxAI1rlnd0UYjfS/OgOOvL0NFaHf3RlpsSOfi6GJ1502ObGwdSLEhfHGkmx+NOFQ/pS8QlSHc1Y99axr9eVTaY7J3W5cfP57LDoBAAIAAKAACDIOAH82l/kQ4WivzcC8K0gQwTwd6TmNgDuCzJEAGPDvwBAAfmIhP0WnwCgKNeKjujGRfgLlyECGP56e/t3QwAHVAvfwF4A8KYA/nmNLnj7U+bMPwuO/W965Fd8M6Nw/X65nHj9ywHw73/R4ZdfjIfG9l7+JWuMT2bVEv6KnrJ/L6ivsk4dgF953fKHf1/Rhcf3hZ/Zva+U2n/ZiRcWgH/zh/7k1nhv1ZXI+/Xil1DGOoUAvuO18y9ZALG7/2PjlwoJ4E/81Gt9AIlH/BO3TiGAH+R7/pYEkBsb7csA/EOe+6wL4AvfgC+5yK0+gDkHXgqXCQEYvf1ngb4Jxd6zFhgFYF503/c8XgnEgR/Xx34VSnGpdbUA/MgFO/UD88Cv9FcXARD7+Qen2cAG8AcfLFEA8YIb//yXtu4f27qmLRGerWUnOQB+sm/9h//+uwBglM/4xFj0pxaAv3HfRoNUZp1CAL+IavA/yhULAPjFNvED96elceAXI0UgCOAP4gDrzb5aB/Cd+PUP9ab1ASTejQfgVxTZvdcHkLzstW0AmT6QeirlBOsDuK8E8BX/oioA/GgbQJEznQH4ThYJAFASwBS/H5e65HXYAL4V3/u/DgDEaPelCsD3mwD4QdS7X1SzoD6Ab6UA/sTuVAbg/iYA/iUyGT/k40COiZ/4pygA+IJd3ADA1x4AKB5I/5ACkPj9gwawcLIegH/w2PmTcj9dAfiGtSFfmC/6J7dPFsB3LHPwQVPnF3ayHoB4e/EffU9XAIbXJMzvYtLiPXv13y97SQDT1v1X+OetmEz4zOD988IMY2K2//j686sCwOQhP/5mlr7dAkAqs/RPtBFdZeJLWTqrNNcV5mnQqnTWa0U6qwsASQT/cJOF75IAYiC9FjD6R5185bQ9KxOqrzU/r9o+kStZihmfX1dkv6RNfLvSi0GyPXFyz+kOqE7pf/FYrBTASvl9aRL895t76mfNQT2/Lvf+5p38KDsZP/ZDrBc4UvTRdNgRDG8DAAFAABAABAEAAUAAEAAEAQABQAAQAAQBAAFAABAABAEAAUAAEAAEAQABQAAQAAQBAAFAAHC0AP4fYAACBAQBAoKAAAFBgIAgIEBAECAgCAgQEAQICAICBAQBAoKAAAFBgIAgIEBAECAgCAgQEAQICAICBAQBAoKAAAFBgIAgIEBAECAgCAgQEAQICAICBAQBAoKAAAFBgIAgIEBAEFL8tYZimVkBEBCkW7FnCBc9AAKCdOT4bAMVRQuAgCCtine2WMzLxAICgqjzcq67syzTMGZFpi22jnNfPGwAAUEace7i4DSuf7ufzxerzcG5yPZCQGcKBARRJedlRqLp4ml7ckrlEd2fIh4eJkBAkOZuz0wd3NPBEZENmhye0Nw5Rr+cnuYQA4LUlsBKvN7GEZWL13s+TdF2hVbPW+x4rMcFAoJIsC+udqdbR0Ie0MJZXf6fo+cFwu7cxgQMgYAgorKLW7MnGfZdaDY9nSaT42k6ORL8uxCz4xoYCDhs56df+PLAZN/mIW9aUEHhHG2cJ7RyjmjqkPx7jnvjQiAgiIh4Gro0JFgBHpXbI2rnw8X9XTh4uPBvfqmGn7FTx/hqHwgIIki/+YndvqAEJ+kKPTqnyfTS8L3w7/nySy6nSdctECDgoCvfBTPAWxT7O4ggbxu7PseZTpP/qQaIFwIBQSrF5NHPeSzw74EI/44XRzePrztcHOCGIu4sCIGAIFVyRuie0+490PQjgsSIf4nbO0aV7wOi7rO7fxcg4BBr3wm/s+OEu0AqM72IosFVHBI+xlScE2GjeYu3AQIO0P09ObVkE98YB4BOXA2ntfMN6QcEHJwY3Nq3Uo7HuKlxjGvcVUTAVdwsviH9gIBDy73Udn80GWPX5xymt4r9gIBDFAtNTo4yOSUjYDT3lq8EBByQ6ERKpSH7Hm8xBQkIOGDxNaLfrJGs0ulH9s3fCgg4nNavqur3KU3SmEEPXgsIOBBZo7kS9m3TnmLd68d7AQGHkn1ZqQj8HnpT9QIBhySBhrbN6ZcNk9GDHr0aEHAIzQ80OTam3yaL/Pr1bkDAITQ/pmOlHxBwAGI1b370svIFAg5Dls2bH9mc33MPXw8I2HPRG2efsyGCsyAEAoJIN3+PiqI/o59vCATss7jRDDYlnW595R8QsM+ya978yPinh0BAEEkxmzc/NrdY9BQIOA6ZNe/9eEY9bv8CAXstvoLBL0fU1/QzEPAbhH/pSgeRBEBAEClZqpj6cX+LBSeBgGOofjUFgw+wNTpCICBIx9Vv3gDutwMEAvZPdCVTP475+ggBEBBEWM71J54Tkm++YIZAQBBx97dRQT98kTYXCAgiKDa6VzPxbYPtPRgCAUEEG7/ooIZ/J2yFrB0QEERIDN6akw0ygD3PwQAB+yOmosYHPvO8/00QIGBvgr/JQRX98AxM35sgQMDx0Y/c/nIWAgFBqipfpfQjlym3gIAgZRIYiulHLVMeAAFB+OJqCpsejAq4tzNBgID9cH5KVhzit4D7PBIaCHhj9i0Ruj8opx/ZAu5/EwQIeBPxL75v8uy0IeQ2hRYQEISWXbTH5cZpR8gKuP9NECBgx40OQ3pv89p9wBdZh0BAEIJ8k9XJaVEeSAL6QECQWM5GvG3q0WlXnkn+mSEQEMS3tPY9HysFOIgIEAjYaqplN4sd39bpRqitgq0QCPhtxVtr8V7Rz053cqR2Cg6BgN+yyt3pqFO/x2uB7ICA362Zu54lu0Q/Hp0bCNUC0UIg4Lepb63E6aHJ4tm5mUxIAtpAwPE3Ms6pz7sEe09H57ZCtUBmIRBwxJWtZaTfebrY3Jp57BbIGQgIxLthC0QPgYBjatnaSy35sPePzyenh7KhHKALBBxH82JnZB6vn8RjD0IYwEBoIGBVbWtqaU5l6/RfqAoYeUDAIbu9hHv3T0dnIEJXwGYIBBxosBf3oE0fD86QhG4BD2MUAhCQSurFIwfuNydncEINghnIKAQgIB7wRX5viNyjlgIcVCccEDAWO5og9Hh0Bit0ADicHDQQ0NUjx+cMWg40/5YhEHAQ7Y3l8MnHyAAOqwXybQl4nnU0SL51/k1o/tkhELDnYmnofuuMQ6YDr4C/HwF3Gno4Oc5Y+acFQMA+17yjYh+DfwMahPD9CBjoaHoYEfsY8d+wUtDfi4A2UrcGfU864Ir8M0MgYD+dn9HWYlS3k22BfsMZhv/NCOi1sAzpzWVV5N/AukC+CwEv9Fs4o5N7NBIHOHYC+pqizf/63f021BbI6Amot7AIc/+Gvww2BTN2Au7Qwwjpd5iw+YdCIGC/mr7apI+DrDboSTLdR14/RwgIOAz318faN0reSfZDz+fYL08IAQGH0e0x6WPmJZ69IRvwPZXl/oCAvRQXPTp95d9UMt83rQz+gIB9kyXqZadv0nm7kIsYsxq7in6DG4k6XgL62n2fs8cyecnnrMZ+rqQfpGH6IlZfc39p+k4iNt2mIeMTEhFIREPyRYB/c9nxBo9zJCYGEPD2Ysp84Jt0X2wk+SchPhDwxuIh1NdRV9flg9rj3zDr4BERMNBRT1sf2ODlVXv8G2YiZjwENBq4v9P2ebWaz6dCn3kynz+sVpvt9iRb/Uo0QZ5r8G+QLnAsBFzLD7k/Pq/mE6RGphdObrbHysErog5wU88MHwh4G9khiUHPx82DKt6VyTwWynm2y78hjkkdAQHtaAdooa6Pw+MU3VQEm8Cr2g8wgYDddnpY8UYd99X0Oy4m6Oby0Db/BsjAQRIwcHemnkFevQvvYY76ISe5jE0tMYCASpnmujvLsgzD0AtQ3z8KLCl5WqDeiFgFTEQJmi79FM0DAjZIJduWMWMH9A+rOPchM87luSzk0wxr55Y3G33XtSyTZVAdEWqlH+kdL8/yD9Jhjega0Vyy7dpkvnraqhlLxYukZua59gdyz9bSqMk/oST5E2O7I7sGBT0goEwz9sK9udIVmk/MOEozlY5Ycm1rKV5DCo3QvmdXpa423ozMzQm4u9RNakfPH1ltjmXLo+UiNpb6xqNk7xvVq2FpI22L3JaAUfet2tFTrBav2XkHgXfho2kYcvybV4RxrnjlbwwnCrwpAdeKR68c7ntAvkIhi3zXVq7zgxvC+bvqFpExqA65WxJwpnRHrG2BfbM+DFL3kQj/iLXWKscU+Laps9tXNqyQKuUcLE4hll7CeVtIuFj9+BSeSP17uh/kVr/jaIQEu2Jhlpu56GzoXjajN/Nzoixe5RyBxaAXeR5bT4gpNW3COT3SuZZdj14m8vDTkwT9vDAEAt4yYNJlxlUVwj7N6pf/MConIRGV7zBXmBwPAYNLo3giPGdnS+Wa9d59vbj5+yi80NU39H69IuDuwj7BdaNOT9N+e75r+FeaZVohoF9fCBjogquInzZ0sqWX5Auj5UFKu9/IZrsehCEQ8Jb0E/B92+Jw5mVvgyZfKwv/qIS5HX5j6QEB3fKRmtunRXFU1Wzd6yrLKhn+R7WcjCAMgYA3FblBHgNI9gczXvV7WpEpy5kXfnfpAQEFhjTpS+s8mG8Vj99jtH430x72FAIBizXyRfwBIxqXJ2pM7aEwJcrwgXs9JeCw5UyvgPVcnI43swEnIGA7YuRDKQ5PrIGxQD4gYHvixcOWeUvMaCY0OYCArSdf2I2oHYR8QMBOqt9CrhyoBwTsqgLWyXwlMA8ICAIEBAEBAoIAAUFAgIAgQEAQECAgCBAQBAQICAIEHK4E8Qrpmgk9Hn0goGeo3aYnMJb9Bs69zawi2+CKaUVydl1PsfKL4p3r9ZyAltodAqJJ3f2fdnSDBYUsuaV65Xqkq5WrnwymioCG0j0q4kUFer3zGfVh7H4SMKON5atUPjv3j4CB0l1SYv71e5VZ6pvsek1A0SXDxJVrbs8IaKvcpyfQ+r/7qEl+j7D/BBRYOUxKud0rAi5V7hSVrULb62mL1m3WlMwfS6LjR5MJo0191kbpvialrsviLNIa7ZfCWJPV6xEBNYV7lV3xW/e8Hayni9PchvfVxdPbLTWp7eSsqlWCfVP5/sRqCOgq3C1vNuTNR3tFwDSgsWaiFLQEqBXoakNfNQS01O3XOFPt4787ARMSCu2tbgn5Nk/pDtlqCGgo2zF0NvQt6HtJQEazyatNwGTh/3TOVU8ISBavtSL+DW7r0V4TkN7xy6pNQLzC6wcBz0IOXpp//U7EDI+AZO3JKN6iBMRCfrcXBDSRGgYWomXJ1wvO5GavhrlrGkaes4akrqQTytuZeLgyMyy3SwKS0fqsLgHDvhGw2NivxcBipkm8MneXJV1Hu4Bdfqs+rlWWfHXlXtYv226QGlFj8DU3JWCydiuHgTU8YNAHAub2GE0YmN+sySViPEOq/1KUgAW/Trb5JAgYiOx1uQ46ISBRzvWmMWDzFLwKAlp5VNGAgditrkQixhPesjdbjlSMgMWdymdBWIuAa+HeLasTAuI5i3XDVrDdCwIaWF6yNgOJG4WVSHaN2sIELDrVJdfvlybNZlIGJsvlt0xA3Ad68gRUmoVRQkCiiqrJQPI2QywRY1YPO/LWM3rYigABba1QMXphDQJ6dNVrFkYyBbZRoGDbBAw0dh0qREBT7a7sCgh4Ju2pxUCDTGNbIomYtfDKjzZOQleAgCK7x1QTkKLfmh+w+0sikd82AfH4wpUiYLBUnaZVQECTCihqMJDiH5avcoVSWlplLHLWik2cKgKKNgUtgUb9sqq5GGCOUGubgOGSWYuWE5Bux6sZj6WAgBq91540A41CN17liBi8JOpCPZJBsbVSTkAvbEJAV/5b7QSyWYoI6DJBKBIwGuNlWUtdZkxN1wRk1GiSDFwW38osDzOwIEZil7VgJkNAP2xCQKtWUtTsioCYe3ZrNOnUDYhWQECLERJIMdBklKpzqR/Ck6lSI4LO4gQ8h00IaNbcB45y0+0RkFnbChJwHSqU5gRkRswzcQaaTK9edj/m/2Q3GA80QQKuwyYENOsPmbO6IeCZFQRKJLWUbUrfnIBsRIQZyOZfaSJGb5IHmIkRMGxCQLtJX6ndCQFdVltWMqtq9YKAZ843m4lF4Bz+lSVids3yUDMRAlpNCBg02wPdGgoBRbIP7RPQ5LkqIQby+IcB5HJdbr3xuJ4IAd0mBFw3jJaWtycgpwC665nqyXGNCcjPWQkw0OS36rkfcde0CjAFCBg2IWDT2Zpep40QGQImL26IZ+vbJ2DZuIFKBpbwLw8CZ9ykYdD0+4p8FHkCuo2DJKN9AprlreAKy8kRIOtbEtAqK+0VDDTLPrjFY3bzniCtkoBmEwI254jVPgG18jxg9QgzXVGfXFMCGqXfrJSB5Q6HWw81b4QZlQS01BCwcbXSGgHPgj0hYrF0k26RpgSsaO+VMLCqwptxTgMBFRBQZ9afcgDgOVX3VgR0qwIyLgMrAy5eW6F5sasmoHtbAtptE3DHHlMvR0DcBxq3IuC60gIOA6sD/jPHuRqNh4Ojdgm4a8yRdcsE9DmZRkkC4h0+tyLgrNpiJgNFGpyVKeqan+DcMgH9xj665eFYAW9SiCwBVUzPbEZAT8QABgOFEh4Gu4HtNR0QrrdMQCxRVG/lCrvdPCA+lCMYOAHFwp0CA8USbjysl82y8DvUNgHdZpPGsOC+DQK6/CGPsgS0b14FC87doBgomPDlfWG/UblzUesELE2wy3joNgi4LJn3L0vAmYLpmc0IKGowwUBbtO3Eu67JYBMXdUBALM27rF+o2yCgXTrkVpKADQadKSKgK4oGVqvYwvzDPgUXKNlk4A51QsCAO5tYJrmmnIDELCnGUEo5Ai6VTI9rRMC1cK97wFgaoNJqi5vltup9YHpaSGsEJN7Xrl1A1BJwVzmnQ4aABJn9GxFwJl7RFBlYXWo8PlpunX4gU3hSUmMCEpGc8HiRwjRidQS0NYEhLOIEJEcjNMmJNyGgJ1PIaQaKeG2N72GJCUaGgBcMiku9tEpAYnSn0CQeW2SNpzoEtA3BQXyCBAzIGdlaowWKmhDQknLBJANnci7LrYintYqhx/i04F03BKQm4VVMDManBVuqhmO57FXK7f9v79x2G4WBMHyxqiJFK62iStFGXoFcRPAGFoJ5/3fbkCoNTjw+gDmU/P9lC8EePo/H9tjYXyi5Mf1j9xZ2f+YQAD0Xxc5vvlHrh9kgD4fO7olXrJxNdel7jhMB+NSlkht5lJMbdo75gFvdZ93sp3CZ4oEeHyHZDj2fbQiAvkPRs+exa53BpDVh4fbD7x8db/zvz27zbP3pANREdT9+dc/MPB/3W40/cQKwjyxfqvH+8d3g4wGHAHj0DkduBG68fewPh77VtbVOCaDat7ru8RkHQPtOSs8vIc79oZp3/3WYTwLdZ432LtvL3My2OT6TMwWAzdcXbdz3ewcHcPv7n5+5rU1lf27CaACAmx7JYC2Bmz5O1hzqHi1uRjkCd3IAG/sZqerZXqEA3P7cf4T9XOulpLs/odgbPg+4LD0P0K4xV1h7DdHfvc4Vbt5f+pPrKwKw86aPx+Oiv7J0bk+dOjfQSgGEACAEAUAIAEIQABxF5eEmAWMAwJcHsIzaokTFCwHID3YBwIkU3QrDACAAnLMw3y0gAICLBfD+gNJ6bX03eQUAAeDkADYy/rw0lq/YBZfNC2pZAL7iKBgAAsDvD2BVtqrnqPr10V4Rk7wWti+A15tLuRAAP+tSTWa75QGYRw/xIi9cn0f9gzu8zfaaOlUezBwIKtTSptIDwDJ5DI0Ts8WIgJq7GIfbwX4sTiSkW0vQ2O4g5LcEUOhNzPLRATw0qebB5tj9FuGrDLoBmDN9VU1PHBHAkihO2oxku0UCmBrGzfnYABIy1CGx3GoAMDfcxqcH0FQcmqMhtlsigJXi/jMhRNptlqyeAkCeiYwr3oB6rFSuilMhOHMFMO5WtLVSeep05RHZP1x1b6bp5x/yoQB2HTlLLr+YKa79FNx2iwQw1/r9bi9Xjgwglzq6Ejt/uT6GEHbXKbR/TcMNQhxs0KlJXGu7o9Ruu46flJHNdpMB6NMzFXcHICnHWI8JIFMfG1kmzWPq9XA7gF9XZASXkwLIqN+LLTXpbbtFAsjIDkjem9mYAJbUcKg0t5c02Dxg4UZWYABT+ue4uemTBTkFiAKnBtD0vnNzfcYBsHR9qAwGYDkHgLWho5XmTriv7RYJIDdF4I63TgkgPQT1ALA6Jcx/+BgWQKOnT4zJXMsH0OPxxjkFsxXnBVD0BLCI+s5fjAWg7z9XCqB4CQDTARNoAHAMAJnJUPHKAFTmfnI5awwIAO0xoFxgDBgNiAErYsZpFgCNIzxjZL4uAO92eE49yMxZvbMAmJEzFHYAOTGtNAuAjWGkW5mrsioAO5OX9LxGYulE5HQA1uSoyQ4gdcE8AGb0crtlQnldAJK7F+6+kdmcZ0qAOQKAnfemrtZXB3cAI8LfuAIoQgBILnh0luiKFwCwa392v7Fg1HqPZgDTWcuUmVu6SH8jdqY7E6kpLs1HqllFlsI9jcSen+HXC0S6IlexNRNpZQB2F7Gv7uEhuYQ7QOSfrzTAiLZsLNpBPVT0eTLanIKbeGzxcsqGydTkS66mOZKYrw3AS6tj5MtklVOnNCWAav6YVz6gjV1zOoxkgQHUZ9ZaEzHXB+AlEtRbIrEl1+omdvNyZAAfetxbRCgcQjSpWa/kkrsm0sWBAXzygl/e2a3drwfA9t3kqnkTt2NNaiV7Nc6bhz0LYxlRKW3aglO4jRGUArPrndXBFZdGsMAAtlVWm3F8sjT7pQIIQcMFACEACAFACAKAEACEIAAIAUAIAoAQAIQgAAgBQAgCgBAAhCAACAFACAKAEACEIAAIAUAIAoAQAIQgAAgBQAgCgBAAhCAACAFACAKA0PL0H45go6fiA5NSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==" /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/MongoDB.tsx b/static/img/technologies/mongodb.svg similarity index 94% rename from src/icons/technologies/MongoDB.tsx rename to static/img/technologies/mongodb.svg index fb9084221c..69b6564fd8 100644 --- a/src/icons/technologies/MongoDB.tsx +++ b/static/img/technologies/mongodb.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( @@ -29,5 +26,4 @@ export default () => ( - -) + \ No newline at end of file diff --git a/src/icons/technologies/MongoDBSimple.tsx b/static/img/technologies/mongodbsimple.svg similarity index 94% rename from src/icons/technologies/MongoDBSimple.tsx rename to static/img/technologies/mongodbsimple.svg index 046f0a56ad..ebe9937d6b 100644 --- a/src/icons/technologies/MongoDBSimple.tsx +++ b/static/img/technologies/mongodbsimple.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( d="M8.88795 2.83463C10.2488 4.2257 12.9549 6.99194 14.2726 12.7401C14.4458 13.7185 14.5366 14.7095 14.5443 15.7027C14.5707 17.8182 14.1477 19.9156 13.3025 21.8593C12.4573 23.803 11.2088 25.5497 9.63774 26.9864L9.59973 27.0207C9.26491 27.3281 8.91095 27.6145 8.53994 27.8782L8.48964 27.9113C8.18549 29.2608 7.95635 30.6257 7.80323 32H7.15372C7.00852 30.4623 6.81283 28.9884 6.7377 28.4225C6.71797 28.2739 6.70655 28.1879 6.70655 28.1798L6.61265 28.1147C5.77645 27.5157 -0.363168 22.8193 0.0169244 14.9414C0.424965 6.49106 5.43324 2.33828 6.41254 1.57911C7.04193 0.913875 7.06764 0.663029 7.11683 0C7.12357 0.01589 7.12983 0.0320177 7.1355 0.0466186C7.14205 0.0634952 7.14781 0.0783319 7.15261 0.0884039C7.15261 0.0884039 7.62996 1.26307 8.10619 1.92389C8.20443 2.13593 8.48813 2.42593 8.88795 2.83463ZM7.45109 12.6152C7.07659 12.6152 7.07659 23.6657 7.07659 23.6657C7.07659 24.5255 7.59977 26.8107 8.11178 26.8704C8.11178 26.8704 7.73839 12.6152 7.45109 12.6152Z" fill="#00684A" /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/MSSQL.tsx b/static/img/technologies/mssql.svg similarity index 99% rename from src/icons/technologies/MSSQL.tsx rename to static/img/technologies/mssql.svg index dcd40b2d34..b6b81fb5ec 100644 --- a/src/icons/technologies/MSSQL.tsx +++ b/static/img/technologies/mssql.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( ( - -) + \ No newline at end of file diff --git a/src/icons/technologies/MySQL.tsx b/static/img/technologies/mysql.svg similarity index 98% rename from src/icons/technologies/MySQL.tsx rename to static/img/technologies/mysql.svg index 9a062e98e2..eef39d31a2 100644 --- a/src/icons/technologies/MySQL.tsx +++ b/static/img/technologies/mysql.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( ( transform="matrix(.13333 0 0 -.13333 3 21)" fill="#fff" /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/MySQLSimple.tsx b/static/img/technologies/mysqlsimple.svg similarity index 99% rename from src/icons/technologies/MySQLSimple.tsx rename to static/img/technologies/mysqlsimple.svg index 9fcc87a680..953749db04 100644 --- a/src/icons/technologies/MySQLSimple.tsx +++ b/static/img/technologies/mysqlsimple.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( - -) + \ No newline at end of file diff --git a/static/img/technologies/nodejs.svg b/static/img/technologies/nodejs.svg new file mode 100644 index 0000000000..a650e25707 --- /dev/null +++ b/static/img/technologies/nodejs.svg @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/src/icons/technologies/PlanetScale.tsx b/static/img/technologies/planetscale.svg similarity index 72% rename from src/icons/technologies/PlanetScale.tsx rename to static/img/technologies/planetscale.svg index 564d87ab47..866cd7adff 100644 --- a/src/icons/technologies/PlanetScale.tsx +++ b/static/img/technologies/planetscale.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( ( > - -) + \ No newline at end of file diff --git a/src/icons/technologies/PlanetscaleDark.tsx b/static/img/technologies/planetscaledark.svg similarity index 89% rename from src/icons/technologies/PlanetscaleDark.tsx rename to static/img/technologies/planetscaledark.svg index 3e141201a8..e91b360fb3 100644 --- a/src/icons/technologies/PlanetscaleDark.tsx +++ b/static/img/technologies/planetscaledark.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( d="M29.207 16.0039L16.0039 29.207C23.2969 29.2031 29.2031 23.2969 29.207 16.0039Z" fill="#E2E8F0" /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/PostgreSQL.tsx b/static/img/technologies/postgresql.svg similarity index 98% rename from src/icons/technologies/PostgreSQL.tsx rename to static/img/technologies/postgresql.svg index 0a9d605f1a..216d321828 100644 --- a/src/icons/technologies/PostgreSQL.tsx +++ b/static/img/technologies/postgresql.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export default () => ( ( transform="translate(5.796 5.819)" fill="#fff" /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/PostgresSQLDark.tsx b/static/img/technologies/postgresqldark.svg similarity index 99% rename from src/icons/technologies/PostgresSQLDark.tsx rename to static/img/technologies/postgresqldark.svg index 2a158bea06..120364907e 100644 --- a/src/icons/technologies/PostgresSQLDark.tsx +++ b/static/img/technologies/postgresqldark.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( /> - -) + \ No newline at end of file diff --git a/src/icons/technologies/PostgresSQLSimple.tsx b/static/img/technologies/postgresqlsimple.svg similarity index 99% rename from src/icons/technologies/PostgresSQLSimple.tsx rename to static/img/technologies/postgresqlsimple.svg index 63c072e02b..0fa5c685d9 100644 --- a/src/icons/technologies/PostgresSQLSimple.tsx +++ b/static/img/technologies/postgresqlsimple.svg @@ -1,6 +1,3 @@ -import React from 'react' - -export default () => ( ( d="M30.0001 19.4037C29.8627 18.987 29.4203 18.8528 28.6853 19.0051C26.5029 19.4567 25.7214 19.1438 25.4647 18.9543C27.161 16.3631 28.5565 13.2311 29.3093 10.3087C29.666 8.9244 29.863 7.63886 29.879 6.59107C29.8968 5.44083 29.7015 4.59575 29.2986 4.07947C27.6741 1.99814 25.29 0.881737 22.4039 0.851055C20.4199 0.828708 18.7436 1.33787 18.4186 1.481C17.7342 1.31035 16.9882 1.20558 16.176 1.19222C14.6865 1.16808 13.3991 1.52562 12.3331 2.25437C11.8701 2.08163 10.6735 1.66976 9.21027 1.43344C6.68033 1.02494 4.67 1.33442 3.23533 2.35353C1.52348 3.5696 0.73319 5.74334 0.886331 8.81425C0.937856 9.84752 1.52491 13.0259 2.4515 16.0698C3.67111 20.076 4.99678 22.344 6.39175 22.8105C6.55499 22.8651 6.74332 22.9033 6.95085 22.9033C7.45972 22.9033 8.08354 22.6733 8.73265 21.8909C9.8108 20.5903 10.8174 19.5005 11.1885 19.1045C11.7369 19.3997 12.3392 19.5645 12.9554 19.581C12.9565 19.5972 12.9581 19.6133 12.9595 19.6294C12.8359 19.7764 12.7345 19.9053 12.6481 20.0153C12.2212 20.5586 12.1324 20.6717 10.7582 20.9555C10.3673 21.0363 9.32902 21.2509 9.3139 21.9806C9.29734 22.7778 10.541 23.1126 10.6828 23.1481C11.1766 23.2721 11.6523 23.3332 12.106 23.3332C13.2094 23.3332 14.1804 22.9696 14.9564 22.266C14.9325 25.1082 15.0507 27.9089 15.391 28.7623C15.6697 29.4608 16.3507 31.168 18.5018 31.1679C18.8173 31.1679 19.1648 31.1311 19.547 31.049C21.7919 30.5663 22.7667 29.5715 23.1438 27.3782C23.3456 26.206 23.692 23.4069 23.8548 21.9055C24.1985 22.013 24.6411 22.0622 25.1195 22.0621C26.1174 22.0621 27.2687 21.8496 27.9907 21.5135C28.8018 21.1358 30.2656 20.2089 30.0001 19.4037ZM24.6541 9.25788C24.6466 9.70115 24.5858 10.1035 24.5213 10.5236C24.4519 10.9753 24.3801 11.4424 24.3621 12.0094C24.3442 12.5612 24.413 13.1349 24.4795 13.6896C24.6138 14.8101 24.7516 15.9637 24.218 17.102C24.1351 16.9544 24.0551 16.7933 23.9817 16.6148C23.9154 16.4537 23.7714 16.1948 23.5721 15.8364C22.7965 14.4417 20.9801 11.1757 21.91 9.84292C22.1869 9.44614 22.8897 9.03837 24.6541 9.25788ZM22.5155 1.74866C25.1013 1.80593 27.1468 2.77589 28.5951 4.63146C29.7058 6.05475 28.4827 12.531 24.9418 18.118C24.9068 18.0735 24.8712 18.0285 24.8344 17.9824C24.8197 17.9639 24.8047 17.9452 24.7896 17.9262C25.7046 16.411 25.5256 14.9119 25.3664 13.5827C25.301 13.0373 25.2392 12.5221 25.2549 12.0382C25.2712 11.5252 25.3388 11.0854 25.4042 10.66C25.4847 10.1357 25.5664 9.59337 25.5438 8.95394C25.5607 8.8869 25.5675 8.80764 25.5587 8.71358C25.5011 8.10038 24.8029 6.26543 23.3799 4.60437C22.6016 3.69599 21.4664 2.67932 19.9165 1.99361C20.5831 1.85508 21.4948 1.72588 22.5155 1.74866ZM8.04577 21.3182C7.33066 22.1803 6.83677 22.0151 6.67438 21.9609C5.61615 21.6069 4.38837 19.3644 3.30585 15.8083C2.36916 12.7313 1.82173 9.63713 1.77845 8.76949C1.64165 6.02551 2.30502 4.1131 3.75022 3.08544C6.10216 1.41303 9.96903 2.41403 11.5228 2.92176C11.5004 2.94382 11.4772 2.96451 11.4551 2.98693C8.90543 5.56887 8.96591 9.98016 8.97214 10.2498C8.97193 10.3538 8.9806 10.5011 8.99257 10.7037C9.03642 11.4456 9.11804 12.8265 8.89998 14.3904C8.69725 15.8436 9.14399 17.2659 10.1255 18.2927C10.2271 18.399 10.3331 18.4988 10.4427 18.5927C10.0058 19.0618 9.05634 20.0992 8.04577 21.3182ZM10.7704 17.673C9.97935 16.8454 9.62011 15.6942 9.78464 14.5144C10.015 12.8624 9.9299 11.4236 9.88425 10.6507C9.87787 10.5426 9.87221 10.4478 9.86884 10.373C10.2413 10.0419 11.9675 9.11446 13.1984 9.39728C13.7602 9.52633 14.1024 9.90982 14.2447 10.5696C14.9813 13.985 14.3423 15.4086 13.8288 16.5525C13.723 16.7882 13.623 17.011 13.5376 17.2415L13.4714 17.4196C13.3039 17.8701 13.148 18.2888 13.0514 18.6865C12.2105 18.684 11.3924 18.3238 10.7704 17.673ZM10.8995 22.2792C10.654 22.2177 10.4331 22.1108 10.3035 22.0222C10.4118 21.9712 10.6044 21.9017 10.9384 21.8328C12.555 21.499 12.8046 21.2635 13.3498 20.5694C13.4749 20.4103 13.6165 20.2299 13.8127 20.0102C13.8128 20.01 13.8129 20.01 13.813 20.0099C14.1053 19.6818 14.2389 19.7374 14.4814 19.8382C14.6779 19.9198 14.8692 20.1667 14.9468 20.4384C14.9835 20.5668 15.0248 20.8104 14.8898 20.9999C13.7509 22.5988 12.0914 22.5783 10.8995 22.2792ZM19.3597 30.1732C17.3821 30.5981 16.6819 29.5863 16.2204 28.4296C15.9226 27.6829 15.7763 24.3155 15.8801 20.597C15.8815 20.5475 15.8745 20.4997 15.8608 20.4548C15.849 20.3681 15.8308 20.2803 15.8056 20.192C15.6511 19.651 15.2748 19.1984 14.8233 19.0108C14.644 18.9362 14.3147 18.7995 13.919 18.901C14.0034 18.5524 14.1498 18.1588 14.3084 17.7326L14.3749 17.5533C14.4499 17.3511 14.5438 17.1417 14.6433 16.9201C15.1806 15.7232 15.9165 14.0838 15.1179 10.3802C14.8187 8.9931 13.8197 8.31572 12.3053 8.47301C11.3973 8.56722 10.5668 8.93454 10.1525 9.14514C10.0634 9.19041 9.98193 9.2341 9.90582 9.27671C10.0214 7.87899 10.4583 5.26701 12.0925 3.61443C13.1214 2.57398 14.4917 2.06015 16.1612 2.08781C19.4509 2.14185 21.5604 3.83459 22.7509 5.24517C23.7767 6.46073 24.3323 7.68513 24.554 8.34547C22.8868 8.17554 21.7529 8.50556 21.178 9.32952C19.9275 11.1219 21.8622 14.6008 22.792 16.2727C22.9625 16.5791 23.1096 16.8439 23.1559 16.9564C23.4587 17.6922 23.8507 18.1834 24.1369 18.542C24.2246 18.6519 24.3098 18.7585 24.3745 18.8515C23.8695 18.9975 22.9625 19.3347 23.0451 21.0205C22.9785 21.8665 22.5044 25.8268 22.2636 27.226C21.9457 29.0745 21.2673 29.7631 19.3597 30.1732ZM27.6146 20.7011C27.0983 20.9415 26.2342 21.1218 25.4133 21.1604C24.5066 21.203 24.0451 21.0586 23.9366 20.9698C23.8855 19.9193 24.2756 19.8095 24.6883 19.6933C24.7531 19.675 24.8164 19.6572 24.8775 19.6358C24.9154 19.6668 24.957 19.6975 25.0025 19.7276C25.7312 20.2099 27.031 20.262 28.8659 19.8822C28.8727 19.8808 28.8794 19.8795 28.8861 19.8781C28.6386 20.1101 28.2151 20.4215 27.6146 20.7011Z" fill="white" /> - -) + \ No newline at end of file diff --git a/static/img/technologies/sqlite.svg b/static/img/technologies/sqlite.svg new file mode 100644 index 0000000000..2cb5c6e2f0 --- /dev/null +++ b/static/img/technologies/sqlite.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/static/img/technologies/sqlserver.svg b/static/img/technologies/sqlserver.svg new file mode 100644 index 0000000000..25ac983cfd --- /dev/null +++ b/static/img/technologies/sqlserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/technologies/Typescript.tsx b/static/img/technologies/typescript.svg similarity index 95% rename from src/icons/technologies/Typescript.tsx rename to static/img/technologies/typescript.svg index 31f5dfdacd..3dc53d6eac 100644 --- a/src/icons/technologies/Typescript.tsx +++ b/static/img/technologies/typescript.svg @@ -1,6 +1,3 @@ -import * as React from 'react' - -export const Typescript = () => ( ( transform="translate(5.257 10.945)" fill="#fff" /> - -) + \ No newline at end of file diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000000..13bf520aa5 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,8 @@ +User-agent: * +# Disallow: / +Disallow: /*?query=* +Disallow: /*?page=* +Disallow: /*&query=* +Disallow: /*&page=* +Sitemap: https://docs-cloudflare.prisma.io/sitemap.xml +Host: https://www.prisma.io diff --git a/static/tech/sqlserver.svg b/static/tech/sqlserver.svg deleted file mode 100644 index 9c07c314da..0000000000 --- a/static/tech/sqlserver.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tsconfig.json b/tsconfig.json index b9a5c790b4..f8d224fe2d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,105 +1,10 @@ { + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Projects */ - // "incremental": true, /* Enable incremental compilation */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - "lib": [ - "dom", - "esnext" - ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, - "jsx": "react" /* Specify what JSX code is generated. */, - // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ - // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - - /* Modules */ - "module": "esnext" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "resolveJsonModule": true, /* Enable importing .json files */ - // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ - // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ - // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - }, - "include": ["./src/**/*", "./gatsby-node.ts", "./gatsby-config.ts", "./plugins/**/*"] -} + "baseUrl": ".", + "types": [ + "docusaurus-plugin-sass" + ] + } +} \ No newline at end of file diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 4175eddb64..0000000000 --- a/tslint.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": ["tslint:recommended"], - "jsRules": {}, - "rules": { - "no-console": false, - "member-access": false, - "object-literal-sort-keys": false, - "ordered-imports": false, - "interface-name": false, - "no-submodule-imports": false, - "quotemark": [true, "single", "jsx-double"], - "arrow-parens": false - }, - "rulesDirectory": [] -} diff --git a/vercel.json b/vercel.json deleted file mode 100644 index fb8789580e..0000000000 --- a/vercel.json +++ /dev/null @@ -1,3883 +0,0 @@ -{ - "headers": [ - { - "source": "/(.*)", - "headers": [ - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Strict-Transport-Security", - "value": "max-age=63072000; includeSubDomains; preload" - }, - { - "key": "Content-Security-Policy", - "value": "default-src data: 'unsafe-inline' 'unsafe-eval' https:; script-src data: 'unsafe-inline' 'unsafe-eval' https: blob:; style-src data: 'unsafe-inline' https:; img-src data: https: blob:; font-src data: https:; connect-src https: wss: blob:; media-src https: blob:; object-src https:; child-src https: data: blob:; form-action https:; block-all-mixed-content" - }, - { - "key": "X-Frame-Options", - "value": "DENY" - }, - { - "key": "X-Content-Type-Options", - "value": "nosniff" - }, - { - "key": "Referrer-Policy", - "value": "no-referrer" - }, - { - "key": "Feature-Policy", - "value": "microphone 'none'; geolocation 'none'" - }, - { - "key": "Cache-Control", - "value": "public, max-age=0, s-maxage=31536000, immutable" - } - ] - } - ], - "redirects": [ - { - "source": "/docs/page-data/docs/:any*", - "destination": "/docs/page-data/index/:any*" - }, - { - "source": "/docs/faq/:any*", - "destination": "https://v1.prisma.io/docs/1.34/faq/:any*" - }, - { - "source": "/docs/-a002", - "destination": "https://v1.prisma.io/docs/1.34/get-started/" - }, - { - "source": "/docs/-t002", - "destination": "https://v1.prisma.io/docs/1.34/get-started/" - }, - { - "source": "/docs/-t002/", - "destination": "https://v1.prisma.io/docs/1.34/get-started/" - }, - { - "source": "/docs/prisma-admin/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-admin/" - }, - { - "source": "/docs/prisma-cli-and-configuration/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-cli-and-configuration/" - }, - { - "source": "/docs/prisma-client/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/" - }, - { - "source": "/docs/prisma-server/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-server/" - }, - { - "source": "/docs/quickstart/", - "destination": "https://v1.prisma.io/docs/1.34/get-started/" - }, - { - "source": "/docs/releases-and-maintenance/", - "destination": "https://v1.prisma.io/docs/1.34/releases-and-maintenance/" - }, - { - "source": "/docs/datamodel-and-migrations/", - "destination": "https://v1.prisma.io/docs/1.34/datamodel-and-migrations" - }, - { - "source": "/docs/get-started/01-setting-up-prisma-new-database-GO-g002/", - "destination": "https://v1.prisma.io/docs/1.34/get-started" - }, - { - "source": "/docs/get-started/01-setting-up-prisma-new-database-JAVASCRIPT-a002/", - "destination": "https://v1.prisma.io/docs/1.34/get-started" - }, - { - "source": "/docs/get-started/01-setting-up-prisma-demo-server-a001/", - "destination": "https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-demo-server-JAVASCRIPT-a001/" - }, - { - "source": "/docs/get-started/01-setting-up-prisma-existing-database-a003/", - "destination": "https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-demo-server-JAVASCRIPT-a001/" - }, - { - "source": "/docs/get-started/01-setting-up-prisma-new-database-a002/", - "destination": "https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-new-database-JAVASCRIPT-a002/" - }, - { - "source": "/docs/datamodel-and-migrations/datamodel-MYSQL-knul/", - "destination": "https://v1.prisma.io/docs/1.34/datamodel-and-migrations" - }, - { - "source": "/docs/data-model-and-migrations/introspection-mapping-to-existing-db-soi1/", - "destination": "https://v1.prisma.io/docs/1.34/data-model-and-migrations/introspection-mapping-to-existing-db-soi1/" - }, - { - "source": "/docs/understand-prisma/how-prisma-works-under-the-hood-j8ff/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/how-prisma-works-under-the-hood-j8ff/" - }, - { - "source": "/docs/understand-prisma/prisma-basics-datamodel-client-and-server-fgz4/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/prisma-basics-datamodel-client-and-server-fgz4/" - }, - { - "source": "/docs/understand-prisma/prisma-introduction-what-why-how-j9ff/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/prisma-introduction-what-why-how-j9ff/" - }, - { - "source": "/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-mongoose-ys8c/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-mongoose-ys8c/" - }, - { - "source": "/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk/" - }, - { - "source": "/docs/understand-prisma/prisma-vs-traditional-orms/prisma-vs-typeorm-k9fh/", - "destination": "https://v1.prisma.io/docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-typeorm-k9fh/" - }, - { - "source": "/docs/prisma-client/basic-data-access/reading-data-GO-go05/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-GO-go05/" - }, - { - "source": "/docs/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-JAVASCRIPT-rsc2/" - }, - { - "source": "/docs/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/" - }, - { - "source": "/docs/prisma-client/basic-data-access/writing-data-GO-go08/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-GO-go08/" - }, - { - "source": "/docs/prisma-client/basic-data-access/writing-data-JAVASCRIPT-rsc6/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-JAVASCRIPT-rsc6/" - }, - { - "source": "/docs/prisma-client/basic-data-access/writing-data-TYPESCRIPT-rsc7/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/basic-data-access/writing-data-TYPESCRIPT-rsc7/" - }, - { - "source": "/docs/prisma-client/features/check-existence-GO-go01/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-GO-go01/" - }, - { - "source": "/docs/prisma-client/features/check-existence-JAVASCRIPT-pyl1/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-JAVASCRIPT-pyl1/" - }, - { - "source": "/docs/prisma-client/features/check-existence-TYPESCRIPT-pyl2/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/check-existence-TYPESCRIPT-pyl2/" - }, - { - "source": "/docs/prisma-client/features/realtime-GO-go06/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-GO-go06/" - }, - { - "source": "/docs/prisma-client/features/realtime-JAVASCRIPT-rsc8/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-JAVASCRIPT-rsc8/" - }, - { - "source": "/docs/prisma-client/features/realtime-TYPESCRIPT-rsc9/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/features/realtime-TYPESCRIPT-rsc9/" - }, - { - "source": "/docs/prisma-client/setup/constructor-GO-go02/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-GO-go02/" - }, - { - "source": "/docs/prisma-client/setup/constructor-JAVASCRIPT-rsc4/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-JAVASCRIPT-rsc4/" - }, - { - "source": "/docs/prisma-client/setup/constructor-TYPESCRIPT-rsc5/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/constructor-TYPESCRIPT-rsc5/" - }, - { - "source": "/docs/prisma-client/setup/generating-the-client-GO-r3c3/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-GO-r3c3/" - }, - { - "source": "/docs/prisma-client/setup/generating-the-client-JAVASCRIPT-rsc1/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-JAVASCRIPT-rsc1/" - }, - { - "source": "/docs/prisma-client/setup/generating-the-client-TYPESCRIPT-r3c2/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-client/setup/generating-the-client-TYPESCRIPT-r3c2/" - }, - { - "source": "/docs/run-prisma-server/database-connector-MYSQL-jgfs/", - "destination": "https://v1.prisma.io/docs/1.34/prisma-server/database-connector-MYSQL-jgfs/" - }, - { - "source": "/docs/guides/database-workflows/setting-up-a-database/postgresql", - "destination": "/docs/dataguide/postgresql/setting-up-a-local-postgresql-database" - }, - { - "source": "/docs/guides/database-workflows/setting-up-a-database/mysql", - "destination": "/docs/dataguide/mysql/setting-up-a-local-mysql-database" - }, - { - "source": "/docs/guides/database-workflows/setting-up-a-database/sqlite", - "destination": "/docs/dataguide/sqlite/setting-up-a-local-sqlite-database" - }, - { - "source": "/docs/guides/database-workflows/import-and-export-data/postgresql", - "destination": "/docs/dataguide/postgresql/inserting-and-modifying-data/importing-and-exporting-data-in-postgresql" - }, - { - "source": "/docs/guides/database-workflows/import-and-export-data/mysql", - "destination": "/docs/dataguide/mysql/importing-and-exporting-data-in-mysql" - }, - { - "source": "/docs/guides/database-workflows/import-and-export-data/sqlite", - "destination": "/docs/dataguide/sqlite/importing-and-exporting-data-in-sqlite" - }, - { - "source": "/docs/guides/database-workflows/:any*", - "destination": "/docs/guides/general-guides/database-workflows/:any*" - }, - { - "source": "/docs/guides/troubleshooting", - "destination": "/docs/support/help-articles" - }, - { - "source": "/docs/guides/troubleshooting/autocompletion-in-graphql-resolvers-with-js", - "destination": "/docs/support/help-articles/autocompletion-in-graphql-resolvers-with-js" - }, - { - "source": "/docs/getting-started/quickstart-typescript", - "destination": "/docs/getting-started/quickstart" - }, - { - "source": "/docs/getting-started/quickstart-javascript", - "destination": "/docs/getting-started/quickstart" - }, - { - "source": "/docs/getting-started/quickstart-node", - "destination": "/docs/getting-started/quickstart" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-file", - "destination": "/docs/reference/tools-and-interfaces/prisma-schema" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-client/api", - "destination": "/docs/reference/tools-and-interfaces/prisma-client" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-client/api", - "destination": "/docs/reference/tools-and-interfaces/prisma-client" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/should-you-upgrade", - "destination": "/docs/guides/upgrade-from-prisma-1/how-to-upgrade" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-schema/models", - "destination": "/docs/reference/tools-and-interfaces/prisma-schema/data-model" - }, - { - "source": "/docs/concepts/overview/api-comparisons/prisma-and-typeorm", - "destination": "/docs/concepts/more/comparisons/prisma-and-typeorm" - }, - { - "source": "/docs/concepts/overview/api-comparisons/prisma-and-sequelize", - "destination": "/docs/concepts/more/comparisons/prisma-and-sequelize" - }, - { - "source": "/docs/concepts/overview/api-comparisons/prisma-and-mongoose", - "destination": "/docs/concepts/more/comparisons/prisma-and-mongoose" - }, - { - "source": "/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-typeorm", - "destination": "/docs/concepts/more/comparisons/prisma-and-typeorm" - }, - { - "source": "/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-sequelize", - "destination": "/docs/concepts/more/comparisons/prisma-and-sequelize" - }, - { - "source": "/docs/concepts/overview/why-prisma/api-comparisons/prisma-and-mongoose", - "destination": "/docs/concepts/more/comparisons/prisma-and-mongoose" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-sql-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-sql-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-sql-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-sql-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-mysql" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-file", - "destination": "/docs/reference/tools-and-interfaces/prisma-schema" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-client/api", - "destination": "/docs/reference/tools-and-interfaces/prisma-client" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/should-you-upgrade", - "destination": "/docs/guides/upgrade-from-prisma-1/how-to-upgrade" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-schema/models", - "destination": "/docs/reference/tools-and-interfaces/prisma-schema/data-model" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch", - "destination": "/docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch-typescript" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/how-to-upgrade", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/schema-incompatibilities", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgres", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first" - }, - { - "source": "/docs/guides/upgrade-from-prisma-1/upgrading-a-rest-api", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-schema/prisma-schema-reference", - "destination": "/docs/reference/api-reference/prisma-schema-reference" - }, - { - "source": "/docs/reference/tools-and-interfaces/prisma-cli/command-reference", - "destination": "/docs/reference/api-reference/command-reference" - }, - { - "source": "/docs/reference/database-connectors/database-features", - "destination": "/docs/orm/reference/supported-databases" - }, - { - "source": "/docs/reference/database-connectors/connection-urls", - "destination": "/docs/orm/reference/connection-urls" - }, - { - "source": "/docs/more/supported-databases", - "destination": "/docs/orm/reference/supported-databases" - }, - { - "source": "/docs/reference/tools-and-interfaces/:any*", - "destination": "/docs/concepts/components/:any*" - }, - { - "source": "/docs/reference/database-connectors/:any*", - "destination": "/docs/concepts/database-connectors/:any*" - }, - { - "source": "/docs/reference/more/:any*", - "destination": "/docs/concepts/more/:any*" - }, - { - "source": "/docs/understand-prisma/introduction", - "destination": "/docs/concepts/overview/what-is-prisma" - }, - { - "source": "/docs/understand-prisma/data-modeling", - "destination": "/docs/concepts/overview/what-is-prisma/data-modeling" - }, - { - "source": "/docs/understand-prisma/:any*", - "destination": "/docs/concepts/overview/:any*" - }, - { - "source": "/docs/understand-prisma/api-comparisons/:any*", - "destination": "/docs/concepts/overview/why-prisma/api-comparisons" - }, - { - "source": "/docs/more/:any*", - "destination": "/docs/about/:any*" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-prisma-migrate", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-sql", - "destination": "/docs/getting-started/setup-prisma" - }, - { - "source": "/docs/guides/prisma-guides/prisma-migrate-guides", - "destination": "/docs/guides/prisma-guides/add-prisma-migrate-to-a-project" - }, - - { - "source": "/docs/guides/prisma-guides/prisma-migrate-guides/add-prisma-migrate-to-a-project", - "destination": "/docs/guides/prisma-guides/add-prisma-migrate-to-a-project" - }, - - { - "source": "/docs/concepts/components/prisma-client/distinct", - "destination": "/docs/concepts/components/prisma-client/aggregation-grouping-summarizing#select-distinct" - }, - - { - "source": "/docs/concepts/components/prisma-client/configuring-the-prisma-client-api", - "destination": "/docs/concepts/components/prisma-client/generating-prisma-client/customizing-the-prisma-client-api" - }, - - { - "source": "/docs/concepts/components/prisma-client/constructor", - "destination": "/docs/reference/api-reference/prisma-client-reference#prismaclient" - }, - - { - "source": "/docs/concepts/components/prisma-client/field-selection", - "destination": "/docs/concepts/components/prisma-client/select-fields" - }, - - { - "source": "/docs/concepts/components/prisma-client/error-reference", - "destination": "/docs/reference/api-reference/error-reference" - }, - - { - "source": "/docs/concepts/components/prisma-client/sorting", - "destination": "/docs/concepts/components/prisma-client/filtering-and-sorting" - }, - - { - "source": "/docs/concepts/components/prisma-client/filtering", - "destination": "/docs/concepts/components/prisma-client/filtering-and-sorting" - }, - - { - "source": "/docs/concepts/components/prisma-client/aggregations", - "destination": "/docs/concepts/components/prisma-client/aggregation-grouping-summarizing" - }, - - { - "source": "/docs/concepts/components/prisma-client/working-with-json", - "destination": "/docs/concepts/components/prisma-client/working-with-advanced-types" - }, - - { - "source": "/docs/concepts/components/prisma-client/group-by", - "destination": "/docs/concepts/components/prisma-client/aggregation-grouping-summarizing#group-by-preview" - }, - - { - "source": "/docs/concepts/components/prisma-client/advanced-usage-of-generated-types", - "destination": "/docs/concepts/components/prisma-client/working-with-generated-types" - }, - - { - "source": "/docs/concepts/components/preview-features/native-types/native-types-mappings", - "destination": "/docs/reference/api-reference/prisma-schema-reference#model-field-scalar-types" - }, - - { - "source": "/docs/concepts/components/preview-features/native-types", - "destination": "/docs/concepts/components/prisma-schema/data-model#native-types-mapping" - }, - - { - "source": "/docs/concepts/components/prisma-client/generating-prisma-client", - "destination": "/docs/concepts/components/prisma-client/working-with-prismaclient/generating-prisma-client" - }, - - { - "source": "/docs/concepts/components/prisma-client/generating-prisma-client/customizing-the-prisma-client-api", - "destination": "/docs/concepts/components/prisma-client/working-with-prismaclient/use-custom-model-and-field-names" - }, - - { - "source": "/docs/concepts/components/prisma-client/connection-management", - "destination": "/docs/concepts/components/prisma-client/working-with-prismaclient/connection-management" - }, - - { - "source": "/docs/concepts/components/prisma-client/logging", - "destination": "/docs/concepts/components/prisma-client/working-with-prismaclient/logging" - }, - - { - "source": "/docs/concepts/components/prisma-client/error-formatting", - "destination": "/docs/concepts/components/prisma-client/working-with-prismaclient/error-formatting" - }, - - { - "source": "/docs/concepts/components/prisma-client/deployment", - "destination": "/docs/guides/deployment/deployment" - }, - - { - "source": "/docs/concepts/components/prisma-migrate/prisma-migrate-flows", - "destination": "/docs/concepts/components/prisma-migrate" - }, - - { - "source": "/docs/guides/prisma-guides/seed-database", - "destination": "/docs/guides/application-lifecycle/seed-database" - }, - - { - "source": "/docs/guides/prisma-guides/add-prisma-migrate-to-a-project", - "destination": "/docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project" - }, - - { - "source": "/docs/about/creating-bug-reports", - "destination": "/docs/support/creating-bug-reports" - }, - - { - "source": "/docs/concepts/components/prisma-client/working-with-generated-types", - "destination": "/docs/concepts/components/prisma-client/advanced-type-safety/operating-against-partial-structures-of-model-types" - }, - - { - "source": "/docs/reference/utility-types-reference", - "destination": "/docs/reference/api-reference/prisma-client-reference#prismavalidator" - }, - - { - "source": "/docs/concepts/components/prisma-client/query-engine", - "destination": "/docs/concepts/components/prisma-engines/query-engine" - }, - - { - "source": "/docs/concepts/overview/under-the-hood", - "destination": "/docs/concepts/components/prisma-engines" - }, - - { - "source": "/docs/guides/application-lifecycle/add-prisma-migrate-to-a-project", - "destination": "/docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project" - }, - - { - "source": "/docs/guides/deployment/patching-production", - "destination": "/docs/guides/database/patching-production" - }, - - { - "source": "/docs/guides/deployment/production-troubleshooting", - "destination": "/docs/guides/database/production-troubleshooting" - }, - - { - "source": "/docs/guides/application-lifecycle/:any*", - "destination": "/docs/guides/database/:any*" - }, - - { - "source": "/docs/guides/deployment/deploying-to-azure-functions", - "destination": "/docs/guides/deployment/deployment-guides/deploying-to-azure-functions" - }, - - { - "source": "/docs/guides/deployment/deploying-to-heroku", - "destination": "/docs/guides/deployment/deployment-guides/deploying-to-heroku" - }, - - { - "source": "/docs/guides/deployment/deploying-to-vercel", - "destination": "/docs/guides/deployment/deployment-guides/deploying-to-vercel" - }, - - { - "source": "/docs/guides/deployment/deploying-to-aws-lambda", - "destination": "/docs/guides/deployment/deployment-guides/deploying-to-aws-lambda" - }, - - { - "source": "/docs/guides/deployment/deploying-to-netlify", - "destination": "/docs/guides/deployment/deployment-guides/deploying-to-netlify" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/cascading-deletes/:any*", - "destination": "/docs/concepts/components/prisma-schema/relations/referential-actions" - }, - - { - "source": "/docs/guides/database/advanced-database-tasks/cascading-deletes/:any*", - "destination": "/docs/concepts/components/prisma-schema/relations/referential-actions" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/data-validation/:any*", - "destination": "/docs/guides/database/advanced-database-tasks/data-validation/:any*" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/sql-views", - "destination": "https://github.com/prisma/prisma/issues/678" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/sql-views-postgres", - "destination": "https://github.com/prisma/prisma/issues/678" - }, - - { - "source": "/docs/guides/database/advanced-database-tasks/sql-views-postgres", - "destination": "https://github.com/prisma/prisma/issues/678" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/sql-views-mysql", - "destination": "https://github.com/prisma/prisma/issues/678" - }, - - { - "source": "/docs/guides/database/advanced-database-tasks/sql-views-mysql", - "destination": "https://github.com/prisma/prisma/issues/678" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes", - "destination": "/docs/concepts/components/prisma-schema/data-model#defining-a-unique-field" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes/mysql", - "destination": "/docs/concepts/components/prisma-schema/data-model#defining-a-unique-field" - }, - - { - "source": "/docs/guides/database/advanced-database-tasks/unique-constraints-and-indexes/postgresql", - "destination": "/docs/concepts/components/prisma-schema/data-model#defining-a-unique-field" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/unique-constraints-and-indexes/sqlite", - "destination": "/docs/concepts/components/prisma-schema/data-model#defining-a-unique-field" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/foreign-keys", - "destination": "/docs/concepts/components/prisma-schema/relations#relational-databases" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/foreign-keys/mysql", - "destination": "/docs/concepts/components/prisma-schema/relations#relational-databases" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/foreign-keys/postgresql", - "destination": "/docs/concepts/components/prisma-schema/relations#relational-databases" - }, - - { - "source": "/docs/guides/general-guides/database-workflows/foreign-keys/sqlite", - "destination": "/docs/concepts/components/prisma-schema/relations#relational-databases" - }, - - { - "source": "/docs/guides/prisma-guides/:any*", - "destination": "/docs/guides/performance-and-optimization/:any*" - }, - - { - "source": "/docs/mongodb", - "destination": "/docs/concepts/database-connectors/mongodb" - }, - - { - "source": "/docs/guides/database/developing-with-prisma-migrate/advanced-migrate-scenarios", - "destination": "/docs/guides/database/developing-with-prisma-migrate/customizing-migrations" - }, - - { - "source": "/docs/concepts/components/prisma-migrate/type-mapping", - "destination": "/docs/concepts/components/prisma-migrate/supported-types-and-db-features" - }, - - { - "source": "/docs/concepts/components/prisma-client/working-with-advanced-types", - "destination": "/docs/concepts/components/prisma-client/working-with-fields" - }, - - { - "source": "/docs/concepts/more/codemod", - "destination": "/docs/guides/upgrade-guides/upgrading-versions/codemods" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/next-steps-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/introspection-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/next-steps-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/introspection-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgresql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/next-steps-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/introspection-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-typescript-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/connect-your-database-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/using-prisma-migrate-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/install-prisma-client-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/querying-the-database-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/next-steps-node-mysql", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/connect-your-database-node-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/introspection-node-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/install-prisma-client-node-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-mysql" - }, - - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/querying-the-database-node-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-mysql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/next-steps-node-mysql", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-mysql" - }, - { - "source": "/docs/concepts/more/environment-variables", - "destination": "/docs/guides/development-environment/environment-variables" - }, - { - "source": "/docs/concepts/more/environment-variables/managing-env-files-and-setting-variables", - "destination": "/docs/guides/development-environment/environment-variables/managing-env-files-and-setting-variables" - }, - { - "source": "/docs/concepts/more/environment-variables/using-multiple-env-files", - "destination": "/docs/guides/development-environment/environment-variables/using-multiple-env-files" - }, - { - "source": "/docs/concepts/more/editor-setup", - "destination": "/docs/guides/development-environment/editor-setup" - }, - { - "source": "/docs/about/about-the-docs", - "destination": "/docs/about/prisma-docs/about-the-docs" - }, - { - "source": "/docs/about/whats-new-in-prisma-docs", - "destination": "/docs/about/prisma-docs/whats-new-in-prisma-docs" - }, - { - "source": "/docs/about/limitations", - "destination": "/docs/about/prisma/limitations" - }, - { - "source": "/docs/about/roadmap", - "destination": "/docs/about/prisma/roadmap" - }, - { - "source": "/docs/about/faq", - "destination": "/docs/about/prisma/faq" - }, - { - "source": "/docs/about/releases", - "destination": "/docs/about/prisma/releases" - }, - { - "source": "/docs/about/example-projects", - "destination": "/docs/about/prisma/example-projects" - }, - { - "source": "/docs/about/style-guide", - "destination": "/docs/about/prisma-docs/style-guide" - }, - { - "source": "/docs/about/style-guide/mdx-examples", - "destination": "/docs/about/prisma-docs/style-guide/mdx-examples" - }, - { - "source": "/docs/about/style-guide/frontmatter", - "destination": "/docs/about/prisma-docs/style-guide/frontmatter" - }, - { - "source": "/docs/about/style-guide/template", - "destination": "/docs/about/prisma-docs/style-guide/template" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server/sql-server-start-from-scratch-typescript", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-sqlserver" - }, - { - "source": "/docs/concepts/database-connectors/microsoft-sql-server", - "destination": "/docs/concepts/database-connectors/sql-server" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server/sql-server-connection-string", - "destination": "/docs/concepts/database-connectors/sql-server" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server/sql-server-local", - "destination": "/docs/concepts/database-connectors/sql-server/sql-server-local" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server/sql-server-docker", - "destination": "/docs/concepts/database-connectors/sql-server/sql-server-docker" - }, - { - "source": "/docs/concepts/components/preview-features/sql-server", - "destination": "/docs/concepts/database-connectors/sql-server" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-to-latest", - "destination": "/docs/guides/upgrade-guides/upgrading-versions" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-to-use-preview-features/enabling-named-constraints", - "destination": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/referential-actions/cyclic-referential-actions", - "destination": "/docs/concepts/components/prisma-schema/relations/referential-actions/special-rules-for-referential-actions" - }, - { - "source": "/docs/concepts/components/prisma-schema/index-configuration", - "destination": "/docs/concepts/components/prisma-schema/indexes" - }, - { - "source": "/docs/concepts/components/prisma-data-platform", - "destination": "/docs/concepts/data-platform" - }, - { - "source": "/docs/about/prisma/platform-releases", - "destination": "/docs/concepts/data-platform/about-platform/platform-releases" - }, - { - "source": "/docs/support", - "destination": "/docs/guides/database/troubleshooting-orm" - }, - { - "source": "/docs/support/:any*", - "destination": "/docs/guides/database/troubleshooting-orm/:any*" - }, - { - "source": "/docs/concepts/data-platform", - "destination": "/docs/data-platform" - }, - { - "source": "/docs/concepts/data-platform/:any*", - "destination": "/docs/data-platform/:any*" - }, - { - "source": "/docs/data-platform/about-platform", - "destination": "/docs/data-platform/about" - }, - { - "source": "/docs/data-platform/about-platform/:any*", - "destination": "/docs/data-platform/about/:any*" - }, - { - "source": "/docs/data-platform/about/platform-limits-and-status", - "destination": "/docs/data-platform/about/limits-and-status" - }, - { - "source": "/docs/data-platform/about/platform-releases", - "destination": "/docs/data-platform/about/releases" - }, - { - "source": "/docs/data-platform/accounts", - "destination": "/docs/data-platform/account" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/referential-integrity", - "destination": "/docs/concepts/components/prisma-schema/relations/relation-mode" - }, - { - "source": "/docs/data-platform/billing/early-adopter-plan", - "destination": "/docs/data-platform/billing/plans-and-quotas" - }, - { - "source": "/docs/data-platform/projects/add-project(.*)", - "destination": "/docs/data-platform/projects/create" - }, - { - "source": "/docs/data-platform/members/user-roles", - "destination": "/docs/data-platform/members/roles-permissions" - }, - { - "source": "/docs/data-platform/members/data-collaborators", - "destination": "/docs/data-platform/members/add" - }, - { - "source": "/docs/data-platform/environments/edit-settings/change-database-connection-string", - "destination": "/docs/data-platform/troubleshooting/cannot-change-db-of-env" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/add-prisma-migrate-to-a-project", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/add-prisma-migrate-to-a-project" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/team-development", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/team-development" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/baselining", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/baselining" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/enable-native-database-functions", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/enable-native-database-functions" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/include-unsupported-database-features", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/include-unsupported-database-features" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/customizing-migrations", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/customizing-migrations" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/squashing-migrations", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/squashing-migrations" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/generating-down-migrations", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/generating-down-migrations" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/troubleshooting-development", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/troubleshooting-development" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/deploy-db.png", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/deploy-db.png" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/existing-database.png", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/existing-database.png" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/migrate-team-dev.png", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/migrate-team-dev.png" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/migration-history.png", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/migration-history.png" - }, - { - "source": "/docs/guides/database/developing-with-prisma-migrate/new-dev-db.png", - "destination": "/docs/guides/migrate/developing-with-prisma-migrate/new-dev-db.png" - }, - { - "source": "/docs/guides/database/seed-database", - "destination": "/docs/guides/migrate/seed-database" - }, - { - "source": "/docs/guides/database/prototyping-schema-db-push", - "destination": "/docs/guides/migrate/prototyping-schema-db-push" - }, - { - "source": "/docs/guides/database/patching-production", - "destination": "/docs/guides/migrate/patching-production" - }, - { - "source": "/docs/guides/database/production-troubleshooting", - "destination": "/docs/guides/migrate/production-troubleshooting" - }, - { - "source": "/docs/guides/database/using-prisma-with-planetscale", - "destination": "/docs/guides/database/planetscale" - }, - { - "source": "/docs/guides/database/using-prisma-with-cockroachdb", - "destination": "/docs/guides/database/cockroachdb" - }, - { - "source": "/docs/guides/database/using-prisma-with-mongodb", - "destination": "/docs/guides/database/mongodb" - }, - { - "source": "/docs/guides/database/multi-schema", - "destination": "/docs/guides/other/multi-schema" - }, - { - "source": "/docs/guides/database/prisma-type-system", - "destination": "/docs/guides/other/prisma-type-system" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/creating-bug-reports", - "destination": "/docs/guides/other/troubleshooting-orm/creating-bug-reports" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/working-with-many-to-many-relations", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/working-with-many-to-many-relations" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/finding-entities-based-on-relation", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/finding-entities-based-on-relation" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/pkg-issue", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/pkg-issue" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/prisma-autocompletion-in-js.png", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/prisma-autocompletion-in-js.png" - }, - { - "source": "/docs/guides/database/troubleshooting-orm/help-articles/unwanted-autocomplete-values-in-vscode.png", - "destination": "/docs/guides/other/troubleshooting-orm/help-articles/unwanted-autocomplete-values-in-vscode.png" - }, - { - "source": "/docs/guides/database/troubleshooting-orm", - "destination": "/docs/guides/other/troubleshooting-orm" - }, - { - "source": "/docs/guides/database/advanced-database-tasks/data-validation/postgresql", - "destination": "/docs/guides/other/advanced-database-tasks/data-validation/postgresql" - }, - { - "source": "/docs/guides/database/advanced-database-tasks/data-validation", - "destination": "/docs/guides/other/advanced-database-tasks/data-validation" - }, - { - "source": "/docs/guides/database/advanced-database-tasks", - "destination": "/docs/guides/other/advanced-database-tasks" - }, - { - "source": "/docs/concepts/components/prisma-cli/installation", - "destination": "/docs/reference/api-reference/command-reference#installation" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/finding-entities-based-on-relation", - "destination": "/docs/concepts/components/prisma-client/relation-queries#filter-on-presence-of-related-records" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/connect-your-database-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/using-prisma-migrate-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/install-prisma-client-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/querying-the-database-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases/next-steps-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgres", - "destination": "/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/introspection-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/baseline-your-database-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/install-prisma-client-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/querying-the-database-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/evolve-your-schema-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/next-steps-node-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql" - }, - { - "source": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-node-postgres", - "destination": "/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-node-postgresql" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgres", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgres", - "destination": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql" - }, - { - "source": "/docs/guides/migrate/deployment/deploy-database-changes-with-prisma-migrate", - "destination": "/docs/guides/deployment/deploy-database-changes-with-prisma-migrate" - }, - { - "source": "/docs/guides/deployment/deployment", - "destination": "/docs/guides/deployment/deploy-prisma" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-heroku", - "destination": "/docs/guides/deployment/traditional/deploy-to-heroku" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-koyeb", - "destination": "/docs/guides/deployment/traditional/deploy-to-koyeb" - }, - { - "source": "/docs/guides/deployment/deployment-guides", - "destination": "/docs/guides/deployment/deploy-prisma" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-azure-functions", - "destination": "/docs/guides/deployment/serverless/deploy-to-azure-functions" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-vercel", - "destination": "/docs/guides/deployment/serverless/deploy-to-vercel" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-aws-lambda", - "destination": "/docs/guides/deployment/serverless/deploy-to-aws-lambda" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-netlify", - "destination": "/docs/guides/deployment/serverless/deploy-to-netlify" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-deno-deploy", - "destination": "/docs/guides/deployment/edge/deploy-to-deno-deploy" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-cloudflare-workers", - "destination": "/docs/guides/deployment/edge/deploy-to-cloudflare-workers" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-migrations-from-a-local-environment", - "destination": "/docs/guides/deployment/deploy-migrations-from-a-local-environment" - }, - { - "source": "/docs/guides/deployment/deployment-guides/caveats-when-deploying-to-aws-platforms", - "destination": "/docs/guides/deployment/caveats-when-deploying-to-aws-platforms" - }, - { - "source": "/docs/guides/deployment/deployment-guides/deploying-to-a-different-os", - "destination": "/docs/guides/deployment/deploy-to-a-different-os" - }, - { - "source": "/docs/guides/deployment/deployment-guides/use-prisma-with-serverless-framework", - "destination": "/docs/guides/deployment/serverless/deploy-to-aws-lambda" - }, - { - "source": "/docs/guides/deployment/use-prisma-with-serverless-framework", - "destination": "/docs/guides/deployment/serverless/deploy-to-aws-lambda" - }, - { - "source": "/docs/data-platform/about/releases", - "destination": "/docs/data-platform/platform-console/maturity-levels" - }, - { - "source": "/docs/data-platform/about/limits-and-status", - "destination": "/docs/data-platform/classic-projects/about/limits-and-status" - }, - { - "source": "/docs/data-platform/about", - "destination": "/docs/data-platform/classic-projects/about" - }, - { - "source": "/docs/data-platform/data-proxy/use-data-proxy", - "destination": "/docs/data-platform/classic-projects/data-proxy/use-data-proxy" - }, - { - "source": "/docs/data-platform/data-proxy/deploy", - "destination": "/docs/data-platform/classic-projects/data-proxy/deploy" - }, - { - "source": "/docs/data-platform/data-proxy/prisma-cli-with-data-proxy", - "destination": "/docs/data-platform/classic-projects/data-proxy/prisma-cli-with-data-proxy" - }, - { - "source": "/docs/data-platform/data-proxy/considerations-limitations", - "destination": "/docs/data-platform/classic-projects/data-proxy/considerations-limitations" - }, - { - "source": "/docs/data-platform/data-proxy", - "destination": "/docs/data-platform/classic-projects/data-proxy" - }, - { - "source": "/docs/data-platform/static-ips", - "destination": "/docs/data-platform/classic-projects/platform/static-ips" - }, - { - "source": "/docs/data-platform/projects/create", - "destination": "/docs/data-platform/classic-projects/platform/projects/create" - }, - { - "source": "/docs/data-platform/projects/edit-settings", - "destination": "/docs/data-platform/classic-projects/platform/projects/edit-settings" - }, - { - "source": "/docs/data-platform/projects/delete-project", - "destination": "/docs/data-platform/classic-projects/platform/projects/delete-project" - }, - { - "source": "/docs/data-platform/projects", - "destination": "/docs/data-platform/classic-projects/platform/projects" - }, - { - "source": "/docs/data-platform/environments/view-all", - "destination": "/docs/data-platform/classic-projects/platform/environments/view-all" - }, - { - "source": "/docs/data-platform/environments/create", - "destination": "/docs/data-platform/classic-projects/platform/environments/create" - }, - { - "source": "/docs/data-platform/environments/edit-settings/edit-name-and-url-handle", - "destination": "/docs/data-platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle" - }, - { - "source": "/docs/data-platform/environments/edit-settings/change-default-environment", - "destination": "/docs/data-platform/classic-projects/platform/environments/edit-settings/change-default-environment" - }, - { - "source": "/docs/data-platform/environments/edit-settings", - "destination": "/docs/data-platform/classic-projects/platform/environments/edit-settings" - }, - { - "source": "/docs/data-platform/environments/delete", - "destination": "/docs/data-platform/classic-projects/platform/environments/delete" - }, - { - "source": "/docs/data-platform/environments", - "destination": "/docs/data-platform/classic-projects/platform/environments" - }, - { - "source": "/docs/data-platform/members/roles-permissions", - "destination": "/docs/data-platform/classic-projects/platform/members/roles-permissions" - }, - { - "source": "/docs/data-platform/members/add", - "destination": "/docs/data-platform/classic-projects/platform/members/add" - }, - { - "source": "/docs/data-platform/members/change-role", - "destination": "/docs/data-platform/classic-projects/platform/members/change-role" - }, - { - "source": "/docs/data-platform/members/remove", - "destination": "/docs/data-platform/classic-projects/platform/members/remove" - }, - { - "source": "/docs/data-platform/members", - "destination": "/docs/data-platform/classic-projects/platform/members" - }, - { - "source": "/docs/data-platform/data-browser", - "destination": "/docs/data-platform/classic-projects/platform/data-browser" - }, - { - "source": "/docs/data-platform/query-console", - "destination": "/docs/data-platform/classic-projects/platform/query-console" - }, - { - "source": "/docs/data-platform/schema-viewer", - "destination": "/docs/data-platform/classic-projects/platform/schema-viewer" - }, - { - "source": "/docs/data-platform/account", - "destination": "/docs/data-platform/classic-projects/platform/account" - }, - { - "source": "/docs/data-platform/github-integration", - "destination": "/docs/data-platform/classic-projects/platform/github-integration" - }, - { - "source": "/docs/data-platform/billing/plans-and-quotas", - "destination": "/docs/data-platform/classic-projects/platform/billing/plans-and-quotas" - }, - { - "source": "/docs/data-platform/billing/manage-plans", - "destination": "/docs/data-platform/classic-projects/platform/billing/manage-plans" - }, - { - "source": "/docs/data-platform/billing/invoices", - "destination": "/docs/data-platform/classic-projects/platform/billing/invoices" - }, - { - "source": "/docs/data-platform/billing/data-proxy-usage", - "destination": "/docs/data-platform/classic-projects/platform/billing/data-proxy-usage" - }, - { - "source": "/docs/data-platform/billing/payment-method-and-billing-information", - "destination": "/docs/data-platform/classic-projects/platform/billing/payment-method-and-billing-information" - }, - { - "source": "/docs/data-platform/billing", - "destination": "/docs/data-platform/classic-projects/platform/billing" - }, - { - "source": "/docs/data-platform/troubleshooting/connection-to-db-timed-out", - "destination": "/docs/data-platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out" - }, - { - "source": "/docs/data-platform/troubleshooting/cannot-change-db-of-env", - "destination": "/docs/data-platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env" - }, - { - "source": "/docs/data-platform/troubleshooting/cannot-edit-schema-file", - "destination": "/docs/data-platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file" - }, - { - "source": "/docs/data-platform/troubleshooting/schema-file-does-not-update", - "destination": "/docs/data-platform/classic-projects/platform/troubleshooting/schema-file-does-not-update" - }, - { - "source": "/docs/data-platform/troubleshooting", - "destination": "/docs/data-platform/platform-console/support" - }, - { - "source": "/docs/data-platform/contact-support", - "destination": "/docs/data-platform/platform-console/support" - }, - { - "source": "/docs/data-platform/cloud-projects/platform/account", - "destination": "/docs/data-platform/platform-console/concepts" - }, - { - "source": "/docs/data-platform/cloud-projects/platform/projects", - "destination": "/docs/data-platform/platform-console/concepts/projects" - }, - { - "source": "/docs/data-platform/cloud-projects/platform/organizations", - "destination": "/docs/data-platform/platform-console/concepts/workspaces" - }, - { - "source": "/docs/data-platform/cloud-projects/platform/billing", - "destination": "/docs/data-platform/platform-console/concepts/workspaces" - }, - { - "source": "/docs/data-platform/cloud-projects/platform", - "destination": "/docs/data-platform/platform-console" - }, - { - "source": "/docs/data-platform/cloud-projects/faq", - "destination": "/docs/data-platform/platform-console/limits" - }, - { - "source": "/docs/data-platform/cloud-projects/support", - "destination": "/docs/data-platform/platform-console/support" - }, - { - "source": "/docs/data-platform/cloud-projects/about-cloud-projects", - "destination": "/docs/data-platform/platform-console/about" - }, - { - "source": "/docs/data-platform/cloud-projects", - "destination": "/docs/data-platform/platform-console" - }, - { - "source": "/docs/data-platform/classic-projects/about/releases", - "destination": "/docs/data-platform/platform-console/maturity-levels" - }, - { - "source": "/docs/data-platform/classic-projects/about/limits-and-status", - "destination": "/docs/data-platform/platform-console/limits" - }, - { - "source": "/docs/data-platform/classic-projects/about", - "destination": "/docs/data-platform/platform-console/about" - }, - { - "source": "/docs/data-platform/classic-projects/contact-support", - "destination": "/docs/data-platform/platform-console/support" - }, - { - "source": "/docs/guides/performance-and-optimization/connection-management/configure-pg-bouncer", - "destination": "/docs/guides/performance-and-optimization/connection-management/configure-for-external-connection-pooler" - }, - { - "source": "/docs/data-platform/classic-projects/platform/billing", - "destination": "https://www.prisma.io/pricing" - }, - { - "source": "/docs/data-platform/accelerate/testing", - "destination": "/docs/data-platform/accelerate/evaluating" - }, - { - "source": "/docs/data-platform/classic-projects/platform/billing/plans-and-quotas", - "destination": "https://www.prisma.io/pricing" - }, - { - "source": "/docs/data-platform/classic-projects/platform/billing/manage-plans", - "destination": "https://www.prisma.io/pricing" - }, - { - "source": "/docs/concepts/components/prisma-schema", - "destination": "/docs/orm/prisma-schema" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient", - "destination": "/docs/orm/prisma-client" - }, - { - "source": "/docs/concepts/components/prisma-client/transactions", - "destination": "/docs/orm/prisma-client/queries/transactions" - }, - { - "source": "/docs/concepts/components/prisma-migrate/get-started", - "destination": "/docs/orm/prisma-migrate/getting-started" - }, - { - "source": "/docs/concepts/components/prisma-migrate/db-push", - "destination": "/docs/orm/prisma-migrate/workflows/prototyping-your-schema" - }, - { - "source": "/docs/concepts/components/prisma-cli", - "destination": "/docs/orm/tools/prisma-cli" - }, - { - "source": "/docs/concepts/components/prisma-engines", - "destination": "/docs/orm/more/under-the-hood/engines" - }, - { - "source": "/docs/concepts/database-connectors/mongodb", - "destination": "/docs/orm/" - }, - { - "source": "/docs/concepts/database-connectors", - "destination": "/docs/orm/overview" - }, - { - "source": "/docs/concepts/more/telemetry", - "destination": "/docs/orm/tools/prisma-cli#telemetry" - }, - { - "source": "/docs/concepts/more", - "destination": "/docs/orm/more" - }, - { - "source": "/docs/concepts", - "destination": "/docs/orm" - }, - { - "source": "/docs/concepts/overview/why-prisma", - "destination": "/docs/orm/overview/introduction/why-prisma" - }, - { - "source": "/docs/concepts/overview/should-you-use-prisma", - "destination": "/docs/orm/overview/introduction/should-you-use-prisma" - }, - { - "source": "/docs/concepts/overview/what-is-prisma/data-modeling", - "destination": "/docs/orm/overview/introduction/data-modeling" - }, - { - "source": "/docs/concepts/overview/what-is-prisma", - "destination": "/docs/orm/overview/introduction/what-is-prisma" - }, - { - "source": "/docs/concepts/components/database-drivers", - "destination": "/docs/orm/overview/databases/database-drivers" - }, - { - "source": "/docs/concepts/database-connectors/postgresql", - "destination": "/docs/orm/overview/databases/postgresql" - }, - { - "source": "/docs/concepts/database-connectors/mysql", - "destination": "/docs/orm/overview/databases/mysql" - }, - { - "source": "/docs/concepts/database-connectors/sqlite", - "destination": "/docs/orm/overview/databases/sqlite" - }, - { - "source": "/docs/guides/database/mongodb", - "destination": "/docs/orm/overview/databases/mongodb" - }, - { - "source": "/docs/concepts/database-connectors/cockroachdb", - "destination": "/docs/orm/overview/databases/cockroachdb" - }, - { - "source": "/docs/concepts/database-connectors/sql-server/sql-server-local", - "destination": "/docs/orm/overview/databases/sql-server/sql-server-local" - }, - { - "source": "/docs/concepts/database-connectors/sql-server/sql-server-docker", - "destination": "/docs/orm/overview/databases/sql-server/sql-server-docker" - }, - { - "source": "/docs/concepts/database-connectors/sql-server", - "destination": "/docs/orm/overview/databases/sql-server" - }, - { - "source": "/docs/guides/database/planetscale", - "destination": "/docs/orm/overview/databases/planetscale" - }, - { - "source": "/docs/guides/database/cockroachdb", - "destination": "/docs/orm/overview/databases/cockroachdb" - }, - { - "source": "/docs/guides/database/supabase", - "destination": "/docs/orm/overview/databases/supabase" - }, - { - "source": "/docs/guides/database/neon", - "destination": "/docs/orm/overview/databases/neon" - }, - { - "source": "/docs/guides/database/turso", - "destination": "/docs/orm/overview/databases/turso" - }, - { - "source": "/docs/guides/database/images/embedded-replica-create-replica.png", - "destination": "/docs/orm/overview/databases/images/embedded-replica-create-replica.png" - }, - { - "source": "/docs/guides/database/images/embedded-replica-read.png", - "destination": "/docs/orm/overview/databases/images/embedded-replica-read.png" - }, - { - "source": "/docs/guides/database/images/embedded-replica-remote-read.png", - "destination": "/docs/orm/overview/databases/images/embedded-replica-remote-read.png" - }, - { - "source": "/docs/guides/database/images/embedded-replica-write-propagation.png", - "destination": "/docs/orm/overview/databases/images/embedded-replica-write-propagation.png" - }, - { - "source": "/docs/concepts/database-connectors/mongodb.png", - "destination": "/docs/orm/overview/databases/mongodb.png" - }, - { - "source": "/docs/concepts/database-connectors/mysql-connection-string.png", - "destination": "/docs/orm/overview/databases/mysql-connection-string.png" - }, - { - "source": "/docs/concepts/database-connectors/postgresql-connection-string.png", - "destination": "/docs/orm/overview/databases/postgresql-connection-string.png" - }, - { - "source": "/docs/concepts/overview/node-js-db-tools-tradeoffs.png", - "destination": "/docs/orm/overview/introduction/node-js-db-tools-tradeoffs.png" - }, - { - "source": "/docs/concepts/overview/prisma-makes-devs-productive.png", - "destination": "/docs/orm/overview/introduction/prisma-makes-devs-productive.png" - }, - { - "source": "/docs/concepts/overview/prisma-rest-apis.png", - "destination": "/docs/orm/overview/introduction/prisma-rest-apis.png" - }, - { - "source": "/docs/concepts/overview/user-post-relation-1-n.png", - "destination": "/docs/orm/overview/introduction/user-post-relation-1-n.png" - }, - { - "source": "/docs/concepts/overview/user-table.png", - "destination": "/docs/orm/overview/introduction/user-table.png" - }, - { - "source": "/docs/concepts/overview/user-table.svg", - "destination": "/docs/orm/overview/introduction/user-table.svg" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/rest.md", - "destination": "/docs/orm/overview/prisma-in-your-stack/rest.md" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/graphql.md", - "destination": "/docs/orm/overview/prisma-in-your-stack/graphql.md" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/fullstack", - "destination": "/docs/orm/overview/prisma-in-your-stack/fullstack" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/is-prisma-an-orm", - "destination": "/docs/orm/overview/prisma-in-your-stack/is-prisma-an-orm" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack", - "destination": "/docs/orm/overview/prisma-in-your-stack" - }, - { - "source": "/docs/concepts/overview", - "destination": "/docs/orm/overview" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/generating-prisma-client", - "destination": "/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/instantiate-prisma-client", - "destination": "/docs/orm/prisma-client/setup-and-configuration/instantiate-prisma-client" - }, - { - "source": "/docs/concepts/components/prisma-client/read-replicas", - "destination": "/docs/orm/prisma-client/setup-and-configuration/read-replicas" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/use-custom-model-and-field-names", - "destination": "/docs/orm/prisma-client/setup-and-configuration/custom-model-and-field-names" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/logging", - "destination": "/docs/orm/prisma-client/observability-and-logging/logging" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/error-formatting", - "destination": "/docs/orm/prisma-client/setup-and-configuration/error-formatting" - }, - { - "source": "/docs/concepts/components/prisma-client/database-polyfills", - "destination": "/docs/orm/prisma-client/setup-and-configuration/database-polyfills" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/connection-management", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections/connection-management" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/connection-pool", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections/connection-pool" - }, - { - "source": "/docs/guides/performance-and-optimization/connection-management/configure-for-external-connection-pooler", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections/pgbouncer" - }, - { - "source": "/docs/guides/performance-and-optimization/connection-management", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections" - }, - { - "source": "/docs/guides/performance-and-optimization/connection-management/serverless-connections-2.png", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections/serverless-connections-2.png" - }, - { - "source": "/docs/guides/performance-and-optimization/connection-management/serverless-connections.png", - "destination": "/docs/orm/prisma-client/setup-and-configuration/databases-connections/serverless-connections.png" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/prisma-client-generation-workflow.png", - "destination": "/docs/orm/prisma-client/setup-and-configuration/prisma-client-generation-workflow.png" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-prismaclient/prisma-client-node-module.png", - "destination": "/docs/orm/prisma-client/setup-and-configuration/prisma-client-node-module.png" - }, - { - "source": "/docs/concepts/components/prisma-client/crud", - "destination": "/docs/orm/prisma-client/queries/crud" - }, - { - "source": "/docs/concepts/components/prisma-client/select-fields", - "destination": "/docs/orm/prisma-client/queries/select-fields" - }, - { - "source": "/docs/concepts/components/prisma-client/relation-queries", - "destination": "/docs/orm/prisma-client/queries/relation-queries" - }, - { - "source": "/docs/concepts/components/prisma-client/filtering-and-sorting", - "destination": "/docs/orm/prisma-client/queries/filtering-and-sorting" - }, - { - "source": "/docs/concepts/components/prisma-client/pagination", - "destination": "/docs/orm/prisma-client/queries/pagination" - }, - { - "source": "/docs/concepts/components/prisma-client/aggregation-grouping-summarizing", - "destination": "/docs/orm/prisma-client/queries/aggregation-grouping-summarizing" - }, - { - "source": "/docs/guides/performance-and-optimization/prisma-client-transactions-guide", - "destination": "/docs/orm/prisma-client/queries/transactions" - }, - { - "source": "/docs/concepts/components/prisma-client/full-text-search", - "destination": "/docs/orm/prisma-client/queries/full-text-search" - }, - { - "source": "/docs/concepts/components/prisma-client/custom-validation", - "destination": "/docs/orm/prisma-client/queries/custom-validation" - }, - { - "source": "/docs/concepts/components/prisma-client/computed-fields", - "destination": "/docs/orm/prisma-client/queries/computed-fields" - }, - { - "source": "/docs/concepts/components/prisma-client/excluding-fields", - "destination": "/docs/orm/prisma-client/queries/excluding-fields" - }, - { - "source": "/docs/concepts/components/prisma-client/custom-models", - "destination": "/docs/orm/prisma-client/queries/custom-models" - }, - { - "source": "/docs/concepts/components/prisma-client/case-sensitivity", - "destination": "/docs/orm/prisma-client/queries/case-sensitivity" - }, - { - "source": "/docs/concepts/components/prisma-client/raw-database-access", - "destination": "/docs/orm/prisma-client/queries/raw-database-access/raw-queries" - }, - { - "source": "/docs/guides/other/advanced-database-tasks/typesafe-raw-sql/safeql", - "destination": "/docs/orm/prisma-client/queries/raw-database-access/custom-and-type-safe-queries" - }, - { - "source": "/docs/guides/performance-and-optimization/query-optimization-performance", - "destination": "/docs/orm/prisma-client/queries/query-optimization-performance" - }, - { - "source": "/docs/concepts/components/prisma-client/composite-types", - "destination": "/docs/orm/prisma-client/special-fields-and-types/composite-types" - }, - { - "source": "/docs/concepts/components/prisma-client/null-and-undefined", - "destination": "/docs/orm/prisma-client/special-fields-and-types/null-and-undefined" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields", - "destination": "/docs/orm/prisma-client/special-fields-and-types/working-with-json-fields" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-fields/working-with-scalar-lists-arrays", - "destination": "/docs/orm/prisma-client/special-fields-and-types/working-with-scalar-lists-arrays" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-fields/working-with-composite-ids-and-constraints", - "destination": "/docs/orm/prisma-client/special-fields-and-types/working-with-composite-ids-and-constraints" - }, - { - "source": "/docs/concepts/components/prisma-client/working-with-fields", - "destination": "/docs/orm/prisma-client/special-fields-and-types" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/model", - "destination": "/docs/orm/prisma-client/client-extensions/model" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/client", - "destination": "/docs/orm/prisma-client/client-extensions/client" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/query", - "destination": "/docs/orm/prisma-client/client-extensions/query" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/result", - "destination": "/docs/orm/prisma-client/client-extensions/result" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/shared-extensions", - "destination": "/docs/orm/prisma-client/client-extensions/shared-extensions" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/type-utilities", - "destination": "/docs/orm/prisma-client/client-extensions/type-utilities" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions/extension-examples", - "destination": "/docs/orm/prisma-client/client-extensions/extension-examples" - }, - { - "source": "/docs/concepts/components/prisma-client/middleware/soft-delete-middleware", - "destination": "/docs/orm/prisma-client/client-extensions/middleware/soft-delete-middleware" - }, - { - "source": "/docs/concepts/components/prisma-client/middleware/logging-middleware", - "destination": "/docs/orm/prisma-client/client-extensions/middleware/logging-middleware" - }, - { - "source": "/docs/concepts/components/prisma-client/middleware/session-data-middleware", - "destination": "/docs/orm/prisma-client/client-extensions/middleware/session-data-middleware" - }, - { - "source": "/docs/concepts/components/prisma-client/middleware", - "destination": "/docs/orm/prisma-client/client-extensions/middleware" - }, - { - "source": "/docs/concepts/components/prisma-client/client-extensions", - "destination": "/docs/orm/prisma-client/client-extensions" - }, - { - "source": "/docs/concepts/components/prisma-client/advanced-type-safety/operating-against-partial-structures-of-model-types", - "destination": "/docs/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types" - }, - { - "source": "/docs/guides/other/prisma-type-system", - "destination": "/docs/orm/prisma-client/type-safety/prisma-type-system" - }, - { - "source": "/docs/concepts/components/prisma-client/advanced-type-safety/prisma-validator", - "destination": "/docs/orm/prisma-client/type-safety/prisma-validator" - }, - { - "source": "/docs/concepts/components/prisma-client/advanced-type-safety", - "destination": "/docs/orm/prisma-client/type-safety" - }, - { - "source": "/docs/guides/testing/unit-testing", - "destination": "/docs/orm/prisma-client/testing/unit-testing" - }, - { - "source": "/docs/guides/testing/integration-testing", - "destination": "/docs/orm/prisma-client/testing/integration-testing" - }, - { - "source": "/docs/guides/testing/Docker_Diagram_V1.png", - "destination": "/docs/orm/prisma-client/testing/Docker_Diagram_V1.png" - }, - { - "source": "/docs/guides/testing", - "destination": "/docs/orm/prisma-client/testing" - }, - { - "source": "/docs/guides/deployment/deploy-prisma", - "destination": "/docs/orm/prisma-client/deployment/deploy-prisma" - }, - { - "source": "/docs/guides/deployment/traditional/deploy-to-heroku", - "destination": "/docs/orm/prisma-client/deployment/traditional/deploy-to-heroku" - }, - { - "source": "/docs/guides/deployment/traditional/deploy-to-koyeb", - "destination": "/docs/orm/prisma-client/deployment/traditional/deploy-to-koyeb" - }, - { - "source": "/docs/guides/deployment/traditional/images/heroku-architecture.png", - "destination": "/docs/orm/prisma-client/deployment/traditional/images/heroku-architecture.png" - }, - { - "source": "/docs/guides/deployment/traditional/images/heroku-deployed.png", - "destination": "/docs/orm/prisma-client/deployment/traditional/images/heroku-deployed.png" - }, - { - "source": "/docs/guides/deployment/traditional/images/koyeb-app-creation.png", - "destination": "/docs/orm/prisma-client/deployment/traditional/images/koyeb-app-creation.png" - }, - { - "source": "/docs/guides/deployment/traditional/images/koyeb-architecture.png", - "destination": "/docs/orm/prisma-client/deployment/traditional/images/koyeb-architecture.png" - }, - { - "source": "/docs/guides/deployment/traditional/images/koyeb-deployed.png", - "destination": "/docs/orm/prisma-client/deployment/traditional/images/koyeb-deployed.png" - }, - { - "source": "/docs/guides/deployment/traditional", - "destination": "/docs/orm/prisma-client/deployment/traditional" - }, - { - "source": "/docs/guides/deployment/serverless/deploy-to-azure-functions", - "destination": "/docs/orm/prisma-client/deployment/serverless/deploy-to-azure-functions" - }, - { - "source": "/docs/guides/deployment/serverless/deploy-to-vercel", - "destination": "/docs/orm/prisma-client/deployment/serverless/deploy-to-vercel" - }, - { - "source": "/docs/guides/deployment/serverless/deploy-to-aws-lambda", - "destination": "/docs/orm/prisma-client/deployment/serverless/deploy-to-aws-lambda" - }, - { - "source": "/docs/guides/deployment/serverless/deploy-to-netlify", - "destination": "/docs/orm/prisma-client/deployment/serverless/deploy-to-netlify" - }, - { - "source": "/docs/guides/deployment/serverless/images/00-deploy-to-vercel-architecture.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/00-deploy-to-vercel-architecture.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/10-deploy-to-vercel-deploy-button.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/10-deploy-to-vercel-deploy-button.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/10-deploy-to-vercel-deploy-button.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/10-deploy-to-vercel-deploy-button.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/20-deploy-to-vercel-select-github.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/20-deploy-to-vercel-select-github.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/20-deploy-to-vercel-select-github.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/20-deploy-to-vercel-select-github.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/30-deploy-to-vercel-create-git-repo.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/30-deploy-to-vercel-create-git-repo.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/30-deploy-to-vercel-create-git-repo.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/30-deploy-to-vercel-create-git-repo.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/40-deploy-to-vercel-configure-project.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/40-deploy-to-vercel-configure-project.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/40-deploy-to-vercel-configure-project.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/40-deploy-to-vercel-configure-project.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/50-deploy-to-vercel-success.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/50-deploy-to-vercel-success.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/50-deploy-to-vercel-success.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/50-deploy-to-vercel-success.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/60-deploy-to-vercel-preview-environment-variable.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/60-deploy-to-vercel-preview-environment-variable.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/60-deploy-to-vercel-preview-environment-variable.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/60-deploy-to-vercel-preview-environment-variable.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/70-deploy-to-vercel-environment-variables.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/70-deploy-to-vercel-environment-variables.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/70-deploy-to-vercel-environment-variables.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/70-deploy-to-vercel-environment-variables.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/01-deploy-to-netlify-architecture.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/01-deploy-to-netlify-architecture.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/02-deploy-to-netlify-example-repo-click-fork.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/02-deploy-to-netlify-example-repo-click-fork.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/02-deploy-to-netlify-example-repo-click-fork.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/02-deploy-to-netlify-example-repo-click-fork.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/03-deploy-to-netlify-example-repo-create-fork-page.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/03-deploy-to-netlify-example-repo-create-fork-page.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/03-deploy-to-netlify-example-repo-create-fork-page.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/03-deploy-to-netlify-example-repo-create-fork-page.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/04-deploy-to-netlify-copy-supabase-connection-string.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/04-deploy-to-netlify-copy-supabase-connection-string.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/04-deploy-to-netlify-copy-supabase-connection-string.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/04-deploy-to-netlify-copy-supabase-connection-string.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/05-deploy-to-netlify-netlify-init-configure-site.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/05-deploy-to-netlify-netlify-init-configure-site.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/05-deploy-to-netlify-netlify-init-configure-site.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/05-deploy-to-netlify-netlify-init-configure-site.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/06-deploy-to-netlify-site-settings.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/06-deploy-to-netlify-site-settings.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/06-deploy-to-netlify-site-settings.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/06-deploy-to-netlify-site-settings.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/07-deploy-to-netlify-environment-variables-settings.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/07-deploy-to-netlify-environment-variables-settings.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/07-deploy-to-netlify-environment-variables-settings.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/07-deploy-to-netlify-environment-variables-settings.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/08-deploy-to-netlify-application-deployed.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/08-deploy-to-netlify-application-deployed.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/08-deploy-to-netlify-application-deployed.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/08-deploy-to-netlify-application-deployed.snagx" - }, - { - "source": "/docs/guides/deployment/serverless/images/09-deploy-to-netlify-application-deployed-call-result.png", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/09-deploy-to-netlify-application-deployed-call-result.png" - }, - { - "source": "/docs/guides/deployment/serverless/images/09-deploy-to-netlify-application-deployed-call-result.snagx", - "destination": "/docs/orm/prisma-client/deployment/serverless/images/09-deploy-to-netlify-application-deployed-call-result.snagx" - }, - { - "source": "/docs/guides/deployment/serverless", - "destination": "/docs/orm/prisma-client/deployment/serverless" - }, - { - "source": "/docs/concepts/components/prisma-client/module-bundlers", - "destination": "/docs/orm/prisma-client/deployment/module-bundlers" - }, - { - "source": "/docs/guides/deployment/edge/deploy-to-cloudflare-workers", - "destination": "/docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare-workers" - }, - { - "source": "/docs/guides/deployment/edge/deploy-to-deno-deploy", - "destination": "/docs/orm/prisma-client/deployment/edge/deploy-to-deno-deploy" - }, - { - "source": "/docs/guides/deployment/edge/images/03-import-project.png", - "destination": "/docs/orm/prisma-client/deployment/edge/images/03-import-project.png" - }, - { - "source": "/docs/guides/deployment/edge/images/03-import-project.snagx", - "destination": "/docs/orm/prisma-client/deployment/edge/images/03-import-project.snagx" - }, - { - "source": "/docs/guides/deployment/edge/images/04-connect-db.png", - "destination": "/docs/orm/prisma-client/deployment/edge/images/04-connect-db.png" - }, - { - "source": "/docs/guides/deployment/edge/images/04-connect-db.snagx", - "destination": "/docs/orm/prisma-client/deployment/edge/images/04-connect-db.snagx" - }, - { - "source": "/docs/guides/deployment/edge/images/05-data-proxy.png", - "destination": "/docs/orm/prisma-client/deployment/edge/images/05-data-proxy.png" - }, - { - "source": "/docs/guides/deployment/edge/images/05-data-proxy.snagx", - "destination": "/docs/orm/prisma-client/deployment/edge/images/05-data-proxy.snagx" - }, - { - "source": "/docs/guides/deployment/edge/images/01-create-repo.png", - "destination": "/docs/orm/prisma-client/deployment/edge/images/01-create-repo.png" - }, - { - "source": "/docs/guides/deployment/edge/images/02-deploy-to-deno-project-parameters.png", - "destination": "/docs/orm/prisma-client/deployment/edge/images/02-deploy-to-deno-project-parameters.png" - }, - { - "source": "/docs/guides/deployment/edge/images/02-deploy-to-deno-project-parameters.snagx", - "destination": "/docs/orm/prisma-client/deployment/edge/images/02-deploy-to-deno-project-parameters.snagx" - }, - { - "source": "/docs/guides/deployment/edge", - "destination": "/docs/orm/prisma-client/deployment/edge" - }, - { - "source": "/docs/guides/deployment/deploy-database-changes-with-prisma-migrate", - "destination": "/docs/orm/prisma-client/deployment/deploy-database-changes-with-prisma-migrate" - }, - { - "source": "/docs/guides/deployment/deploy-migrations-from-a-local-environment", - "destination": "/docs/orm/prisma-client/deployment/deploy-migrations-from-a-local-environment" - }, - { - "source": "/docs/guides/deployment/caveats-when-deploying-to-aws-platforms", - "destination": "/docs/orm/prisma-client/deployment/caveats-when-deploying-to-aws-platforms" - }, - { - "source": "/docs/guides/deployment/deploy-to-a-different-os", - "destination": "/docs/orm/prisma-client/deployment/deploy-to-a-different-os" - }, - { - "source": "/docs/guides/deployment", - "destination": "/docs/orm/prisma-client/deployment" - }, - { - "source": "/docs/concepts/components/prisma-client/metrics", - "destination": "/docs/orm/prisma-client/observability-and-logging/metrics" - }, - { - "source": "/docs/concepts/components/prisma-client/opentelemetry-tracing", - "destination": "/docs/orm/prisma-client/observability-and-logging/opentelemetry-tracing" - }, - { - "source": "/docs/concepts/components/prisma-client/jaeger.png", - "destination": "/docs/orm/prisma-client/observability-and-logging/jaeger.png" - }, - { - "source": "/docs/concepts/components/prisma-client/trace-diagram.png", - "destination": "/docs/orm/prisma-client/observability-and-logging/trace-diagram.png" - }, - { - "source": "/docs/concepts/components/prisma-client/debugging", - "destination": "/docs/orm/prisma-client/debugging-and-troubleshooting/debugging" - }, - { - "source": "/docs/concepts/components/prisma-client/handling-exceptions-and-errors", - "destination": "/docs/orm/prisma-client/debugging-and-troubleshooting/handling-exceptions-and-errors" - }, - { - "source": "/docs/concepts/components/prisma-client", - "destination": "/docs/orm/prisma-client" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/add-prisma-migrate-to-a-project", - "destination": "/docs/orm/prisma-migrate/getting-started" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model" - }, - { - "source": "/docs/concepts/components/prisma-migrate/migration-histories", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/migration-histories" - }, - { - "source": "/docs/concepts/components/prisma-migrate/shadow-database", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/shadow-database" - }, - { - "source": "/docs/concepts/components/prisma-migrate/prisma-migrate-limitations-issues", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/limitations-and-known-issues" - }, - { - "source": "/docs/concepts/components/prisma-migrate/legacy-migrate", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/legacy-migrate" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/database-first-migration-flow.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/database-first-migration-flow.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/db-push-flow.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/db-push-flow.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/entity-first-migration-flow.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/entity-first-migration-flow.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/prisma-migrate-dev-flow.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/prisma-migrate-dev-flow.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/prisma-migrate-diff-flow.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/prisma-migrate-diff-flow.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/prisma-migrate-lifecycle.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/prisma-migrate-lifecycle.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/mental-model-illustrations/prisma-migrate-state-mgt.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/mental-model-illustrations/prisma-migrate-state-mgt.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/migrate-mapping.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/migrate-mapping.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/shadow-database.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/shadow-database.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate/shadow-db.png", - "destination": "/docs/orm/prisma-migrate/understanding-prisma-migrate/shadow-db.png" - }, - { - "source": "/docs/guides/migrate/seed-database", - "destination": "/docs/orm/prisma-migrate/workflows/seeding" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/team-development", - "destination": "/docs/orm/prisma-migrate/workflows/team-development" - }, - { - "source": "/docs/concepts/components/prisma-migrate/supported-types-and-db-features", - "destination": "/docs/orm/prisma-migrate/workflows/native-database-types" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/enable-native-database-functions", - "destination": "/docs/orm/prisma-migrate/workflows/native-database-functions" - }, - { - "source": "/docs/guides/migrate/prototyping-schema-db-push", - "destination": "/docs/orm/prisma-migrate/workflows/prototyping-your-schema" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/troubleshooting-development", - "destination": "/docs/orm/prisma-migrate/workflows/troubleshooting" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/baselining", - "destination": "/docs/orm/prisma-migrate/workflows/baselining" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/customizing-migrations", - "destination": "/docs/orm/prisma-migrate/workflows/customizing-migrations" - }, - { - "source": "/docs/guides/migrate/data-migration", - "destination": "/docs/orm/prisma-migrate/workflows/data-migration" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/squashing-migrations", - "destination": "/docs/orm/prisma-migrate/workflows/squashing-migrations" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/generating-down-migrations", - "destination": "/docs/orm/prisma-migrate/workflows/generating-down-migrations" - }, - { - "source": "/docs/guides/migrate/production-troubleshooting", - "destination": "/docs/orm/prisma-migrate/workflows/patching-and-hotfixing" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/include-unsupported-database-features", - "destination": "/docs/orm/prisma-migrate/workflows/unsupported-database-features" - }, - { - "source": "/docs/concepts/components/prisma-migrate/migrate-development-production", - "destination": "/docs/orm/prisma-migrate/workflows/development-and-production" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/deploy-db.png", - "destination": "/docs/orm/prisma-migrate/workflows/deploy-db.png" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/existing-database.png", - "destination": "/docs/orm/prisma-migrate/workflows/existing-database.png" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/migrate-team-dev.png", - "destination": "/docs/orm/prisma-migrate/workflows/migrate-team-dev.png" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/migration-history.png", - "destination": "/docs/orm/prisma-migrate/workflows/migration-history.png" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate/new-dev-db.png", - "destination": "/docs/orm/prisma-migrate/workflows/new-dev-db.png" - }, - { - "source": "/docs/concepts/components/prisma-migrate", - "destination": "/docs/orm/prisma-migrate" - }, - { - "source": "/docs/concepts/components/prisma-schema/data-sources", - "destination": "/docs/orm/prisma-schema/overview/data-sources" - }, - { - "source": "/docs/concepts/components/prisma-schema/generators", - "destination": "/docs/orm/prisma-schema/overview/generators" - }, - { - "source": "/docs/concepts/components/prisma-schema/data-model", - "destination": "/docs/orm/prisma-schema/data-model/models" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/one-to-one-relations", - "destination": "/docs/orm/prisma-schema/data-model/relations/one-to-one-relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/one-to-many-relations", - "destination": "/docs/orm/prisma-schema/data-model/relations/one-to-many-relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/many-to-many-relations", - "destination": "/docs/orm/prisma-schema/data-model/relations/many-to-many-relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/self-relations", - "destination": "/docs/orm/prisma-schema/data-model/relations/self-relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/referential-actions/special-rules-for-referential-actions", - "destination": "/docs/orm/prisma-schema/data-model/relations/referential-actions/special-rules-for-referential-actions" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/referential-actions", - "destination": "/docs/orm/prisma-schema/data-model/relations/referential-actions" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/relation-mode", - "destination": "/docs/orm/prisma-schema/data-model/relations/relation-mode" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/troubleshooting-relations", - "destination": "/docs/orm/prisma-schema/data-model/relations/troubleshooting-relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations", - "destination": "/docs/orm/prisma-schema/data-model/relations" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/one-to-many.png", - "destination": "/docs/orm/prisma-schema/data-model/relations/one-to-many.png" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/quick-fix-index.png", - "destination": "/docs/orm/prisma-schema/data-model/relations/quick-fix-index.png" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/quick-fix-index.snagx", - "destination": "/docs/orm/prisma-schema/data-model/relations/quick-fix-index.snagx" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/relations-intro.png", - "destination": "/docs/orm/prisma-schema/data-model/relations/relations-intro.png" - }, - { - "source": "/docs/concepts/components/prisma-schema/relations/sample-schema.png", - "destination": "/docs/orm/prisma-schema/data-model/relations/sample-schema.png" - }, - { - "source": "/docs/concepts/components/prisma-schema/indexes", - "destination": "/docs/orm/prisma-schema/data-model/indexes" - }, - { - "source": "/docs/concepts/components/prisma-schema/views", - "destination": "/docs/orm/prisma-schema/data-model/views" - }, - { - "source": "/docs/concepts/components/prisma-schema/names-in-underlying-database", - "destination": "/docs/orm/prisma-schema/data-model/database-mapping" - }, - { - "source": "/docs/guides/other/multi-schema", - "destination": "/docs/orm/prisma-schema/data-model/multi-schema" - }, - { - "source": "/docs/concepts/components/prisma-schema/features-without-psl-equivalent", - "destination": "/docs/orm/prisma-schema/data-model/unsupported-database-features" - }, - { - "source": "/docs/concepts/components/introspection", - "destination": "/docs/orm/prisma-schema/introspection" - }, - { - "source": "/docs/concepts/components/prisma-schema/postgresql-extensions", - "destination": "/docs/orm/prisma-schema/postgresql-extensions" - }, - { - "source": "/docs/concepts/components/prisma-schema/prisma-schema/relations-intro.png", - "destination": "/docs/orm/prisma-schema/prisma-schema/relations-intro.png" - }, - { - "source": "/docs/concepts/components/prisma-schema/prisma-schema/sample-database.png", - "destination": "/docs/orm/prisma-schema/prisma-schema/sample-database.png" - }, - { - "source": "/docs/concepts/components/prisma-studio", - "destination": "/docs/orm/tools/prisma-studio" - }, - { - "source": "/docs/concepts/components/images/drivers/qe-query-engine-adapter.png", - "destination": "/docs/orm/tools/images/drivers/qe-query-engine-adapter.png" - }, - { - "source": "/docs/concepts/components/images/drivers/qe-query-execution-flow.png", - "destination": "/docs/orm/tools/images/drivers/qe-query-execution-flow.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/models-view.png", - "destination": "/docs/orm/tools/images/prisma-studio/models-view.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/open-close-models.png", - "destination": "/docs/orm/tools/images/prisma-studio/open-close-models.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/model-view-keyboard-shortcuts.png", - "destination": "/docs/orm/tools/images/prisma-studio/model-view-keyboard-shortcuts.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/save-multiple-changes.png", - "destination": "/docs/orm/tools/images/prisma-studio/save-multiple-changes.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/add-remove-filters.png", - "destination": "/docs/orm/tools/images/prisma-studio/add-remove-filters.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/show-hide-fields.png", - "destination": "/docs/orm/tools/images/prisma-studio/show-hide-fields.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/show-hide-records.png", - "destination": "/docs/orm/tools/images/prisma-studio/show-hide-records.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/model-sort.png", - "destination": "/docs/orm/tools/images/prisma-studio/model-sort.png" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/array.svg", - "destination": "/docs/orm/tools/images/prisma-studio/array.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/boolean.svg", - "destination": "/docs/orm/tools/images/prisma-studio/boolean.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/database.svg", - "destination": "/docs/orm/tools/images/prisma-studio/database.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/datetime.svg", - "destination": "/docs/orm/tools/images/prisma-studio/datetime.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/enum.svg", - "destination": "/docs/orm/tools/images/prisma-studio/enum.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/number.svg", - "destination": "/docs/orm/tools/images/prisma-studio/number.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/object.svg", - "destination": "/docs/orm/tools/images/prisma-studio/object.svg" - }, - { - "source": "/docs/concepts/components/images/prisma-studio/string.svg", - "destination": "/docs/orm/tools/images/prisma-studio/string.svg" - }, - { - "source": "/docs/concepts/components", - "destination": "/docs/orm/tools" - }, - { - "source": "/docs/reference/api-reference/prisma-client-reference", - "destination": "/docs/orm/reference/prisma-client-reference" - }, - { - "source": "/docs/reference/api-reference/prisma-schema-reference", - "destination": "/docs/orm/reference/prisma-schema-reference" - }, - { - "source": "/docs/reference/api-reference/command-reference", - "destination": "/docs/orm/reference/prisma-cli-reference" - }, - { - "source": "/docs/reference/api-reference/error-reference", - "destination": "/docs/orm/reference/error-reference" - }, - { - "source": "/docs/reference/api-reference/environment-variables-reference", - "destination": "/docs/orm/reference/environment-variables-reference" - }, - { - "source": "/docs/reference/database-reference/database-features", - "destination": "/docs/orm/reference/database-features" - }, - { - "source": "/docs/reference/database-reference/supported-databases", - "destination": "/docs/orm/reference/supported-databases" - }, - { - "source": "/docs/reference/database-reference/connection-urls", - "destination": "/docs/orm/reference/connection-urls" - }, - { - "source": "/docs/reference/system-requirements", - "destination": "/docs/orm/reference/system-requirements" - }, - { - "source": "/docs/concepts/components/preview-features/client-preview-features", - "destination": "/docs/orm/reference/preview-features/client-preview-features" - }, - { - "source": "/docs/concepts/components/preview-features/cli-preview-features", - "destination": "/docs/orm/reference/preview-features/cli-preview-features" - }, - { - "source": "/docs/concepts/components/preview-features", - "destination": "/docs/orm/reference/preview-features" - }, - { - "source": "/docs/reference", - "destination": "/docs/orm/reference" - }, - { - "source": "/docs/concepts/components/prisma-engines/query-engine", - "destination": "/docs/orm/more/under-the-hood/engines" - }, - { - "source": "/docs/concepts/components/prisma-engines/query-engine-node-js-at-runtime.png", - "destination": "/docs/orm/more/under-the-hood/query-engine-node-js-at-runtime.png" - }, - { - "source": "/docs/concepts/components/prisma-engines/typical-flow-query-engine-at-runtime.png", - "destination": "/docs/orm/more/under-the-hood/typical-flow-query-engine-at-runtime.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/rejectonnotfound-changes" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5/jsonprotocol-changes" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-5", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-5" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-4", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-4" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/named-constraints" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3/referential-actions" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/upgrading-to-prisma-3", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-3" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions/codemods", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions/codemods" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-versions", - "destination": "/docs/orm/more/upgrade-guides/upgrading-versions" - }, - { - "source": "/docs/guides/upgrade-guides/upgrading-to-use-preview-features", - "destination": "/docs/orm/more/upgrade-guides/upgrading-to-use-preview-features" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/how-to-upgrade" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-nexus-prisma-to-nexus" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-nexus" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-prisma-binding-to-sdl-first" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-a-rest-api" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrade-from-mongodb-beta", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrade-from-mongodb-beta" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/TablePlus-GUI.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/TablePlus-GUI.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/add-missing-default-constraints-to-columns.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/add-missing-default-constraints-to-columns.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/altering-columns-to-use-enum.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/altering-columns-to-use-enum.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/download-graphql-schema.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/download-graphql-schema.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/expose-prisma-model-fields-with-t-model.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/expose-prisma-model-fields-with-t-model.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/fix-columns-with-json-data-types.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/fix-columns-with-json-data-types.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/fix-incorrect-m-n-relations-sql.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/fix-incorrect-m-n-relations-sql.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/fix-schema-incompatibilities.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/fix-schema-incompatibilities.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/prisma-cli-introspection-flow.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/prisma-cli-introspection-flow.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/regenerate-resolvers-with-t-crud.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/regenerate-resolvers-with-t-crud.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/run-sql-command-to-alter-column.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/run-sql-command-to-alter-column.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/images/use-t-crud-to-generate-resolvers.png", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/images/use-t-crud-to-generate-resolvers.png" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1" - }, - { - "source": "/docs/concepts/more/comparisons/prisma-and-typeorm", - "destination": "/docs/orm/more/comparisons/prisma-and-typeorm" - }, - { - "source": "/docs/concepts/more/comparisons/prisma-and-sequelize", - "destination": "/docs/orm/more/comparisons/prisma-and-sequelize" - }, - { - "source": "/docs/concepts/more/comparisons/prisma-and-mongoose", - "destination": "/docs/orm/more/comparisons/prisma-and-mongoose" - }, - { - "source": "/docs/concepts/more/comparisons/prisma-and-drizzle", - "destination": "/docs/orm/more/comparisons/prisma-and-drizzle" - }, - { - "source": "/docs/concepts/more/comparisons", - "destination": "/docs/orm/more/comparisons" - }, - { - "source": "/docs/guides/migrate-to-prisma/migrate-from-typeorm", - "destination": "/docs/orm/more/migrating-to-prisma/migrate-from-typeorm" - }, - { - "source": "/docs/guides/migrate-to-prisma/migrate-from-sequelize", - "destination": "/docs/orm/more/migrating-to-prisma/migrate-from-sequelize" - }, - { - "source": "/docs/guides/migrate-to-prisma/migrate-from-mongoose", - "destination": "/docs/orm/more/migrating-to-prisma/migrate-from-mongoose" - }, - { - "source": "/docs/guides/migrate-to-prisma", - "destination": "/docs/orm/more/migrating-to-prisma" - }, - { - "source": "/docs/guides/development-environment/environment-variables/env-files", - "destination": "/docs/orm/more/development-environment/environment-variables/env-files" - }, - { - "source": "/docs/guides/development-environment/environment-variables/managing-env-files-and-setting-variables", - "destination": "/docs/orm/more/development-environment/environment-variables/managing-env-files-and-setting-variables" - }, - { - "source": "/docs/guides/development-environment/environment-variables/using-multiple-env-files", - "destination": "/docs/orm/more/development-environment/environment-variables/using-multiple-env-files" - }, - { - "source": "/docs/guides/development-environment/environment-variables", - "destination": "/docs/orm/more/development-environment/environment-variables" - }, - { - "source": "/docs/guides/development-environment/editor-setup", - "destination": "/docs/orm/more/development-environment/editor-setup" - }, - { - "source": "/docs/guides/development-environment", - "destination": "/docs/orm/more/development-environment" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/creating-bug-reports", - "destination": "/docs/orm/more/help-and-troubleshooting/creating-bug-reports" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/autocompletion-in-graphql-resolvers-with-js", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/autocompletion-in-graphql-resolvers-with-js" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/working-with-many-to-many-relations", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/working-with-many-to-many-relations" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-dev-practices" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-monorepo", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-monorepo" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/pkg-issue", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/pkg-issue" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/comparing-columns-through-raw-queries", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/comparing-columns-through-raw-queries" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/vercel-caching-issue", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/vercel-caching-issue" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/netlify-caching-issue", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/netlify-caching-issue" - }, - { - "source": "/docs/guides/other/advanced-database-tasks/data-validation/postgresql", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/check-constraints" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/netlify-build-command-filled.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/netlify-build-command-filled.png" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/netlify-edit-settings.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/netlify-edit-settings.png" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/prisma-autocompletion-in-js.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/prisma-autocompletion-in-js.png" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/unwanted-autocomplete-values-in-vscode.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/unwanted-autocomplete-values-in-vscode.png" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/vercel-ui-build-command-filled.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/vercel-ui-build-command-filled.png" - }, - { - "source": "/docs/guides/other/troubleshooting-orm/help-articles/vercel-ui-build-command.png", - "destination": "/docs/orm/more/help-and-troubleshooting/help-articles/vercel-ui-build-command.png" - }, - { - "source": "/docs/about/prisma/releases", - "destination": "/docs/orm/more/releases" - }, - { - "source": "/docs/data-platform/accelerate/what-is-accelerate", - "destination": "/docs/accelerate/what-is-accelerate" - }, - { - "source": "/docs/data-platform/accelerate/getting-started", - "destination": "/docs/accelerate/getting-started" - }, - { - "source": "/docs/data-platform/accelerate/concepts", - "destination": "/docs/accelerate/concepts" - }, - { - "source": "/docs/data-platform/accelerate/api-reference", - "destination": "/docs/accelerate/api-reference" - }, - { - "source": "/docs/data-platform/accelerate/limitations", - "destination": "/docs/accelerate/limitations" - }, - { - "source": "/docs/data-platform/accelerate/evaluating", - "destination": "/docs/accelerate/evaluating" - }, - { - "source": "/docs/data-platform/accelerate/faq", - "destination": "/docs/accelerate/faq" - }, - { - "source": "/docs/data-platform/accelerate/feedback", - "destination": "/docs/accelerate/feedback" - }, - { - "source": "/docs/data-platform/accelerate/images/accelerate-update-database-connection-string.png", - "destination": "/docs/accelerate/images/accelerate-update-database-connection-string.png" - }, - { - "source": "/docs/data-platform/accelerate/images/accelerate.png", - "destination": "/docs/accelerate/images/accelerate.png" - }, - { - "source": "/docs/data-platform/accelerate/images/no-cache.png", - "destination": "/docs/accelerate/images/no-cache.png" - }, - { - "source": "/docs/data-platform/accelerate/images/speed-test.png", - "destination": "/docs/accelerate/images/speed-test.png" - }, - { - "source": "/docs/data-platform/accelerate/images/swr.png", - "destination": "/docs/accelerate/images/swr.png" - }, - { - "source": "/docs/data-platform/accelerate/images/ttl.png", - "destination": "/docs/accelerate/images/ttl.png" - }, - { - "source": "/docs/data-platform/accelerate/images/ttl_and_swr.png", - "destination": "/docs/accelerate/images/ttl_and_swr.png" - }, - { - "source": "/docs/guides/migrate/developing-with-prisma-migrate", - "destination": "/docs/orm/prisma-migrate" - }, - { - "source": "/docs/guides/migrate/patching-production", - "destination": "/docs/orm/prisma-migrate/workflows/patching-and-hotfixing" - }, - { - "source": "/docs/guides/migrate", - "destination": "/docs/orm/prisma-migrate" - }, - { - "source": "/docs/guides/database", - "destination": "/docs/orm/overview/databases" - }, - { - "source": "/docs/guides/performance-and-optimization/metrics", - "destination": "/docs/orm/prisma-client/observability-and-logging/metrics" - }, - { - "source": "/docs/guides/performance-and-optimization/query-tracing", - "destination": "/docs/orm/prisma-client/observability-and-logging/opentelemetry-tracing" - }, - { - "source": "/docs/guides/performance-and-optimization", - "destination": "/docs/orm/prisma-client/queries/query-optimization-performance" - }, - { - "source": "/docs/guides/upgrade-guides", - "destination": "/docs/orm/more/upgrade-guides" - }, - { - "source": "/docs/guides/other/troubleshooting-orm", - "destination": "/docs/orm/more/help-and-troubleshooting" - }, - { - "source": "/docs/guides/other/advanced-database-tasks/typesafe-raw-sql", - "destination": "/docs/orm/prisma-client/queries/raw-database-access/custom-and-type-safe-queries" - }, - { - "source": "/docs/guides/other/advanced-database-tasks/data-validation", - "destination": "/docs/orm/prisma-client/queries/custom-validation" - }, - { - "source": "/docs/guides/other/advanced-database-tasks", - "destination": "/docs/orm" - }, - { - "source": "/docs/guides/other", - "destination": "/docs/orm" - }, - { - "source": "/docs/guides", - "destination": "/docs/orm" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-postgresql" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-postgresql" - }, - { - "source": "/docs/data-platform/pulse/what-is-pulse", - "destination": "/docs/pulse/what-is-pulse" - }, - { - "source": "/docs/data-platform/pulse/getting-started", - "destination": "/docs/pulse/getting-started" - }, - { - "source": "/docs/data-platform/pulse/concepts", - "destination": "/docs/pulse/concepts" - }, - { - "source": "/docs/data-platform/pulse/api-reference", - "destination": "/docs/pulse/api-reference" - }, - { - "source": "/docs/data-platform/pulse/current-limitations", - "destination": "/docs/pulse/current-limitations" - }, - { - "source": "/docs/data-platform/pulse/faq", - "destination": "/docs/pulse/faq" - }, - { - "source": "/docs/data-platform/pulse/feedback", - "destination": "/docs/pulse/feedback" - }, - { - "source": "/docs/reference/api-reference", - "destination": "/docs/orm/reference" - }, - { - "source": "/docs/reference/database-reference", - "destination": "/docs/orm/reference" - }, - { - "source": "/docs/data-platform/platform-console/about", - "destination": "/docs/platform/platform-console/about" - }, - { - "source": "/docs/data-platform/platform-console/concepts/workspaces", - "destination": "/docs/platform/platform-console/concepts/workspaces" - }, - { - "source": "/docs/data-platform/platform-console/concepts/projects", - "destination": "/docs/platform/platform-console/concepts/projects" - }, - { - "source": "/docs/data-platform/platform-console/concepts", - "destination": "/docs/platform/platform-console/concepts" - }, - { - "source": "/docs/data-platform/platform-console/maturity-levels", - "destination": "/docs/platform/platform-console/maturity-levels" - }, - { - "source": "/docs/data-platform/platform-console/limits", - "destination": "/docs/platform/platform-console/limits" - }, - { - "source": "/docs/data-platform/platform-console/support", - "destination": "/docs/platform/platform-console/support" - }, - { - "source": "/docs/data-platform/platform-console", - "destination": "/docs/platform/platform-console" - }, - { - "source": "/docs/data-platform/classic-projects/data-proxy/use-data-proxy", - "destination": "/docs/platform/classic-projects/data-proxy/use-data-proxy" - }, - { - "source": "/docs/data-platform/classic-projects/data-proxy/deploy", - "destination": "/docs/platform/classic-projects/data-proxy/deploy" - }, - { - "source": "/docs/data-platform/classic-projects/data-proxy/prisma-cli-with-data-proxy", - "destination": "/docs/platform/classic-projects/data-proxy/prisma-cli-with-data-proxy" - }, - { - "source": "/docs/data-platform/classic-projects/data-proxy/considerations-limitations", - "destination": "/docs/platform/classic-projects/data-proxy/considerations-limitations" - }, - { - "source": "/docs/data-platform/classic-projects/data-proxy", - "destination": "/docs/platform/classic-projects/data-proxy" - }, - { - "source": "/docs/data-platform/classic-projects/platform/static-ips", - "destination": "/docs/platform/classic-projects/platform/static-ips" - }, - { - "source": "/docs/data-platform/classic-projects/platform/projects/create", - "destination": "/docs/platform/classic-projects/platform/projects/create" - }, - { - "source": "/docs/data-platform/classic-projects/platform/projects/edit-settings", - "destination": "/docs/platform/classic-projects/platform/projects/edit-settings" - }, - { - "source": "/docs/data-platform/classic-projects/platform/projects/delete-project", - "destination": "/docs/platform/classic-projects/platform/projects/delete-project" - }, - { - "source": "/docs/data-platform/classic-projects/platform/projects", - "destination": "/docs/platform/classic-projects/platform/projects" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/view-all", - "destination": "/docs/platform/classic-projects/platform/environments/view-all" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/create", - "destination": "/docs/platform/classic-projects/platform/environments/create" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle", - "destination": "/docs/platform/classic-projects/platform/environments/edit-settings/edit-name-and-url-handle" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/edit-settings/change-default-environment", - "destination": "/docs/platform/classic-projects/platform/environments/edit-settings/change-default-environment" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/edit-settings", - "destination": "/docs/platform/classic-projects/platform/environments/edit-settings" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments/delete", - "destination": "/docs/platform/classic-projects/platform/environments/delete" - }, - { - "source": "/docs/data-platform/classic-projects/platform/environments", - "destination": "/docs/platform/classic-projects/platform/environments" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/roles-permissions", - "destination": "/docs/platform/classic-projects/platform/members/roles-permissions" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/add", - "destination": "/docs/platform/classic-projects/platform/members/add" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/change-role", - "destination": "/docs/platform/classic-projects/platform/members/change-role" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/remove", - "destination": "/docs/platform/classic-projects/platform/members/remove" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/images/team-members-invite-and-select-role.png", - "destination": "/docs/platform/classic-projects/platform/members/images/team-members-invite-and-select-role.png" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members/images/team-members-invite-and-select-role.snagx", - "destination": "/docs/platform/classic-projects/platform/members/images/team-members-invite-and-select-role.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/platform/members", - "destination": "/docs/platform/classic-projects/platform/members" - }, - { - "source": "/docs/data-platform/classic-projects/platform/data-browser", - "destination": "/docs/platform/classic-projects/platform/data-browser" - }, - { - "source": "/docs/data-platform/classic-projects/platform/query-console", - "destination": "/docs/platform/classic-projects/platform/query-console" - }, - { - "source": "/docs/data-platform/classic-projects/platform/schema-viewer", - "destination": "/docs/platform/classic-projects/platform/schema-viewer" - }, - { - "source": "/docs/data-platform/classic-projects/platform/account", - "destination": "/docs/platform/classic-projects/platform/account" - }, - { - "source": "/docs/data-platform/classic-projects/platform/github-integration", - "destination": "/docs/platform/classic-projects/platform/github-integration" - }, - { - "source": "/docs/data-platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out", - "destination": "/docs/platform/classic-projects/platform/troubleshooting/connection-to-db-timed-out" - }, - { - "source": "/docs/data-platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env", - "destination": "/docs/platform/classic-projects/platform/troubleshooting/cannot-change-db-of-env" - }, - { - "source": "/docs/data-platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file", - "destination": "/docs/platform/classic-projects/platform/troubleshooting/cannot-edit-schema-file" - }, - { - "source": "/docs/data-platform/classic-projects/platform/troubleshooting/schema-file-does-not-update", - "destination": "/docs/platform/classic-projects/platform/troubleshooting/schema-file-does-not-update" - }, - { - "source": "/docs/data-platform/classic-projects/platform/troubleshooting", - "destination": "/docs/platform/classic-projects/platform/troubleshooting" - }, - { - "source": "/docs/data-platform/classic-projects/platform", - "destination": "/docs/platform/classic-projects/platform" - }, - { - "source": "/docs/data-platform/classic-projects/support", - "destination": "/docs/platform/classic-projects/support" - }, - { - "source": "/docs/data-platform/classic-projects/images/account/profile-menu-github-account.png", - "destination": "/docs/platform/classic-projects/images/account/profile-menu-github-account.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/account/profile-menu-github-account.snagx", - "destination": "/docs/platform/classic-projects/images/account/profile-menu-github-account.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/account/sign-up-01-create-first-project.png", - "destination": "/docs/platform/classic-projects/images/account/sign-up-01-create-first-project.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/account/sign-up-01-create-first-project.snagx", - "destination": "/docs/platform/classic-projects/images/account/sign-up-01-create-first-project.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/common/open-project-settings.png", - "destination": "/docs/platform/classic-projects/images/common/open-project-settings.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/common/open-project-settings.snagx", - "destination": "/docs/platform/classic-projects/images/common/open-project-settings.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/common/support-pop-up.png", - "destination": "/docs/platform/classic-projects/images/common/support-pop-up.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/common/support-pop-up.snagx", - "destination": "/docs/platform/classic-projects/images/common/support-pop-up.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/models-view.png", - "destination": "/docs/platform/classic-projects/images/data-browser/models-view.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/models-view.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/models-view.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/open-close-models.png", - "destination": "/docs/platform/classic-projects/images/data-browser/open-close-models.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/open-close-models.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/open-close-models.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/model-view-keyboard-shortcuts.png", - "destination": "/docs/platform/classic-projects/images/data-browser/model-view-keyboard-shortcuts.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/model-view-keyboard-shortcuts.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/model-view-keyboard-shortcuts.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/save-multiple-changes.png", - "destination": "/docs/platform/classic-projects/images/data-browser/save-multiple-changes.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/save-multiple-changes.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/save-multiple-changes.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/add-remove-filters.png", - "destination": "/docs/platform/classic-projects/images/data-browser/add-remove-filters.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/add-remove-filters.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/add-remove-filters.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/show-hide-fields.png", - "destination": "/docs/platform/classic-projects/images/data-browser/show-hide-fields.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/show-hide-fields.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/show-hide-fields.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/show-hide-records.png", - "destination": "/docs/platform/classic-projects/images/data-browser/show-hide-records.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/show-hide-records.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/show-hide-records.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/model-sort.png", - "destination": "/docs/platform/classic-projects/images/data-browser/model-sort.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/model-sort.snagx", - "destination": "/docs/platform/classic-projects/images/data-browser/model-sort.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/array.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/array.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/boolean.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/boolean.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/database.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/database.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/datetime.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/datetime.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/enum.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/enum.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/number.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/number.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/object.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/object.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-browser/string.svg", - "destination": "/docs/platform/classic-projects/images/data-browser/string.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/copy-connection-string.png", - "destination": "/docs/platform/classic-projects/images/data-proxy/copy-connection-string.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/copy-connection-string.snagx", - "destination": "/docs/platform/classic-projects/images/data-proxy/copy-connection-string.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/create-and-name-new-connection-string.png", - "destination": "/docs/platform/classic-projects/images/data-proxy/create-and-name-new-connection-string.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/create-and-name-new-connection-string.snagx", - "destination": "/docs/platform/classic-projects/images/data-proxy/create-and-name-new-connection-string.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/prisma-bundle-with-data-proxy.svg", - "destination": "/docs/platform/classic-projects/images/data-proxy/prisma-bundle-with-data-proxy.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/data-proxy/prisma-bundle-without-data-proxy.svg", - "destination": "/docs/platform/classic-projects/images/data-proxy/prisma-bundle-without-data-proxy.svg" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-01-drop-down-select-create.png", - "destination": "/docs/platform/classic-projects/images/environments/create-01-drop-down-select-create.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-01-drop-down-select-create.snagx", - "destination": "/docs/platform/classic-projects/images/environments/create-01-drop-down-select-create.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-env-upload-schema-file.png", - "destination": "/docs/platform/classic-projects/images/environments/create-env-upload-schema-file.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-no-schema-sync-02-repo-branch-database-connection-string-data-proxy.png", - "destination": "/docs/platform/classic-projects/images/environments/create-no-schema-sync-02-repo-branch-database-connection-string-data-proxy.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-no-schema-sync-02-repo-branch-database-connection-string-data-proxy.snagx", - "destination": "/docs/platform/classic-projects/images/environments/create-no-schema-sync-02-repo-branch-database-connection-string-data-proxy.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-on-schema-sync-02-connection-string-static-ips-data-proxy-region.png", - "destination": "/docs/platform/classic-projects/images/environments/create-on-schema-sync-02-connection-string-static-ips-data-proxy-region.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/create-on-schema-sync-02-connection-string-static-ips-data-proxy-region.snagx", - "destination": "/docs/platform/classic-projects/images/environments/create-on-schema-sync-02-connection-string-static-ips-data-proxy-region.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/default-environment.png", - "destination": "/docs/platform/classic-projects/images/environments/default-environment.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/default-environment.snagx", - "destination": "/docs/platform/classic-projects/images/environments/default-environment.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/delete-01-click-three-dot-select-delete.png", - "destination": "/docs/platform/classic-projects/images/environments/delete-01-click-three-dot-select-delete.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/delete-01-click-three-dot-select-delete.snagx", - "destination": "/docs/platform/classic-projects/images/environments/delete-01-click-three-dot-select-delete.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-database-connection-string.png", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-database-connection-string.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-database-connection-string.snagx", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-database-connection-string.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-default.png", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-default.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-default.snagx", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-default.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-name-and-URL-handle.png", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-name-and-URL-handle.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/edit-01-change-name-and-URL-handle.snagx", - "destination": "/docs/platform/classic-projects/images/environments/edit-01-change-name-and-URL-handle.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/list-all-environments.png", - "destination": "/docs/platform/classic-projects/images/environments/list-all-environments.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/list-all-environments.snagx", - "destination": "/docs/platform/classic-projects/images/environments/list-all-environments.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/switch-environment.png", - "destination": "/docs/platform/classic-projects/images/environments/switch-environment.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/switch-environment.snagx", - "destination": "/docs/platform/classic-projects/images/environments/switch-environment.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/view-all-01-environments-drop-down-view-all.png", - "destination": "/docs/platform/classic-projects/images/environments/view-all-01-environments-drop-down-view-all.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/environments/view-all-01-environments-drop-down-view-all.snagx", - "destination": "/docs/platform/classic-projects/images/environments/view-all-01-environments-drop-down-view-all.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/add-github-account-or-org.png", - "destination": "/docs/platform/classic-projects/images/github/add-github-account-or-org.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/add-github-account-or-org.snagx", - "destination": "/docs/platform/classic-projects/images/github/add-github-account-or-org.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/grant-access-github-app.png", - "destination": "/docs/platform/classic-projects/images/github/grant-access-github-app.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/grant-access-github-app.snagx", - "destination": "/docs/platform/classic-projects/images/github/grant-access-github-app.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/grant-access-to-select-github-repositories.png", - "destination": "/docs/platform/classic-projects/images/github/grant-access-to-select-github-repositories.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/github/grant-access-to-select-github-repositories.snagx", - "destination": "/docs/platform/classic-projects/images/github/grant-access-to-select-github-repositories.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/create-02-enable-schema-sync-github-account-branch-schema-path.png", - "destination": "/docs/platform/classic-projects/images/projects/create-02-enable-schema-sync-github-account-branch-schema-path.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/create-02-enable-schema-sync-github-account-branch-schema-path.snagx", - "destination": "/docs/platform/classic-projects/images/projects/create-02-enable-schema-sync-github-account-branch-schema-path.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/create-02-link-schema-file-from-a-repository.png", - "destination": "/docs/platform/classic-projects/images/projects/create-02-link-schema-file-from-a-repository.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/create-02-upload-schema-file.png", - "destination": "/docs/platform/classic-projects/images/projects/create-02-upload-schema-file.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/prisma-data-platform-projects-page.png", - "destination": "/docs/platform/classic-projects/images/projects/prisma-data-platform-projects-page.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/projects/prisma-data-platform-projects-page.snagx", - "destination": "/docs/platform/classic-projects/images/projects/prisma-data-platform-projects-page.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/add-query-with-autocomplete.png", - "destination": "/docs/platform/classic-projects/images/query-console/add-query-with-autocomplete.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/add-query-with-autocomplete.snagx", - "destination": "/docs/platform/classic-projects/images/query-console/add-query-with-autocomplete.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/components.png", - "destination": "/docs/platform/classic-projects/images/query-console/components.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/components.snagx", - "destination": "/docs/platform/classic-projects/images/query-console/components.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/run-query.png", - "destination": "/docs/platform/classic-projects/images/query-console/run-query.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/query-console/run-query.snagx", - "destination": "/docs/platform/classic-projects/images/query-console/run-query.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/overview.png", - "destination": "/docs/platform/classic-projects/images/schema-viewer/overview.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/overview.snagx", - "destination": "/docs/platform/classic-projects/images/schema-viewer/overview.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/project-introspected-schema.png", - "destination": "/docs/platform/classic-projects/images/schema-viewer/project-introspected-schema.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/project-introspected-schema.snagx", - "destination": "/docs/platform/classic-projects/images/schema-viewer/project-introspected-schema.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/project-no-models-no-schema.png", - "destination": "/docs/platform/classic-projects/images/schema-viewer/project-no-models-no-schema.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/project-no-models-no-schema.snagx", - "destination": "/docs/platform/classic-projects/images/schema-viewer/project-no-models-no-schema.snagx" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/project-schema-viewer.png", - "destination": "/docs/platform/classic-projects/images/schema-viewer/project-schema-viewer.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/provide-prisma-schema.png", - "destination": "/docs/platform/classic-projects/images/schema-viewer/provide-prisma-schema.png" - }, - { - "source": "/docs/data-platform/classic-projects/images/schema-viewer/provide-prisma-schema.snagx", - "destination": "/docs/platform/classic-projects/images/schema-viewer/provide-prisma-schema.snagx" - }, - { - "source": "/docs/data-platform/classic-projects", - "destination": "/docs/platform/classic-projects" - }, - { - "source": "/docs/data-platform", - "destination": "/docs/platform" - }, - { - "source": "/docs/about/prisma/example-projects", - "destination": "https://github.com/prisma/prisma-examples/" - }, - { - "source": "/docs/about/prisma/roadmap", - "destination": "/docs/orm/more/releases#roadmap" - }, - { - "source": "/docs/about/prisma/faq", - "destination": "/docs/support" - }, - { - "source": "/docs/about/prisma/limitations", - "destination": "/docs/orm/prisma-schema/data-model/models#limitations" - }, - { - "source": "/docs/about/prisma", - "destination": "/docs/about" - }, - { - "source": "/docs/data-platform/accelerate", - "destination": "/docs/accelerate" - }, - { - "source": "/docs/data-platform/pulse", - "destination": "/docs/pulse" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/schema-incompatibilities-mysql" - }, - { - "source": "/docs/guides/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql", - "destination": "/docs/orm/more/upgrade-guides/upgrade-from-prisma-1/upgrading-the-prisma-layer-mysql" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/graphql", - "destination": "/docs/orm/overview/prisma-in-your-stack/graphql" - }, - { - "source": "/docs/concepts/overview/prisma-in-your-stack/rest", - "destination": "/docs/orm/overview/prisma-in-your-stack/rest" - }, - { - "source": "/docs/accelerate/concepts", - "destination": "/docs/accelerate" - }, - { - "source": "/docs/platform/classic-projects/data-proxy/:any*", - "destination": "/docs/accelerate" - }, - { - "source": "/docs/platform/classic-projects/platform/:any*", - "destination": "/docs/platform" - }, - { - "source": "/docs/platform/classic-projects/support", - "destination": "https://www.prisma.io/support" - }, - { - "source": "/docs/platform/classic-projects", - "destination": "/docs/platform" - }, - { - "source": "/docs/platform/platform-console/about", - "destination": "/docs/platform/about" - }, - { - "source": "/docs/platform/platform-console/concepts/workspaces", - "destination": "/docs/platform/concepts/workspaces" - }, - { - "source": "/docs/platform/platform-console/concepts/projects", - "destination": "/docs/platform/concepts/projects" - }, - { - "source": "/docs/platform/platform-console/maturity-levels", - "destination": "/docs/platform/maturity-levels" - }, - { - "source": "/docs/platform/platform-console/limits", - "destination": "/docs/platform/limits" - }, - { - "source": "/docs/platform/platform-console/support", - "destination": "/docs/platform/support" - }, - { - "source": "/docs/platform/platform-console", - "destination": "/docs/platform" - } - ] -} diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000000..cf48e11e56 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,13 @@ +# Generated by Wrangler on Fri Apr 05 2024 19:27:05 GMT-0500 (Central Daylight Time) +name = "docs" +pages_build_output_dir = "build" +compatibility_date = "2024-03-18" + +[vars] +DOCUSAURUS_BASE_URL='/' + +[env.preview.vars] +DOCUSAURUS_BASE_URL='/' + +[env.production.vars] +DOCUSAURUS_BASE_URL='/'