diff --git a/.github/workflows/deploy_vercel_prod.yml b/.github/workflows/deploy_vercel_prod.yml deleted file mode 100644 index 3bf31cbdad8..00000000000 --- a/.github/workflows/deploy_vercel_prod.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Deploy studio app to production on vercel -on: - push: - branches: - - studio - paths: - - 'studio/**' -jobs: - deploy: - runs-on: ubuntu-18.04 - timeout-minutes: 10 - - steps: - - uses: actions/checkout@v2 - - uses: amondnet/vercel-action@v19 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required - github-comment: false - vercel-args: '--prod -A .vercel/production.json' - vercel-org-id: team_E6KJ1W561hMTjon1QSwOh0WO #Required - vercel-project-id: Qmd7Mw8yFW8SbtvTWFV9uyRzw9P1rJLmgtHjSezywhtYec #Required - working-directory: ./studio #Your Working Directory, Optional - vercel-project-name: app diff --git a/.github/workflows/deploy_vercel_staging.yml b/.github/workflows/deploy_vercel_staging.yml deleted file mode 100644 index bef19d9ea0b..00000000000 --- a/.github/workflows/deploy_vercel_staging.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Deploy studio app to staging on vercel -on: - push: - branches: - - master - paths: - - 'studio/**' -jobs: - deploy: - runs-on: ubuntu-18.04 - timeout-minutes: 10 - - steps: - - uses: actions/checkout@v2 - - uses: amondnet/vercel-action@v19 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required - github-comment: false - vercel-args: '--prod -A .vercel/staging.json' - vercel-org-id: team_E6KJ1W561hMTjon1QSwOh0WO #Required - vercel-project-id: QmcmhbiAtCMFTAHCuGgQscNbke4TzgWULECctNcKmxWCoT #Required - working-directory: ./studio #Your Working Directory, Optional - vercel-project-name: staging-app diff --git a/docker/.env.example b/docker/.env.example index 7389a1d449f..8a12be00005 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,10 @@ -# Secrets +# Secrets +# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long +ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY +SERVICE_ROLE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU # Auth @@ -27,6 +30,9 @@ ENABLE_PHONE_AUTOCONFIRM=false # Ports +## Studio port +STUDIO_PORT=3000 + ## API endpoint ports KONG_HTTP_PORT=8000 KONG_HTTPS_PORT=8443 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8dd1cf01c25..ac54c922e0a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -8,6 +8,17 @@ version: "3.8" services: + studio: + container_name: supabase-studio + image: supabase/studio:latest + restart: unless-stopped + ports: + - ${STUDIO_PORT}:3000/tcp + environment: + SUPABASE_URL: http://kong:8000 + STUDIO_PG_META_URL: http://meta:8080 + SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} + kong: container_name: supabase-kong image: kong:2.1 @@ -99,8 +110,8 @@ services: - rest restart: unless-stopped environment: - ANON_KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY - SERVICE_KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU + ANON_KEY: ${ANON_KEY} + SERVICE_KEY: ${SERVICE_ROLE_KEY} POSTGREST_URL: http://rest:3000 PGRST_JWT_SECRET: ${JWT_SECRET} DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/postgres diff --git a/studio/.dockerignore b/studio/.dockerignore new file mode 100644 index 00000000000..b5924c32836 --- /dev/null +++ b/studio/.dockerignore @@ -0,0 +1,7 @@ +node_modules/ +.vercel +.next +.env.local +.env.production +.env.dev +.env.* \ No newline at end of file diff --git a/studio/Dockerfile b/studio/Dockerfile index 8d7abea36c3..5d4dd5fc97d 100644 --- a/studio/Dockerfile +++ b/studio/Dockerfile @@ -1,24 +1,29 @@ -# Extermely simple setup - should be optimized before sending -# to docker hub - ## USAGE: -# docker build -t next . -# docker run -p 3010:3000 next +# Build: docker build --target production -t supabase/studio:latest . +# Run: docker run -p 3000:3000 supabase/studio +# Deploy: docker push supabase/studio:latest +# Clean build: +# docker build --target production --no-cache -t supabase/studio:latest . +# docker builder prune -FROM node:16 -RUN mkdir -p /home/app/ && chown -R node:node /home/app -WORKDIR /home/app -COPY --chown=node:node . . +FROM node:14 as base +WORKDIR /usr/src/app +COPY package*.json ./ -# Sometimes need this for the pg-parser -# RUN apk add --no-cache python build-base gcc g++ libpq - -USER node - -# Can change to "npm ci" eventually -RUN npm install +FROM base as build +ENV NODE_ENV=build +RUN npm install +COPY . . RUN npm run build +FROM build as dev +ENV NODE_ENV=dev EXPOSE 8082 -CMD [ "npm", "start" ] +CMD [ "npm", "run", "dev" ] + +FROM build as production +ENV NODE_ENV=production +COPY . . +EXPOSE 3000 +CMD ["npm", "start"] diff --git a/studio/components/interfaces/Home/ProjectUsage.tsx b/studio/components/interfaces/Home/ProjectUsage.tsx index 1e8039eb45e..4470eef6696 100644 --- a/studio/components/interfaces/Home/ProjectUsage.tsx +++ b/studio/components/interfaces/Home/ProjectUsage.tsx @@ -37,7 +37,7 @@ const ProjectUsage: FC = ({ project }) => { return (
- Statistics for the past 7 days + Statistics for past 24 hours
{startDate && endDate && (
diff --git a/studio/hooks/misc/withAuth.tsx b/studio/hooks/misc/withAuth.tsx index 5869a76a52e..89b0ff9712a 100644 --- a/studio/hooks/misc/withAuth.tsx +++ b/studio/hooks/misc/withAuth.tsx @@ -1,6 +1,6 @@ import { useProfile, useStore } from 'hooks' import { ComponentType, useEffect, useState } from 'react' -import { flatten } from 'lodash' +import { flatten, isUndefined } from 'lodash' import { NextRouter, useRouter } from 'next/router' import { IS_PLATFORM } from 'lib/constants' import Connecting from 'components/ui/Loading' @@ -15,9 +15,6 @@ export function withAuth( redirectIfFound?: boolean } ) { - const redirectTo = options?.redirectTo ?? '/' - const redirectIfFound = options?.redirectIfFound - return (props: any) => { const router = useRouter() const rootStore = useStore() @@ -25,21 +22,19 @@ export function withAuth( const { ref, slug } = router.query const { app, ui } = rootStore + const page = router.pathname.split('/')[3] + + const redirectTo = options?.redirectTo ?? (!isUndefined(ref) ? `/project/${ref}` : '/') + const redirectIfFound = options?.redirectIfFound const returning = app.projects.isInitialized && app.organizations.isInitialized ? 'minimal' : undefined const { profile, isLoading } = useProfile(returning) - const isRedirecting = checkRedirectTo(isLoading, router, profile, redirectTo, redirectIfFound) - - // We might probably be able to bring this into a _middleware with next 12 - if (!IS_PLATFORM) { - // Hide routes for self-hosted version until features are functionally ready - const page = router.pathname.split('/')[3] - if (PLATFORM_ONLY_PAGES.includes(page)) { - router.push(`/project/${ref}`) - } - } + const isAccessingBlockedPage = !IS_PLATFORM && PLATFORM_ONLY_PAGES.includes(page) + const isRedirecting = + isAccessingBlockedPage || + checkRedirectTo(isLoading, router, profile, redirectTo, redirectIfFound) useEffect(() => { // this should run before redirecting diff --git a/studio/next.config.js b/studio/next.config.js index 9b42e56e782..0be76b8d5dd 100644 --- a/studio/next.config.js +++ b/studio/next.config.js @@ -55,4 +55,6 @@ const sentryWebpackPluginOptions = { // Make sure adding Sentry options is the last code to run before exporting, to // ensure that your source maps include changes from all other Webpack plugins -module.exports = withSentryConfig(moduleExports, sentryWebpackPluginOptions) +module.exports = process.env.NEXT_PUBLIC_IS_PLATFORM === 'true' + ? withSentryConfig(moduleExports, sentryWebpackPluginOptions) + : nextConfig diff --git a/studio/package-lock.json b/studio/package-lock.json index 470f6171660..64a8d24dddb 100644 --- a/studio/package-lock.json +++ b/studio/package-lock.json @@ -8866,6 +8866,52 @@ "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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" + } + } } }, "@babel/parser": { @@ -8883,9 +8929,9 @@ } }, "@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -9002,9 +9048,9 @@ } }, "@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" }, "@hapi/topo": { "version": "5.1.0", @@ -9015,10 +9061,9 @@ } }, "@headlessui/react": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.4.1.tgz", - "integrity": "sha512-gL6Ns5xQM57cZBzX6IVv6L7nsam8rDEpRhs5fg28SN64ikfmuuMgunc+Rw5C1cMScnvFM+cz32ueVrlSFEVlSg==", - "requires": {} + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.4.2.tgz", + "integrity": "sha512-N8tv7kLhg9qGKBkVdtg572BvKvWhmiudmeEpOCyNwzOsZHCXBtl8AazGikIfUS+vBoub20Fse3BjawXDVPPdug==" }, "@monaco-editor/loader": { "version": "1.2.0", @@ -9046,7 +9091,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-12.0.4.tgz", "integrity": "sha512-hl9SmruSHMMMjmcUXJYdP12HbencBOpuy4gHPpQLbRmfErUsY7ia+eF5Xt9vAkim7s6HKByoDg7cu6HJQzfpfg==", - "dev": true, "requires": { "webpack-bundle-analyzer": "4.3.0" } @@ -9079,13 +9123,10 @@ "strip-ansi": "6.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" - } + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "chalk": { "version": "4.0.0", @@ -9096,30 +9137,12 @@ "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==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "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" + "ansi-regex": "^5.0.0" } } } @@ -9196,8 +9219,7 @@ "@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, "@radix-ui/react-compose-refs": { "version": "0.1.0", @@ -9301,16 +9323,6 @@ "npmlog": "^4.1.2", "progress": "^2.0.3", "proxy-from-env": "^1.1.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } } }, "@sentry/core": { @@ -9527,9 +9539,9 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@supabase/gotrue-js": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.20.0.tgz", - "integrity": "sha512-udv6o44JPqQWc8dh9bJnvvUpPKFtzVpSpsTKiS541gjR9kNCgdxkMMYBh5653W9gKfcmqN5mYf9/hYzDOoB6ww==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.21.7.tgz", + "integrity": "sha512-YnL4cO3Q+ugatWEtgCEnLt+Wwi0VpOVTPSSjSSUho2x3cH7+juRBTrVbYky/W6YVgAw/ZJrVUFPh/NcUCUhdmw==", "requires": { "cross-fetch": "^3.0.6" } @@ -9581,9 +9593,9 @@ } }, "@supabase/realtime-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.2.1.tgz", - "integrity": "sha512-nhwSvizonT8hiMoQHOqs+2MZNV8qkhKn552g7NIJktVmqpz//O1dGjdcXyjhbAurW18z0Y7Qa9G7UXfEYJKRPQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.3.2.tgz", + "integrity": "sha512-6U/2Ct0J8z9PIea5gOuTeGjMCwhZWL34hznwUaTjgDOkqKVheTKtvyrbTLJi04yXP4SLIVxju6egjOlA5cI0HQ==", "requires": { "@types/websocket": "^1.0.3", "websocket": "^1.0.34" @@ -9598,11 +9610,11 @@ } }, "@supabase/supabase-js": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.27.0.tgz", - "integrity": "sha512-oAm111Y1t7X+S5GeJWw9NdzAn1A1Cz5WAB/evYjM4ut7ZVWpeaEAlQ2p34MAjDrRVAcCfEr75rQwLTCqPcmMMQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.28.2.tgz", + "integrity": "sha512-QJmnBV6iNcWJ2UI56KjUEXlZrcKlNXSaJBgXdq6Cl+CcyVSBv9Y+UbgqVWUMsuzu2HDD73aiYvO8FU1QLsmqZg==", "requires": { - "@supabase/gotrue-js": "^1.20.0", + "@supabase/gotrue-js": "^1.21.0", "@supabase/postgrest-js": "^0.35.0", "@supabase/realtime-js": "^1.2.1", "@supabase/storage-js": "^1.5.0" @@ -9687,32 +9699,6 @@ "resolved": "https://registry.npmjs.org/@types/debounce-promise/-/debounce-promise-3.1.4.tgz", "integrity": "sha512-9SEVY3nsz+uMN2DwDocftB5TAgZe7D0cOzxxRhpotWs6T4QFqRaTXpXbOSzbk31/7iYcfCkJJPwWGzTxyuGhCg==" }, - "@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==", - "peer": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", - "peer": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "peer": true - }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -9720,6 +9706,18 @@ "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" + }, + "dependencies": { + "@types/react": { + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + } } }, "@types/http-cache-semantics": { @@ -9727,12 +9725,6 @@ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "peer": true - }, "@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -9742,9 +9734,9 @@ } }, "@types/lodash": { - "version": "4.14.173", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.173.tgz", - "integrity": "sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg==", + "version": "4.14.177", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", + "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==", "dev": true }, "@types/markdown-table": { @@ -9757,9 +9749,9 @@ } }, "@types/node": { - "version": "16.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", - "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==" + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==" }, "@types/papaparse": { "version": "5.3.1", @@ -9785,6 +9777,7 @@ "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", + "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -9827,6 +9820,18 @@ "@types/react": "*", "hoist-non-react-statics": "^3.3.0", "redux": "^4.0.0" + }, + "dependencies": { + "@types/react": { + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + } } }, "@types/react-virtualized-auto-sizer": { @@ -9901,169 +9906,10 @@ "integrity": "sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "peer": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "peer": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "peer": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@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==", - "peer": true - }, - "@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==", - "peer": true - }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==" }, "acorn-node": { "version": "1.8.2", @@ -10074,13 +9920,26 @@ "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } } }, "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "agent-base": { "version": "6.0.2", @@ -10088,21 +9947,6 @@ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "aggregate-error": { @@ -10115,9 +9959,9 @@ } }, "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -10146,16 +9990,16 @@ "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" }, "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { @@ -10179,35 +10023,6 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" - } - }, - "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==" - }, - "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" - } - } } }, "arg": { @@ -10251,17 +10066,44 @@ "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" }, "autoprefixer": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.4.tgz", - "integrity": "sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz", + "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==", "dev": true, "requires": { - "browserslist": "^4.16.8", - "caniuse-lite": "^1.0.30001252", - "colorette": "^1.3.0", + "browserslist": "^4.17.5", + "caniuse-lite": "^1.0.30001272", "fraction.js": "^4.1.1", "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + } } }, "available-typed-arrays": { @@ -10421,6 +10263,23 @@ "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==" + } } }, "browserify-zlib": { @@ -10432,22 +10291,15 @@ } }, "browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "requires": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "dependencies": { - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" - } + "node-releases": "^1.1.71" } }, "buffer": { @@ -10459,12 +10311,6 @@ "ieee754": "^1.1.4" } }, - "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==", - "peer": true - }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -10534,18 +10380,17 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001279", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", - "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==" + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==" }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "charenc": { @@ -10568,12 +10413,6 @@ "readdirp": "~3.5.0" } }, - "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==", - "peer": true - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -10622,49 +10461,32 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", - "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.2.tgz", + "integrity": "sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q==", "dev": true, "requires": { "color-convert": "^2.0.1", - "color-string": "^1.6.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==", - "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 - } + "color-string": "^1.7.4" } }, "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==", + "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.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.7.4.tgz", + "integrity": "sha512-nVdUvPVgZMpRQad5dcsCMOSB5BXLljklTiaxS6ehhKxDsAI5sD7k5VmFuBt1y3Rlym8uulc/ANUN/bMWtBu6Sg==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -10679,8 +10501,7 @@ "commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" }, "commondir": { "version": "1.0.1", @@ -10732,13 +10553,6 @@ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" - }, - "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==" - } } }, "cookie": { @@ -10811,6 +10625,13 @@ "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", "requires": { "node-fetch": "2.6.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + } } }, "crypt": { @@ -10872,9 +10693,9 @@ "dev": true }, "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "d": { "version": "1.0.1", @@ -10968,11 +10789,11 @@ "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "decimal.js-light": { @@ -11084,13 +10905,13 @@ "dev": true }, "dnd-core": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.0.tgz", - "integrity": "sha512-wTDYKyjSqWuYw3ZG0GJ7k+UIfzxTNoZLjDrut37PbcPGNfwhlKYlPUqjAKUjOOv80izshUiqusaKgJPItXSevA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.1.tgz", + "integrity": "sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==", "requires": { "@react-dnd/asap": "^4.0.0", "@react-dnd/invariant": "^2.0.0", - "redux": "^4.0.5" + "redux": "^4.1.1" } }, "dom-helpers": { @@ -11109,13 +10930,12 @@ "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "electron-to-chromium": { - "version": "1.3.893", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz", - "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz", + "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg==" }, "elliptic": { "version": "6.5.4", @@ -11159,16 +10979,6 @@ "once": "^1.4.0" } }, - "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11176,12 +10986,20 @@ "dev": true, "requires": { "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } } }, "es-abstract": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", - "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -11194,7 +11012,9 @@ "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", + "is-weakref": "^1.0.1", "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", @@ -11203,12 +11023,6 @@ "unbox-primitive": "^1.0.1" } }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "peer": true - }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -11363,12 +11177,6 @@ "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==", - "peer": true - }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -11421,9 +11229,9 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "fraction.js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", "dev": true }, "fs-extra": { @@ -11472,21 +11280,6 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "gensync": { @@ -11531,9 +11324,9 @@ } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -11572,16 +11365,16 @@ } }, "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "version": "11.8.3", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", + "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", "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.1", + "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", @@ -11598,7 +11391,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, "requires": { "duplexer": "^0.1.2" } @@ -11617,9 +11409,9 @@ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-symbols": { "version": "1.0.2", @@ -11647,6 +11439,23 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==" + } } }, "hash.js": { @@ -11685,13 +11494,6 @@ "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==" - } } }, "hsl-regex": { @@ -11718,15 +11520,15 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, "http2-wrapper": { @@ -11750,21 +11552,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "iconv-lite": { @@ -11887,9 +11674,9 @@ } }, "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true }, "is-bigint": { @@ -11942,9 +11729,9 @@ } }, "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" @@ -11980,9 +11767,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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" } @@ -12028,6 +11815,11 @@ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -12061,6 +11853,14 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "requires": { + "call-bind": "^1.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -12076,11 +11876,6 @@ "supports-color": "^8.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": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -12132,12 +11927,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "peer": true - }, "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", @@ -12185,23 +11974,17 @@ } }, "lilconfig": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", - "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", "dev": true }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "peer": true - }, "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", @@ -12291,20 +12074,15 @@ } }, "lottie-web": { - "version": "5.7.14", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.7.14.tgz", - "integrity": "sha512-J+QEPse7Rws0XvTqRJNtcE8cszb5FWYFHubEK6bgDJtw64/AQJ40aazbWXsWGBM4sm/PgLBLgmmhDU4QpLiieg==" + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.8.1.tgz", + "integrity": "sha512-9gIizWADlaHC2GCt+D+yNpk5l2clZQFqnVWWIVdY0LnxC/uLa39dYltAe3fcmC/hrZ2IUQ8dLlY0O934Npjs7Q==" }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -12313,6 +12091,11 @@ "yallist": "^4.0.0" } }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -12399,23 +12182,7 @@ "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "peer": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "peer": true, - "requires": { - "mime-db": "1.51.0" - } + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mimic-response": { "version": "1.0.1", @@ -12446,16 +12213,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "mobx": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.3.tgz", - "integrity": "sha512-JoNU50rO6d1wHwKPJqKq4rmUMbYnI9CsJmBo+Cu4exBYenFvIN77LWrZENpzW6reZPADtXMmB1DicbDSfy8Clw==" + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.8.tgz", + "integrity": "sha512-RfG2y766P1o9u9xrQht/HBXEoUPIr4B3Gjri3reLW/TuHm3I/3TfBBS0OaeMbw19RIF0AymqjDNlJgakN4ZK7g==" }, "mobx-react-lite": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.1.tgz", - "integrity": "sha512-hwURgfmP2apX3HQrB55V9DN47kuN3C6KlQvI5UIfJRibXma72C/JudcNt2r9dWjAdFMrcZoz1ivvtXMCkJ2aQA==", - "requires": {} + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.2.tgz", + "integrity": "sha512-FxJJMqmHcnQYOVVs2DdjNHioGlFsXF5/9VHztS9NAfIT3DYrxNZzVi119Zr/OmlWKkWNkAsssSNzPkqautfL4A==" }, "modern-normalize": { "version": "1.1.0", @@ -12463,21 +12237,15 @@ "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", "dev": true }, - "monaco-editor": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.29.1.tgz", - "integrity": "sha512-rguaEG/zrPQSaKzQB7IfX/PpNa0qxF1FY8ZXRkN4WIl8qZdTQRSRJCtRto7IMcSgrU6H53RXI+fTcywOBC4aVw==", - "peer": true - }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==" + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" }, "native-url": { "version": "0.3.4", @@ -12487,12 +12255,6 @@ "querystring": "^0.2.0" } }, - "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==", - "peer": true - }, "next": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/next/-/next-11.1.1.tgz", @@ -12562,16 +12324,12 @@ "regenerator-runtime": "^0.13.4" } }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "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": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "color-convert": "^1.9.0" } }, "cssnano-simple": { @@ -12602,6 +12360,16 @@ "source-map": "^0.6.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "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==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12629,9 +12397,12 @@ } }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-gyp-build": { "version": "4.3.0", @@ -12685,11 +12456,6 @@ "util": "0.10.3" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -12716,9 +12482,9 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, "path-browserify": { "version": "0.0.1", @@ -12730,25 +12496,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" - } - }, - "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==" - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -12770,14 +12517,6 @@ "xtend": "^4.0.0" } }, - "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" - } - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -12789,14 +12528,21 @@ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } } } }, "node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" }, "normalize-path": { "version": "3.0.0", @@ -12889,15 +12635,14 @@ } }, "openapi-types": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-9.3.0.tgz", - "integrity": "sha512-sR23YjmuwDSMsQVZDHbV9mPgi0RyniQlqR0AQxTC2/F3cpSjRFMH3CFPjoWvNqhC4OxPkDYNb2l8Mc1Me6D/KQ==" + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-9.3.1.tgz", + "integrity": "sha512-/Yvsd2D7miYB4HLJ3hOOS0+vnowQpaT75FsHzr/y5M9P4q9bwa7RcbW2YdH6KZBn8ceLbKGnHxMZ1CHliGHUFw==" }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" }, "openid-client": { "version": "4.9.1", @@ -13111,8 +12856,7 @@ "pg-pool": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", - "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==", - "requires": {} + "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==" }, "pg-protocol": { "version": "1.5.0", @@ -13142,7 +12886,8 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "picomatch": { "version": "2.3.0", @@ -13176,9 +12921,9 @@ "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "dev": true, "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" } }, "postcss-js": { @@ -13222,10 +12967,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, "postgres-array": { "version": "2.0.0", @@ -13259,8 +13003,7 @@ "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==", - "requires": {} + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==" }, "process": { "version": "0.11.10", @@ -13285,13 +13028,6 @@ "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==" - } } }, "proxy-compare": { @@ -13339,15 +13075,23 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "purgecss": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.0.3.tgz", - "integrity": "sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.1.tgz", + "integrity": "sha512-oVNNzN9tRVoRCeITtpC3ofLU5wGLLYayXkOELeSr0FjwSVdxNK1GbIAvDQNSm5X1WFXGkfcb9JbvTsS2G364/w==", "dev": true, "requires": { - "commander": "^6.0.0", - "glob": "^7.0.0", - "postcss": "^8.2.1", - "postcss-selector-parser": "^6.0.2" + "commander": "^8.0.0", + "glob": "^7.1.7", + "postcss": "^8.3.5", + "postcss-selector-parser": "^6.0.6" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } } }, "querystring": { @@ -13420,6 +13164,18 @@ "unpipe": "1.0.0" }, "dependencies": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -13427,6 +13183,16 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3" } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" } } }, @@ -13467,23 +13233,23 @@ "integrity": "sha512-exyAdFLAxtuM4wNwLYrlKyPYLiJ7e0mv9tqPAd3kq+k1CiJFtznevR3yP0icv5q/y200w+lzNgi7TQn1Wrhu0w==" }, "react-dnd": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-14.0.3.tgz", - "integrity": "sha512-i73Hx5SKfDRdwXe30+CjF/DidiRdt/gwpPN14ajkPR20t/0osnNKFNHg3DLV6RZym+DJ0pO9H5APeMsBWGU3+Q==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-14.0.4.tgz", + "integrity": "sha512-AFJJXzUIWp5WAhgvI85ESkDCawM0lhoVvfo/lrseLXwFdH3kEO3v8I2C81QPqBW2UEyJBIPStOhPMGYGFtq/bg==", "requires": { "@react-dnd/invariant": "^2.0.0", "@react-dnd/shallowequal": "^2.0.0", - "dnd-core": "14.0.0", + "dnd-core": "14.0.1", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" } }, "react-dnd-html5-backend": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-14.0.1.tgz", - "integrity": "sha512-ZDmpvFpd1NR4riw/CMbr8C3mgP6ZhsTf0c48a36kw4ZW8emgiugNlAz/qhhZ4/Pz9TO6DZ63sQohUTTl+AWGiA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-14.0.2.tgz", + "integrity": "sha512-QgN6rYrOm4UUj6tIvN8ovImu6uP48xBXF2rzVsp6tvj6d5XQ7OjHI4SJ/ZgGobOneRAU3WCX4f8DGCYx0tuhlw==", "requires": { - "dnd-core": "14.0.0" + "dnd-core": "14.0.1" } }, "react-dom": { @@ -13508,8 +13274,7 @@ "react-from-dom": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.6.1.tgz", - "integrity": "sha512-7aAZx7LhRnmR51W5XtmTBYHGFl2n1AdEk1uoXLuzHa1OoGXrxOW/iwLcudvgp6BGX/l4Yh1rtMrIzvhlvbVddg==", - "requires": {} + "integrity": "sha512-7aAZx7LhRnmR51W5XtmTBYHGFl2n1AdEk1uoXLuzHa1OoGXrxOW/iwLcudvgp6BGX/l4Yh1rtMrIzvhlvbVddg==" }, "react-grid-layout": { "version": "1.3.0", @@ -13536,20 +13301,6 @@ "integrity": "sha512-Odrp4wue0fHh0pOfZt5H+9nWCMtqs3wdlFSzZPp7qsxfzmbE26QmGWIh6hG43CukiPeOjA8WQhBJU8JwtWvWbQ==", "requires": { "goober": "^2.0.35" - }, - "dependencies": { - "csstype": { - "version": "2.6.18", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", - "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==", - "peer": true - }, - "goober": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.0.41.tgz", - "integrity": "sha512-kwjegMT5018zWydhOQlQneCgCtrKJaPsru7TaBWmTYV0nsMeUrM6L6O8JmNYb9UbPMgWcmtf+9p4Y3oJabIH1A==", - "requires": {} - } } }, "react-inlinesvg": { @@ -13562,9 +13313,9 @@ } }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -13582,6 +13333,13 @@ "loose-envify": "^1.4.0", "prop-types": "^15.7.2", "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } } }, "react-refresh": { @@ -13631,16 +13389,15 @@ "react-tiny-popover": { "version": "6.0.10", "resolved": "https://registry.npmjs.org/react-tiny-popover/-/react-tiny-popover-6.0.10.tgz", - "integrity": "sha512-ECMucd701SxWHGa+2YuVvccCxxTjmhomcD0ZYTF+Qmi5qNAj8pdlExFN+k+p1G78QTYIGPGNLocxRb9f6cZ0Mw==", - "requires": {} + "integrity": "sha512-ECMucd701SxWHGa+2YuVvccCxxTjmhomcD0ZYTF+Qmi5qNAj8pdlExFN+k+p1G78QTYIGPGNLocxRb9f6cZ0Mw==" }, "react-tracked": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/react-tracked/-/react-tracked-1.7.4.tgz", - "integrity": "sha512-iWiH7ZNImKJW5UGZZnEKtoDcdxffMZVxr6LDoMNZOSJKrwMCpYF8RuP9hwtiFjNog2WjF1Zjp2IpPMj5JVAVnA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/react-tracked/-/react-tracked-1.7.5.tgz", + "integrity": "sha512-RSlYpSZ5vGe09crxwZRQUZeTGkNOL529KLpGwwTysoBGuJOW4V8nECn0aP7+gcvEovd9VJN/pgrf9axbvZawog==", "requires": { "proxy-compare": "2.0.2", - "use-context-selector": "1.3.7" + "use-context-selector": "1.3.9" } }, "react-transition-group": { @@ -13657,8 +13414,7 @@ "react-virtualized-auto-sizer": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", - "requires": {} + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==" }, "react-window": { "version": "1.8.6", @@ -13672,17 +13428,20 @@ "react-window-infinite-loader": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/react-window-infinite-loader/-/react-window-infinite-loader-1.0.7.tgz", - "integrity": "sha512-wg3LWkUpG21lhv+cZvNy+p0+vtclZw+9nP2vO6T9PKT50EN1cUq37Dq6FzcM38h/c2domE0gsUhb6jHXtGogAA==", - "requires": {} + "integrity": "sha512-wg3LWkUpG21lhv+cZvNy+p0+vtclZw+9nP2vO6T9PKT50EN1cUq37Dq6FzcM38h/c2domE0gsUhb6jHXtGogAA==" }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^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" } }, "readdirp": { @@ -13712,13 +13471,6 @@ "react-smooth": "^2.0.0", "recharts-scale": "^0.4.4", "reduce-css-calc": "^2.1.8" - }, - "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==" - } } }, "recharts-scale": { @@ -13736,19 +13488,12 @@ "requires": { "css-unit-converter": "^1.1.1", "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } } }, "redux": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", - "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "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" } @@ -13853,9 +13598,9 @@ } }, "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==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -13863,9 +13608,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz", + "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==", "requires": { "chokidar": ">=3.0.0 <4.0.0" } @@ -13879,44 +13624,6 @@ "object-assign": "^4.1.1" } }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "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==", - "peer": true, - "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==", - "peer": true - } - } - }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -13927,15 +13634,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -13947,9 +13645,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", @@ -13976,9 +13674,9 @@ } }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "simple-swizzle": { "version": "0.2.2", @@ -13987,21 +13685,12 @@ "dev": true, "requires": { "is-arrayish": "^0.3.1" - }, - "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==", - "dev": true - } } }, "sirv": { "version": "1.0.18", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.18.tgz", "integrity": "sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==", - "dev": true, "requires": { "@polka/url": "^1.0.0-next.20", "mime": "^2.3.1", @@ -14032,14 +13721,37 @@ "source-map": "^0.6.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } } } }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, "split.js": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.4.tgz", @@ -14051,6 +13763,18 @@ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "requires": { "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "sqlstring": { @@ -14083,6 +13807,18 @@ "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-http": { @@ -14094,6 +13830,18 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-parser": { @@ -14102,14 +13850,21 @@ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", "requires": { "debug": "2" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.2.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": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "string-hash": { @@ -14125,21 +13880,6 @@ "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "string.prototype.trimend": { @@ -14160,12 +13900,20 @@ "define-properties": "^1.1.3" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "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": { - "ansi-regex": "^5.0.0" + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" } }, "styled-jsx": { @@ -14198,15 +13946,14 @@ "stylis-rule-sheet": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "requires": {} + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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": "^3.0.0" + "has-flag": "^4.0.0" } }, "swr": { @@ -14218,9 +13965,9 @@ } }, "tailwindcss": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.15.tgz", - "integrity": "sha512-WgV41xTMbnSoTNMNnJvShQZ+8GmY86DmXTrCgnsveNZJdlybfwCItV8kAqjYmU49YiFr+ofzmT1JlAKajBZboQ==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", + "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", "dev": true, "requires": { "arg": "^5.0.1", @@ -14257,25 +14004,6 @@ "tmp": "^0.2.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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -14303,34 +14031,19 @@ } } }, - "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 - }, "glob-parent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "readdirp": { @@ -14341,100 +14054,6 @@ "requires": { "picomatch": "^2.2.1" } - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "peer": true - }, - "terser-webpack-plugin": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", - "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", - "peer": true, - "requires": { - "jest-worker": "^27.0.6", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "optional": true, - "peer": true - }, - "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==", - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", - "peer": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "peer": true - } - } } } }, @@ -14452,9 +14071,9 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" }, "tmp": { "version": "0.2.1", @@ -14484,23 +14103,19 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "ts-pnp": { "version": "1.2.0", @@ -14632,16 +14247,14 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, "use-context-selector": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/use-context-selector/-/use-context-selector-1.3.7.tgz", - "integrity": "sha512-O94hcN9UDAPTC4Fsm3p6Og5PVlhTEeKqxJX3HuBbVSuevOSPLDZxowFUmx49/fnu9jpgY83Nd3TALJVDRtYzdQ==", - "requires": {} + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/use-context-selector/-/use-context-selector-1.3.9.tgz", + "integrity": "sha512-YgzRyeFjoJXwFn2qLVAuIbV6EQ8DOuzu3SS/eiCxyAyvBhcn02jYSz8c5v22QQU3LW6Ez/Iyo62kKvS7Kdqt3A==" }, "use-memo-one": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", - "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", - "requires": {} + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==" }, "use-subscription": { "version": "1.5.1", @@ -14660,9 +14273,9 @@ } }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -14705,72 +14318,14 @@ } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "5.64.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.1.tgz", - "integrity": "sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw==", - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.2" - }, - "dependencies": { - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "peer": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peer": true, - "requires": {} - }, - "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - } - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "webpack-bundle-analyzer": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz", "integrity": "sha512-J3TPm54bPARx6QG8z4cKBszahnUglcv70+N+8gUqv2I5KOFHJbzBiLx+pAp606so0X004fxM7hqRu10MLjJifA==", - "dev": true, "requires": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", @@ -14781,77 +14336,8 @@ "opener": "^1.5.2", "sirv": "^1.0.7", "ws": "^7.3.1" - }, - "dependencies": { - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "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" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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==", - "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 - }, - "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": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, - "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", - "peer": true - }, "websocket": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", @@ -14863,16 +14349,30 @@ "typedarray-to-buffer": "^3.1.5", "utf-8-validate": "^5.0.2", "yaeti": "^0.0.6" + }, + "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": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which-boxed-primitive": { @@ -14914,11 +14414,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", - "dev": true, - "requires": {} + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==" }, "xtend": { "version": "4.0.2", diff --git a/studio/package.json b/studio/package.json index 2561b2e0491..2d938c0c2c0 100644 --- a/studio/package.json +++ b/studio/package.json @@ -12,6 +12,7 @@ "@auth0/nextjs-auth0": "^1.6.1", "@headlessui/react": "^1.4.1", "@monaco-editor/react": "^4.3.1", + "@next/bundle-analyzer": "^12.0.4", "@radix-ui/react-portal": "^0.1.1", "@sentry/browser": "^6.15.0", "@sentry/nextjs": "^6.15.0", @@ -59,7 +60,6 @@ "zxcvbn": "^4.4.2" }, "devDependencies": { - "@next/bundle-analyzer": "^12.0.4", "@types/crypto-js": "^4.0.2", "@types/lodash": "^4.14.172", "@types/markdown-table": "^3.0.0", diff --git a/studio/pages/project/[ref]/sql/index.tsx b/studio/pages/project/[ref]/sql/index.tsx index a1c7c2ad9d9..0e5a3493d98 100644 --- a/studio/pages/project/[ref]/sql/index.tsx +++ b/studio/pages/project/[ref]/sql/index.tsx @@ -93,7 +93,7 @@ const SqlEditor = observer(() => { if (monaco) { // Enable pgsql format const formatprovider = monaco.languages.registerDocumentFormattingEditProvider('pgsql', { - async provideDocumentFormattingEdits(model) { + async provideDocumentFormattingEdits(model: any) { const value = model.getValue() const formatted = await formatPgsql(value) return [ diff --git a/web/docs/guides/integrations/auth0.mdx b/web/docs/guides/integrations/auth0.mdx new file mode 100644 index 00000000000..7129259f22a --- /dev/null +++ b/web/docs/guides/integrations/auth0.mdx @@ -0,0 +1,458 @@ +--- +id: auth0 +title: 'Auth0' +description: 'Swap out Supabase authentication with Auth0. Let Auth0 handle tokens and signing users in and out, while Supabase enforces authorization policies with Row Level Security (RLS).' +--- + +This guide steps through building a Next.js application with Auth0 and Supabase. We configure Auth0 to handle authenticating users and managing tokens, while writing our authorization logic in Supabase - using Row Level Security policies. + +> Note: This guide is heavily inspired by the [Using Next.js and Auth0 with Supabase](https://auth0.com/blog/using-nextjs-and-auth0-with-supabase/) article on [Auth0's blog](https://auth0.com/blog/). Check it out for a practical step-by-step guide on integrating Auth0 and Supabase. + +The full code example for this guide can be found [here](https://github.com/dijonmusters/supabase-auth0-example). + +[Auth0](https://auth0.com/) is an authentication and authorization platform, offering numerous strategies to authenticate and manage users. It provides fine-grain control over how users sign in to your application, the token that is generated, and what data is stored about your users. + +[Next.js](https://nextjs.org/) is a web application framework built on top of React. We will be using it for this example, as it allows us to write server-side logic within our application. Auth0 have also written a [very well integrated authentication library](https://www.npmjs.com/package/@auth0/nextjs-auth0) specifically for Next.js. + +> Note: API routes (serverless functions) in Next.js closely resemble the structure of Node server frameworks - such as Express, Koa and Fastify. The server-side logic in this guide could easily be refactored in one of these frameworks and managed as a separate application to the front-end. + +If you don’t have an Auth0 account, create one [here](https://auth0.com/signup). + +You will also need a Supabase account, which can be created by signing in [here](https://app.supabase.io/). + +## Step 1: Creating an Auth0 tenant + +From the Auth0 dashboard, click the menu to the right of the Auth0 logo, and select `Create tenant`. + +![Create tenant from Auth0 dashboard](/img/guides/integrations/auth0/IYzHxeW.png) + +Enter a `Domain` for your tenant - this will need to be unique. + +Select a `Region` - this should be geographically close to the majority of your users. + +Select `Development` for `Environment Tag` - this should be production when you're ready to go live. + +![Auth0 tenant settings](/img/guides/integrations/auth0/iSA3E0J.png) + +## Step 2: Setting up an Auth0 application + +From the sidebar menu, select `Applications` > `Applications` and click `Create Application`. + +Give your application a name, select the `Regular Web Applications` option and click `Create`. + +![Auth0 application settings](/img/guides/integrations/auth0/ANU4Wez.png) + +Select `Settings` and navigate to the `Application URIs` section, and update the following: + +`Allowed Callback URLs`: `http://localhost:3000/api/auth/callback` + +`Allowed Logout URLs`: `http://localhost:3000` + +Scroll to the bottom of the `Settings` section and reveal the `Advanced Settings`. + +Select `OAuth` and set `JSON Web Token Signature` to `RS256`. + +Confirm `OIDC Conformant` is `Enabled`. + +Click `Save` to update the settings. + +## Step 3: Creating a Supabase project + +From your [Supabase dashboard](https://app.supabase.io/), click `New project`. + +Enter a `Name` for your Supabase project. + +Enter a secure `Database Password`. + +Select the same `Region` you selected for your Auth0 tenant. + +Click `Create new project`. + +![New Supabase project settings](/img/guides/integrations/auth0/qnmJEU7.png) + +## Step 4: Creating data in Supabase + +From the sidebar menu in the [Supabase dashboard](https://app.supabase.io/), click `Table editor`, then `New table`. + +Enter `todo` as the `Name` field. + +Select `Enable Row Level Security (RLS)`. + +Create two new columns: + +- `title` as `text` +- `user_id` as `text` +- `is_complete` as `bool` with the default value `false` + +Click `Save` to create the new table. + +![Todo table](/img/guides/integrations/auth0/33kqP4K.png) + +From the `Table editor` view, select the `todo` table and click `Insert row`. + +Fill out the `title` field and click `Save`. + +![New row settings](/img/guides/integrations/auth0/mEhHAWC.png) + +Click `Insert row` and add a couple of extra todos. + +![List of todos](/img/guides/integrations/auth0/dLOvhdq.png) + +## Step 5: Building a Next.js app + +Create a new Next.js project: + +```bash +npx create-next-app +``` + +Create a `.env.local` file and enter the following values: + +``` +AUTH0_SECRET=any-secure-value +AUTH0_BASE_URL=http://localhost:3000 +AUTH0_ISSUER_BASE_URL=https://..auth0.com +AUTH0_CLIENT_ID=get-from-auth0-dashboard +AUTH0_CLIENT_SECRET=get-from-auth0-dashboard +NEXT_PUBLIC_SUPABASE_URL=get-from-supabase-dashboard +NEXT_PUBLIC_SUPABASE_KEY=get-from-supabase-dashboard +SUPABASE_SIGNING_SECRET=get-from-supabase-dashboard +``` + +> Note: Auth0 values can be found under `Settings > Basic Information` for your application. + +![Auth0 settings](/img/guides/integrations/auth0/o07FaoV.png) + +> Note: Supabase values can be found under `Settings > API` for your project. + +![Supabase settings](/img/guides/integrations/auth0/r1GAfLo.png) + +Restart your Next.js development server to read in the new values from `.env.local`. + +```bash +npm run dev +``` + +## Step 5: Install Auth0 Next.js library + +Install the `@auth0/nextjs-auth0` library. + +```bash +npm i @auth0/nextjs-auth0 +``` + +Create a new file `pages/api/auth/[...auth0].js` and add: + +```jsx +// pages/api/auth/[...auth0].js + +import { handleAuth } from '@auth0/nextjs-auth0' + +export default handleAuth() +``` + +> Note: This will create a few API routes for us. The main ones we will use are `/api/auth/login` and `/api/auth/logout` to handle signing users in and out. + +Open `pages/_app.js` and wrap our `Component` with the `UserProvider` from Auth0: + +```jsx +// pages/_app.js + +import React from 'react' +import { UserProvider } from '@auth0/nextjs-auth0' + +const App = ({ Component, pageProps }) => { + return ( + + + + ) +} + +export default App +``` + +Update `pages/index.js` to ensure the user is logged in to view the landing page. + +```jsx +// pages/index.js + +import styles from '../styles/Home.module.css' +import { withPageAuthRequired } from '@auth0/nextjs-auth0' +import Link from 'next/link' + +const Index = ({ user }) => { + return ( +
+

+ Welcome {user.name}!{' '} + + Logout + +

+
+ ) +} + +export const getServerSideProps = withPageAuthRequired() + +export default Index +``` + +> Note: `withPageAuthRequired` will automatically redirect the user to `/api/auth/login` if they are not currently logged in. + +Test this is working by navigating to `http://localhost:3000` which should redirect you to an Auth0 sign in screen. + +![Auth0 sign in screen](/img/guides/integrations/auth0/xLRL7S7.png) + +Either `Sign up` for a new account, or click `Continue with Google` to sign in. + +You should now be able to view the landing page. + +![Landing page](/img/guides/integrations/auth0/YdBKRy6.png) + +## Step 6: Sign Auth0 token for Supabase + +Currently, neither Supabase or Auth0 allow for a custom signing secret to be set for their JWT. They also use different [signing algorithms](https://auth0.com/docs/configure/applications/signing-algorithms). + +Therefore, we need to extract the bits we need from Auth0's JWT, and sign our own to send to Supabase. + +We can do that using Auth0's `afterCallback` function, which gets called anytime the user authenticates. + +Install the `jsonwebtoken` library. + +```bash +npm i jsonwebtoken +``` + +Update `pages/api/auth/[...auth0].js` with the following: + +```jsx +// pages/api/auth/[...auth0].js + +import { handleAuth, handleCallback } from '@auth0/nextjs-auth0' +import jwt from 'jsonwebtoken' + +const afterCallback = async (req, res, session) => { + const payload = { + userId: session.user.sub, + exp: Math.floor(Date.now() / 1000) + 60 * 60, + } + + session.user.accessToken = jwt.sign(payload, process.env.SUPABASE_SIGNING_SECRET) + + return session +} + +export default handleAuth({ + async callback(req, res) { + try { + await handleCallback(req, res, { afterCallback }) + } catch (error) { + res.status(error.status || 500).end(error.message) + } + }, +}) +``` + +Our `payload` for the JWT will contain our user's unique identifier from Auth0 - `session.user.sub` and an expiry of 1 hour. + +We are signing this JWT using Supabase's signing secret, so Supabase will be able to validate it is authentic and hasn't been tampered with in transit. + +> Note: We need to sign the user out and back in again to run the `afterCallback` function, and create our new token. + +Now we just need to send the token along with the request to Supabase. + +## Step 7: Requesting data from Supabase + +Create a new file called `utils/supabase.js` and add the following: + +```jsx +// utils/supabase.js + +import { createClient } from '@supabase/supabase-js' + +const getSupabase = (access_token) => { + const supabase = createClient( + process.env.NEXT_PUBLIC_SUPABASE_URL, + process.env.NEXT_PUBLIC_SUPABASE_KEY + ) + + if (access_token) { + supabase.auth.session = () => ({ + access_token, + }) + } + + return supabase +} + +export { getSupabase } +``` + +This will be our client for talking to Supabase. We can pass it an `access_token` and it will be attached to our request. + +Let's load our `todos` from Supabase in our landing page! + +```jsx +// pages/index.js + +import styles from '../styles/Home.module.css' +import { withPageAuthRequired } from '@auth0/nextjs-auth0' +import { getSupabase } from '../utils/supabase' +import Link from 'next/link' +import { useEffect } from 'react' + +const Index = ({ user }) => { + const [todos, setTodos] = useState([]) + const supabase = getSupabase(user.accessToken) + + useEffect(() => { + const fetchTodos = async () => { + const { data } = await supabase.from('todo').select('*') + setTodos(data) + } + + fetchTodos() + }, []) + + return ( +
+

+ Welcome {user.name}!{' '} + + Logout + +

+ {todos?.length > 0 ? ( + todos.map((todo) =>

{todo.content}

) + ) : ( +

You have completed all todos!

+ )} +
+ ) +} + +export const getServerSideProps = withPageAuthRequired() + +export default Index +``` + +Alternatively, we could fetch todos on the server using the `getServerSideProps` function. + +```jsx +// pages/index.js + +import styles from '../styles/Home.module.css' +import { withPageAuthRequired, getSession } from '@auth0/nextjs-auth0' +import { getSupabase } from '../utils/supabase' +import Link from 'next/link' + +const Index = ({ user, todos }) => { + return ( +
+

