diff --git a/.gitignore b/.gitignore index c359d50..cf8ef5d 100644 --- a/.gitignore +++ b/.gitignore @@ -42,8 +42,13 @@ yarn-error.log* # WebStorm .idea +# VsCode +.vscode + # PWA public/sw.js public/sw.js.map public/workbox-*.js public/workbox-*.js.map + +.env.production diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 0000000..31c390e --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,43 @@ +# 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=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE +SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q + +# Auth + +## General +SITE_URL=http://localhost:3000 +KONG_URL=http://kong:8000 +META_URL=http://meta:8080 +ADDITIONAL_REDIRECT_URLS= +JWT_EXPIRY=3600 +DISABLE_SIGNUP=false + +## Email auth +ENABLE_EMAIL_SIGNUP=true +ENABLE_EMAIL_AUTOCONFIRM=true +SMTP_ADMIN_EMAIL=admin@example.com +SMTP_HOST=mail +SMTP_PORT=2500 +SMTP_USER=fake_mail_user +SMTP_PASS=fake_mail_password +SMTP_SENDER_NAME=fake_sender + +## Phone auth +ENABLE_PHONE_SIGNUP=false +ENABLE_PHONE_AUTOCONFIRM=false + +# Ports + +## Studio port +STUDIO_PORT=3000 + +## API endpoint ports +KONG_HTTP_PORT=8000 +KONG_HTTPS_PORT=8443 + +## DB port +POSTGRES_PORT=5432 diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 0000000..e5c6762 --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1,5 @@ +volumes/db/data +volumes/db/init/data.sql +volumes/storage +.env +test.http diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..9ab215b --- /dev/null +++ b/docker/README.md @@ -0,0 +1,3 @@ +# Supabase Docker + +This is a minimal Docker Compose setup for self-hosting Supabase. Follow the steps [here](https://supabase.com/docs/guides/hosting/docker) to get started. diff --git a/docker/dev/data.sql b/docker/dev/data.sql new file mode 100644 index 0000000..2328004 --- /dev/null +++ b/docker/dev/data.sql @@ -0,0 +1,48 @@ +create table profiles ( + id uuid references auth.users not null, + updated_at timestamp with time zone, + username text unique, + avatar_url text, + website text, + + primary key (id), + unique(username), + constraint username_length check (char_length(username) >= 3) +); + +alter table profiles enable row level security; + +create policy "Public profiles are viewable by the owner." + on profiles for select + using ( auth.uid() = id ); + +create policy "Users can insert their own profile." + on profiles for insert + with check ( auth.uid() = id ); + +create policy "Users can update own profile." + on profiles for update + using ( auth.uid() = id ); + +-- Set up Realtime +begin; + drop publication if exists supabase_realtime; + create publication supabase_realtime; +commit; +alter publication supabase_realtime add table profiles; + +-- Set up Storage +insert into storage.buckets (id, name) +values ('avatars', 'avatars'); + +create policy "Avatar images are publicly accessible." + on storage.objects for select + using ( bucket_id = 'avatars' ); + +create policy "Anyone can upload an avatar." + on storage.objects for insert + with check ( bucket_id = 'avatars' ); + +create policy "Anyone can update an avatar." + on storage.objects for update + with check ( bucket_id = 'avatars' ); diff --git a/docker/dev/docker-compose.dev.yml b/docker/dev/docker-compose.dev.yml new file mode 100644 index 0000000..49ec4c7 --- /dev/null +++ b/docker/dev/docker-compose.dev.yml @@ -0,0 +1,20 @@ +version: "3.8" + +services: + mail: + container_name: supabase-mail + image: inbucket/inbucket:stable + ports: + - '2500:2500' # SMTP + - '9000:9000' # web interface + - '1100:1100' # POP3 + meta: + ports: + - 5555:8080 + db: + volumes: + - /var/lib/postgresql/data + - ./dev/data.sql:/docker-entrypoint-initdb.d/data.sql + storage: + volumes: + - /var/lib/storage diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 77f10d2..11c206f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,78 +1,159 @@ -version: '3.6' +# Usage +# Start: docker-compose up +# With helpers: docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up +# Stop: docker-compose down +# Destroy: docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml down -v --remove-orphans + +version: "3.8" + services: + studio: + container_name: supabase-studio + image: supabase/studio:latest + restart: unless-stopped + ports: + - ${STUDIO_PORT}:3000/tcp + environment: + SUPABASE_URL: ${KONG_URL} + STUDIO_PG_META_URL: ${META_URL} + SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} + kong: container_name: supabase-kong - build: - context: ./kong + image: kong:2.1 + restart: unless-stopped + ports: + - ${KONG_HTTP_PORT}:8000/tcp + - ${KONG_HTTPS_PORT}:8443/tcp environment: + KONG_DATABASE: "off" KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml - KONG_PLUGINS: request-transformer,cors,key-auth,http-log + # https://github.com/supabase/cli/issues/14 KONG_DNS_ORDER: LAST,A,CNAME - ports: - - 8000:8000/tcp + KONG_PLUGINS: request-transformer,cors,key-auth,acl + volumes: + - ./volumes/api/kong.yml:/var/lib/kong/kong.yml + auth: container_name: supabase-auth - image: supabase/gotrue:latest - environment: - GOTRUE_JWT_SECRET: 1513f583-979d-4f6a-9705-00635b34cc47 - GOTRUE_JWT_EXP: 86400 - GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated - GOTRUE_DB_DRIVER: postgres - DB_NAMESPACE: auth - API_EXTERNAL_URL: localhost - GOTRUE_API_HOST: 0.0.0.0 - PORT: 9999 - GOTRUE_DISABLE_SIGNUP: 'false' - GOTRUE_SITE_URL: localhost - GOTRUE_MAILER_AUTOCONFIRM: 'true' - GOTRUE_LOG_LEVEL: DEBUG - GOTRUE_OPERATOR_TOKEN: super-secret-operator-token - DATABASE_URL: 'postgres://postgres:postgres@db:5432/postgres?sslmode=disable' + image: supabase/gotrue:v1.10.2 depends_on: - db + restart: unless-stopped + environment: + GOTRUE_API_HOST: 0.0.0.0 + GOTRUE_API_PORT: 9999 + + GOTRUE_DB_DRIVER: postgres + GOTRUE_DB_DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/postgres?search_path=auth + + GOTRUE_SITE_URL: ${SITE_URL} + GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS} + GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP} + + GOTRUE_JWT_SECRET: ${JWT_SECRET} + GOTRUE_JWT_EXP: ${JWT_EXPIRY} + GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated + + GOTRUE_EXTERNAL_EMAIL_ENABLED: ${ENABLE_EMAIL_SIGNUP} + GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM} + GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL} + GOTRUE_SMTP_HOST: ${SMTP_HOST} + GOTRUE_SMTP_PORT: ${SMTP_PORT} + GOTRUE_SMTP_USER: ${SMTP_USER} + GOTRUE_SMTP_PASS: ${SMTP_PASS} + GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME} + GOTRUE_MAILER_URLPATHS_INVITE: /auth/v1/verify + GOTRUE_MAILER_URLPATHS_CONFIRMATION: /auth/v1/verify + GOTRUE_MAILER_URLPATHS_RECOVERY: /auth/v1/verify + GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: /auth/v1/verify + + GOTRUE_EXTERNAL_PHONE_ENABLED: ${ENABLE_PHONE_SIGNUP} + GOTRUE_SMS_AUTOCONFIRM: ${ENABLE_PHONE_AUTOCONFIRM} + rest: container_name: supabase-rest - image: postgrest/postgrest:latest + image: postgrest/postgrest:v9.0.0 depends_on: - db - restart: always + restart: unless-stopped environment: - PGRST_DB_URI: postgres://postgres:postgres@db:5432/postgres - PGRST_DB_SCHEMA: public - PGRST_DB_ANON_ROLE: postgres - PGRST_JWT_SECRET: 1513f583-979d-4f6a-9705-00635b34cc47 + PGRST_DB_URI: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/postgres + PGRST_DB_SCHEMAS: public,storage + PGRST_DB_ANON_ROLE: anon + PGRST_JWT_SECRET: ${JWT_SECRET} + PGRST_DB_USE_LEGACY_GUCS: "false" + realtime: container_name: supabase-realtime - image: supabase/realtime:latest + image: supabase/realtime:v0.21.0 depends_on: - db - restart: on-failure + restart: unless-stopped environment: DB_HOST: db + DB_PORT: 5432 DB_NAME: postgres DB_USER: postgres - DB_PASSWORD: postgres - DB_PORT: 5432 + DB_PASSWORD: ${POSTGRES_PASSWORD} + DB_SSL: "false" PORT: 4000 - HOSTNAME: localhost - # Disable JWT Auth locally. The JWT_SECRET will be ignored. - SECURE_CHANNELS: 'false' - JWT_SECRET: 1513f583-979d-4f6a-9705-00635b34cc47 + JWT_SECRET: ${JWT_SECRET} + REPLICATION_MODE: RLS + REPLICATION_POLL_INTERVAL: 100 + SECURE_CHANNELS: "true" + SLOT_NAME: supabase_realtime_rls + TEMPORARY_SLOT: "true" + command: > + bash -c "./prod/rel/realtime/bin/realtime eval Realtime.Release.migrate + && ./prod/rel/realtime/bin/realtime start" + + storage: + container_name: supabase-storage + image: supabase/storage-api:v0.10.0 + depends_on: + - db + - rest + restart: unless-stopped + environment: + 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 + PGOPTIONS: -c search_path=storage,public + FILE_SIZE_LIMIT: 52428800 + STORAGE_BACKEND: file + FILE_STORAGE_BACKEND_PATH: /var/lib/storage + TENANT_ID: stub + # TODO: https://github.com/supabase/storage-api/issues/55 + REGION: stub + GLOBAL_S3_BUCKET: stub + volumes: + - ./volumes/storage:/var/lib/storage + + meta: + container_name: supabase-meta + image: supabase/postgres-meta:v0.29.0 + depends_on: + - db + restart: unless-stopped + environment: + PG_META_PORT: 8080 + PG_META_DB_HOST: db + PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD} + db: container_name: supabase-db build: context: ./postgres + command: postgres -c config_file=/etc/postgresql/postgresql.conf + restart: unless-stopped ports: - - 5432:5432 - command: - - postgres - - -c - - wal_level=logical + - ${POSTGRES_PORT}:5432 environment: - POSTGRES_DB: postgres - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_PORT: 5432 -networks: - default: - name: supabase + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + # - ./volumes/db/data:/var/lib/postgresql/data + - ./volumes/db/init:/docker-entrypoint-initdb.d diff --git a/docker/kong/Dockerfile b/docker/kong/Dockerfile deleted file mode 100644 index 6fc21f6..0000000 --- a/docker/kong/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM kong:2.1 - -COPY kong.yml /var/lib/kong/kong.yml - -# Run time values -ENV KONG_DATABASE=off -ENV KONG_PLUGINS=request-transformer,cors,key-auth -ENV KONG_DECLARATIVE_CONFIG=/var/lib/kong/kong.yml - -EXPOSE 8000 diff --git a/docker/kong/kong.yml b/docker/kong/kong.yml deleted file mode 100644 index 2a0d210..0000000 --- a/docker/kong/kong.yml +++ /dev/null @@ -1,45 +0,0 @@ -_format_version: '1.1' -services: - - name: auth-v1 - _comment: 'GoTrue: /auth/v1/* -> http://auth:9999/*' - url: http://auth:9999/ - routes: - - name: auth-v1-all - strip_path: true - paths: - - /auth/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: true - - name: rest-v1 - _comment: 'PosgREST: /rest/v1/* -> http://rest:3000/*' - url: http://rest:3000/ - routes: - - name: rest-v1-all - strip_path: true - paths: - - /rest/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: true - - name: realtime-v1 - _comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*' - url: http://realtime:4000/socket/ - routes: - - name: realtime-v1-all - strip_path: true - paths: - - /realtime/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: true -consumers: - - username: 'private-key' - keyauth_credentials: - - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.gCm8Egtn7aeHyz-Pq8QbqxpzSnMK3DffadQsBK9ainY diff --git a/docker/postgres/00-initial-schema.sql b/docker/postgres/00-initial-schema.sql deleted file mode 100644 index a0b6303..0000000 --- a/docker/postgres/00-initial-schema.sql +++ /dev/null @@ -1,26 +0,0 @@ - - --- Set up reatime -create publication supabase_realtime for all tables; - --- Extension namespacing -create schema extensions; -create extension if not exists "uuid-ossp" with schema extensions; -create extension if not exists pgcrypto with schema extensions; -create extension if not exists pgjwt with schema extensions; - --- Developer roles -create role anon nologin noinherit; -create role authenticated nologin noinherit; -- "logged in" user: web_user, app_user, etc -create role service_role nologin noinherit bypassrls; -- allow developers to create JWT's that bypass their policies - -create user authenticator noinherit; -grant anon to authenticator; -grant authenticated to authenticator; -grant service_role to authenticator; - -grant usage on schema public to postgres, anon, authenticated, service_role; -alter default privileges in schema public grant all on tables to postgres, anon, authenticated, service_role; -alter default privileges in schema public grant all on functions to postgres, anon, authenticated, service_role; -alter default privileges in schema public grant all on sequences to postgres, anon, authenticated, service_role; - diff --git a/docker/postgres/Dockerfile b/docker/postgres/Dockerfile index b57d03d..9d481e9 100644 --- a/docker/postgres/Dockerfile +++ b/docker/postgres/Dockerfile @@ -1,15 +1,15 @@ -FROM supabase/postgres:0.13.0 +FROM supabase/postgres:14.1.0 RUN apt-get update \ && apt-get install -y --no-install-recommends \ - gcc \ - make \ - libc-dev \ - postgresql-server-dev-$PG_MAJOR \ - wget \ - ca-certificates \ - openssl \ - && rm -rf /var/lib/apt/lists/* \ + gcc \ + make \ + libc-dev \ + postgresql-server-dev-$PG_MAJOR \ + wget \ + ca-certificates \ + openssl \ + && rm -rf /var/lib/apt/lists/* \ && wget -q -O - "http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2" | tar xjf - \ && wget -q -O zhparser.tar.gz "https://github.com/amutu/zhparser/archive/master.tar.gz" \ && tar xvf zhparser.tar.gz \ @@ -18,23 +18,11 @@ RUN apt-get update \ && make install \ && cd /zhparser-master \ && SCWS_HOME=/usr/local make && make install \ - && cd / \ - && wget -q -O rum.tar.gz "https://github.com/postgrespro/rum/archive/master/master.tar.gz" \ - && tar xvf rum.tar.gz \ - && cd /rum-master \ - && make USE_PGXS=1 \ - && make USE_PGXS=1 install \ - && apt-get purge -y gcc make libc-dev postgresql-server-dev-$PG_MAJOR \ && apt-get autoremove -y \ && rm -rf \ - /zhparser-master \ - /zhparser.zip \ - /scws-1.2.3 - -COPY 00-initial-schema.sql /docker-entrypoint-initdb.d/00-initial-schema.sql -COPY auth-schema.sql /docker-entrypoint-initdb.d/auth-schema.sql -COPY 200-init-zhparser.sql /docker-entrypoint-initdb.d/200-init-zhparser.sql -COPY 201-init-rum.sql /docker-entrypoint-initdb.d/201-init-rum.sql + /zhparser-master \ + /zhparser.zip \ + /scws-1.2.3 # Run time values ENV POSTGRES_DB=postgres diff --git a/docker/volumes/api/kong.yml b/docker/volumes/api/kong.yml new file mode 100644 index 0000000..feff1d1 --- /dev/null +++ b/docker/volumes/api/kong.yml @@ -0,0 +1,148 @@ +_format_version: "1.1" + +### +### Consumers / Users +### +consumers: + - username: anon + keyauth_credentials: + - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.gCm8Egtn7aeHyz-Pq8QbqxpzSnMK3DffadQsBK9ainY + - username: service_role + keyauth_credentials: + - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoic2VydmljZV9yb2xlIn0.WiEF94VgCZWE_IvPZinXSfpTj4mrVVRktGDQwWaEpl4 + +### +### Access Control List +### +acls: + - consumer: anon + group: anon + - consumer: service_role + group: admin + +### +### API Routes +### +services: + ## Open Auth routes + - name: auth-v1-open + url: http://auth:9999/verify + routes: + - name: auth-v1-open + strip_path: true + paths: + - /auth/v1/verify + plugins: + - name: cors + - name: auth-v1-open-callback + url: http://auth:9999/callback + routes: + - name: auth-v1-open-callback + strip_path: true + paths: + - /auth/v1/callback + plugins: + - name: cors + - name: auth-v1-open-authorize + url: http://auth:9999/authorize + routes: + - name: auth-v1-open-authorize + strip_path: true + paths: + - /auth/v1/authorize + plugins: + - name: cors + + ## Secure Auth routes + - name: auth-v1 + _comment: "GoTrue: /auth/v1/* -> http://auth:9999/*" + url: http://auth:9999/ + routes: + - name: auth-v1-all + strip_path: true + paths: + - /auth/v1/ + plugins: + - name: cors + - name: key-auth + config: + hide_credentials: false + - name: acl + config: + hide_groups_header: true + allow: + - admin + - anon + + ## Secure REST routes + - name: rest-v1 + _comment: "PostgREST: /rest/v1/* -> http://rest:3000/*" + url: http://rest:3000/ + routes: + - name: rest-v1-all + strip_path: true + paths: + - /rest/v1/ + plugins: + - name: cors + - name: key-auth + config: + hide_credentials: true + - name: acl + config: + hide_groups_header: true + allow: + - admin + - anon + + ## Secure Realtime routes + - name: realtime-v1 + _comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*" + url: http://realtime:4000/socket/ + routes: + - name: realtime-v1-all + strip_path: true + paths: + - /realtime/v1/ + plugins: + - name: cors + - name: key-auth + config: + hide_credentials: false + - name: acl + config: + hide_groups_header: true + allow: + - admin + - anon + + ## Storage routes: the storage server manages its own auth + - name: storage-v1 + _comment: "Storage: /storage/v1/* -> http://storage:5000/*" + url: http://storage:5000/ + routes: + - name: storage-v1-all + strip_path: true + paths: + - /storage/v1/ + plugins: + - name: cors + + ## Secure Database routes + - name: meta + _comment: "pg-meta: /pg/* -> http://pg-meta:8080/*" + url: http://meta:8080/ + routes: + - name: meta-all + strip_path: true + paths: + - /pg/ + plugins: + - name: key-auth + config: + hide_credentials: false + - name: acl + config: + hide_groups_header: true + allow: + - admin diff --git a/docker/volumes/db/init/00-initial-schema.sql b/docker/volumes/db/init/00-initial-schema.sql new file mode 100644 index 0000000..474b866 --- /dev/null +++ b/docker/volumes/db/init/00-initial-schema.sql @@ -0,0 +1,48 @@ +-- Set up realtime +create schema if not exists realtime; +-- create publication supabase_realtime; -- defaults to empty publication +create publication supabase_realtime; + +-- Supabase super admin +create user supabase_admin; +alter user supabase_admin with superuser createdb createrole replication bypassrls; + +-- Extension namespacing +create schema if not exists extensions; +create extension if not exists "uuid-ossp" with schema extensions; +create extension if not exists pgcrypto with schema extensions; +create extension if not exists pgjwt with schema extensions; + +-- Set up auth roles for the developer +create role anon nologin noinherit; +create role authenticated nologin noinherit; -- "logged in" user: web_user, app_user, etc +create role service_role nologin noinherit bypassrls; -- allow developers to create JWT's that bypass their policies + +create user authenticator noinherit; +grant anon to authenticator; +grant authenticated to authenticator; +grant service_role to authenticator; +grant supabase_admin to authenticator; + +grant usage on schema public to postgres, anon, authenticated, service_role; +alter default privileges in schema public grant all on tables to postgres, anon, authenticated, service_role; +alter default privileges in schema public grant all on functions to postgres, anon, authenticated, service_role; +alter default privileges in schema public grant all on sequences to postgres, anon, authenticated, service_role; + +-- Allow Extensions to be used in the API +grant usage on schema extensions to postgres, anon, authenticated, service_role; + +-- Set up namespacing +alter user supabase_admin SET search_path TO public, extensions; -- don't include the "auth" schema + +-- These are required so that the users receive grants whenever "supabase_admin" creates tables/function +alter default privileges for user supabase_admin in schema public grant all + on sequences to postgres, anon, authenticated, service_role; +alter default privileges for user supabase_admin in schema public grant all + on tables to postgres, anon, authenticated, service_role; +alter default privileges for user supabase_admin in schema public grant all + on functions to postgres, anon, authenticated, service_role; + +-- Set short statement/query timeouts for API roles +alter role anon set statement_timeout = '3s'; +alter role authenticated set statement_timeout = '8s'; diff --git a/docker/postgres/auth-schema.sql b/docker/volumes/db/init/01-auth-schema.sql similarity index 50% rename from docker/postgres/auth-schema.sql rename to docker/volumes/db/init/01-auth-schema.sql index 8b13436..3544f9a 100644 --- a/docker/postgres/auth-schema.sql +++ b/docker/volumes/db/init/01-auth-schema.sql @@ -1,13 +1,14 @@ -CREATE SCHEMA IF NOT EXISTS auth AUTHORIZATION postgres; +CREATE SCHEMA IF NOT EXISTS auth AUTHORIZATION supabase_admin; -- auth.users definition + CREATE TABLE auth.users ( instance_id uuid NULL, - id uuid NOT NULL, + id uuid NOT NULL UNIQUE, aud varchar(255) NULL, "role" varchar(255) NULL, - email varchar(255) NULL, + email varchar(255) NULL UNIQUE, encrypted_password varchar(255) NULL, confirmed_at timestamptz NULL, invited_at timestamptz NULL, @@ -28,7 +29,10 @@ CREATE TABLE auth.users ( ); CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, email); CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id); +comment on table auth.users is 'Auth: Stores user login data within a secure schema.'; + -- auth.refresh_tokens definition + CREATE TABLE auth.refresh_tokens ( instance_id uuid NULL, id bigserial NOT NULL, @@ -42,7 +46,10 @@ CREATE TABLE auth.refresh_tokens ( CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id); CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id); CREATE INDEX refresh_tokens_token_idx ON auth.refresh_tokens USING btree (token); +comment on table auth.refresh_tokens is 'Auth: Store of tokens used to refresh JWT tokens once they expire.'; + -- auth.instances definition + CREATE TABLE auth.instances ( id uuid NOT NULL, uuid uuid NULL, @@ -51,7 +58,10 @@ CREATE TABLE auth.instances ( updated_at timestamptz NULL, CONSTRAINT instances_pkey PRIMARY KEY (id) ); +comment on table auth.instances is 'Auth: Manages users across multiple sites.'; + -- auth.audit_log_entries definition + CREATE TABLE auth.audit_log_entries ( instance_id uuid NULL, id uuid NOT NULL, @@ -60,11 +70,16 @@ CREATE TABLE auth.audit_log_entries ( CONSTRAINT audit_log_entries_pkey PRIMARY KEY (id) ); CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id); +comment on table auth.audit_log_entries is 'Auth: Audit trail for user actions.'; + -- auth.schema_migrations definition + CREATE TABLE auth.schema_migrations ( "version" varchar(255) NOT NULL, CONSTRAINT schema_migrations_pkey PRIMARY KEY ("version") ); +comment on table auth.schema_migrations is 'Auth: Manages updates to the auth system.'; + INSERT INTO auth.schema_migrations (version) VALUES ('20171026211738'), ('20171026211808'), @@ -73,19 +88,58 @@ VALUES ('20171026211738'), ('20180108183307'), ('20180119214651'), ('20180125194653'); --- Gets the User ID from the request cookie -create or replace function auth.uid() returns uuid as $$ - select nullif(current_setting('request.jwt.claim.sub', true), '')::uuid; -$$ language sql stable; --- Gets the User Role from the request cookie -create or replace function auth.role() returns text as $$ - select nullif(current_setting('request.jwt.claim.role', true), '')::text; -$$ language sql stable; --- Gets the User Email from the request cookie -create or replace function auth.email() returns text as $$ - select nullif(current_setting('request.jwt.claim.email', true), '')::text; -$$ language sql stable; -GRANT ALL PRIVILEGES ON SCHEMA auth TO postgres; -GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA auth TO postgres; -GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA auth TO postgres; -ALTER ROLE postgres SET search_path = "$user", public, auth; + +create or replace function auth.uid() +returns uuid +language sql stable +as $$ + select + coalesce( + current_setting('request.jwt.claim.sub', true), + (current_setting('request.jwt.claims', true)::jsonb ->> 'sub') + )::uuid +$$; + +create or replace function auth.role() +returns text +language sql stable +as $$ + select + coalesce( + current_setting('request.jwt.claim.role', true), + (current_setting('request.jwt.claims', true)::jsonb ->> 'role') + )::text +$$; + +create or replace function auth.email() +returns text +language sql stable +as $$ + select + coalesce( + current_setting('request.jwt.claim.email', true), + (current_setting('request.jwt.claims', true)::jsonb ->> 'email') + )::text +$$; + +-- usage on auth functions to API roles +GRANT USAGE ON SCHEMA auth TO anon, authenticated, service_role; + +-- Supabase super admin +CREATE USER supabase_auth_admin NOINHERIT CREATEROLE LOGIN NOREPLICATION; +GRANT ALL PRIVILEGES ON SCHEMA auth TO supabase_auth_admin; +GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA auth TO supabase_auth_admin; +GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA auth TO supabase_auth_admin; +ALTER USER supabase_auth_admin SET search_path = "auth"; +ALTER table "auth".users OWNER TO supabase_auth_admin; +ALTER table "auth".refresh_tokens OWNER TO supabase_auth_admin; +ALTER table "auth".audit_log_entries OWNER TO supabase_auth_admin; +ALTER table "auth".instances OWNER TO supabase_auth_admin; +ALTER table "auth".schema_migrations OWNER TO supabase_auth_admin; + +ALTER FUNCTION "auth"."uid" OWNER TO supabase_auth_admin; +ALTER FUNCTION "auth"."role" OWNER TO supabase_auth_admin; +ALTER FUNCTION "auth"."email" OWNER TO supabase_auth_admin; +GRANT EXECUTE ON FUNCTION "auth"."uid"() TO PUBLIC; +GRANT EXECUTE ON FUNCTION "auth"."role"() TO PUBLIC; +GRANT EXECUTE ON FUNCTION "auth"."email"() TO PUBLIC; diff --git a/docker/volumes/db/init/02-storage-schema.sql b/docker/volumes/db/init/02-storage-schema.sql new file mode 100644 index 0000000..ba891b0 --- /dev/null +++ b/docker/volumes/db/init/02-storage-schema.sql @@ -0,0 +1,116 @@ +CREATE SCHEMA IF NOT EXISTS storage AUTHORIZATION supabase_admin; + +grant usage on schema storage to postgres, anon, authenticated, service_role; +alter default privileges in schema storage grant all on tables to postgres, anon, authenticated, service_role; +alter default privileges in schema storage grant all on functions to postgres, anon, authenticated, service_role; +alter default privileges in schema storage grant all on sequences to postgres, anon, authenticated, service_role; + +CREATE TABLE "storage"."buckets" ( + "id" text not NULL, + "name" text NOT NULL, + "owner" uuid, + "created_at" timestamptz DEFAULT now(), + "updated_at" timestamptz DEFAULT now(), + CONSTRAINT "buckets_owner_fkey" FOREIGN KEY ("owner") REFERENCES "auth"."users"("id"), + PRIMARY KEY ("id") +); +CREATE UNIQUE INDEX "bname" ON "storage"."buckets" USING BTREE ("name"); + +CREATE TABLE "storage"."objects" ( + "id" uuid NOT NULL DEFAULT extensions.uuid_generate_v4(), + "bucket_id" text, + "name" text, + "owner" uuid, + "created_at" timestamptz DEFAULT now(), + "updated_at" timestamptz DEFAULT now(), + "last_accessed_at" timestamptz DEFAULT now(), + "metadata" jsonb, + CONSTRAINT "objects_bucketId_fkey" FOREIGN KEY ("bucket_id") REFERENCES "storage"."buckets"("id"), + CONSTRAINT "objects_owner_fkey" FOREIGN KEY ("owner") REFERENCES "auth"."users"("id"), + PRIMARY KEY ("id") +); +CREATE UNIQUE INDEX "bucketid_objname" ON "storage"."objects" USING BTREE ("bucket_id","name"); +CREATE INDEX name_prefix_search ON storage.objects(name text_pattern_ops); + +ALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY; + +CREATE FUNCTION storage.foldername(name text) + RETURNS text[] + LANGUAGE plpgsql +AS $function$ +DECLARE +_parts text[]; +BEGIN + select string_to_array(name, '/') into _parts; + return _parts[1:array_length(_parts,1)-1]; +END +$function$; + +CREATE FUNCTION storage.filename(name text) + RETURNS text + LANGUAGE plpgsql +AS $function$ +DECLARE +_parts text[]; +BEGIN + select string_to_array(name, '/') into _parts; + return _parts[array_length(_parts,1)]; +END +$function$; + +CREATE FUNCTION storage.extension(name text) + RETURNS text + LANGUAGE plpgsql +AS $function$ +DECLARE +_parts text[]; +_filename text; +BEGIN + select string_to_array(name, '/') into _parts; + select _parts[array_length(_parts,1)] into _filename; + -- @todo return the last part instead of 2 + return split_part(_filename, '.', 2); +END +$function$; + +CREATE FUNCTION storage.search(prefix text, bucketname text, limits int DEFAULT 100, levels int DEFAULT 1, offsets int DEFAULT 0) + RETURNS TABLE ( + name text, + id uuid, + updated_at TIMESTAMPTZ, + created_at TIMESTAMPTZ, + last_accessed_at TIMESTAMPTZ, + metadata jsonb + ) + LANGUAGE plpgsql +AS $function$ +DECLARE +_bucketId text; +BEGIN + -- will be replaced by migrations when server starts + -- saving space for cloud-init +END +$function$; + +-- create migrations table +-- https://github.com/ThomWright/postgres-migrations/blob/master/src/migrations/0_create-migrations-table.sql +-- we add this table here and not let it be auto-created so that the permissions are properly applied to it +CREATE TABLE IF NOT EXISTS storage.migrations ( + id integer PRIMARY KEY, + name varchar(100) UNIQUE NOT NULL, + hash varchar(40) NOT NULL, -- sha1 hex encoded hash of the file name and contents, to ensure it hasn't been altered since applying the migration + executed_at timestamp DEFAULT current_timestamp +); + +CREATE USER supabase_storage_admin NOINHERIT CREATEROLE LOGIN NOREPLICATION; +GRANT ALL PRIVILEGES ON SCHEMA storage TO supabase_storage_admin; +GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA storage TO supabase_storage_admin; +GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA storage TO supabase_storage_admin; +ALTER USER supabase_storage_admin SET search_path = "storage"; +ALTER table "storage".objects owner to supabase_storage_admin; +ALTER table "storage".buckets owner to supabase_storage_admin; +ALTER table "storage".migrations OWNER TO supabase_storage_admin; +ALTER function "storage".foldername(text) owner to supabase_storage_admin; +ALTER function "storage".filename(text) owner to supabase_storage_admin; +ALTER function "storage".extension(text) owner to supabase_storage_admin; +ALTER function "storage".search(text,text,int,int,int) owner to supabase_storage_admin; diff --git a/docker/volumes/db/init/03-post-setup.sql b/docker/volumes/db/init/03-post-setup.sql new file mode 100644 index 0000000..64dc739 --- /dev/null +++ b/docker/volumes/db/init/03-post-setup.sql @@ -0,0 +1,68 @@ +ALTER ROLE postgres SET search_path TO "\$user",public,extensions; +CREATE OR REPLACE FUNCTION extensions.notify_api_restart() +RETURNS event_trigger +LANGUAGE plpgsql +AS $$ +BEGIN + NOTIFY pgrst, 'reload schema'; +END; +$$; +CREATE EVENT TRIGGER api_restart ON ddl_command_end +EXECUTE PROCEDURE extensions.notify_api_restart(); +COMMENT ON FUNCTION extensions.notify_api_restart IS 'Sends a notification to the API to restart. If your database schema has changed, this is required so that Supabase can rebuild the relationships.'; + +-- Trigger for pg_cron +CREATE OR REPLACE FUNCTION extensions.grant_pg_cron_access() +RETURNS event_trigger +LANGUAGE plpgsql +AS $$ +DECLARE + schema_is_cron bool; +BEGIN + schema_is_cron = ( + SELECT n.nspname = 'cron' + FROM pg_event_trigger_ddl_commands() AS ev + LEFT JOIN pg_catalog.pg_namespace AS n + ON ev.objid = n.oid + ); + + IF schema_is_cron + THEN + grant usage on schema cron to postgres with grant option; + + alter default privileges in schema cron grant all on tables to postgres with grant option; + alter default privileges in schema cron grant all on functions to postgres with grant option; + alter default privileges in schema cron grant all on sequences to postgres with grant option; + + alter default privileges for user supabase_admin in schema cron grant all + on sequences to postgres with grant option; + alter default privileges for user supabase_admin in schema cron grant all + on tables to postgres with grant option; + alter default privileges for user supabase_admin in schema cron grant all + on functions to postgres with grant option; + + grant all privileges on all tables in schema cron to postgres with grant option; + + END IF; + +END; +$$; +CREATE EVENT TRIGGER issue_pg_cron_access ON ddl_command_end WHEN TAG in ('CREATE SCHEMA') +EXECUTE PROCEDURE extensions.grant_pg_cron_access(); +COMMENT ON FUNCTION extensions.grant_pg_cron_access IS 'Grants access to pg_cron'; + +-- Supabase dashboard user +CREATE ROLE dashboard_user NOSUPERUSER CREATEDB CREATEROLE REPLICATION; +GRANT ALL ON DATABASE postgres TO dashboard_user; +GRANT ALL ON SCHEMA auth TO dashboard_user; +GRANT ALL ON SCHEMA extensions TO dashboard_user; +GRANT ALL ON SCHEMA storage TO dashboard_user; +GRANT ALL ON ALL TABLES IN SCHEMA auth TO dashboard_user; +GRANT ALL ON ALL TABLES IN SCHEMA extensions TO dashboard_user; +-- GRANT ALL ON ALL TABLES IN SCHEMA storage TO dashboard_user; +GRANT ALL ON ALL SEQUENCES IN SCHEMA auth TO dashboard_user; +GRANT ALL ON ALL SEQUENCES IN SCHEMA storage TO dashboard_user; +GRANT ALL ON ALL SEQUENCES IN SCHEMA extensions TO dashboard_user; +GRANT ALL ON ALL ROUTINES IN SCHEMA auth TO dashboard_user; +GRANT ALL ON ALL ROUTINES IN SCHEMA storage TO dashboard_user; +GRANT ALL ON ALL ROUTINES IN SCHEMA extensions TO dashboard_user; diff --git a/docker/postgres/200-init-zhparser.sql b/docker/volumes/db/init/90-init-zhparser.sql similarity index 100% rename from docker/postgres/200-init-zhparser.sql rename to docker/volumes/db/init/90-init-zhparser.sql diff --git a/docker/postgres/201-init-rum.sql b/docker/volumes/db/init/91-init-rum.sql similarity index 100% rename from docker/postgres/201-init-rum.sql rename to docker/volumes/db/init/91-init-rum.sql diff --git a/package.json b/package.json index 23471b8..66abde7 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,9 @@ "start": "next start" }, "dependencies": { + "@chakra-ui/react": "^1.8.6", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", "@metascraper/helpers": "^5.25.8", "@next/bundle-analyzer": "^12.1.0", "@prisma/client": "^3.10.0", @@ -21,6 +24,7 @@ "cookie": "^0.4.2", "date-fns": "^2.28.0", "execa": "^6.1.0", + "framer-motion": "^6.2.8", "he": "^1.2.0", "metascraper": "^5.25.8", "metascraper-description": "^5.25.8", diff --git a/pages/_app.tsx b/pages/_app.tsx index 4e6fd92..b9afbf8 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -5,6 +5,162 @@ import Head from 'next/head'; import React from 'react'; import { ToastProvider } from 'react-toast-notifications'; import 'tailwindcss/tailwind.css'; +import { ChakraProvider, extendTheme } from '@chakra-ui/react'; + +const colors = { + transparent: 'transparent', + current: 'currentColor', + + black: '#000', + white: '#fff', + + dark: { + 100: '#eeeeee', + 200: '#e0e0e0', + 300: '#bbbbbb', + 400: '#666666', + 500: '#444444', + 600: '#2a2a2a', + 700: '#1f1f1f', + 800: '#181818', + 900: '#0f0f0f', + }, + + brand: { + 50: '#82dab0', + 100: '#82dab0', + 200: '#69d3a0', + 300: '#50cb90', + 400: '#C5F1DD', + 500: '#9FE7C7', + 600: '#65D9A5', + 700: '#3ECF8E', + 800: '#24b47e', // Green-500 in dashboard + 900: '#2c9c6a', + }, + + gray: { + // 100: '#f7fafc', + // 200: '#edf2f7', + // 300: '#e2e8f0', + // 400: '#cbd5e0', + // 500: '#a0aec0', + // 600: '#718096', + // 700: '#4a5568', + // 800: '#2d3748', + // 900: '#1a202c', + 100: '#eeeeee', + 200: '#e0e0e0', + 300: '#bbbbbb', + 400: '#666666', + 500: '#444444', + 600: '#2a2a2a', + 700: '#1f1f1f', + 800: '#181818', + 900: '#0f0f0f', + }, + red: { + 100: '#fff5f5', + 200: '#fed7d7', + 300: '#feb2b2', + 400: '#fc8181', + 500: '#f56565', + 600: '#e53e3e', + 700: '#c53030', + 800: '#9b2c2c', + 900: '#742a2a', + }, + orange: { + 100: '#fffaf0', + 200: '#feebc8', + 300: '#fbd38d', + 400: '#f6ad55', + 500: '#ed8936', + 600: '#dd6b20', + 700: '#c05621', + 800: '#9c4221', + 900: '#7b341e', + }, + yellow: { + 100: '#fffff0', + 200: '#fefcbf', + 300: '#faf089', + 400: '#f6e05e', + 500: '#ecc94b', + 600: '#d69e2e', + 700: '#b7791f', + 800: '#975a16', + 900: '#744210', + }, + green: { + 100: '#f0fff4', + 200: '#c6f6d5', + 300: '#9ae6b4', + 400: '#68d391', + 500: '#48bb78', + 600: '#38a169', + 700: '#2f855a', + 800: '#276749', + 900: '#22543d', + }, + teal: { + 100: '#e6fffa', + 200: '#b2f5ea', + 300: '#81e6d9', + 400: '#4fd1c5', + 500: '#38b2ac', + 600: '#319795', + 700: '#2c7a7b', + 800: '#285e61', + 900: '#234e52', + }, + blue: { + 100: '#ebf8ff', + 200: '#bee3f8', + 300: '#90cdf4', + 400: '#63b3ed', + 500: '#4299e1', + 600: '#3182ce', + 700: '#2b6cb0', + 800: '#2c5282', + 900: '#2a4365', + }, + indigo: { + 100: '#ebf4ff', + 200: '#c3dafe', + 300: '#a3bffa', + 400: '#7f9cf5', + 500: '#667eea', + 600: '#5a67d8', + 700: '#4c51bf', + 800: '#434190', + 900: '#3c366b', + }, + purple: { + 100: '#faf5ff', + 200: '#e9d8fd', + 300: '#d6bcfa', + 400: '#b794f4', + 500: '#9f7aea', + 600: '#805ad5', + 700: '#6b46c1', + 800: '#553c9a', + 900: '#44337a', + }, + pink: { + 100: '#fff5f7', + 200: '#fed7e2', + 300: '#fbb6ce', + 400: '#f687b3', + 500: '#ed64a6', + 600: '#d53f8c', + 700: '#b83280', + 800: '#97266d', + 900: '#702459', + }, +}; + +const theme = extendTheme({ colors }); const MyApp: React.FC = ({ Component, pageProps }) => { return ( @@ -40,11 +196,13 @@ const MyApp: React.FC = ({ Component, pageProps }) => { /> - - - - - + + + + + + + ); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd73697..0476988 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,9 @@ lockfileVersion: 5.3 specifiers: + '@chakra-ui/react': ^1.8.6 + '@emotion/react': ^11.8.1 + '@emotion/styled': ^11.8.1 '@metascraper/helpers': ^5.25.8 '@next/bundle-analyzer': ^12.1.0 '@prisma/client': ^3.10.0 @@ -25,6 +28,7 @@ specifiers: eslint-import-resolver-typescript: ^2.5.0 eslint-plugin-import: ^2.25.4 execa: ^6.1.0 + framer-motion: ^6.2.8 he: ^1.2.0 metascraper: ^5.25.8 metascraper-description: ^5.25.8 @@ -53,6 +57,9 @@ specifiers: zod: ^3.13.4 dependencies: + '@chakra-ui/react': 1.8.6_4d036ee35cd491fa34ae10c10c81f097 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/styled': 11.8.1_286aa9033b2bfd8c8e13486452a89338 '@metascraper/helpers': 5.25.8 '@next/bundle-analyzer': 12.1.0 '@prisma/client': 3.10.0_prisma@3.10.0 @@ -63,6 +70,7 @@ dependencies: cookie: 0.4.2 date-fns: 2.28.0 execa: 6.1.0 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 he: 1.2.0 metascraper: 5.25.8 metascraper-description: 5.25.8 @@ -675,6 +683,15 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: false + /@babel/plugin-syntax-jsx/7.16.7: + resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.16.7 + dev: false + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.5: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -1249,6 +1266,791 @@ packages: to-fast-properties: 2.0.0 dev: false + /@chakra-ui/accordion/1.4.9_1bea533209df0d5781454cc484417533: + resolution: {integrity: sha512-ZrfrLwAu6p9B41sZ+iEWjfPW/mn2TdUDXv165qr1O355619e2Btjb01x3IYoN4GlE2iF7GOVjC5uYGNyLpBlZg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/descendant': 2.1.3_react@18.0.0-rc.1 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/transition': 1.4.7_55ff7732c3000f6063e35738996310c1 + '@chakra-ui/utils': 1.10.4 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/alert/1.3.7_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-fFpJYBpHOIK/BX4BVl/xafYiDBUW+Bq/gUYDOo4iAiO4vHgxo74oa+yOwSRNlNjAgIX7pi2ridsYQALKyWyxxQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/anatomy/1.3.0_@chakra-ui+system@1.11.2: + resolution: {integrity: sha512-vj/lcHkCuq/dtbl69DkNsftZTnrGEegB90ODs1B6rxw8iVMdDSYkthPPFAkqzNs4ppv1y2IBjELuVzpeta1OHA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme-tools': 1.3.6_@chakra-ui+system@1.11.2 + dev: false + + /@chakra-ui/avatar/1.3.9_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-QhtVuFRXhV7X5iMCHI1lXOA0U2hJnpKC9uIEB80EkBuNYJDEz/y8ViOQPRivMVU//wymwLcbvjDCZd1urMjVYQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/image': 1.1.8_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/breadcrumb/1.3.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-iXxienBO6RUnJEcDvyDWyRt+mzPyl7/b6N8i0vrjGKGLpgtayJFvIdo33tFcvx6TCy7V9hiE3HTtZnNomWdR6A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/button/1.5.8_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-harZywey/6OclxIB5p/Ge/coeGKZWoqmu7JjXlbwTUd3U9IQiOVo/zekY1JscCSz2oZoVBCvoKZVt3on5dPwmA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/spinner': 1.2.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/checkbox/1.6.8_1bea533209df0d5781454cc484417533: + resolution: {integrity: sha512-CYmJbMA9BXb6ArKmXIAuQ22aQ97HgtslbJlqRKsV/FmZuk1DXF1dcVXzqeInhe5HacQ8z/+SmSqL9Q3fjswKag==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/clickable/1.2.6_react@18.0.0-rc.1: + resolution: {integrity: sha512-89SsrQwwwAadcl/bN8nZqqaaVhVNFdBXqQnxVy1t07DL5ezubmNb5SgFh9LDznkm9YYPQhaGr3W6HFro7iAHMg==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/close-button/1.2.7_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-cYTxfgrIlPU4IZm1sehZXxx/TNQBk9c3LBPvTpywEM8GVRGINh4YLq8WiMaPtO+TDNBnKoWS/jS4IHnR+abADw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/color-mode/1.4.6_react@18.0.0-rc.1: + resolution: {integrity: sha512-gCO8Z/jv68jXop94MUQNzigl7JXICAgZQUUqLaKhdy1h2zatVDIPFfjwwjnsgM97G0BxQaNBOC87+PD2UYjzHw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-env': 1.1.6_react@18.0.0-rc.1 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/control-box/1.1.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-EUcq5f854puG6ZA6wAWl4107OPl8+bj4MMHJCa48BB0qec0U8HCEtxQGnFwJmaYLalIAjMfHuY3OwO2A3Hi9hA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/counter/1.2.8_react@18.0.0-rc.1: + resolution: {integrity: sha512-lVuK+ycKxEE0G4Jkl8A6GWdXUFAih89KA1IkkhQG6NwqdGzbgouTInwBLg1Sm5uwgQ5QqSr9S42QyDoleUyF0g==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/css-reset/1.1.3_6c69cae363205e33f87c93bc82025e49: + resolution: {integrity: sha512-AgfrE7bRTJvNi/4zIfacI/kBHmHmHEIeQtHwCvk/0qM9V2gK1VM3ctYlnibf7BTh17F/UszweOGRb1lHSPfWjw==} + peerDependencies: + '@emotion/react': '>=10.0.35' + react: '>=16.8.6' + dependencies: + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/descendant/2.1.3_react@18.0.0-rc.1: + resolution: {integrity: sha512-aNYNv99gEPENCdw2N5y3FvL5wgBVcLiOzJ2TxSwb4EVYszbgBZ8Ry1pf7lkoSfysdxD0scgy2cVyxO8TsYTU4g==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/editable/1.4.0_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-QH5ZMCK/U3pQINtSPiqxxA5XCdiXKBfAI1+siiuSqKtmCriltcArEU4groQn/bm7EY6UJIr/MV3azSDeeBIsaQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/focus-lock/1.2.6_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-ZJNE1oNdUM1aGWuCJ+bxFa/d3EwxzfMWzTKzSvKDK50GWoUQQ10xFTT9nY/yFpkcwhBvx1KavxKf44mIhIbSog==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + react-focus-lock: 2.5.2_76220cd404ce3584e7b4e070e95dcd42 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/form-control/1.5.9_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-JuUB9dHXFqTYm+Z+cOULk56AcrX9y3eaied0j/KGdPwtIjS2kkjulq7A8sJJdsle4M6XleMinjW+1KO2PMExQg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/hooks/1.8.5_react@18.0.0-rc.1: + resolution: {integrity: sha512-/UrBfUG7NLxuU/09gy2qQfEH+H5SPBUaUiFtokRlq887D/32JQ3XksZdF78RKMCM/0bbZuIjqUkuN/wO9kAbSw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/utils': 1.10.4 + compute-scroll-into-view: 1.0.14 + copy-to-clipboard: 3.3.1 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/icon/2.0.5_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-ZrqRvCCIxGr4qFd/r1pmtd9tobRmv8KAxV7ygFoc/t4vOSKTcVIjhE12gsI3FzgvXM15ZFVwsxa1zodwgo5neQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/image/1.1.8_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-ffO5lyTfGXxaFr9Bdkrb+GahjXsqeph8R1jXYFYwLjos+/sZZJmHJz/cjyoKjKPd6J7puKVZ6Cxz+Ej6PJlQcA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/input/1.4.4_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-A1TYz8lOdSVuMnWRnR7Y+cddnnr5d2o1Vvd8Im09WW2j09xy06xD/EaFy8dI51Ab0ACldglVs66qx5dO7WoV0w==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/layout/1.7.7_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-HuZ/Zv9xWzLip263tX2Vt0oaqwaS6Srw78Sdl3DiGSifN8x+ooEAxmeDAIaU2PO21YX+f6s+9A738NAtSM2R+Q==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/live-region/1.1.6_react@18.0.0-rc.1: + resolution: {integrity: sha512-9gPQHXf7oW0jXyT5R/JzyDMfJ3hF70TqhN8bRH4fMyfNr2Se+SjztMBqCrv5FS5rPjcCeua+e0eArpoB3ROuWQ==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/media-query/2.0.4_3c7581bb364edafe5ad9dd907f44da6e: + resolution: {integrity: sha512-kn6g/L0IFFUHz2v4yiCsBnhg9jUeA7525Z+AWl+BPtvryi7i9J+AJ27y/QAge7vUGy4dwDeFyxOZTs2oZ9/BsA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + '@chakra-ui/theme': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-env': 1.1.6_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme': 1.14.0_@chakra-ui+system@1.11.2 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/menu/1.8.9_1bea533209df0d5781454cc484417533: + resolution: {integrity: sha512-rvQQU56nQoaz+IZXyamKaAU/87IiGIDrX9wEONHth7QDT/93whnFNYPtUMHMzILz0oliysBey4dlmtRzk5vUpQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/clickable': 1.2.6_react@18.0.0-rc.1 + '@chakra-ui/descendant': 2.1.3_react@18.0.0-rc.1 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/popper': 2.4.3_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/transition': 1.4.7_55ff7732c3000f6063e35738996310c1 + '@chakra-ui/utils': 1.10.4 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/modal/1.10.10_b39aacd6a4f3d0f1b1adfd5d2d233051: + resolution: {integrity: sha512-/OLnZhhGXQEaCqtrCCf2nu27mVxT/3Kd+NBNMKGZ4X70Dm6HD3x1Zrsto2hVo8l3kLEPRpkfpXhKu61doMc8zw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/close-button': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/focus-lock': 1.2.6_76220cd404ce3584e7b4e070e95dcd42 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/portal': 1.3.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/transition': 1.4.7_55ff7732c3000f6063e35738996310c1 + '@chakra-ui/utils': 1.10.4 + aria-hidden: 1.1.3 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + react-remove-scroll: 2.4.1_76220cd404ce3584e7b4e070e95dcd42 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/number-input/1.4.5_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-jxOvJUEuXZXQrOgMGZ+rPNjSrIoV7MSb7CPt3C1jVuiumr/GgNu54awmrky3Zj4ikj68rREEUXAGKBgm9oU3nQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/counter': 1.2.8_react@18.0.0-rc.1 + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/pin-input/1.7.8_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-P4uJBVKDxTetQhj+s0L7TbUTTqbcHwkLpo4bGUEdQpHMfGFlJgGu0wFT5Z8O0fw+vGNfguFfkqkVRRgK8FkHlA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/descendant': 2.1.3_react@18.0.0-rc.1 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/popover/1.11.7_1bea533209df0d5781454cc484417533: + resolution: {integrity: sha512-TjMZlpBomIuGuQgGQi2rTSVFwFbc9HdJSU3anyFyDQb4ZnunyqaIEMoqFdj/dK8tDdWIatozKjX6AzSimmSvLg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/close-button': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/popper': 2.4.3_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/popper/2.4.3_react@18.0.0-rc.1: + resolution: {integrity: sha512-TGzFnYt3mtIVkIejtYIAu4Ka9DaYLzMR4NgcqI6EtaTvgK7Xep+6RTiY/Nq+ZT3l/eaNUwqHRFoNrDUg1XYasA==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@popperjs/core': 2.11.2 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/portal/1.3.8_dde4e734dd2b0b3bb2733d8cbf4f2511: + resolution: {integrity: sha512-rpSu/RdtlKfOBzw11qHs91IwUTffUfppBz33PfOFNZpDGmO0+6pWkz40I16eSgYtQigZRQG1spz6Ul7tsh+1ag==} + peerDependencies: + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + dev: false + + /@chakra-ui/progress/1.2.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-thaHRIYTVktgV78vJMNwzfCX+ickhSpn2bun6FtGVUphFx4tjV+ggz+IGohm6AH2hapskoR1mQU2iNZb6BK0hQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme-tools': 1.3.6_@chakra-ui+system@1.11.2 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/provider/1.7.12_4df73f4ade60f76e029fb1843db9db89: + resolution: {integrity: sha512-SSq4z4nMjCbqdGrRkbxzR4o96uRah1HnSFui3lM2263zJN7fyezqiseRboID+i7eIUCBWHMLdsabARAD8t1tDQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/css-reset': 1.1.3_6c69cae363205e33f87c93bc82025e49 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/portal': 1.3.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + '@chakra-ui/react-env': 1.1.6_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/styled': 11.8.1_286aa9033b2bfd8c8e13486452a89338 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + dev: false + + /@chakra-ui/radio/1.4.10_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-TgqBgfezypC4do1Vj4iBp4kptXVWdnhASJ97VFuau2QQPT6zKl3Ke2di+XLhH3CZNCDHpvU/KxQNJ6bfj5GMGg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/react-env/1.1.6_react@18.0.0-rc.1: + resolution: {integrity: sha512-L90LNvCfe04FTkN9OPok/o2e60zLJNBH8Im/5dUHvqy7dXLXok8ZDad5vEL46XmGbhe7O8fbxhG6FmAYdcCHrQ==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/react-utils/1.2.3_react@18.0.0-rc.1: + resolution: {integrity: sha512-r8pUwCVVB7UPhb0AiRa9ZzSp4xkMz64yIeJ4O4aGy4WMw7TRH4j4QkbkE1YC9tQitrXrliOlvx4WWJR4VyiGpw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/react/1.8.6_4d036ee35cd491fa34ae10c10c81f097: + resolution: {integrity: sha512-FEh/KG0uPeNOMQuIlyPfGjHvGB7LN1AAhkdFefqzNt0zNy8Giv4p1PKY7wdCh5QEFor++A83L1wIWvTGQVJ2vQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/accordion': 1.4.9_1bea533209df0d5781454cc484417533 + '@chakra-ui/alert': 1.3.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/avatar': 1.3.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/breadcrumb': 1.3.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/button': 1.5.8_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/checkbox': 1.6.8_1bea533209df0d5781454cc484417533 + '@chakra-ui/close-button': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/control-box': 1.1.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/counter': 1.2.8_react@18.0.0-rc.1 + '@chakra-ui/css-reset': 1.1.3_6c69cae363205e33f87c93bc82025e49 + '@chakra-ui/editable': 1.4.0_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/image': 1.1.8_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/input': 1.4.4_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/layout': 1.7.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/live-region': 1.1.6_react@18.0.0-rc.1 + '@chakra-ui/media-query': 2.0.4_3c7581bb364edafe5ad9dd907f44da6e + '@chakra-ui/menu': 1.8.9_1bea533209df0d5781454cc484417533 + '@chakra-ui/modal': 1.10.10_b39aacd6a4f3d0f1b1adfd5d2d233051 + '@chakra-ui/number-input': 1.4.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/pin-input': 1.7.8_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/popover': 1.11.7_1bea533209df0d5781454cc484417533 + '@chakra-ui/popper': 2.4.3_react@18.0.0-rc.1 + '@chakra-ui/portal': 1.3.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + '@chakra-ui/progress': 1.2.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/provider': 1.7.12_4df73f4ade60f76e029fb1843db9db89 + '@chakra-ui/radio': 1.4.10_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/react-env': 1.1.6_react@18.0.0-rc.1 + '@chakra-ui/select': 1.2.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/skeleton': 1.2.12_15ac1884da0bb7bd9087c1a0fd138603 + '@chakra-ui/slider': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/spinner': 1.2.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/stat': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/switch': 1.3.8_1bea533209df0d5781454cc484417533 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/table': 1.3.6_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/tabs': 1.6.8_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/tag': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/textarea': 1.2.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/theme': 1.14.0_@chakra-ui+system@1.11.2 + '@chakra-ui/toast': 1.5.7_6ffff4574d1693ea40ffc5e6134731b9 + '@chakra-ui/tooltip': 1.4.9_6ffff4574d1693ea40ffc5e6134731b9 + '@chakra-ui/transition': 1.4.7_55ff7732c3000f6063e35738996310c1 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/styled': 11.8.1_286aa9033b2bfd8c8e13486452a89338 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/select/1.2.9_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-f8cRy3whXFYviuKGfugPnvXTGarPVt2ux5pffipmliYOhfaJ8O2OtdmNJ/od4WaeGStUH13x12GsEqVw2LBKOg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/skeleton/1.2.12_15ac1884da0bb7bd9087c1a0fd138603: + resolution: {integrity: sha512-buHqfKw24+EQXFGHlSRq2obHxZgz0FUKSFNMlQS3tMoFwBkLRO/jAQfjj9KKR5b0m2qu1qLBmwFHJLih1+bnzg==} + peerDependencies: + '@chakra-ui/theme': '>=1.0.0' + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/media-query': 2.0.4_3c7581bb364edafe5ad9dd907f44da6e + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme': 1.14.0_@chakra-ui+system@1.11.2 + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/styled': 11.8.1_286aa9033b2bfd8c8e13486452a89338 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/slider/1.5.9_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-m9n/BpnD/hEDS9q3T17ezgTFWDdvCocPzxQXzLLDN2Z2xOgwyLTQVLk4iB1yROvLCUl7Ig9C4+a4/7fivm+IHw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/spinner/1.2.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-GoUCccN120fGRVgUtfuwcEjeoaxffB+XsgpxX7jhWloXf8b6lkqm68bsxX4Ybb2vGN1fANI98/45JmrnddZO/A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/stat/1.2.7_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-m76jumFW1N+mCG4ytrUz9Mh09nZtS4OQcADEvOslfdI5StwwuzasTA1tueaelPzdhBioMwFUWL05Fr1fXbPJ/Q==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/styled-system/1.18.1: + resolution: {integrity: sha512-uhWMNAfkk1DFAQ4nKu+t23WBQ1/XSJq8Y3sBZJQpvopfwOcarbVvEiM5voSUWPA7pkpD/BprGM7zjIRockUcmw==} + dependencies: + '@chakra-ui/utils': 1.10.4 + csstype: 3.0.11 + dev: false + + /@chakra-ui/switch/1.3.8_1bea533209df0d5781454cc484417533: + resolution: {integrity: sha512-xcsq4G9YUNRSp0F+XBDjeGZFlJeEdGJptuixk6PZjqRJYUyH+k2bk1bJ2Bv2bjvmkDCojI42MkvWTLHrOqp41A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/checkbox': 1.6.8_1bea533209df0d5781454cc484417533 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/system/1.11.2_e22a60e393c2e8ca3f61a97add4c6060: + resolution: {integrity: sha512-s4HGYVo86XuSav5PLfuVT26Y+l3ca/nQVF6QxS6YCNiUxdBlahlzsZz3yMz3MKp11voljnY8vj4z4dvOd2sjUQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + dependencies: + '@chakra-ui/color-mode': 1.4.6_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/styled-system': 1.18.1 + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/styled': 11.8.1_286aa9033b2bfd8c8e13486452a89338 + react: 18.0.0-rc.1 + react-fast-compare: 3.2.0 + dev: false + + /@chakra-ui/table/1.3.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-7agZAgAeDFKviqStvixqnLAH54+setzhx67EztioZTr5Xu+6hQ4rotfJbu8L4i587pcbNg98kCEXEkidjw0XRQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/tabs/1.6.8_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-f1kM9VhAXqKzTAVRoPRIINNiUgvBcadP9m5GtjAgE4DzCrQKnTDImjIkFhXlMvWEmB5ynXZcCGlsgIZ2A9Hs9g==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/clickable': 1.2.6_react@18.0.0-rc.1 + '@chakra-ui/descendant': 2.1.3_react@18.0.0-rc.1 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/tag/1.2.7_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-RKrKOol4i/CnpFfo3T9LMm1abaqM+5Bs0soQLbo1iJBbBACY09sWXrQYvveQ2GYzU/OrAUloHqqmKjyVGOlNtg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/textarea/1.2.9_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-HHeUdBA2JrH/S4PopcpOjRmBWKv4wpxQ+Q4mD03UBznyFARZe3XFJOnxhAPdpB/ZadbdgiyXK27TR0uzaqlONw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.5.9_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/theme-tools/1.3.6_@chakra-ui+system@1.11.2: + resolution: {integrity: sha512-Wxz3XSJhPCU6OwCHEyH44EegEDQHwvlsx+KDkUDGevOjUU88YuNqOVkKtgTpgMLNQcsrYZ93oPWZUJqqCVNRew==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@ctrl/tinycolor': 3.4.0 + dev: false + + /@chakra-ui/theme/1.14.0_@chakra-ui+system@1.11.2: + resolution: {integrity: sha512-zKy/8JSbiCP0QeBsLzdub7aBnfX2k0qp5vD+RA+mxPEiykEvPGg+TwryxRM5KMZK1Zdgg95aH+9mwiGe9tJt3A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + dependencies: + '@chakra-ui/anatomy': 1.3.0_@chakra-ui+system@1.11.2 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme-tools': 1.3.6_@chakra-ui+system@1.11.2 + '@chakra-ui/utils': 1.10.4 + dev: false + + /@chakra-ui/toast/1.5.7_6ffff4574d1693ea40ffc5e6134731b9: + resolution: {integrity: sha512-vM88vX2jTfSwOXWqcj9o9pm+msojJS0cG0Pe/wSuYP+D274SdE8oB2OFqJyijsQ7WQq/P6BIlgquzUcS4smu9A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/alert': 1.3.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/close-button': 1.2.7_8e859594b0e307cd68826701db79ed14 + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/theme': 1.14.0_@chakra-ui+system@1.11.2 + '@chakra-ui/transition': 1.4.7_55ff7732c3000f6063e35738996310c1 + '@chakra-ui/utils': 1.10.4 + '@reach/alert': 0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + dev: false + + /@chakra-ui/tooltip/1.4.9_6ffff4574d1693ea40ffc5e6134731b9: + resolution: {integrity: sha512-W1GVMFWkLLBfiFsOddhr7oWr2rTKqSy2xxMkR5MuomNaqORW4tvjN/wNSLMUuUHVxtWM+iRQkslE5r6k5/1HAw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.8.5_react@18.0.0-rc.1 + '@chakra-ui/popper': 2.4.3_react@18.0.0-rc.1 + '@chakra-ui/portal': 1.3.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + '@chakra-ui/react-utils': 1.2.3_react@18.0.0-rc.1 + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6_8e859594b0e307cd68826701db79ed14 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + dev: false + + /@chakra-ui/transition/1.4.7_55ff7732c3000f6063e35738996310c1: + resolution: {integrity: sha512-2sbMoKB/enp6Qbte3DD6zwBHyO4YAUSgvSr3wn7DAy4hz9kRZHPuUf/N+i9QZ0whL2koXLgdZvV6RNtSTShq4g==} + peerDependencies: + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + framer-motion: 6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511 + react: 18.0.0-rc.1 + dev: false + + /@chakra-ui/utils/1.10.4: + resolution: {integrity: sha512-AM91VQQxw8F4F1WDA28mqKY6NFIOuzc2Ekkna88imy2OiqqmYH0xkq8J16L2qj4cLiLozpYqba3C79pWioy6FA==} + dependencies: + '@types/lodash.mergewith': 4.6.6 + css-box-model: 1.2.1 + framesync: 5.3.0 + lodash.mergewith: 4.6.2 + dev: false + + /@chakra-ui/visually-hidden/1.1.6_8e859594b0e307cd68826701db79ed14: + resolution: {integrity: sha512-Xzy5bA0UA+IyMgwJizQYSEdgz8cC/tHdmFB3CniXzmpKTSK8mJddeEBl+cGbXHBzxEUhH7xF1eaS41O+0ezWEQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.11.2_e22a60e393c2e8ca3f61a97add4c6060 + '@chakra-ui/utils': 1.10.4 + react: 18.0.0-rc.1 + dev: false + /@cspotcode/source-map-consumer/0.8.0: resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} engines: {node: '>= 12'} @@ -1261,6 +2063,30 @@ packages: '@cspotcode/source-map-consumer': 0.8.0 dev: true + /@ctrl/tinycolor/3.4.0: + resolution: {integrity: sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==} + engines: {node: '>=10'} + dev: false + + /@emotion/babel-plugin/11.7.2: + resolution: {integrity: sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/helper-module-imports': 7.16.7 + '@babel/plugin-syntax-jsx': 7.16.7 + '@babel/runtime': 7.17.2 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.5 + '@emotion/serialize': 1.0.2 + babel-plugin-macros: 2.8.0 + convert-source-map: 1.8.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.0.13 + dev: false + /@emotion/cache/10.0.29: resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} dependencies: @@ -1270,6 +2096,16 @@ packages: '@emotion/weak-memoize': 0.2.5 dev: false + /@emotion/cache/11.7.1: + resolution: {integrity: sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==} + dependencies: + '@emotion/memoize': 0.7.5 + '@emotion/sheet': 1.1.0 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + stylis: 4.0.13 + dev: false + /@emotion/core/10.3.1_react@18.0.0-rc.1: resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} peerDependencies: @@ -1296,10 +2132,52 @@ packages: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false + /@emotion/is-prop-valid/0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/is-prop-valid/1.1.2: + resolution: {integrity: sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==} + dependencies: + '@emotion/memoize': 0.7.5 + dev: false + /@emotion/memoize/0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} dev: false + /@emotion/memoize/0.7.5: + resolution: {integrity: sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==} + dev: false + + /@emotion/react/11.8.1_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.2 + '@emotion/babel-plugin': 11.7.2 + '@emotion/cache': 11.7.1 + '@emotion/serialize': 1.0.2 + '@emotion/sheet': 1.1.0 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + '@types/react': 17.0.39 + hoist-non-react-statics: 3.3.2 + react: 18.0.0-rc.1 + dev: false + /@emotion/serialize/0.11.16: resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} dependencies: @@ -1310,10 +2188,47 @@ packages: csstype: 2.6.20 dev: false + /@emotion/serialize/1.0.2: + resolution: {integrity: sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==} + dependencies: + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.5 + '@emotion/unitless': 0.7.5 + '@emotion/utils': 1.1.0 + csstype: 3.0.11 + dev: false + /@emotion/sheet/0.9.4: resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} dev: false + /@emotion/sheet/1.1.0: + resolution: {integrity: sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==} + dev: false + + /@emotion/styled/11.8.1_286aa9033b2bfd8c8e13486452a89338: + resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.2 + '@emotion/babel-plugin': 11.7.2 + '@emotion/is-prop-valid': 1.1.2 + '@emotion/react': 11.8.1_76220cd404ce3584e7b4e070e95dcd42 + '@emotion/serialize': 1.0.2 + '@emotion/utils': 1.1.0 + '@types/react': 17.0.39 + react: 18.0.0-rc.1 + dev: false + /@emotion/stylis/0.8.5: resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} dev: false @@ -1326,6 +2241,10 @@ packages: resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} dev: false + /@emotion/utils/1.1.0: + resolution: {integrity: sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==} + dev: false + /@emotion/weak-memoize/0.2.5: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} dev: false @@ -1563,6 +2482,10 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: false + /@popperjs/core/2.11.2: + resolution: {integrity: sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==} + dev: false + /@prisma/client/3.10.0_prisma@3.10.0: resolution: {integrity: sha512-6P4sV7WFuODSfSoSEzCH1qfmWMrCUBk1LIIuTbQf6m1LI/IOpLN4lnqGDmgiBGprEzuWobnGLfe9YsXLn0inrg==} engines: {node: '>=12.6'} @@ -1586,6 +2509,45 @@ packages: requiresBuild: true dev: true + /@reach/alert/0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511: + resolution: {integrity: sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + '@reach/utils': 0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511 + '@reach/visually-hidden': 0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511 + prop-types: 15.8.1 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + tslib: 2.3.1 + dev: false + + /@reach/utils/0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511: + resolution: {integrity: sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + '@types/warning': 3.0.0 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + tslib: 2.3.1 + warning: 4.0.3 + dev: false + + /@reach/visually-hidden/0.13.2_dde4e734dd2b0b3bb2733d8cbf4f2511: + resolution: {integrity: sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + prop-types: 15.8.1 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + tslib: 2.3.1 + dev: false + /@rollup/plugin-babel/5.3.1_@babel+core@7.17.5+rollup@2.69.1: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -1770,6 +2732,16 @@ packages: resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} dev: true + /@types/lodash.mergewith/4.6.6: + resolution: {integrity: sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==} + dependencies: + '@types/lodash': 4.14.179 + dev: false + + /@types/lodash/4.14.179: + resolution: {integrity: sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==} + dev: false + /@types/minimatch/3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: false @@ -1811,6 +2783,10 @@ packages: resolution: {integrity: sha512-WOoL2UJTI6RxV8RB2kS3ZhxjjijI5G1i7mgU7mtlm4LsC1XGCfiV56h+GV4VZnAUkkkLQ4gbFGR/dggT01n0RA==} dev: true + /@types/warning/3.0.0: + resolution: {integrity: sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=} + dev: false + /@types/websocket/1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: @@ -2020,7 +2996,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.2 + debug: 4.3.3 transitivePeerDependencies: - supports-color dev: false @@ -2117,6 +3093,13 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /aria-hidden/1.1.3: + resolution: {integrity: sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==} + engines: {node: '>=8.5.0'} + dependencies: + tslib: 1.14.1 + dev: false + /array-includes/3.1.4: resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} engines: {node: '>= 0.4'} @@ -2319,7 +3302,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001313 - electron-to-chromium: 1.4.75 + electron-to-chromium: 1.4.76 escalade: 3.1.1 node-releases: 2.0.2 picocolors: 1.0.0 @@ -2531,6 +3514,10 @@ packages: resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} dev: false + /compute-scroll-into-view/1.0.14: + resolution: {integrity: sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==} + dev: false + /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -2618,6 +3605,12 @@ packages: engines: {node: '>=8'} dev: false + /css-box-model/1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + dependencies: + tiny-invariant: 1.2.0 + dev: false + /css-in-js-utils/2.0.1: resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} dependencies: @@ -2789,6 +3782,10 @@ packages: engines: {node: '>=8'} dev: false + /detect-node-es/1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + /detective/5.2.0: resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} engines: {node: '>=0.8.0'} @@ -2918,8 +3915,8 @@ packages: jake: 10.8.2 dev: false - /electron-to-chromium/1.4.75: - resolution: {integrity: sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==} + /electron-to-chromium/1.4.76: + resolution: {integrity: sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA==} /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3039,7 +4036,6 @@ packages: /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} @@ -3266,7 +4262,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.3 + debug: 4.3.2 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -3381,6 +4377,13 @@ packages: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} dev: true + /focus-lock/0.9.2: + resolution: {integrity: sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.3.1 + dev: false + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -3394,6 +4397,35 @@ packages: resolution: {integrity: sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==} dev: true + /framer-motion/6.2.8_dde4e734dd2b0b3bb2733d8cbf4f2511: + resolution: {integrity: sha512-4PtBWFJ6NqR350zYVt9AsFDtISTqsdqna79FvSYPfYDXuuqFmiKtZdkTnYPslnsOMedTW0pEvaQ7eqjD+sA+HA==} + peerDependencies: + react: '>=16.8 || ^17.0.0 || ^18.0.0' + react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' + dependencies: + framesync: 6.0.1 + hey-listen: 1.0.8 + popmotion: 11.0.3 + react: 18.0.0-rc.1 + react-dom: 18.0.0-rc.1_react@18.0.0-rc.1 + style-value-types: 5.0.0 + tslib: 2.3.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /framesync/5.3.0: + resolution: {integrity: sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==} + dependencies: + tslib: 2.3.1 + dev: false + + /framesync/6.0.1: + resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} + dependencies: + tslib: 2.3.1 + dev: false + /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -3464,6 +4496,11 @@ packages: has: 1.0.3 has-symbols: 1.0.3 + /get-nonce/1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-own-enumerable-property-symbols/3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: false @@ -3598,6 +4635,16 @@ packages: hasBin: true dev: false + /hey-listen/1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + /html-encoding-sniffer/3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -3645,7 +4692,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.2 + debug: 4.3.3 transitivePeerDependencies: - supports-color dev: false @@ -3746,6 +4793,12 @@ packages: has: 1.0.3 side-channel: 1.0.4 + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /ip-regex/4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -4210,6 +5263,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.mergewith/4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: false + /lodash.sortby/4.7.0: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} dev: false @@ -4909,6 +5966,15 @@ packages: resolution: {integrity: sha512-7nhBjcdyhj/mdNiom0k3UBbwVL7M8jJj9uz9nODsWS319KJ+yWyhgFSc+Mwzf/oR/sprcQlcmEw43iqZ/I6rPw==} dev: false + /popmotion/11.0.3: + resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} + dependencies: + framesync: 6.0.1 + hey-listen: 1.0.8 + style-value-types: 5.0.0 + tslib: 2.3.1 + dev: false + /postcss-js/4.0.0_postcss@8.4.7: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} engines: {node: ^12 || ^14 || >= 16} @@ -5102,6 +6168,15 @@ packages: - supports-color dev: false + /react-clientside-effect/1.2.5_react@18.0.0-rc.1: + resolution: {integrity: sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + react: 18.0.0-rc.1 + dev: false + /react-dom/18.0.0-rc.1_react@18.0.0-rc.1: resolution: {integrity: sha512-BZ9NEwUp56MEguEwAzuh3u4bYE9Jv3QrzjaTmu11PV4C/lJCARTELEI16vjnHLq184GoJcCHMBrDILqlCrkZFQ==} peerDependencies: @@ -5112,6 +6187,10 @@ packages: scheduler: 0.21.0-rc.1-next-f468816ef-20220225 dev: false + /react-fast-compare/3.2.0: + resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} + dev: false + /react-feather/2.0.9_react@18.0.0-rc.1: resolution: {integrity: sha512-yMfCGRkZdXwIs23Zw/zIWCJO3m3tlaUvtHiXlW+3FH7cIT6fiK1iJ7RJWugXq7Fso8ZaQyUm92/GOOHXvkiVUw==} peerDependencies: @@ -5121,6 +6200,22 @@ packages: react: 18.0.0-rc.1 dev: false + /react-focus-lock/2.5.2_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + focus-lock: 0.9.2 + prop-types: 15.8.1 + react: 18.0.0-rc.1 + react-clientside-effect: 1.2.5_react@18.0.0-rc.1 + use-callback-ref: 1.2.5_76220cd404ce3584e7b4e070e95dcd42 + use-sidecar: 1.0.5_react@18.0.0-rc.1 + transitivePeerDependencies: + - '@types/react' + dev: false + /react-hook-form/7.27.1_react@18.0.0-rc.1: resolution: {integrity: sha512-N3a7A6zIQ8DJeThisVZGtOUabTbJw+7DHJidmB9w8m3chckv2ZWKb5MHps9d2pPJqmCDoWe53Bos56bYmJms5w==} engines: {node: '>=12.22.0'} @@ -5134,6 +6229,58 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-remove-scroll-bar/2.2.0_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==} + engines: {node: '>=8.5.0'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + react: 18.0.0-rc.1 + react-style-singleton: 2.1.1_76220cd404ce3584e7b4e070e95dcd42 + tslib: 1.14.1 + dev: false + + /react-remove-scroll/2.4.1_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA==} + engines: {node: '>=8.5.0'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + react: 18.0.0-rc.1 + react-remove-scroll-bar: 2.2.0_76220cd404ce3584e7b4e070e95dcd42 + react-style-singleton: 2.1.1_76220cd404ce3584e7b4e070e95dcd42 + tslib: 1.14.1 + use-callback-ref: 1.2.5_76220cd404ce3584e7b4e070e95dcd42 + use-sidecar: 1.0.5_react@18.0.0-rc.1 + dev: false + + /react-style-singleton/2.1.1_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==} + engines: {node: '>=8.5.0'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.0.0-rc.1 + tslib: 1.14.1 + dev: false + /react-toast-notifications/2.5.1_dde4e734dd2b0b3bb2733d8cbf4f2511: resolution: {integrity: sha512-eYuuiSPGLyuMHojRH2U7CbENvFHsvNia39pLM/s10KipIoNs14T7RIJk4aU2N+l++OsSgtJqnFObx9bpwLMU5A==} peerDependencies: @@ -5708,6 +6855,13 @@ packages: truncate: 2.1.0 dev: false + /style-value-types/5.0.0: + resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} + dependencies: + hey-listen: 1.0.8 + tslib: 2.3.1 + dev: false + /styled-jsx/5.0.0_react@18.0.0-rc.1: resolution: {integrity: sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==} engines: {node: '>= 12.0.0'} @@ -5890,6 +7044,10 @@ packages: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: false + /tiny-invariant/1.2.0: + resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==} + dev: false + /tlds/1.230.0: resolution: {integrity: sha512-QFuY6JBWZt2bZXlapjqsojul5dv9xfo7Uc8wTUlctJOuF+BS/ICni2f4x7MFiT7muUVmcKC1LvGnU4GWhYO0PQ==} hasBin: true @@ -5997,7 +7155,6 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} @@ -6158,6 +7315,31 @@ packages: tlds: 1.230.0 dev: false + /use-callback-ref/1.2.5_76220cd404ce3584e7b4e070e95dcd42: + resolution: {integrity: sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==} + engines: {node: '>=8.5.0'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + react: 18.0.0-rc.1 + dev: false + + /use-sidecar/1.0.5_react@18.0.0-rc.1: + resolution: {integrity: sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA==} + engines: {node: '>=8.5.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + detect-node-es: 1.1.0 + react: 18.0.0-rc.1 + tslib: 1.14.1 + dev: false + /use-subscription/1.5.1_react@18.0.0-rc.1: resolution: {integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==} peerDependencies: @@ -6211,6 +7393,12 @@ packages: xml-name-validator: 4.0.0 dev: false + /warning/4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + /webidl-conversions/3.0.1: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} dev: false diff --git a/prisma/migrations/20210429025219_init/migration.sql b/prisma/migrations/20210429025219_init/migration.sql index 82b63f2..5b64243 100644 --- a/prisma/migrations/20210429025219_init/migration.sql +++ b/prisma/migrations/20210429025219_init/migration.sql @@ -122,7 +122,7 @@ begin return new; else insert into public.pusers ("id", "role") - values (new.id, 'admin'::user_role); + values (new.id, 'admin'); return new; end if; end; diff --git a/prisma/prepare_migrate_dev.patch b/prisma/prepare_migrate_dev.patch new file mode 100644 index 0000000..f19782e --- /dev/null +++ b/prisma/prepare_migrate_dev.patch @@ -0,0 +1,183 @@ +diff --git a/prisma/migrations/20210429025219_init/migration.sql b/prisma/migrations/20210429025219_init/migration.sql +index 82b63f2..ff0d9c6 100644 +--- a/prisma/migrations/20210429025219_init/migration.sql ++++ b/prisma/migrations/20210429025219_init/migration.sql +@@ -70,8 +70,8 @@ CREATE TABLE "bookmarks" + + ALTER TABLE bookmarks + ENABLE ROW LEVEL SECURITY; +-CREATE POLICY "bookmark_only_self" ON bookmarks +- FOR ALL USING (auth.uid() = user_id); ++-- CREATE POLICY "bookmark_only_self" ON bookmarks ++-- FOR ALL USING (auth.uid() = user_id); + + -- CreateTable + CREATE TABLE "links" +@@ -107,59 +107,59 @@ CREATE TABLE "pusers" + ); + alter table pusers + enable row level security; +-create policy "puser_only_view_self" +- on pusers for select +- using (auth.uid() = id); +- +--- inserts a row into public.users +-create or replace function public.handle_new_user() +- returns trigger as +-$$ +-begin +- if exists(select id from public.pusers limit 1) then +- insert into public.pusers (id) +- values (new.id); +- return new; +- else +- insert into public.pusers ("id", "role") +- values (new.id, 'admin'::user_role); +- return new; +- end if; +-end; +-$$ language plpgsql security definer; +- +--- trigger the function every time a user is created +-create trigger on_auth_user_created +- after insert +- on auth.users +- for each row +-execute procedure public.handle_new_user(); +- +--- update user +-create or replace function public.handle_user_setting() +- returns trigger as +-$$ +-begin +- update auth.users +- set raw_user_meta_data=new.settings || jsonb_build_object('role', new.role::user_role) +- where id = new.id; +- return new; +-end; +-$$ language plpgsql security definer; +- +--- trigger the function every time user setting updated +-create trigger on_user_setting_updated +- after update +- on pusers +- for each row +-execute procedure public.handle_user_setting(); +- +--- trigger the function every time user setting updated +-create trigger on_user_setting_insert +- after insert +- on pusers +- for each row +-execute procedure public.handle_user_setting(); ++-- create policy "puser_only_view_self" ++-- on pusers for select ++-- using (auth.uid() = id); ++ ++-- -- inserts a row into public.users ++-- create or replace function public.handle_new_user() ++-- returns trigger as ++-- $$ ++-- begin ++-- if exists(select id from public.pusers limit 1) then ++-- insert into public.pusers (id) ++-- values (new.id); ++-- return new; ++-- else ++-- insert into public.pusers ("id", "role") ++-- values (new.id, 'admin'::user_role); ++-- return new; ++-- end if; ++-- end; ++-- $$ language plpgsql security definer; ++ ++-- -- trigger the function every time a user is created ++-- create trigger on_auth_user_created ++-- after insert ++-- on auth.users ++-- for each row ++-- execute procedure public.handle_new_user(); ++ ++-- -- update user ++-- create or replace function public.handle_user_setting() ++-- returns trigger as ++-- $$ ++-- begin ++-- update auth.users ++-- set raw_user_meta_data=new.settings || jsonb_build_object('role', new.role::user_role) ++-- where id = new.id; ++-- return new; ++-- end; ++-- $$ language plpgsql security definer; ++ ++-- -- trigger the function every time user setting updated ++-- create trigger on_user_setting_updated ++-- after update ++-- on pusers ++-- for each row ++-- execute procedure public.handle_user_setting(); ++ ++-- -- trigger the function every time user setting updated ++-- create trigger on_user_setting_insert ++-- after insert ++-- on pusers ++-- for each row ++-- execute procedure public.handle_user_setting(); + + + -- CreateTable +diff --git a/prisma/migrations/20210502040805_narrow_privileges/migration.sql b/prisma/migrations/20210502040805_narrow_privileges/migration.sql +index 70557e8..2ef1f63 100644 +--- a/prisma/migrations/20210502040805_narrow_privileges/migration.sql ++++ b/prisma/migrations/20210502040805_narrow_privileges/migration.sql +@@ -4,21 +4,21 @@ REVOKE UPDATE, DELETE, INSERT + FROM anon, authenticated; + + --- security pusers +-drop policy "puser_only_view_self" on pusers; +-CREATE POLICY "puser_only_self" +- ON pusers FOR ALL +- USING (auth.uid() = id); ++-- drop policy "puser_only_view_self" on pusers; ++-- CREATE POLICY "puser_only_self" ++-- ON pusers FOR ALL ++-- USING (auth.uid() = id); + +--- check uid for taggings +-ALTER TABLE taggings ENABLE ROW LEVEL SECURITY; +-CREATE POLICY "tagging_only_self" +- ON taggings FOR ALL +- USING (auth.uid() IN (SELECT user_id FROM bookmarks WHERE id=taggings.bookmark_id)); ++-- -- check uid for taggings ++-- ALTER TABLE taggings ENABLE ROW LEVEL SECURITY; ++-- CREATE POLICY "tagging_only_self" ++-- ON taggings FOR ALL ++-- USING (auth.uid() IN (SELECT user_id FROM bookmarks WHERE id=taggings.bookmark_id)); + + -- _prisma_migrations is private +-REVOKE ALL +- ON public._prisma_migrations +-FROM anon, authenticated; ++-- REVOKE ALL ++-- ON public._prisma_migrations ++-- FROM anon, authenticated; + + -- security links table + REVOKE ALL +diff --git a/prisma/migrations/20210502054201_puser_privileges/migration.sql b/prisma/migrations/20210502054201_puser_privileges/migration.sql +index dd255d3..e3f8c5e 100644 +--- a/prisma/migrations/20210502054201_puser_privileges/migration.sql ++++ b/prisma/migrations/20210502054201_puser_privileges/migration.sql +@@ -1,8 +1,8 @@ +-DROP POLICY "puser_only_self" ON pusers; ++-- DROP POLICY "puser_only_self" ON pusers; + +-CREATE POLICY "puser_only_view_self" +- ON pusers FOR SELECT +- USING (auth.uid() = id); ++-- CREATE POLICY "puser_only_view_self" ++-- ON pusers FOR SELECT ++-- USING (auth.uid() = id); + + CREATE POLICY "puser_not_update" + ON pusers FOR UPDATE diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 05e82b2..9b121c1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -49,7 +49,7 @@ model User { id String @id @db.Uuid role user_role @default(user) settings Json @default("{}") - api_token String @unique @db.Uuid + api_token String? @unique @default(dbgenerated("gen_random_uuid()")) @db.Uuid bookmarks Bookmark[] @@map("pusers")