+ Welcome {user.name}!{' '} + + Logout + +

+ {todos?.length > 0 ? ( + todos.map((todo) =>

{todo.content}

) + ) : ( +

You have completed all todos!

+ )} +
+ ) +} + +export const getServerSideProps = withPageAuthRequired({ + async getServerSideProps({ req, res }) { + const { + user: { accessToken }, + } = await getSession(req, res) + + const supabase = getSupabase(accessToken) + + const { data: todos } = await supabase.from('todo').select('*') + + return { + props: { todos }, + } + }, +}) + +export default Index +``` + +Either way, when we reload our application, we are still getting the empty state for todos. + +![Empty todo list](/img/guides/integrations/auth0/XgEMwnN.png) + +This is because we enabled Row Level Security, which blocks all requests by default. To enable our user to select their `todos` we need to write a policy. + +## Step 8: Write a policy to allow select + +Our policy will need to know who our currently logged in user is to determine whether or not they should have access. Let's create a PostgreSQL function to extract the current user from our new JWT. + +Navigate back to the Supabase dashboard, select `SQL` from the sidebar menu, and click `New query`. This will create a new query called `new sql snippet`, which will allow us to run any SQL against our Postgres database. + +Write the following and click `Run`. + +```sql +create or replace function auth.user_id() returns text as $$ + select nullif(current_setting('request.jwt.claim.userId', true), '')::text; +$$ language sql stable; +``` + +This will create a function called `auth.user_id()`, which will inspect the `userId` field of our JWT payload. + +> Note: To learn more about PostgreSQL functions, check out [our deep dive video](https://www.youtube.com/watch?v=MJZCCpCYEqk). + +Let's create a policy that checks whether this user is the owner of the todo. + +Select `Authentication` from the Supabase sidebar menu, click `Policies`, and then `New Policy` on the `todo` table. + +![Create new policy](/img/guides/integrations/auth0/M7XyhHe.png) + +From the modal, select `Create a policy from scratch` and add the following. + +![Policy settings for SELECT](/img/guides/integrations/auth0/wuWz3am.png) + +This policy is calling the function we just created to get the currently logged in user's ID `auth.user_id()` and checking whether this matches the `user_id` column for the current `todo`. If it does, then it will allow the user to select it, otherwise it will continue to deny. + +Click `Review` and then `Save policy`. + +> Note: To learn more about RLS and policies, check out [our deep dive video](https://www.youtube.com/watch?v=Ow_Uzedfohk). + +The last thing we need to do is update the `user_id` columns for our existing `todos`. + +Head back to the Supabase dashboard, and select `Table editor` from the sidebar. + +![User ID null in Supabase Table Editor](/img/guides/integrations/auth0/dLOvhdq.png) + +Each of our `user_id` columns are set to `NULL`! + +To get the ID for our Auth0 user, head over to the Auth0 dashboard, select `User Management` from the sidebar, click `Users` and select your test user. + +![List of users in Auth0 dashboard](/img/guides/integrations/auth0/GdXS013.png) + +Copy their `user_id`. + +![User ID in Auth0 dashboard](/img/guides/integrations/auth0/tbvd0Uj.png) + +Update each row in Supabase. + +![User ID set to Auth0 user](/img/guides/integrations/auth0/tPu4Tt8.png) + +Now when we refresh our application, we should finally see our list of `todos`! + +> Note: Check out [the repo](https://github.com/dijonmusters/supabase-auth0-example/blob/main/pages/index.js) for an example of writing new `todos` to Supabase. + +## Resources + +- [Auth0](https://auth0.com/) official website. +- [Auth0 blog](https://auth0.com/blog/). +- [Using Next.js and Auth0 with Supabase article](https://auth0.com/blog/using-nextjs-and-auth0-with-supabase/). +- [Auth0 community](https://community.auth0.com/). +- [Auth0 documentation](https://auth0.com/docs/). diff --git a/web/docs/guides/integrations/draftbit.mdx b/web/docs/guides/integrations/draftbit.mdx new file mode 100644 index 00000000000..a0867a6b920 --- /dev/null +++ b/web/docs/guides/integrations/draftbit.mdx @@ -0,0 +1,231 @@ +--- +id: draftbit +title: 'Draftbit' +description: 'Connect your Supabase postgres database to your Low-code mobile app.' +--- + +This guide explains how to connect a Supabase back-end to a Draftbit front-end and then configure all CRUD operations necessary to build a simple mobile app. + +[Draftbit](https://draftb.it/3Fkbask) is a "pro-code" low-code mobile app building platform. Draftbit exports React Native source code that is 100% run on open-source languages and libraries. + +Draftbit is back-end agnostic and connects to Supabase via REST API. + +> Note: For the demonstration purpose of this guide, we are using a pre-populated database in Supabase. We are calling `Groceries`. To follow along, rename it any way you prefer. + +![Prepopulated Database](/img/guides/integrations/draftbit/prepopulated-database.png) + +If you don’t have a Draftbit account, create one [here](https://draftb.it/3Fkbask). Once you’ve got your account set up, Create a New App. You can select `Start From a Blank App` for this demo and proceed to the Builder interface. + +## Step 1: Get the RESTful endpoint and Project API key + +To connect the REST API in the Draftbit app, the following fields are required: + +- Base URL of the REST API, which is in the format: `https://.supabase.co/rest/v1` where the `` (the space between `Bearer` and `` is required). Click **Add** after adding the value. +- Enter another key name to access the API Key such as `Api_Key_Header`. When making the service connection in the next section, it will be passed as the header `apiKey` value. +- The value of this key requires you to enter an authorization token that starts with syntax is ``. Click **Add** after adding the value. +- Click **Save** to save these keys and close the modal. + +![Add header values in Draftbit](/img/guides/integrations/draftbit/authheader.png) + +## Step 3: Add Supabase RESTful endpoint in Draftbit + +In your Draftbit builder interface: + +- Open the **API & Cloud Services** modal from the top menu bar. +- From the **Connect a service** menu, click on **Rest API**. + +- In Step 1: Enter a name for your REST API. Then, paste your `Base URL` (from the first section) into the Base URL field. +- In Step 2: Under **Key** add `Authorization` and `apikey`. Then, under **Value**, select the global variables (from the previous section) to add the actual values for both keys. +- Click Save. + +![Create a API service in Draftbit](/img/guides/integrations/draftbit/service.png) + +## Making API requests with Supabase & Draftbit + +### GET request to Fetch all records + +In this section, let's populate a Fetch component with all the data from a simple Supabase and then display the data fetched from the Supabase data table in a List component. + +For a reference, here is a how the Components tree looks like for this screen: + +![Components tree](/img/guides/integrations/draftbit/ctree.png) + +The next step is to create an endpoint. Let's try fetching all the data using a `GET` HTTP request. Select the Supabase service in the **API & Cloud Services** modal, and then: + +- Click **Add endpoint**. +- In Step 1: enter the name for the endpoint. Make sure the **Method** select is `GET`. +- In Step 2: add the base name path: `/groceries/select=*`, where `groceries` is the table name in Supabase. +- In Step 4: click the **Test** button next to the Endpoint input to verify the response coming from the Supabase. +- Click Save. + +![Creating a GET request endpoint](/img/guides/integrations/draftbit/get-request.gif) + +In the Builder, on the app screen: + +- Select the Fetch component in the Components tree and go to the [Data tab from Properties Panel](doc:introduction-to-the-builder#properties-panel). +- For **Service**, select the name of the Supabase Service. +- For **Endpoint**, select the endpoint you want to fetch the data from. +- Select the List component in the Components and go to the [Data tab from Properties Panel](doc:introduction-to-the-builder#properties-panel). In Data, select `Top-Level Response` from the dropdown menu. +- Then, select the Text component in the Components and then go to the Data tab from the Properties Panel. +- Add a `{{varName}}` value (inside the curly braces) to represent a column field from the Supabase. For example, add `{{title}}` to represent the column name from the Supabase Base. +- Under **Variables**, you will see the variable name defined in the previous step. From the dropdown menu, select the appropriate field that represents the data field. + +![Fetching data on app screen](/img/guides/integrations/draftbit/fetchall.gif) + +### GET request to fetch single row + +Open the **API & Cloud services** modal from the top menu, select the Supabase service, and then: + +- Click **Add endpoint**. +- In Step 1: enter a name for the endpoint. +- In Step 2: add the `/groceries/column-name=eq.{{column-name}}` variable. Then, add a Test value for the `{{column-name}}`. For example, it can be the `title` or the `id`. +- In Step 4: click the **Test** button next to the Endpoint input to verify the response coming from the Supabase. +- Click Save. + +![Creating endpoint to fetch a single row](/img/guides/integrations/draftbit/getsingle.gif) + +On app screen: + +- Select the Fetch component in the Components tree and go to the Data tab from Properties Panel +- For **Service**, select the name of the Supabase Service. +- For **endpoint**, select the endpoint you want to fetch the data from. +- Set the value for the `id` in the Configuration > URL Structure section to Navigation > id. +- Select the List component in the Components and go to the Data tab from Properties Panel. In Data, select `Top-Level Response` from the dropdown menu. +- Then, select the Text component in the Components and then go to the Data tab from the Properties Panel. +- Add a `{{varName}}` value (inside the curly braces) to represent the column field from the Supabase. For example, add `{{title}}` to represent the field and value from the Supabase data table. +- Under **Variables**, you will see the variable name defined in the previous step. From the dropdown menu, select the appropriate field that represents the data field. + +![Displaying data from single row](/img/guides/integrations/draftbit/fetchsingle.png) + +### POST request to submit a new row + +Submitting new Data from the Draftbit app to Supabase's REST API requires the request to be sent using the HTTP `POST` method. + +For this section, you need to use at least one component that accepts user input and has a Field Name prop to POST data using Supabase REST API. + +You can use one of the following components in Draftbit: + +- Text Input +- Text Area/Text Field +- Checkbox +- Slider +- Radio Button Group +- Radio Button + +In addition, you need a Touchable component like a Button to attach the POST action. After you have created these components, we will create the `POST` endpoint: + +- Click **Add endpoint**. +- In Step 1: enter a name for the endpoint and select the Method to `POST`. +- In Step 2: enter the base name as path: `/groceries`. +- In Step 3: add a valid Body structure to submit a POST request. Add one or many `{{variable}}` for test values. Click Body Preview to validate the structure of the Body in the request. For the example, let's create a variable called `{{inputValue}}`. +- In Step 4: to see the new row added to the Supabase data table as JSON response inside the Builder, you have to pass a new header called `Prefer` with its value as `return=representation`. +- In Step 5: click the **Test** button next to the Endpoint input to verify the response coming from the Supabase and click Save. + +![Make a POST request to add new data to Supabase database](/img/guides/integrations/draftbit/postrequest.gif) + +Once you follow the above steps, you should get a 200 OK response with exactly the new record as a JSON you have entered for your schema. + +An example of how Body in a request will look like: + +```json +{ + "title": {{inputValue}} +} +``` + +Where `title` is the column name in your Supabase database table. + +In Draftbit, using a Touchable or a Button component, you can trigger the action **API Request** to submit the data to the endpoint. + +Now, there is a working `POST` request in Draftbit. Map its response to the components on your screen in Draftbit. + +First, for each input component, make sure you have set the Field Names (found in the Configs tab, second from the left) to unique values. For example, in the screen below, there is one TextInput field component with the the value of the `Field Name` prop of `textInputValue`. + +![Field Name prop on a TextInput component](/img/guides/integrations/draftbit/textinput.png) + +Next, on your Button component, go to the Interactions tab in the Properties panel located on the far-right-hand side. Select an Action called `API request`. + +In the API request action: + +- In **Service**, select the name to Supabase API Service. +- In **Endpoint**, select the name of the Endpoint. +- Then add the configuration for the body request to be sent by selecting the values for `{{inputValue}}`. + +![Setting up the API Request to send a POST request](/img/guides/integrations/draftbit/postapirequest.png) + +After completing the above steps, you can trigger the API request to submit new data to the Supabase database. + +### PATCH request to Update a new record + +Updating an existing record from the Draftbit app to Supabase's REST API requires the request to be sent using the HTTP `PATCH` method. + +After you have created your screen components in the Draftbit builder, open the Supabase service and make the `PATCH` endpoint: + +- Click **Add endpoint**. +- In Step 1: enter a name for the endpoint and select the Method to `PATCH`. +- In Step 2: enter the base name as path: `/groceries?id=eq.{{id}}`, where `id` is the value of an existing record in the database. +- In Step 3: add a valid Body structure to submit a PATCH request. Add one or many `{{variable}}` for test values depending on the structure of your app. Click Body Preview to validate the structure of the Body in the request. For the example, let's create a variable called `{{inputValue}}`. +- In Step 5: click the **Test** button next to the Endpoint input to verify the response coming from the Supabase and click Save. + +![Creating an endpoint for PATCH request](/img/guides/integrations/draftbit/patch.gif) + +Next, on your Button component, go to the Interactions tab in the Properties panel located on the far-right-hand side. Select an Action called `API request`. + +In the API request action: + +- In **Service**, select the name to Supabase API Service. +- In **Endpoint**, select the name of the Endpoint. +- Then add the configuration for the query param, and the body request to be sent by selecting the values for `{{inputValue}}`. + +![Setting up the API Request to send a PATCH request](/img/guides/integrations/draftbit/patchapirequest.png) + +After completing the above steps, you can trigger the API request to update existing data in the Supabase database. + +### DELETE request to remove an existing record + +The `DELETE` request is to the Supabase with an item's `column-name` to remove that particular record from the table. You can use a [filter from Supabase](https://supabase.io/docs/reference/javascript/using-filters) to filter the value of a specific `column-name`. + +After you have created your screen components in the Draftbit builder, open the Supabase service and create the `DELETE` endpoint: + +- Click **Add endpoint**. +- In Step 1: enter a name for the endpoint and select the Method to `DELETE`. +- In Step 2: add `/groceries/columnName=eq.{{columnName}}`. Then, add a Test value for the `{{columnName}}`. For example, the `{{columnName}}` here can be `id` of the record. +- In Step 4: click the **Test** button next to the Endpoint input to verify the response from the Supabase. +- Click Save. + +![Creating an endpoint for DELETE request](/img/guides/integrations/draftbit/delete.gif) + +Next, on your Button component, go to the Interactions tab in the Properties panel located on the far-right-hand side. Select an Action called `API request`. + +In the API Request action: + +- In **Service**, select the name to Supabase API Service. +- In **Endpoint**, select the name of the Endpoint. +- Then, add the configuration for the query request to be sent by selecting a value. For example, in this case it will be the `id` of the record coming from the Navigation parameter. + +![Setting up the API Request to send a DELETE request](/img/guides/integrations/draftbit/deleteapirequest.gif) + +## Resources + +- [Draftbit](https://draftb.it/3Fkbask) official website. +- [Draftbit Community](https://community.draftbit.com/home). +- [Draftbit](https://docs.draftbit.com/) documentation. diff --git a/web/docs/guides/integrations/prisma.mdx b/web/docs/guides/integrations/prisma.mdx new file mode 100644 index 00000000000..9b805c2b110 --- /dev/null +++ b/web/docs/guides/integrations/prisma.mdx @@ -0,0 +1,146 @@ +--- +id: prisma +title: 'Prisma' +description: 'Connect your Supabase postgres database to your Prisma project.' +--- + +This guide explains how to quickly connect the Postgres database provided by Supabase to a Prisma project. + +[Prisma](https://prisma.io) 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. +- **Prisma Studio**: GUI to view and edit data in your database. + +## Step 1: Get the connection string from Supabase project settings + +Go to the settings page from the sidebar and navigate to the **Database** tab. You’ll find the database’s connection string with a placeholder for the password you provided when you created the project. +![Getting the connection string](/img/guides/integrations/prisma/zntcsh3ic91gf1gy8j73.png) + +## Step 2: Testing the connection + +To make sure that everything works correctly, let’s try the connection string in a Prisma project. + +If you already have one, all you need to do is set the `DATABASE_URL` to the connection string (including the password) in your `.env` file, and you’re good to go. + +In case you don’t have a Prisma project or this is your first time working with Prisma, you’re going to use with the repo from the [quickstart](https://www.prisma.io/docs/getting-started/quickstart) guide. + +### Cloning the starter project + +Navigate into a directory of your choice and run the following command in your terminal if you’re on a Windows machine: + +```bash +curl https://pris.ly/quickstart -L -o quickstart-master.tar.gz && tar -zxvf quickstart-master.tar.gz quickstart-master/typescript/starter && move quickstart-master\typescript\starter starter && rmdir /S /Q quickstart-master && del /Q quickstart-master.tar.gz +``` + +And if you’re using Mac OS or Linux, run the following command: + +```bash +curl -L https://pris.ly/quickstart | tar -xz --strip=2 quickstart-master/typescript/starter +``` + +You can now navigate into the directory and install the project’s dependencies: + +```bash +cd starter && npm install +``` + +### A look at the project’s structure + +This project comes with TypeScript configured and has the following structure. + +- A `prisma` directory which contains: + - A `dev.db` file: This is a SQLite database. + - A `schema.prisma` file: Where we define the different database models and relations between them. +- A `.env` file: Contains the `DATABASE_URL` variable, which Prisma will use. +- A `script.ts` file: where we will run some queries using Prisma Client. + This starter also comes with the following packages installed: +- [`@prisma/client`](https://www.npmjs.com/package/prisma): An auto-generated and type-safe query builder that’s _tailored_ to your data. +- [`prisma`](https://www.npmjs.com/package/@prisma/client): Prisma’s command-line interface (CLI). It allows you to initialize new project assets, generate Prisma Client, and analyze existing database structures through introspection to automatically create your application models. + > Note: Prisma works with both JavaScript and TypeScript. However, to get the best possible development experience, using TypeScript is highly recommended. + +### Configuring the project to use PostgreSQL + +Go ahead and delete the `prisma/dev.db` file because we will be switching to PostgreSQL. +Next, inside the `prisma/.env` file, update the value of the `DATABASE_URL` variable to the connection string you got in **step 3**. The URL might look as follows: + +```env +# prisma/.env +postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:5432/postgres +``` + +Finally, inside your `schema.prisma` file, change the `provider` from “sqlite” to `“postgresql”`. +This is what your `schema.prisma` file should look like: + +```go +datasource db { + provider = “postgresql” + url = env(“DATABASE_URL”) +} +generator client { + provider = “prisma-client-js” +} +model Post { + id Int @id @default(autoincrement()) + title String + content String? + published Boolean @default(false) + author User? @relation(fields: [authorId], references: [id]) + authorId Int? +} +model User { + id Int @id @default(autoincrement()) + email String @unique + name String? + posts Post[] +} +``` + +To test that everything works correctly, run the following command to create a migration: + +```bash +prisma migrate dev --name init +``` + +You can optionally give your migration a name, depending on the changes you made. Since this is the project’s first migration, you’re setting the `--name` flag to “init”. +If everything works correctly, you should get the following message in your terminal: + +```text +Your database is now in sync with your schema. +:heavy_check_mark: Generated Prisma Client (2.x.x) to ./node_modules/@prisma/client in 111ms +``` + +This will create a `prisma/migrations` folder inside your `prisma` directory and synchronize your Prisma schema with your database schema. + +> Note: if you want to skip the process of creating a migration history, you can use the [`db push`](https://www.prisma.io/docs/concepts/components/prisma-migrate/db-push) command instead of `migrate dev`. +> If you go to your Supabase project, in the table editor, you should see that two tables have been created, a `Post` and a `User` table. +> ![tables created in the UI](/img/guides/integrations/prisma/7y4qq4wwvfrheti6r09u.png) +> That’s it! You have now successfully connected a Prisma project to a PostgreSQL database hosted on Supabase and ran your first migration. + +## Connection pooling with Supabase + +If you’re working in a serverless environment (for example Node.js functions hosted on AWS Lambda, Vercel or Netlify Functions), you need to set up [connection pooling](https://www.prisma.io/docs/guides/performance-and-optimization/connection-management#serverless-environments-faas) using a tool like [PgBouncer](https://www.pgbouncer.org/). That’s because every function invocation may result in a [new connection to the database](https://www.prisma.io/docs/guides/performance-and-optimization/connection-management#the-serverless-challenge). Supabase [support connection management using PgBouncer](https://supabase.io/blog/2021/04/02/supabase-pgbouncer#what-is-connection-pooling) and are enabled by default. +Go to the **Database** page from the sidebar in the Supabase dashboard and navigate to **connection pool** settings +![Connection pool settings](/img/guides/integrations/prisma/w0oowg8vq435ob5c3gf0.png) +When running migrations you need to use the non pooled connection URL (like the one we used in **step 4**). However, when deploying your app, you’ll use the pooled connection URL. and add the `?pgbouncer=true` flag to the PostgreSQL connection URL. The URL might look as follows: + +```env +# prisma/.env +postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:6543/postgres?pgbouncer=true +``` + +Prisma Migrate uses database transactions to check out the current state of the database and the migrations table. However, the Migration Engine is designed to use a single connection to the database, and does not support connection pooling with PgBouncer. If you attempt to run Prisma Migrate commands in any environment that uses PgBouncer for connection pooling, you might see the following error: + +```bash +Error: undefined: Database error +Error querying the database: db error: ERROR: prepared statement “s0” already exists +``` + +This is a known issue and it is being worked on, you can follow the progress on this [GitHub issue](https://github.com/prisma/prisma/issues/6485). +If you want to learn more about Prisma, check out the [docs](https://www.prisma.io/docs). Also in case you have any questions or run into any issue, feel free to start a discussion in the repo’s [discussions section](https://github.com/prisma/prisma/discussions). + +## Resources + +- [Prisma](https://prisma.io) official website. +- [Prisma GitHub](https://github.com/prisma/prisma). +- [Prisma](https://www.prisma.io/docs/) documentation. diff --git a/web/docs/guides/integrations/vercel.mdx b/web/docs/guides/integrations/vercel.mdx new file mode 100644 index 00000000000..d3da240fe4c --- /dev/null +++ b/web/docs/guides/integrations/vercel.mdx @@ -0,0 +1,241 @@ +--- +id: vercel +title: 'Vercel' +description: The fastest way to get up and running with an application that uses Supabase is with Vercel's Next.js starter and Supabase integration. +--- + +This guide steps through using Vercel's dashboard to create a Next.js project integrated with Supabase. To further streamline the process, we will be using the Next.js starter template, which can be automatically forked to a new GitHub repo, without leaving the dashboard! + +If you don’t have a Vercel account, create one [here](https://vercel.com/signup). + +## Step 1: Create a Supabase project + +This guide could use an existing Supabase project, but to create the `todo` demo from scratch, navigate to [Supabase](https://app.supabase.io/), click `Sign In` and authenticate with GitHub to login or register a new account. + +From the Supabase dashboard, click `New project` and select an organization. + +> Note: You may need to create an organization first. + +Give your project a `name`, `password`, select a `region` close to your potential users and click `Create new project`. + +![Create a Supabase project](/img/guides/integrations/vercel/create-supabase-project.png) + +Supabase will take a couple of minutes to configure the infrastructure. + +Once this is finished, navigate to `SQL Editor` from the sidebar menu and click `New query`. + +This will create a new SQL snippet called "New Query". Copy and paste the following and click `Run`. + +```sql +create table todos ( + id bigint generated by default as identity primary key, + title text, + is_complete boolean default false, + created_at timestamp with time zone default timezone('utc'::text, now()) not null +); + +alter table todos enable row level security; + +create policy "Anyone can view todos" on todos for + select using (true); + +create policy "Anyone can add new todos" on todos for + insert with check (true); + +insert into todos(title) +values + ('Create Supabase project'), + ('Create Vercel project'), + ('Install Supabase integration'); +``` + +This will create a new todos table, enable row level security, add policies for selecting and inserting data, and add some example rows. + +> Note: To simplify this example, we are allowing anyone to `select` and `insert` rows on the `todos` table. Usually, these actions would be locked down to only allow logged in users to perform them. Check out [this video](https://www.youtube.com/watch?v=Ow_Uzedfohk) to learn more about Row Level Security and policies. + +## Step 2: Create Vercel project + +From your [Vercel dashboard](https://vercel.com/dashboard), click `New Project`. + +![Create new Vercel project](/img/guides/integrations/vercel/create-vercel-project.png) + +Under the `Clone Template` menu, click `Next.js`. + +![Clone Next.js template](/img/guides/integrations/vercel/clone-next-js-template.png) + +In the `Create Git Repository` section, click `GitHub`, select your username under `GIT SCOPE`, enter a name for your project, choose whether you want your repo `private` or `public`, and click `Create`. + +![New GitHub repo settings](/img/guides/integrations/vercel/repo-settings.png) + +This will create a new GitHub repository, clone and commit the Next.js starter project, then build and deploy your new project to Vercel. + +Once you have been redirected to the `Congratulations` screen, click `Go to Dashboard`. + +Navigate to `Settings`, `Integrations`, then click `Browse Marketplace`. + +Search for `Supabase` and click the Supabase integration. + +![Supabase integration](/img/guides/integrations/vercel/supabase-integration.png) + +Click `Add Integration`. Select your account from the `Vercel Scope` dropdown, and click `CONTINUE`. + +![Choose scope](/img/guides/integrations/vercel/choose-scope.png) + +Choose `Specific Projects` and select your new Vercel project from the dropdown, and click `Add Integration`. + +![Choose project](/img/guides/integrations/vercel/choose-project.png) + +From the Supabase popup, select your new Vercel Project and Supabase project from the dropdowns. + +![Supabase integration](/img/guides/integrations/vercel/link-vercel-to-supabase.png) + +## Step 4: Clone GitHub repo + +The fastest way to get this project running locally is to clone the repo that Vercel created for us. + +Navigate back to the Vercel project `Overview` page, and click `View Git Repository`. + +![Vercel Project Dashboard](/img/guides/integrations/vercel/vercel-project-dashboard.png) + +This will open the GitHub repo. From here, click the arrow next to `Code` and copy the url from the dropdown. + +![GitHub repo url](/img/guides/integrations/vercel/github-project-url.png) + +Open a terminal window or CLI and run the following command to clone the GitHub repo. + +```bash +git clone your-repo-url.git +``` + +Open the project in your code editor of choice, and update the contents of `pages/index.js` to the following: + +```jsx +import styles from '../styles/Home.module.css' + +export default function Home() { + return
working
+} +``` + +Run a local development server. + +```bash +npm run dev +``` + +Navigate to `http://localhost:3000` to confirm the project is "working". + +## Step 4: Pull environment variables from Vercel + +First, we need to login to Vercel using their CLI tool. + +```bash +npx vercel login +``` + +This will ask if we are happy to install `vercel`. Type `y` and hit `Enter`. + +We will the need to authenticate Vercel by selecting `Continue with GitHub`. + +This will open a browser window where you need to authenticate with your GitHub account. + +Next, we need to link our Vercel project. + +```bash +npx vercel link +``` + +Step through the prompts to link the Vercel project. + +![Link project from Vercel](/img/guides/integrations/vercel/vercel-link.png) + +Copy the environment variables from our Vercel project. + +```bash +npx vercel env pull +``` + +This will create a `.env` file containing our Supabase environment variables. Rename this file to `.env.local` to automatically ignore it from git. + +## Step 5: Install Supabase.js + +Install the `supabase-js` library. + +```bash +npm i @supabase/supabase-js +``` + +Create a new file called `/utils/supabase.js` and add the following. + +```jsx +import { createClient } from '@supabase/supabase-js' + +export default createClient( + process.env.NEXT_PUBLIC_SUPABASE_URL, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY +) +``` + +Create a new file called `/components/NewTodo.js` and add the following. + +```jsx +import { useState } from 'react' +import supabase from '../utils/supabase' + +export default ({ reload }) => { + const [title, setTitle] = useState('') + + const addTodo = async (e) => { + e.preventDefault() + await supabase.from('todos').insert({ title }) + reload() + setTitle('') + } + + return ( +
+ setTitle(e.target.value)} /> +
+ ) +} +``` + +This component will be responsible for writing a new `todo` to Supabase. + +Let's import our new component in `pages/index.js` and display a list of todos. + +```jsx +import { useState, useEffect } from 'react' +import styles from '../styles/Home.module.css' +import supabase from '../utils/supabase' +import NewTodo from '../components/NewTodo' + +export default function Home() { + const [todos, setTodos] = useState([]) + + const fetchTodos = async () => { + const { data } = await supabase.from('todos').select('*') + setTodos(data) + } + + useEffect(() => { + fetchTodos() + }, []) + + return ( +
+ + {todos.map((todo) => ( +

{todo.title}

+ ))} +
+ ) +} +``` + +## Resources + +- [Vercel official website](https://vercel.com). +- [Vercel blog](https://vercel.com/blog). +- [Vercel docs](https://vercel.com/docs). +- [Vercel Integration docs](https://vercel.com/docs/integrations) diff --git a/web/sidebars.js b/web/sidebars.js index d94dccfc96e..c62b08083eb 100755 --- a/web/sidebars.js +++ b/web/sidebars.js @@ -182,6 +182,17 @@ module.exports = { }, ], }, + { + type: 'category', + label: 'Integrations', + collapsed: false, + items: [ + 'guides/integrations/auth0', + 'guides/integrations/draftbit', + 'guides/integrations/prisma', + 'guides/integrations/vercel', + ], + }, // { // type: 'category', // label: 'Storage', diff --git a/web/spec/dart.yml b/web/spec/dart.yml index b34b9bead79..86880ddc94c 100644 --- a/web/spec/dart.yml +++ b/web/spec/dart.yml @@ -425,6 +425,18 @@ pages: ''') .execute(); ``` + - name: Filtering with inner joins + description: | + If you want to filter a table based on a child table's values you can use the `!inner()` function. For example, if you wanted + to select all rows in a `message` table which belong to a user with the `username` "Jane": + js: | + ```js + final res = await supabase + .from('messages') + .select('*, users!inner(*)') + .eq('users.username', 'Jane') + .execute(); + ``` - name: Querying with count option description: | You can get the number of rows by using the count option. diff --git a/web/spec/supabase.yml b/web/spec/supabase.yml index 6f2056cc3a7..7ddd6b6d092 100644 --- a/web/spec/supabase.yml +++ b/web/spec/supabase.yml @@ -283,7 +283,7 @@ pages: import { createClient } from '@supabase/supabase-js' const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', { - fetch: fetch + fetch: fetch.bind(globalThis) }) ``` @@ -856,6 +856,17 @@ pages: purchaser:purchaser_id ( name ) `) ``` + - name: Filtering with inner joins + description: | + If you want to filter a table based on a child table's values you can use the `!inner()` function. For example, if you wanted + to select all rows in a `message` table which belong to a user with the `username` "Jane": + js: | + ```js + const { data, error } = await supabase + .from('messages') + .select('*, users!inner(*)') + .eq('users.username', 'Jane') + ``` - name: Querying with count option description: | You can get the number of rows by using the count option. diff --git a/web/static/img/guides/integrations/auth0/33kqP4K.png b/web/static/img/guides/integrations/auth0/33kqP4K.png new file mode 100644 index 00000000000..1158cb6fa24 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/33kqP4K.png differ diff --git a/web/static/img/guides/integrations/auth0/ANU4Wez.png b/web/static/img/guides/integrations/auth0/ANU4Wez.png new file mode 100644 index 00000000000..33c0704aec4 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/ANU4Wez.png differ diff --git a/web/static/img/guides/integrations/auth0/GdXS013.png b/web/static/img/guides/integrations/auth0/GdXS013.png new file mode 100644 index 00000000000..a5ee5ef69a9 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/GdXS013.png differ diff --git a/web/static/img/guides/integrations/auth0/IYzHxeW.png b/web/static/img/guides/integrations/auth0/IYzHxeW.png new file mode 100644 index 00000000000..ec2a54f7841 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/IYzHxeW.png differ diff --git a/web/static/img/guides/integrations/auth0/M7XyhHe.png b/web/static/img/guides/integrations/auth0/M7XyhHe.png new file mode 100644 index 00000000000..694f54ff79d Binary files /dev/null and b/web/static/img/guides/integrations/auth0/M7XyhHe.png differ diff --git a/web/static/img/guides/integrations/auth0/XgEMwnN.png b/web/static/img/guides/integrations/auth0/XgEMwnN.png new file mode 100644 index 00000000000..2a85f0c3af1 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/XgEMwnN.png differ diff --git a/web/static/img/guides/integrations/auth0/YdBKRy6.png b/web/static/img/guides/integrations/auth0/YdBKRy6.png new file mode 100644 index 00000000000..979720ce868 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/YdBKRy6.png differ diff --git a/web/static/img/guides/integrations/auth0/dLOvhdq-1.png b/web/static/img/guides/integrations/auth0/dLOvhdq-1.png new file mode 100644 index 00000000000..baa9fdc2326 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/dLOvhdq-1.png differ diff --git a/web/static/img/guides/integrations/auth0/dLOvhdq.png b/web/static/img/guides/integrations/auth0/dLOvhdq.png new file mode 100644 index 00000000000..baa9fdc2326 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/dLOvhdq.png differ diff --git a/web/static/img/guides/integrations/auth0/iSA3E0J.png b/web/static/img/guides/integrations/auth0/iSA3E0J.png new file mode 100644 index 00000000000..666ad012ac7 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/iSA3E0J.png differ diff --git a/web/static/img/guides/integrations/auth0/mEhHAWC.png b/web/static/img/guides/integrations/auth0/mEhHAWC.png new file mode 100644 index 00000000000..e8aca555121 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/mEhHAWC.png differ diff --git a/web/static/img/guides/integrations/auth0/o07FaoV.png b/web/static/img/guides/integrations/auth0/o07FaoV.png new file mode 100644 index 00000000000..4aabb218006 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/o07FaoV.png differ diff --git a/web/static/img/guides/integrations/auth0/qnmJEU7.png b/web/static/img/guides/integrations/auth0/qnmJEU7.png new file mode 100644 index 00000000000..d6daf31eecd Binary files /dev/null and b/web/static/img/guides/integrations/auth0/qnmJEU7.png differ diff --git a/web/static/img/guides/integrations/auth0/r1GAfLo.png b/web/static/img/guides/integrations/auth0/r1GAfLo.png new file mode 100644 index 00000000000..2bfe6a9c68b Binary files /dev/null and b/web/static/img/guides/integrations/auth0/r1GAfLo.png differ diff --git a/web/static/img/guides/integrations/auth0/tPu4Tt8.png b/web/static/img/guides/integrations/auth0/tPu4Tt8.png new file mode 100644 index 00000000000..ffb2f78b6a8 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/tPu4Tt8.png differ diff --git a/web/static/img/guides/integrations/auth0/tbvd0Uj.png b/web/static/img/guides/integrations/auth0/tbvd0Uj.png new file mode 100644 index 00000000000..0f323f1b4f9 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/tbvd0Uj.png differ diff --git a/web/static/img/guides/integrations/auth0/wuWz3am.png b/web/static/img/guides/integrations/auth0/wuWz3am.png new file mode 100644 index 00000000000..c506f369373 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/wuWz3am.png differ diff --git a/web/static/img/guides/integrations/auth0/xLRL7S7.png b/web/static/img/guides/integrations/auth0/xLRL7S7.png new file mode 100644 index 00000000000..53527c9b3d8 Binary files /dev/null and b/web/static/img/guides/integrations/auth0/xLRL7S7.png differ diff --git a/web/static/img/guides/integrations/draftbit/authheader.png b/web/static/img/guides/integrations/draftbit/authheader.png new file mode 100644 index 00000000000..c8b2b0c7c1f Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/authheader.png differ diff --git a/web/static/img/guides/integrations/draftbit/ctree.png b/web/static/img/guides/integrations/draftbit/ctree.png new file mode 100644 index 00000000000..cc1ade28a6d Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/ctree.png differ diff --git a/web/static/img/guides/integrations/draftbit/delete.gif b/web/static/img/guides/integrations/draftbit/delete.gif new file mode 100644 index 00000000000..bc8a27abb27 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/delete.gif differ diff --git a/web/static/img/guides/integrations/draftbit/deleteapirequest.gif b/web/static/img/guides/integrations/draftbit/deleteapirequest.gif new file mode 100644 index 00000000000..5fc85f42a3e Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/deleteapirequest.gif differ diff --git a/web/static/img/guides/integrations/draftbit/endpoint.png b/web/static/img/guides/integrations/draftbit/endpoint.png new file mode 100644 index 00000000000..99ecd0d6bc3 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/endpoint.png differ diff --git a/web/static/img/guides/integrations/draftbit/fetchall.gif b/web/static/img/guides/integrations/draftbit/fetchall.gif new file mode 100644 index 00000000000..8004538c9d9 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/fetchall.gif differ diff --git a/web/static/img/guides/integrations/draftbit/fetchsingle.png b/web/static/img/guides/integrations/draftbit/fetchsingle.png new file mode 100644 index 00000000000..44051de9f21 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/fetchsingle.png differ diff --git a/web/static/img/guides/integrations/draftbit/get-request.gif b/web/static/img/guides/integrations/draftbit/get-request.gif new file mode 100644 index 00000000000..fb6500dd544 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/get-request.gif differ diff --git a/web/static/img/guides/integrations/draftbit/getsingle.gif b/web/static/img/guides/integrations/draftbit/getsingle.gif new file mode 100644 index 00000000000..934ae30a06d Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/getsingle.gif differ diff --git a/web/static/img/guides/integrations/draftbit/patch.gif b/web/static/img/guides/integrations/draftbit/patch.gif new file mode 100644 index 00000000000..623b5614379 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/patch.gif differ diff --git a/web/static/img/guides/integrations/draftbit/patchapirequest.png b/web/static/img/guides/integrations/draftbit/patchapirequest.png new file mode 100644 index 00000000000..3963e3888b5 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/patchapirequest.png differ diff --git a/web/static/img/guides/integrations/draftbit/postapirequest.png b/web/static/img/guides/integrations/draftbit/postapirequest.png new file mode 100644 index 00000000000..ba5334a09e6 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/postapirequest.png differ diff --git a/web/static/img/guides/integrations/draftbit/postrequest.gif b/web/static/img/guides/integrations/draftbit/postrequest.gif new file mode 100644 index 00000000000..ba41851eb3a Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/postrequest.gif differ diff --git a/web/static/img/guides/integrations/draftbit/prepopulated-database.png b/web/static/img/guides/integrations/draftbit/prepopulated-database.png new file mode 100644 index 00000000000..db3ad5cbf1a Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/prepopulated-database.png differ diff --git a/web/static/img/guides/integrations/draftbit/service.png b/web/static/img/guides/integrations/draftbit/service.png new file mode 100644 index 00000000000..c145dd53d1f Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/service.png differ diff --git a/web/static/img/guides/integrations/draftbit/textinput.png b/web/static/img/guides/integrations/draftbit/textinput.png new file mode 100644 index 00000000000..794d58fd9d6 Binary files /dev/null and b/web/static/img/guides/integrations/draftbit/textinput.png differ diff --git a/web/static/img/guides/integrations/prisma/7y4qq4wwvfrheti6r09u.png b/web/static/img/guides/integrations/prisma/7y4qq4wwvfrheti6r09u.png new file mode 100644 index 00000000000..7602fd2f152 Binary files /dev/null and b/web/static/img/guides/integrations/prisma/7y4qq4wwvfrheti6r09u.png differ diff --git a/web/static/img/guides/integrations/prisma/w0oowg8vq435ob5c3gf0.png b/web/static/img/guides/integrations/prisma/w0oowg8vq435ob5c3gf0.png new file mode 100644 index 00000000000..9bfb34db474 Binary files /dev/null and b/web/static/img/guides/integrations/prisma/w0oowg8vq435ob5c3gf0.png differ diff --git a/web/static/img/guides/integrations/prisma/zntcsh3ic91gf1gy8j73.png b/web/static/img/guides/integrations/prisma/zntcsh3ic91gf1gy8j73.png new file mode 100644 index 00000000000..817a4f8d1b2 Binary files /dev/null and b/web/static/img/guides/integrations/prisma/zntcsh3ic91gf1gy8j73.png differ diff --git a/web/static/img/guides/integrations/vercel/choose-project.png b/web/static/img/guides/integrations/vercel/choose-project.png new file mode 100644 index 00000000000..530ede3f217 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/choose-project.png differ diff --git a/web/static/img/guides/integrations/vercel/choose-scope.png b/web/static/img/guides/integrations/vercel/choose-scope.png new file mode 100644 index 00000000000..cd01bf47838 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/choose-scope.png differ diff --git a/web/static/img/guides/integrations/vercel/clone-next-js-template.png b/web/static/img/guides/integrations/vercel/clone-next-js-template.png new file mode 100644 index 00000000000..0a6987e2c55 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/clone-next-js-template.png differ diff --git a/web/static/img/guides/integrations/vercel/create-supabase-project.png b/web/static/img/guides/integrations/vercel/create-supabase-project.png new file mode 100644 index 00000000000..bafa3f40076 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/create-supabase-project.png differ diff --git a/web/static/img/guides/integrations/vercel/create-vercel-project.png b/web/static/img/guides/integrations/vercel/create-vercel-project.png new file mode 100644 index 00000000000..bc799859433 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/create-vercel-project.png differ diff --git a/web/static/img/guides/integrations/vercel/github-project-url.png b/web/static/img/guides/integrations/vercel/github-project-url.png new file mode 100644 index 00000000000..5e855935f23 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/github-project-url.png differ diff --git a/web/static/img/guides/integrations/vercel/link-vercel-to-supabase.png b/web/static/img/guides/integrations/vercel/link-vercel-to-supabase.png new file mode 100644 index 00000000000..b4da05efe2a Binary files /dev/null and b/web/static/img/guides/integrations/vercel/link-vercel-to-supabase.png differ diff --git a/web/static/img/guides/integrations/vercel/repo-settings.png b/web/static/img/guides/integrations/vercel/repo-settings.png new file mode 100644 index 00000000000..7b96f4b3a1a Binary files /dev/null and b/web/static/img/guides/integrations/vercel/repo-settings.png differ diff --git a/web/static/img/guides/integrations/vercel/supabase-integration.png b/web/static/img/guides/integrations/vercel/supabase-integration.png new file mode 100644 index 00000000000..0a1f0ba5f3c Binary files /dev/null and b/web/static/img/guides/integrations/vercel/supabase-integration.png differ diff --git a/web/static/img/guides/integrations/vercel/vercel-link.png b/web/static/img/guides/integrations/vercel/vercel-link.png new file mode 100644 index 00000000000..1b0961c2160 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/vercel-link.png differ diff --git a/web/static/img/guides/integrations/vercel/vercel-project-dashboard.png b/web/static/img/guides/integrations/vercel/vercel-project-dashboard.png new file mode 100644 index 00000000000..cca9931a856 Binary files /dev/null and b/web/static/img/guides/integrations/vercel/vercel-project-dashboard.png differ diff --git a/www/_blog/2021-07-30-supabase-functions-updates.mdx b/www/_blog/2021-07-30-supabase-functions-updates.mdx index df791a18484..37e7c281c3d 100644 --- a/www/_blog/2021-07-30-supabase-functions-updates.mdx +++ b/www/_blog/2021-07-30-supabase-functions-updates.mdx @@ -149,7 +149,7 @@ http_post After making a request, the extension will return an ID. You can use this ID to collect a response. -```sql noCopy +```sql hideCopy -- Collect the response from a request select * @@ -207,7 +207,7 @@ To build asynchronous behavior, we use a PostgreSQL [background worker](https:// Shout out to [Paul Ramsey](https://github.com/pramsey), who gave us the implementation idea in [pgsql-http](https://github.com/pramsey/pgsql-http/#to-do). While we originally hoped to add background workers to his extension, the implementation became too cumbersome and we decided to start with a clean slate. The advantage of being async can be seen by making some requests with both extensions: -```sql noCopy +```sql hideCopy \timing on -- using pgsql-http to fetch from "supabase.io" 10 times diff --git a/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx b/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx index f40ef687111..c2c2023f558 100644 --- a/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx +++ b/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx @@ -5,8 +5,8 @@ author: paul_copplestone author_url: https://github.com/kiwicopple author_image_url: https://github.com/kiwicopple.png authorURL: https://github.com/kiwicopple -image: launch-week-3/launch-week-3-og.jpg -thumb: launch-week-3/launch-week-3-thumb.jpg +image: launch-week-three/launch-week-three-og.jpg +thumb: launch-week-three/launch-week-three-thumb.jpg tags: - launch-week date: '2021-11-26' @@ -37,7 +37,9 @@ Last Launch Week we introduced the idea of Community Day - a day where we shine ### Where? -Blog post coming soon. Follow our [Twitter](https://twitter.com/supabase) to get notified immediately. +Read the [blog post](https://supabase.com/blog/2021/11/29/community-day). + +Tune in on [Twitter Spaces](https://twitter.com/i/spaces/1YqKDqYXQnLGV) at 7am PT! ## Tuesday: Dashboard Surprise diff --git a/www/_blog/2021-11-28-postgrest-9.mdx b/www/_blog/2021-11-28-postgrest-9.mdx new file mode 100644 index 00000000000..7819633d562 --- /dev/null +++ b/www/_blog/2021-11-28-postgrest-9.mdx @@ -0,0 +1,109 @@ +--- +title: 'PostgREST 9' +description: New features and updates in PostgREST version 9. +author: steve_chavez +author_url: https://github.com/steve-chavez +author_image_url: https://github.com/steve-chavez.png +authorURL: https://github.com/steve-chavez +image: launch-week-three/community-day/supabase-oss.jpg +thumb: launch-week-three/community-day/supabase-oss.jpg +tags: + - launch-week + - release-notes + - tech + - community +date: '2021-11-27' +toc_depth: 2 +--- + + +PostgREST turns your PostgreSQL database automatically into a RESTful API. Today, PostgREST 9 was [released](https://postgrest.org/en/v9.0/releases/v9.0.0.html). Let's take a look at some of the new features. + +## Inner Joins + +PostgREST 9 brings a [much-requested feature](https://github.com/supabase/postgrest-js/issues/197): the ability to do `inner joins`. + +Here's an example with `supabase-js`: + +```js hideCopy +const { data, error } = await supabase + .from('messages') + .select('*, users!inner(*)') + .eq('users.username', 'Jane') +``` + +With the new `!inner` keyword, you can now filter rows of the top-level table (`messages`) based on a filter (`eq`) of the embedded table (`users`). +This works across all Supabase client libraries and you can use it with any of the available operators (`gt`, `in`, etc.) + +[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#resource-embedding-with-top-level-filtering). + +## Functions with unnamed parameters + +You can now make `POST` requests to functions with a single unnamed parameter. This is particularly useful for webhooks that send JSON payloads. + +For example, imagine you were using Postmark as an email provider and you wanted to save email bounces using their [bounce webhook](https://postmarkapp.com/developer/webhooks/bounce-webhook). +Previously this wouldn't be possible with PostgREST, as every function required a named parameter. + +As of PostgREST 9, this is possible. +Simply create a function inside your PostgreSQL database to receive the raw JSON: + +```sql hideCopy +create function store_bounces(json) +returns json +language sql +as $$ + insert into bounces (webhook_id, email) + values ( + ($1->>'ID')::bigint, + ($1->>'Email')::text + ); + + select '{ "status": 200 }'::json; +$$; +``` + +And the webhook can send data directly to your database via an `rpc` call: + +```bash hideCopy +POST https://.supabase.co/rest/v1/rpc/store_bounces HTTP/1.1 +Content-Type: application/json + +{ + "RecordType": "Bounce", + "MessageStream": "outbound", + "ID": 4323372036854775807, + "Type": "HardBounce", + "MessageID": "883953f4-6105-42a2-a16a-77a8eac79483", + "Description": "The server was unable to deliver your message (ex: unknown user, mailbox not found).", + "Details": "Test bounce details", + "Email": "john@example.com", + "From": "sender@example.com", + "BouncedAt": "2019-11-05T16:33:54.9070259Z" +} +``` + +[Read more](https://postgrest.org/en/v9.0/api.html#s-proc-single-unnamed). + + +## PostgreSQL 14 compatibility + +If you've ever done your own custom `auth` functions using PostgREST [HTTP Context](https://postgrest.org/en/v8.0/api.html#accessing-request-headers-cookies-and-jwt-claims), +note that a breaking change was necessary for PostgreSQL 14 Compatibility. You'll need to update them: + + +| `From` | `To` | +| --- | --- | +| `current_setting('request.jwt.claim.custom-claim', true)` | `current_setting('request.jwt.claims', true)::json->>'custom-claim'` | +| `current_setting('request.header.custom-header', true)` | `current_setting('request.headers', true)::json->>'custom-header'` | + + +If you only use Supabase default `auth` functions(`auth.email()`, `auth.uid()`, `auth.role()`), then no action is required because we have updated the functions to handle these changes transparently. + +[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#postgresql-14-compatibility). + +## Release notes + +There are a lot more improvements released in PostgREST 9, including [support for Partitioned Tables](https://postgrest.org/en/v9.0/releases/v9.0.0.html#partitioned-tables), +[improved doc](https://postgrest.org/en/v9.0/releases/v9.0.0.html#documentation-improvements), and [bug fixes](https://postgrest.org/en/v9.0/releases/v9.0.0.html#bug-fixes). + +You can see the full updates on the [PostgREST 9 release notes](https://postgrest.org/en/v9.0/releases/v9.0.0.html). \ No newline at end of file diff --git a/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx b/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx new file mode 100644 index 00000000000..a0afa49599a --- /dev/null +++ b/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx @@ -0,0 +1,166 @@ +--- +title: 'New in PostgreSQL 14: What every developer should know' +description: 'A quick look at some new features and functionality in PostgreSQL 14.' +author: gurjeet +author_url: https://github.com/gurjeet +author_image_url: https://github.com/gurjeet.png +authorURL: https://github.com/gurjeet +image: whats-new-in-postgres-14/whats-new-in-postgres-14-og.png +thumb: whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png +tags: + - tech +date: '2021-11-28' +toc_depth: 3 +--- + +Every web developer knows the importance of choosing a suitable database for building modern apps. +Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years, +relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future. +Among the many open-source relational databases available, [PostgreSQL](https://supabase.com/docs/guides/database/introduction) is a popular choice among developers. +It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by +DBEnginges, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps. + +This blog will highlight some key features of the newly available PostgreSQL 14, which every developer can benefit from. So, let's dive right in. + +## Complex data type support + +### JSON subscripting + +PostgreSQL continues to add innovations for complex data types, making JSON data more accessible. In postgreSQL 14, developers can use subscripts to iterate through JSON key pairs and fetch corresponding values. For example, using this capability, nested JSON fields can be quickly traversed to retrieve values to reconstruct application objects. + +```sql hideCopy +select ( + '{ "PostgreSQL": { "release": 14 }}'::jsonb +)['PostgreSQL']['release']; + + jsonb +------- + 14 +``` + +### Working with disjointed data ranges + +In the real world, data ranges are pretty common. For example, if you have sensor readings going into a PostgreSQL database, you may want to define a range for +low, medium, and high metrics. Before version 14, you could set data ranges for integers, numerics, timestamps, and other data types. +However, these ranges had to be contiguous, and it required multiple insert records across the different ranges. +In PostgreSQL 14, a single insert statement can be used to map data across multiple noncontiguous ranges. Let's check it out with an example. + +First, create an enum data type to capture low, medium, and high sensor reading levels. + +```sql hideCopy +create type valid_levels as enum ( + 'low', 'medium', 'high' +); +``` + +To store sensor reading metric data, create a table consisting of the sensor description, the level and the range of timestamps when the sensor was at that level. + +```sql hideCopy +create table sensor_range ( + reading_id serial primary key, + metric_desc varchar(100), + metric_level valid_levels, + metric_ts tsmultirange +); +``` + +Now, insert some data into the table. Note that, the insert statement below provides two time ranges that are not contiguous. + +```sql hideCopy +insert into sensor_range ( + metric_desc, + metric_level, + metric_ts +) +values ( + 'Temperature', + 'high', + '{[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]}' +); + +insert into sensor_range ( + metric_desc, + metric_level, + metric_ts +) +values ( + 'Temperature', + 'low', + '{[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]}' +); +``` + +Query the data in the table to see the inserted data rows + +```sql hideCopy +select * +from sensor_range; +``` + +``` hideCopy +| `reading_id` | `metric_desc` | `metric_level` | `metric_ts` | +|--------------|---------------|----------------|-----------------------------------------------------------------------------| +| 1 | Temperature | high | {[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]} | +| 2 | Temperature | low | {[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]} | +``` + +## Improved performance and monitoring + +### Query pipelining + +If you're a developer accessing PostgreSQL using a high-level programming language, the database driver you're using is likely based on a C library called libpq. For example, suppose your application performs several write operations within a short period, or your network has a higher latency. In that case, you may want to fire off several queries over the same network connection simultaneously, so you don't have to wait for a reply after each query. Under the hood, libpq can send multiple queries to PostgreSQL while maintaining a queue of queries that are waiting for results. This queue consumes additional memory on both the client and server. Developers can now take advantage of PostgreSQL 14's client-side query pipeline mode using clients built on top of the latest libpq library to accelerate app performance. + +Aside from query pipelining, the latest PostgreSQL 14 release brings several other enhancements to query parallelism, including improved performance of parallel sequential scans, parallel query execution capabilities for Foreign Data Wrappers, and the ability to run parallel queries when refreshing materialized views. With this, your PostgreSQL server can now do more work for you at a lower cost. + +### Monitoring and troubleshooting queries + +Ask any database troubleshooting expert, and they will tell you that without a way to correlate data across different database components, investigating and monitoring query-related issues can quickly become a nightmare. When it comes to PostgreSQL, the SQL statement’s query_id can be used for this purpose, allowing database experts an easy way to identify workload patterns quickly, detect rogue run-away or slow queries, and common query-related issues. Before PostgreSQL 14, this information was only available using the pg_stat_statements [extension](https://supabase.com/docs/guides/database/extensions), which shows aggregate statistics about queries that have finished executing, but now this information is additionally available for live running queries with pg_stat_activity, in the EXPLAIN VERBOSE statement, and log files. +An example of using query_id IN EXPLAIN (VERBOSE) statement + +Start by altering the system to enable the query_id + +```sql hideCopy +alter system set compute_query_id = 'on'; +``` + +Restart the PostgreSQL database for the alter system statement to take effect. + +Run the following query that selects schema and table names from the catalog tables + +```sql hideCopy +explain (verbose, costs off) +select schemaname, tablename +from pg_tables, pg_sleep(5) +where schemaname <> 'pg_catalog'; +``` + +View the result of the EXPLAIN statement + +![View the result of the EXPLAIN statement](/images/blog/whats-new-in-postgres-14/explain-statement.png) + +Notice that the query identifier is in the output:
+`Query Identifier: 4856400161806292488` + +## Enhanced security + +Security remains top of mind for every organization, and PostgreSQL 14 brings some critical enhancements in this area. + +Have you ever wanted to [manage database user access](https://supabase.com/docs/guides/auth/managing-user-data) so that only specific individuals have read-only access? For example, consider a situation where you would like to host some sample data online for a demo and not allow demo users to modify or delete data. With the latest PostgreSQL version 14, you can easily set that up using a single GRANT statement. + +```sql hideCopy +grant pg_read_all_data to bobfries; +``` + +From an authentication perspective, if you're still managing passwords in the database without [third-party login providers](https://supabase.com/docs/guides/auth#third-party-logins), +you may want to read this. Since version 10, PostgreSQL supports several different hashing mechanisms such as MD5 and SCRAM-SHA-256 to store user passwords on disk. +However, to keep up with the [latest security weaknesses around MD5](https://en.wikipedia.org/wiki/MD5#Security) and meet regulatory compliance requirements, +PostgreSQL 14 has made SCRAM-SHA-256 the default password management mechanism. So, if you are using old PostgreSQL client software, +you may want to update it, to be able to connect to the newer versions of the database server. + +## It's only the tip of the iceberg + +Indeed, there's a lot more to explore in the latest PostgreSQL, and we've barely scratched the surface of what PostgreSQL 14 has to offer. +There's no better way to experience some of these features than by trying them out for yourself. +You can check out these new features within your Supabase project without having to perform a local installation. + +Explore the [Supabase dashboard now](https://app.supabase.io) and get started with your new project. diff --git a/www/_blog/2021-11-29-community-day.mdx b/www/_blog/2021-11-29-community-day.mdx new file mode 100644 index 00000000000..ea690d26e7f --- /dev/null +++ b/www/_blog/2021-11-29-community-day.mdx @@ -0,0 +1,136 @@ +--- +title: 'Community Day' +description: Kicking off launch week by highlighting the communities around Supabase. +author: thor_schaeff +author_url: https://github.com/thorwebdev +author_image_url: https://github.com/thorwebdev.png +authorURL: https://github.com/thorwebdev +image: launch-week-three/community-day/supabase-oss.jpg +thumb: launch-week-three/community-day/supabase-oss.jpg +tags: + - launch-week + - community +date: '2021-11-29' +toc_depth: 2 +--- + +Supabase combines existing open-source tools with our own open-source contributions to provide a delightful experience for developers. As part of this goal we hope to build a community of communities, bringing together developers from many different tools, as well as new developers looking to get involved with open source. + +To kick off launch week we want to showcase some of the communities that make up the Supabase community, highlight some of their updates, and celebrate everyone who contributes their time to the Supabase mission. + +So let's get cracking, we've got a lot to cover. 🚀 + +## Open Source Spotlight: Kong API Gateway + +Supabase provides a whole bunch of features that are made up of a [collection of open-source tools](/docs/architecture). To orchestrate these different services and functionalities we use the [Kong API Gateway](https://github.com/Kong/kong). + +As a user of our hosted offering you don't really need to know all this, but we love showcasing the amazing open-source tools that we work with, and so we've invited [Vik Gamov](https://twitter.com/gAmUssA) to give you a little intro to [Kong](https://github.com/Kong/kong): + + + +## PostgreSQL 14 updates + +![Postgres-14](/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png) + +Every web developer knows the importance of choosing a suitable database for building modern apps. +Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years, +relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future. +Among the many open-source relational databases available, [PostgreSQL](/docs/guides/database/introduction) is a popular choice among developers. +It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by +DBEnginges, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps. + +[Gurjeet](https://twitter.com/0xGurjeet), one of our Postgres engineers, has written up a [blogpost](/blog/2021/11/28/whats-new-in-postgres-14) with the most important updates the every dev should know. + +## PostgREST 9 updates + +![PostgREST-9](/images/blog/launch-week-three/community-day/postgrest-9-og.png) + +We've had a lot of feedback on our Postgres APIs, and we've been hard at work with the [PostgREST team](https://github.com/orgs/PostgREST/people) to improve an already-incredible product. + +Some new features include + +- Inner Joins +- Functions with unnamed parameters +- PostgreSQL 14 compatibility + +From tomorrow, every Supabase project will be on PostgREST 9 (including existing projects). + +Read about some of the new features in PostgREST 9 [here](/blog/2021/11/28/postgrest-9). + +## New community partner: GitGuardian + +![gitguardian-supabase-partnership.jpeg](/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg) + +[As you (hopefully) know](/docs/learn/auth-deep-dive/auth-deep-dive-jwts#jwts-in-supabase), keeping your service role key secret is a crucial part of securing your database. But we also know that it can be difficult to make sure it stays secret as your team grows and you don't accidentally leak it. To help you with this, [we've partnered with GitGuardian](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/). + +GitGuardian helps developers keep 250+ types of secrets out of source code. Their automated secrets detection and remediation solution secures every step of the development life cycle, helping you monitor your code for sensitive data. Read [their blog post](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/) to learn more. + +## Auth updates + +![new-oauth-providers.jpg](/images/blog/launch-week-three/community-day/new-oauth-providers.jpg) + +The beauty of building in the open is that the community can get involved in adding new OAuth providers, which is exactly what [@TheHarryET](https://twitter.com/TheHarryET) and [MonsterDeveloper](https://github.com/MonsterDeveloper) have been doing. Thanks to them you can now provide sign-in with [Slack](/docs/guides/auth/auth-slack) as well as [Spotify](/docs/guides/auth/auth-spotify) to your users, as well as use [MessageBird](/docs/guides/auth/auth-messagebird) for phone auth as an alternative to the existing [Twilio](/docs/guides/auth/auth-twilio) integration. + +## SupaSquad updates + +The [SupaSquad](/docs/handbook/supasquad) is an official Supabase advocate program where community members help build and manage the Supabase community. + +Among many other awesome things, the SupaSquad has been absolutely on fire building [client libraries](/docs/reference/javascript/supabase-client) for all flavors of backends and environments. + +![client-libs.jpg](/images/blog/launch-week-three/community-day/client-libs.jpg) + +### Python client library updates + +- New maintainers [`@Dreinon`](https://github.com/dreinon), [`@anand2312`](https://github.com/anand2312), and [`@leynier`](https://github.com/leynier). 💚 +- `gotrue-py` rewritten and now at feature parity with `gotrue-js`. +- Postgrest-py now support synchronous operations as well instead of just synchronous operations in the past. Also at feature-parity with postgrest-js. +- Supabase-py is now Supabase (e.g. you do `pip3 install supabase` instead of `pip3 install supabase-py`). +- Storage is working for the py client library but it's yet to be extracted out as a standalone lib. + +## New tutorials and integration guides + +Our own [Jon Meyers](https://twitter.com/_dijonmusters) and the broader community have been busy creating awesome tutorials and integration guides to help everyone build even more amazing things with Supabase: + +- Jon has added official guides for working with [Auth0](/docs/guides/integrations/auth0) and [Vercel](/docs/guides/integrations/vercel), +- [Jonny Summers-Muir](https://twitter.com/JSummersMuir) has been busy paving the way for [Prisma](/docs/guides/integrations/prisma), and +- [Aman Mittal](https://github.com/amandeepmittal) has hooked us up with a guide for [Draftbit](/docs/guides/integrations/draftbit)! + +And below are some of the community one's we've come across recently. If you've created one yourself, please notify us by tagging us in a Tweet! + +- [Supabase & Sveltekit - Build Twitter in 75 minutes](https://youtu.be/mPQyckogDYc) +- [Supabase Auth With Next.Js 12 Middleware](https://jitsu.com/blog/supabase-nextjs-middleware#what-were-going-to-build) +- [Vue 3 & Supabase | Workout Tracker App](https://www.youtube.com/watch?v=3tF0fGkd4ho) +- [Use Supabase Auth with Vue.js 3](https://vueschool.io/articles/vuejs-tutorials/use-supabase-auth-with-vue-js-3/) +- [Dynamic Jamstack with Stencil and Supabase](https://ionicframework.com/blog/dynamic-jamstack-with-stencil-and-supabase) + +## Developer stories + +Anytime we scroll through [madewithsupabase.com](https://www.madewithsupabase.com/) we're absolutely blown away by the awesome things y'all are building with Supabase. + +So we reached out to some of our users, requesting a short video to learn more and we were overwhelmed with your gracious submissions. We've started a user stories playlist and we are so excited to see many more of these stories in the future. 💚 + + + +And with that, we officially declare Launch Week as open 🥳 Check back [here](/blog) every day this week to see what new things we are shipping. We can't wait to share them with you 🚀 + +## Want even more Supabase in your life? + +![tiktok.png](/images/blog/launch-week-three/community-day/tiktok.png) + +We've got some stellar swag drops and behind the scenes footage for you on our new [TikTok page](https://www.tiktok.com/@supabase.com). Make sure to follow us there as we'll be giving away some swag randomly to 10 peeps who follow us during launch week! \ No newline at end of file diff --git a/www/lib/authors.json b/www/lib/authors.json index 6d237686310..80f65287107 100644 --- a/www/lib/authors.json +++ b/www/lib/authors.json @@ -82,5 +82,12 @@ "position": "Engineering", "username": "darora", "author_image_url": "https://github.com/darora.png" + }, + "gurjeet": { + "author": "Gurjeet Singh", + "author_url": "https://github.com/gurjeet", + "position": "Engineering", + "username": "gurjeet", + "author_image_url": "https://github.com/gurjeet.png" } } diff --git a/www/pages/auth/Auth.tsx b/www/pages/auth/Auth.tsx index 1049b4b0947..ba7f21d798c 100644 --- a/www/pages/auth/Auth.tsx +++ b/www/pages/auth/Auth.tsx @@ -119,6 +119,13 @@ function AuthPage() { + + + + + + +

All the social providers diff --git a/www/public/images/blog/launch-week-three/community-day/client-libs.jpg b/www/public/images/blog/launch-week-three/community-day/client-libs.jpg new file mode 100644 index 00000000000..ebcc7f7f85f Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/client-libs.jpg differ diff --git a/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg b/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg new file mode 100644 index 00000000000..f71e5ccd910 Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg differ diff --git a/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg b/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg new file mode 100644 index 00000000000..95219ee34b2 Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg differ diff --git a/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png b/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png new file mode 100644 index 00000000000..09eaecf8f8e Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png differ diff --git a/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png b/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png new file mode 100644 index 00000000000..b5008e00eb3 Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png differ diff --git a/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg b/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg new file mode 100644 index 00000000000..5c00cb91094 Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg differ diff --git a/www/public/images/blog/launch-week-three/community-day/tiktok.png b/www/public/images/blog/launch-week-three/community-day/tiktok.png new file mode 100644 index 00000000000..bdc723f3edf Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/tiktok.png differ diff --git a/www/public/images/blog/launch-week-three/launch-week-three-og.jpg b/www/public/images/blog/launch-week-three/launch-week-three-og.jpg new file mode 100644 index 00000000000..dcaece66ea8 Binary files /dev/null and b/www/public/images/blog/launch-week-three/launch-week-three-og.jpg differ diff --git a/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg b/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg new file mode 100644 index 00000000000..dcaece66ea8 Binary files /dev/null and b/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg differ diff --git a/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png b/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png new file mode 100644 index 00000000000..a23780b8252 Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png differ diff --git a/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png new file mode 100644 index 00000000000..b857fb4b808 Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png differ diff --git a/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png new file mode 100644 index 00000000000..24c97250f06 Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png differ diff --git a/www/public/images/product/auth/apple-icon.svg b/www/public/images/product/auth/apple-icon.svg new file mode 100644 index 00000000000..3902c024ec0 --- /dev/null +++ b/www/public/images/product/auth/apple-icon.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/www/public/images/product/auth/discord-icon.svg b/www/public/images/product/auth/discord-icon.svg new file mode 100644 index 00000000000..3efe1ec110f --- /dev/null +++ b/www/public/images/product/auth/discord-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/www/public/images/product/auth/messagebird-icon.svg b/www/public/images/product/auth/messagebird-icon.svg new file mode 100644 index 00000000000..b9c98603bc7 --- /dev/null +++ b/www/public/images/product/auth/messagebird-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/public/images/product/auth/microsoft-icon.svg b/www/public/images/product/auth/microsoft-icon.svg new file mode 100644 index 00000000000..5334aa7ca68 --- /dev/null +++ b/www/public/images/product/auth/microsoft-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/public/images/product/auth/slack-icon.svg b/www/public/images/product/auth/slack-icon.svg new file mode 100644 index 00000000000..69a4eb6a217 --- /dev/null +++ b/www/public/images/product/auth/slack-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/public/images/product/auth/spotify-icon.svg b/www/public/images/product/auth/spotify-icon.svg new file mode 100644 index 00000000000..41d8137620f --- /dev/null +++ b/www/public/images/product/auth/spotify-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/public/images/product/auth/twilio-icon.svg b/www/public/images/product/auth/twilio-icon.svg new file mode 100644 index 00000000000..76d12c7164a --- /dev/null +++ b/www/public/images/product/auth/twilio-icon.svg @@ -0,0 +1 @@ + diff --git a/www/public/images/product/auth/twitch-icon.svg b/www/public/images/product/auth/twitch-icon.svg new file mode 100644 index 00000000000..ee4a95fbf02 --- /dev/null +++ b/www/public/images/product/auth/twitch-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/public/rss.xml b/www/public/rss.xml index 810e78f7a43..787acdd9b85 100644 --- a/www/public/rss.xml +++ b/www/public/rss.xml @@ -5,12 +5,20 @@ https://supabase.com Latest news from Supabase en - Thu, 25 Nov 2021 16:00:00 GMT + Sat, 27 Nov 2021 16:00:00 GMT + + https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14 + New in PostgreSQL 14: What every developer should know + https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14 + A quick look at some new features and functionality in PostgreSQL 14. + Sat, 27 Nov 2021 16:00:00 GMT + + https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy - Supabase Launch Week III: Holiday Special. + Supabase Launch Week III: Holiday Special https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy Tis the season to be shipping. Thu, 25 Nov 2021 16:00:00 GMT @@ -18,7 +26,7 @@ https://supabase.com/blog/2021/11/26/supabase-how-we-launch - How we launch at Supabase. + How we launch at Supabase https://supabase.com/blog/2021/11/26/supabase-how-we-launch The history and methodology of Supabase Launch Week. Thu, 25 Nov 2021 16:00:00 GMT