diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..837bdb720 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: 'bug: [DESCRIPTION]' +labels: 'type: bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/discussion-thread.md b/.github/ISSUE_TEMPLATE/discussion-thread.md new file mode 100644 index 000000000..09e52ae68 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/discussion-thread.md @@ -0,0 +1,14 @@ +--- +name: Discussion thread +about: Start an open ended discussion +title: 'Discussion: [TOPIC HERE]' +labels: '' +assignees: '' + +--- + +**Motivation** + +**Discussion** + +**Resources** diff --git a/.github/ISSUE_TEMPLATE/epic-request.md b/.github/ISSUE_TEMPLATE/epic-request.md new file mode 100644 index 000000000..bfad8e5f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/epic-request.md @@ -0,0 +1,20 @@ +--- +name: Epic request +about: Suggest an idea for this project +title: 'epic: [DESCRIPTION]' +labels: 'type: epic' +assignees: '' + +--- + +**Problem** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Success Criteria** +A clear and concise description of what you want to happen. + +**Sub Issues** +- + +**Additional context** +Add any other context or screenshots about the epic request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..26f586bd0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: 'feat: [DESCRIPTION]' +labels: 'type: feature request' +assignees: '' + +--- + +**Problem** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Success Criteria** +A clear and concise description of what you want to happen. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/ci-production.yml b/.github/workflows/ci-production.yml deleted file mode 100644 index 0d0a0a152..000000000 --- a/.github/workflows/ci-production.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Jan CI Production - -on: - push: - tags: ['v*.*.*'] - -env: - REGISTRY: ghcr.io - HASURA_WORKER_IMAGE_NAME: ${{ github.repository }}/worker - WEB_CLIENT_IMAGE_NAME: ${{ github.repository }}/web-client - -jobs: - build-docker-image: - runs-on: ubuntu-latest - environment: production - permissions: - contents: read - packages: write - steps: - - name: Getting the repo - uses: actions/checkout@v3 - - - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get tag - id: tag - uses: dawidd6/action-get-tag@v1 - - # Build and docker image for app-backend worker - - name: Build docker image for app-backend worker - run: | - cd ./app-backend/worker - docker build -t ${{ env.REGISTRY }}/${{ env.HASURA_WORKER_IMAGE_NAME }}:${{ steps.tag.outputs.tag }} . - docker push ${{ env.REGISTRY }}/${{ env.HASURA_WORKER_IMAGE_NAME }}:${{ steps.tag.outputs.tag }} - - # Get .env for FE - - name: Get .env file for build time - run: cd ./web-client && base64 -d <<< "$ENV_FILE_BASE64" > .env - shell: bash - env: - ENV_FILE_BASE64: ${{ secrets.ENV_FILE_BASE64 }} - - # Build and push docker for web client - - name: Build docker image for web-client - run: | - cd ./web-client - docker build -t ${{ env.REGISTRY }}/${{ env.WEB_CLIENT_IMAGE_NAME }}:${{ steps.tag.outputs.tag }} . - docker push ${{ env.REGISTRY }}/${{ env.WEB_CLIENT_IMAGE_NAME }}:${{ steps.tag.outputs.tag }} diff --git a/.github/workflows/ci-staging.yml b/.github/workflows/ci-staging.yml deleted file mode 100644 index 5f42cef4b..000000000 --- a/.github/workflows/ci-staging.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Jan CI Staging -on: - push: - branches: - - stag - paths: - - 'app-backend/worker/**' # hasura worker source code - - 'web-client/**' # web client source code - -env: - REGISTRY: ghcr.io - HASURA_WORKER_IMAGE_NAME: ${{ github.repository }}/worker - WEB_CLIENT_IMAGE_NAME: ${{ github.repository }}/web-client - -jobs: - build-docker-image: - runs-on: ubuntu-latest - environment: staging - permissions: - contents: read - packages: write - steps: - - name: Getting the repo - uses: actions/checkout@v3 - - - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get current date - id: date - run: echo "::set-output name=date::$(date +'%Y.%m.%d')" - - # Build docker image for app-backend worker - - name: Build docker image for app-backend worker - if: ${{ contains(github.event.head_commit.added, 'app-backend/worker/') }} - run: | - cd ./app-backend/worker - docker build -t ${{ env.REGISTRY }}/${{ env.HASURA_WORKER_IMAGE_NAME }}:staging-${{ steps.date.outputs.date }}.${{github.run_number}} . - docker push ${{ env.REGISTRY }}/${{ env.HASURA_WORKER_IMAGE_NAME }}:staging-${{ steps.date.outputs.date }}.${{github.run_number}} - - # Get .env for FE - - name: Get .env file for build time - run: cd ./web-client && base64 -d <<< "$ENV_FILE_BASE64" > .env - shell: bash - env: - ENV_FILE_BASE64: ${{ secrets.ENV_FILE_BASE64 }} - - # Build and push docker for web client - - name: Build docker image for web-client - if: ${{ contains(github.event.head_commit.added, 'web-client/') }} - run: | - cd ./web-client - docker build -t ${{ env.REGISTRY }}/${{ env.WEB_CLIENT_IMAGE_NAME }}:staging-${{ steps.date.outputs.date }}.${{github.run_number}} . - docker push ${{ env.REGISTRY }}/${{ env.WEB_CLIENT_IMAGE_NAME }}:staging-${{ steps.date.outputs.date }}.${{github.run_number}} diff --git a/.github/workflows/deploy-jan-docs.yml b/.github/workflows/deploy-jan-docs.yml index a61abf271..e35117a39 100644 --- a/.github/workflows/deploy-jan-docs.yml +++ b/.github/workflows/deploy-jan-docs.yml @@ -19,8 +19,8 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - cache: 'npm' - cache-dependency-path: './docs/package-lock.json' + cache: 'yarn' + cache-dependency-path: './docs/yarn.lock' - name: Install dependencies run: yarn install @@ -30,7 +30,7 @@ jobs: working-directory: docs - name: Add Custome Domain file - run: echo "docs.jan.ai" > ./docs/build/CNAME + run: echo "${{ vars.DOCUSAURUS_DOMAIN }}" > ./docs/build/CNAME # Popular action to deploy to GitHub Pages: # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus diff --git a/.github/workflows/macos-build-app.yml b/.github/workflows/macos-build-app.yml new file mode 100644 index 000000000..0977d1a6f --- /dev/null +++ b/.github/workflows/macos-build-app.yml @@ -0,0 +1,50 @@ +name: Jan Build MacOS App + +on: + push: + tags: ['v*.*.*'] + +jobs: + build-macos-app: + runs-on: macos-latest + + permissions: + contents: write + steps: + - name: Getting the repo + uses: actions/checkout@v3 + + - name: Installing node + uses: actions/setup-node@v1 + with: + node-version: 20 + + - name: Install jq + uses: dcarbone/install-jq-action@v2.0.1 + + - name: Get tag + id: tag + uses: dawidd6/action-get-tag@v1 + + - name: Update app version base on tag + run: | + if [[ ! "${VERSION_TAG}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Error: Tag is not valid!" + exit 1 + fi + jq --arg version "${VERSION_TAG#v}" '.version = $version' electron/package.json > /tmp/package.json + mv /tmp/package.json electron/package.json + env: + VERSION_TAG: ${{ steps.tag.outputs.tag }} + + - name: Install yarn dependencies + run: | + yarn install + yarn build:plugins + + - name: Build and publish app + run: | + yarn build:publish + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + diff --git a/.gitignore b/.gitignore index 2f01a3534..2fd305c0d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,11 @@ # Jan inference models/** error.log +node_modules +package-lock.json +*.tgz +yarn.lock +dist +build +.DS_Store +electron/renderer diff --git a/KC.md b/KC.md deleted file mode 100644 index 3773e241b..000000000 --- a/KC.md +++ /dev/null @@ -1,28 +0,0 @@ -# Configuring Keycloak theme -Jan comes with a default theme for Keycloak. Extended from [Keywind](https://github.com/lukin/keywind) - -## Select keywind as theme -1. Navigate to http://localhost:8088/admin -2. Sign in with below credentials -``` -username: admin -password: admin -``` -3. Select `hasura` from the top left dropdown box -![Screenshot 2023-09-06 at 15 10 53](https://github.com/janhq/jan/assets/10397206/5e3cf99b-7cd6-43ff-a003-e66aedd8c850) - -4. Select `Realm settings` on left navigation bar and open tab `Themes` -![Screenshot 2023-09-06 at 15 14 05](https://github.com/janhq/jan/assets/10397206/3256b5c4-e3e7-48ef-9c5e-f720b5beeaa8) - -5. On `Login theme` open the drop down box and select `keywind` -![Screenshot 2023-09-06 at 15 15 28](https://github.com/janhq/jan/assets/10397206/c52ba743-d978-4963-9311-cf84b4bb5389) - -6. Save - -**That's it!** - -Open your web browser and navigate to `http://localhost:3000` to access Jan web application. Proceed to `Login` on the top right. - -You should expect the theme as below. If it's does not, try to clear the cache from your browser. - -![Screenshot 2023-09-06 at 15 29 09](https://github.com/janhq/jan/assets/10397206/a80a32e7-633f-4109-90fa-ec223c9d3b17) diff --git a/README.md b/README.md index 9c65ea486..ef4efa032 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Jan - Self-Hosted AI Platform +# Jan - Run your own AI

janlogo @@ -20,13 +20,14 @@ > ⚠️ **Jan is currently in Development**: Expect breaking changes and bugs! -Jan helps you run Local AI on your computer, with 1-click installs for the latest models. Easy-to-use yet powerful, with helpful tools to monitor and manage software-hardware performance. +Jan lets you run AI on your own hardware, with helpful tools to manage models and monitor your hardware performance. -Jan runs on a wide variety of hardware. We run on consumer-grade GPUs and Mac Minis, as well as datacenter-grade DGX H100 clusters. +In the background, Jan runs [Nitro](https://nitro.jan.ai), a C++ inference engine. It runs various model formats (GGUF/TensorRT) on various hardware (Mac M1/M2/Intel, Windows, Linux, and datacenter-grade Nvidia GPUs) with optional GPU acceleration. -Jan can be run as a server or cloud-native application for enterprise. We offer enterprise plugins for LDAP integration and Audit Logs. Contact us at [hello@jan.ai](mailto:hello@jan.ai) for more details. +> See the Nitro codebase at https://nitro.jan.ai. -Jan is free, [open core](https://en.wikipedia.org/wiki/Open-core_model), and licensed under a Sustainable Use License. + + ## Demo @@ -34,208 +35,107 @@ Jan is free, [open core](https://en.wikipedia.org/wiki/Open-core_model), and lic Jan Web GIF

-## Features +## Quicklinks -**Self-Hosted AI** -- [x] Self-hosted Llama2 and LLMs -- [ ] Self-hosted StableDiffusion and Controlnet -- [ ] 1-click installs for Models (coming soon) +- Developer documentation: https://jan.ai/docs (Work in Progress) +- Desktop app: Download at https://jan.ai/ +- Mobile app shell: Download via [App Store](https://apps.apple.com/us/app/jan-on-device-ai-cloud-ais/id6449664703) | [Android](https://play.google.com/store/apps/details?id=com.jan.ai) +- Nitro (C++ AI Engine): https://nitro.jan.ai -**3rd-party AIs** -- [ ] Connect to ChatGPT, Claude via API Key (coming soon) -- [ ] Security policy engine for 3rd-party AIs (coming soon) -- [ ] Pre-flight PII and Sensitive Data checks (coming soon) +## Plugins -**Multi-Device** -- [x] Web App -- [ ] Jan Mobile support for custom Jan server (in progress) -- [ ] Cloud deployments (coming soon) +Jan supports core & 3rd party extensions: -**Organization Tools** -- [x] Multi-user support -- [ ] Audit and Usage logs (coming soon) -- [ ] Compliance and Audit policy (coming soon) +- [x] **LLM chat**: Self-hosted Llama2 and LLMs +- [x] **Model Manager**: 1-click to install, swap, and delete models +- [x] **Storage**: Optionally store your conversation history and other data in SQLite/your storage of choice +- [ ] **3rd-party AIs**: Connect to ChatGPT, Claude via API Key (in progress) +- [ ] **Cross device support**: Mobile & Web support for custom shared servers (in progress) +- [ ] **File retrieval**: User can upload private and run a vectorDB (planned) +- [ ] **Multi-user support**: Share a single server across a team/friends (planned) +- [ ] **Compliance**: Auditing and flagging features (planned) -**Hardware Support** +## Hardware Support -- [x] Nvidia GPUs -- [x] Apple Silicon (in progress) -- [x] CPU support via llama.cpp -- [ ] Nvidia GPUs using TensorRT (in progress) +Nitro provides both CPU and GPU support, via [llama.cpp](https://github.com/ggerganov/llama.cpp) and [TensorRT](https://github.com/NVIDIA/TensorRT), respectively. -## Documentation +- [x] Nvidia GPUs (accelerated) +- [x] Apple M-series (accelerated) +- [x] Linux DEB +- [x] Windows x64 -👋 https://docs.jan.ai (Work in Progress) +Not supported yet: Apple Intel, Linux RPM, Windows x86|ARM64, AMD ROCm -## Installation +> See [developer docs](https://docs.jan.ai/docs/) for detailed installation instructions. -> ⚠️ **Jan is currently in Development**: Expect breaking changes and bugs! +## Contributing -### Step 1: Install Docker +Contributions are welcome! Please read the [CONTRIBUTING.md](CONTRIBUTING.md) file -Jan is currently packaged as a Docker Compose application. +### Pre-requisites +- node >= 20.0.0 +- yarn >= 1.22.0 -- Docker ([Installation Instructions](https://docs.docker.com/get-docker/)) -- Docker Compose ([Installation Instructions](https://docs.docker.com/compose/install/)) +### Use as complete suite (in progress) +### For interactive development -### Step 2: Clone Repo +Note: This instruction is tested on MacOS only. -```bash -git clone https://github.com/janhq/jan.git -cd jan -``` +1. **Clone the Repository:** -### Step 3: Configure `.env` + ``` + git clone https://github.com/janhq/jan + git checkout feature/hackathon-refactor-jan-into-electron-app + cd jan + ``` -We provide a sample `.env` file that you can use to get started. +2. **Install dependencies:** -```shell -cp sample.env .env -``` + ``` + yarn install -You will need to set the following `.env` variables + # Packing base plugins + yarn build:plugins + ``` -```shell -# TODO: Document .env variables -``` +4. **Run development and Using Jan Desktop** -### Step 4: Install Models + ``` + yarn dev + ``` + This will start the development server and open the desktop app. + In this step, there are a few notification about installing base plugin, just click `OK` and `Next` to continue. -> Note: These step will change soon as we will be switching to [Nitro](https://github.com/janhq/nitro), an Accelerated Inference Server written in C++ +### For production build -#### Step 4.1: Install Mamba + ```bash + # Do step 1 and 2 in previous section + git clone https://github.com/janhq/jan + cd jan + yarn install + yarn build:plugins -> For complete Mambaforge installation instructions, see [miniforge repo](https://github.com/conda-forge/miniforge) + # Build the app + yarn build + ``` -Install Mamba to handle native python binding (which can yield better performance on Mac M/ NVIDIA) + This will build the app MacOS m1/m2 for production (with code signing already done) and put the result in `dist` folder. -```bash -curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" -bash Mambaforge-$(uname)-$(uname -m).sh -rm Mambaforge-$(uname)-$(uname -m).sh +## License -# Create environment -conda create -n jan python=3.9.16 -conda activate jan -``` +Jan is free, [open core](https://en.wikipedia.org/wiki/Open-core_model), and Sustainable Use Licensed. -Uninstall any previous versions of `llama-cpp-python` -```bash -pip uninstall llama-cpp-python -y -``` +## Acknowledgements -#### Step 4.2: Install `llama-cpp-python` - -> Note: This step will change soon once [Nitro](https://github.com/janhq/nitro) (our accelerated inference server written in C++) is released - -- On Mac - -```bash -# See https://github.com/abetlen/llama-cpp-python/blob/main/docs/install/macos.md -CMAKE_ARGS="-DLLAMA_METAL=on" FORCE_CMAKE=1 pip install -U llama-cpp-python --no-cache-dir -pip install 'llama-cpp-python[server]' -``` - -- On Linux with NVIDIA GPU Hardware Acceleration - -```bash -# See https://github.com/abetlen/llama-cpp-python#installation-with-hardware-acceleration -CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip install llama-cpp-python -pip install 'llama-cpp-python[server]' -``` - -- On Linux with Intel/ AMD CPU (support for AVX-2/ AVX-512) - -```bash -CMAKE_ARGS="-DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS" FORCE_CMAKE=1 pip install llama-cpp-python -pip install 'llama-cpp-python[server]' -``` - -We recommend that Llama2-7B (4-bit quantized) as a basic model to get started. - -You will need to download the models to the `models` folder at root level. - -```shell -# Downloads model (~4gb) -# Download time depends on your internet connection and HuggingFace's bandwidth -# In this part, please head over to any source contains `.gguf` format model - https://huggingface.co/models?search=gguf -wget https://huggingface.co/TheBloke/Llama-2-7B-GGUF/resolve/main/llama-2-7b.Q4_0.gguf -P models -``` - -- Run the model in host machine -```bash -# Please change the value of --model key as your corresponding model path -# The --n_gpu_layers 1 means using acclerator (can be Metal on Mac, NVIDIA GPU on on linux with NVIDIA GPU) -# This service will run at `http://localhost:8000` in host level -# The backend service inside docker compose will connect to this service by using `http://host.docker.internal:8000` -python3 -m llama_cpp.server --model models/llama-2-7b.Q4_0.gguf --n_gpu_layers 1 -``` - -### Step 5: `docker compose up` - -Jan utilizes Docker Compose to run all services: - -```shell -docker compose up -d # Detached mode -``` - -The table below summarizes the services and their respective URLs and credentials. - -| Service | Container Name | URL and Port | Credentials | -| ------------------------------------------------ | -------------------- | --------------------- | ---------------------------------------------------------------------------------- | -| Jan Web | jan-web-* | http://localhost:3000 | Set in `conf/keycloak_conf/example-realm.json`
- Default Username / Password | -| [Hasura](https://hasura.io) (Backend) | jan-graphql-engine-* | http://localhost:8080 | Set in `conf/sample.env_app-backend`
- `HASURA_GRAPHQL_ADMIN_SECRET` | -| [Keycloak](https://www.keycloak.org/) (Identity) | jan-keycloak-* | http://localhost:8088 | Set in `.env`
- `KEYCLOAK_ADMIN`
- `KEYCLOAK_ADMIN_PASSWORD` | | -| PostgresDB | jan-postgres-* | http://localhost:5432 | Set in `.env` | - -### Step 6: Configure Keycloak - -- [ ] Refactor [Keycloak Instructions](KC.md) into main README.md -- [ ] Changing login theme - -### Step 7: Use Jan - -- Launch the web application via `http://localhost:3000`. -- Login with default user (username: `username`, password: `password`) - -### Step 8: Deploying to Production - -- [ ] TODO - -## About Jan - -Jan is a commercial company with a [Fair Code](https://faircode.io/) business model. This means that while we are open-source and can used for free, we require commercial licenses for specific use cases (e.g. hosting Jan as a service). - -We are a team of engineers passionate about AI, productivity and the future of work. We are funded through consulting contracts and enterprise licenses. Feel free to reach out to us! - -### Repo Structure - -Jan comprises of several repositories: - -| Repo | Purpose | -| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Jan](https://github.com/janhq/jan) | AI Platform to run AI in the enterprise. Easy-to-use for users, and packed with useful organizational and compliance features. | -| [Jan Mobile](https://github.com/janhq/jan-react-native) | Mobile App that can be pointed to a custom Jan server. | -| [Nitro](https://github.com/janhq/nitro) | Inference Engine that runs AI on different types of hardware. Offers popular API formats (e.g. OpenAI, Clipdrop). Written in C++ for blazing fast performance | - -### Architecture - -Jan builds on top of several open-source projects: +Jan builds on top of other open-source projects: +- [llama.cpp](https://github.com/ggerganov/llama.cpp) +- [TensorRT](https://github.com/NVIDIA/TensorRT) - [Keycloak Community](https://github.com/keycloak/keycloak) (Apache-2.0) -- [Hasura Community Edition](https://github.com/hasura/graphql-engine) (Apache-2.0) -We may re-evaluate this in the future, given different customer requirements. +## Contact - -### Contributing - -Contributions are welcome! Please read the [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines on how to contribute to this project. - -Please note that Jan intends to build a sustainable business that can provide high quality jobs to its contributors. If you are excited about our mission and vision, please contact us to explore opportunities. - -### Contact - -- For support: please file a Github ticket -- For questions: join our Discord [here](https://discord.gg/FTk2MvZwJH) -- For long form inquiries: please email hello@jan.ai +- Bugs & requests: file a Github ticket +- For discussion: join our Discord [here](https://discord.gg/FTk2MvZwJH) +- For business inquiries: email hello@jan.ai +- For jobs: please email hr@jan.ai diff --git a/app-backend/.gitignore b/app-backend/.gitignore deleted file mode 100644 index 4caef3e61..000000000 --- a/app-backend/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -.env -.env_postgresql -worker/node_modules/.mf diff --git a/app-backend/README.md b/app-backend/README.md deleted file mode 100644 index 0c693253b..000000000 --- a/app-backend/README.md +++ /dev/null @@ -1,59 +0,0 @@ -## Jan Backend - -A Hasura Data API Platform designed to provide APIs for client interaction with the Language Model (LLM) through chat or the generation of art using Stable Diffusion. It is encapsulated within a Docker container for easy local deployment - -## Quickstart -1. Run docker up - -```bash -docker compose up -``` - -2. Install [HasuraCLI](https://hasura.io/docs/latest/hasura-cli/overview/) - -3. Open Hasura Console - -```bash -cd hasura && hasura console -``` - -4. Apply Migration - -```bash -hasura migrate apply -``` - -5. Apply Metadata - -```bash -hasura metadata apply -``` - -6. Apply seeds - -```bash -hasura seed apply -``` - -## Hasura One Click Deploy -Use this URL to deploy this app to Hasura Cloud - -[![Hasura Deploy](https://hasura.io/deploy-button.svg)](https://cloud.hasura.io/deploy?github_repo=https://github.com/janhq/app-backend/&hasura_dir=/hasura) - -[One-click deploy docs](https://hasura.io/docs/latest/getting-started/getting-started-cloud/) - -## Modify schema & model -[Hasura Tutorials](https://hasura.io/docs/latest/resources/tutorials/index/) - -## Events & Workers - -Serverless function (Cloudflare worker) to stream llm message & update - -Readmore about Hasura Events here: -> https://hasura.io/docs/latest/event-triggers/serverless/ - -## Deploy Worker -```bash -npx wrangler deploy -``` -[Cloudflare Worker Guide](https://developers.cloudflare.com/workers/get-started/guide/) \ No newline at end of file diff --git a/app-backend/docker-compose.yml b/app-backend/docker-compose.yml deleted file mode 100644 index 5f60468e0..000000000 --- a/app-backend/docker-compose.yml +++ /dev/null @@ -1,52 +0,0 @@ -version: "3.6" -services: - postgres: - image: postgres:13 - restart: always - volumes: - - db_data:/var/lib/postgresql/data - env_file: - - .env_postgresql - graphql-engine: - image: hasura/graphql-engine:v2.31.0.cli-migrations-v3 - ports: - - "8080:8080" - restart: always - env_file: - - .env - volumes: - - ./hasura/migrations:/migrations - - ./hasura/metadata:/metadata - depends_on: - data-connector-agent: - condition: service_healthy - - data-connector-agent: - image: hasura/graphql-data-connector:v2.31.0 - restart: always - ports: - - 8081:8081 - environment: - QUARKUS_LOG_LEVEL: ERROR # FATAL, ERROR, WARN, INFO, DEBUG, TRACE - ## https://quarkus.io/guides/opentelemetry#configuration-reference - QUARKUS_OPENTELEMETRY_ENABLED: "false" - ## QUARKUS_OPENTELEMETRY_TRACER_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317 - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8081/api/v1/athena/health"] - interval: 5s - timeout: 10s - retries: 5 - start_period: 5s - worker: - build: - context: ./worker - dockerfile: ./Dockerfile - restart: always - environment: - - "NODE_ENV=development" - volumes: - - ./worker:/worker - ports: - - "8787:8787" -volumes: - db_data: diff --git a/app-backend/hasura/config.yaml b/app-backend/hasura/config.yaml deleted file mode 100644 index d13faa054..000000000 --- a/app-backend/hasura/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: 3 -endpoint: http://localhost:8080 -admin_secret: myadminsecretkey -metadata_directory: metadata -actions: - kind: synchronous - handler_webhook_baseurl: http://localhost:3000 diff --git a/app-backend/hasura/metadata/actions.graphql b/app-backend/hasura/metadata/actions.graphql deleted file mode 100644 index 4b8328f43..000000000 --- a/app-backend/hasura/metadata/actions.graphql +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - imageGeneration( - input: ImageGenerationInput! - ): ImageGenerationOutput -} - -input ImageGenerationInput { - prompt: String! - neg_prompt: String! - model: String! - seed: Int! - steps: Int! - width: Int! - height: Int! -} - -type ImageGenerationOutput { - url: String! -} - diff --git a/app-backend/hasura/metadata/actions.yaml b/app-backend/hasura/metadata/actions.yaml deleted file mode 100644 index 2b1580711..000000000 --- a/app-backend/hasura/metadata/actions.yaml +++ /dev/null @@ -1,33 +0,0 @@ -actions: - - name: imageGeneration - definition: - kind: synchronous - handler: '{{HASURA_ACTION_STABLE_DIFFUSION_URL}}' - timeout: 1800 - request_transform: - body: - action: transform - template: |- - { - "prompt": {{$body.input.input.prompt}}, - "neg_prompt": {{$body.input.input.neg_prompt}}, - "unet_model": {{$body.input.input.model}}, - "seed": {{$body.input.input.seed}}, - "steps": {{$body.input.input.steps}}, - "width": {{$body.input.input.width}}, - "height": {{$body.input.input.height}} - } - method: POST - query_params: {} - template_engine: Kriti - url: '{{$base_url}}/inferences/txt2img' - version: 2 - permissions: - - role: user -custom_types: - enums: [] - input_objects: - - name: ImageGenerationInput - objects: - - name: ImageGenerationOutput - scalars: [] diff --git a/app-backend/hasura/metadata/allow_list.yaml b/app-backend/hasura/metadata/allow_list.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/allow_list.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/api_limits.yaml b/app-backend/hasura/metadata/api_limits.yaml deleted file mode 100644 index 0967ef424..000000000 --- a/app-backend/hasura/metadata/api_limits.yaml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/app-backend/hasura/metadata/backend_configs.yaml b/app-backend/hasura/metadata/backend_configs.yaml deleted file mode 100644 index 1266c8d5c..000000000 --- a/app-backend/hasura/metadata/backend_configs.yaml +++ /dev/null @@ -1,11 +0,0 @@ -dataconnector: - athena: - uri: http://data-connector-agent:8081/api/v1/athena - mariadb: - uri: http://data-connector-agent:8081/api/v1/mariadb - mysql8: - uri: http://data-connector-agent:8081/api/v1/mysql - oracle: - uri: http://data-connector-agent:8081/api/v1/oracle - snowflake: - uri: http://data-connector-agent:8081/api/v1/snowflake diff --git a/app-backend/hasura/metadata/cron_triggers.yaml b/app-backend/hasura/metadata/cron_triggers.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/cron_triggers.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/databases/databases.yaml b/app-backend/hasura/metadata/databases/databases.yaml deleted file mode 100644 index b420475e7..000000000 --- a/app-backend/hasura/metadata/databases/databases.yaml +++ /dev/null @@ -1,9 +0,0 @@ -- name: jandb - kind: postgres - configuration: - connection_info: - database_url: - from_env: PG_DATABASE_URL - isolation_level: read-committed - use_prepared_statements: false - tables: "!include jandb/tables/tables.yaml" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_collection_products.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_collection_products.yaml deleted file mode 100644 index 955361aed..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_collection_products.yaml +++ /dev/null @@ -1,43 +0,0 @@ -table: - name: collection_products - schema: public -array_relationships: - - name: collections - using: - manual_configuration: - column_mapping: - collection_id: id - insertion_order: null - remote_table: - name: collections - schema: public - - name: products - using: - manual_configuration: - column_mapping: - product_id: id - insertion_order: null - remote_table: - name: products - schema: public -select_permissions: - - role: public - permission: - columns: - - created_at - - updated_at - - collection_id - - id - - product_id - filter: {} - comment: "" - - role: user - permission: - columns: - - created_at - - updated_at - - collection_id - - id - - product_id - filter: {} - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_collections.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_collections.yaml deleted file mode 100644 index c84847f1c..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_collections.yaml +++ /dev/null @@ -1,36 +0,0 @@ -table: - name: collections - schema: public -array_relationships: - - name: collection_products - using: - manual_configuration: - column_mapping: - id: collection_id - insertion_order: null - remote_table: - name: collection_products - schema: public -select_permissions: - - role: public - permission: - columns: - - slug - - description - - name - - created_at - - updated_at - - id - filter: {} - comment: "" - - role: user - permission: - columns: - - slug - - description - - name - - created_at - - updated_at - - id - filter: {} - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_conversations.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_conversations.yaml deleted file mode 100644 index 41637a39b..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_conversations.yaml +++ /dev/null @@ -1,68 +0,0 @@ -table: - name: conversations - schema: public -object_relationships: - - name: conversation_product - using: - manual_configuration: - column_mapping: - product_id: id - insertion_order: null - remote_table: - name: products - schema: public -array_relationships: - - name: conversation_messages - using: - manual_configuration: - column_mapping: - id: conversation_id - insertion_order: null - remote_table: - name: messages - schema: public -insert_permissions: - - role: user - permission: - check: - user_id: - _eq: X-Hasura-User-Id - columns: - - last_image_url - - last_text_message - - product_id - - user_id - comment: "" -select_permissions: - - role: user - permission: - columns: - - last_image_url - - last_text_message - - user_id - - created_at - - updated_at - - id - - product_id - filter: - user_id: - _eq: X-Hasura-User-Id - comment: "" -update_permissions: - - role: user - permission: - columns: - - last_image_url - - last_text_message - filter: - user_id: - _eq: X-Hasura-User-Id - check: null - comment: "" -delete_permissions: - - role: user - permission: - filter: - user_id: - _eq: X-Hasura-User-Id - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_message_medias.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_message_medias.yaml deleted file mode 100644 index 1f223b01a..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_message_medias.yaml +++ /dev/null @@ -1,68 +0,0 @@ -table: - name: message_medias - schema: public -object_relationships: - - name: media_message - using: - manual_configuration: - column_mapping: - message_id: id - insertion_order: null - remote_table: - name: messages - schema: public -insert_permissions: - - role: user - permission: - check: - media_message: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - columns: - - media_url - - message_id - - mime_type - comment: "" -select_permissions: - - role: user - permission: - columns: - - mime_type - - media_url - - created_at - - updated_at - - id - - message_id - filter: - media_message: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - comment: "" -update_permissions: - - role: user - permission: - columns: - - mime_type - - media_url - - created_at - - updated_at - - id - - message_id - filter: - media_message: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - check: null - comment: "" -delete_permissions: - - role: user - permission: - filter: - media_message: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_messages.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_messages.yaml deleted file mode 100644 index eb0d06b79..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_messages.yaml +++ /dev/null @@ -1,86 +0,0 @@ -table: - name: messages - schema: public -object_relationships: - - name: message_conversation - using: - manual_configuration: - column_mapping: - conversation_id: id - insertion_order: null - remote_table: - name: conversations - schema: public -array_relationships: - - name: message_medias - using: - manual_configuration: - column_mapping: - id: message_id - insertion_order: null - remote_table: - name: message_medias - schema: public -insert_permissions: - - role: user - permission: - check: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - columns: - - content - - conversation_id - - message_sender_type - - message_type - - prompt_cache - - sender - - sender_avatar_url - - sender_name - - status - comment: "" -select_permissions: - - role: user - permission: - columns: - - content - - conversation_id - - created_at - - id - - message_sender_type - - message_type - - sender - - sender_avatar_url - - sender_name - - status - - updated_at - filter: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - comment: "" -update_permissions: - - role: user - permission: - columns: - - content - - message_sender_type - - message_type - - sender - - sender_avatar_url - - sender_name - - status - filter: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - check: null - comment: "" -delete_permissions: - - role: user - permission: - filter: - message_conversation: - user_id: - _eq: X-Hasura-User-Id - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_product_prompts.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_product_prompts.yaml deleted file mode 100644 index 8a0f9e90b..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_product_prompts.yaml +++ /dev/null @@ -1,43 +0,0 @@ -table: - name: product_prompts - schema: public -array_relationships: - - name: products - using: - manual_configuration: - column_mapping: - product_id: id - insertion_order: null - remote_table: - name: products - schema: public - - name: prompts - using: - manual_configuration: - column_mapping: - prompt_id: id - insertion_order: null - remote_table: - name: prompts - schema: public -select_permissions: - - role: public - permission: - columns: - - created_at - - updated_at - - id - - product_id - - prompt_id - filter: {} - comment: "" - - role: user - permission: - columns: - - created_at - - updated_at - - id - - product_id - - prompt_id - filter: {} - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_products.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_products.yaml deleted file mode 100644 index f38873115..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_products.yaml +++ /dev/null @@ -1,65 +0,0 @@ -table: - name: products - schema: public -array_relationships: - - name: product_collections - using: - manual_configuration: - column_mapping: - id: product_id - insertion_order: null - remote_table: - name: collection_products - schema: public - - name: product_prompts - using: - manual_configuration: - column_mapping: - id: product_id - insertion_order: null - remote_table: - name: product_prompts - schema: public -select_permissions: - - role: public - permission: - columns: - - nsfw - - slug - - inputs - - outputs - - author - - description - - greeting - - image_url - - long_description - - name - - source_url - - technical_description - - version - - created_at - - updated_at - - id - filter: {} - comment: "" - - role: user - permission: - columns: - - nsfw - - slug - - inputs - - outputs - - author - - description - - greeting - - image_url - - long_description - - name - - source_url - - technical_description - - version - - created_at - - updated_at - - id - filter: {} - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/public_prompts.yaml b/app-backend/hasura/metadata/databases/jandb/tables/public_prompts.yaml deleted file mode 100644 index 81cb8aadb..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/public_prompts.yaml +++ /dev/null @@ -1,36 +0,0 @@ -table: - name: prompts - schema: public -array_relationships: - - name: prompt_products - using: - manual_configuration: - column_mapping: - id: prompt_id - insertion_order: null - remote_table: - name: product_prompts - schema: public -select_permissions: - - role: public - permission: - columns: - - slug - - content - - image_url - - created_at - - updated_at - - id - filter: {} - comment: "" - - role: user - permission: - columns: - - slug - - content - - image_url - - created_at - - updated_at - - id - filter: {} - comment: "" diff --git a/app-backend/hasura/metadata/databases/jandb/tables/tables.yaml b/app-backend/hasura/metadata/databases/jandb/tables/tables.yaml deleted file mode 100644 index f541617f9..000000000 --- a/app-backend/hasura/metadata/databases/jandb/tables/tables.yaml +++ /dev/null @@ -1,8 +0,0 @@ -- "!include public_collection_products.yaml" -- "!include public_collections.yaml" -- "!include public_conversations.yaml" -- "!include public_message_medias.yaml" -- "!include public_messages.yaml" -- "!include public_product_prompts.yaml" -- "!include public_products.yaml" -- "!include public_prompts.yaml" diff --git a/app-backend/hasura/metadata/graphql_schema_introspection.yaml b/app-backend/hasura/metadata/graphql_schema_introspection.yaml deleted file mode 100644 index 61a4dcac2..000000000 --- a/app-backend/hasura/metadata/graphql_schema_introspection.yaml +++ /dev/null @@ -1 +0,0 @@ -disabled_for_roles: [] diff --git a/app-backend/hasura/metadata/inherited_roles.yaml b/app-backend/hasura/metadata/inherited_roles.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/inherited_roles.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/metrics_config.yaml b/app-backend/hasura/metadata/metrics_config.yaml deleted file mode 100644 index 0967ef424..000000000 --- a/app-backend/hasura/metadata/metrics_config.yaml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/app-backend/hasura/metadata/network.yaml b/app-backend/hasura/metadata/network.yaml deleted file mode 100644 index 0967ef424..000000000 --- a/app-backend/hasura/metadata/network.yaml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/app-backend/hasura/metadata/opentelemetry.yaml b/app-backend/hasura/metadata/opentelemetry.yaml deleted file mode 100644 index 0967ef424..000000000 --- a/app-backend/hasura/metadata/opentelemetry.yaml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/app-backend/hasura/metadata/query_collections.yaml b/app-backend/hasura/metadata/query_collections.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/query_collections.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/remote_schemas.yaml b/app-backend/hasura/metadata/remote_schemas.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/remote_schemas.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/rest_endpoints.yaml b/app-backend/hasura/metadata/rest_endpoints.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/app-backend/hasura/metadata/rest_endpoints.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/app-backend/hasura/metadata/version.yaml b/app-backend/hasura/metadata/version.yaml deleted file mode 100644 index 0a70affa4..000000000 --- a/app-backend/hasura/metadata/version.yaml +++ /dev/null @@ -1 +0,0 @@ -version: 3 diff --git a/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/down.sql b/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/down.sql deleted file mode 100644 index df0f0d344..000000000 --- a/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."collections"; diff --git a/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/up.sql b/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/up.sql deleted file mode 100644 index fec2cb55d..000000000 --- a/app-backend/hasura/migrations/jandb/1692603657609_create_table_public_collections/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."collections" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "slug" varchar NOT NULL, "name" text NOT NULL, "description" text NOT NULL, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , UNIQUE ("slug")); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_collections_updated_at" -BEFORE UPDATE ON "public"."collections" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_collections_updated_at" ON "public"."collections" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/down.sql b/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/down.sql deleted file mode 100644 index 3b41d9305..000000000 --- a/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."products"; diff --git a/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/up.sql b/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/up.sql deleted file mode 100644 index 038926bb7..000000000 --- a/app-backend/hasura/migrations/jandb/1692603899157_create_table_public_products/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."products" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "slug" varchar NOT NULL, "name" text NOT NULL, "description" text, "image_url" text, "long_description" text, "technical_description" text, "author" text, "version" text, "source_url" text, "nsfw" boolean NOT NULL DEFAULT true, "greeting" text, "inputs" jsonb, "outputs" jsonb, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , UNIQUE ("slug")); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_products_updated_at" -BEFORE UPDATE ON "public"."products" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_products_updated_at" ON "public"."products" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/down.sql b/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/down.sql deleted file mode 100644 index 74f77626e..000000000 --- a/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."prompts"; diff --git a/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/up.sql b/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/up.sql deleted file mode 100644 index 7f444c43b..000000000 --- a/app-backend/hasura/migrations/jandb/1692603954223_create_table_public_prompts/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."prompts" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "slug" varchar NOT NULL, "content" text, "image_url" text, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , UNIQUE ("slug")); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_prompts_updated_at" -BEFORE UPDATE ON "public"."prompts" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_prompts_updated_at" ON "public"."prompts" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/down.sql b/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/down.sql deleted file mode 100644 index 53839d4c2..000000000 --- a/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."conversations"; diff --git a/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/up.sql b/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/up.sql deleted file mode 100644 index 5df679bf7..000000000 --- a/app-backend/hasura/migrations/jandb/1692604164229_create_table_public_conversations/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."conversations" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "product_id" uuid NOT NULL, "user_id" Text NOT NULL, "last_image_url" text, "last_text_message" text, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") ); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_conversations_updated_at" -BEFORE UPDATE ON "public"."conversations" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_conversations_updated_at" ON "public"."conversations" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/down.sql b/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/down.sql deleted file mode 100644 index eae375db7..000000000 --- a/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."messages"; diff --git a/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/up.sql b/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/up.sql deleted file mode 100644 index e9645e75d..000000000 --- a/app-backend/hasura/migrations/jandb/1692604250751_create_table_public_messages/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."messages" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "conversation_id" uuid NOT NULL, "message_type" varchar, "message_sender_type" varchar, "sender" text NOT NULL, "sender_name" text, "sender_avatar_url" text, "content" text, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") ); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_messages_updated_at" -BEFORE UPDATE ON "public"."messages" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_messages_updated_at" ON "public"."messages" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/down.sql b/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/down.sql deleted file mode 100644 index dfec07a82..000000000 --- a/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."message_medias"; diff --git a/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/up.sql b/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/up.sql deleted file mode 100644 index 8b82699b9..000000000 --- a/app-backend/hasura/migrations/jandb/1692604354631_create_table_public_message_medias/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."message_medias" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "message_id" uuid NOT NULL, "media_url" text, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), "mime_type" varchar, PRIMARY KEY ("id") ); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_message_medias_updated_at" -BEFORE UPDATE ON "public"."message_medias" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_message_medias_updated_at" ON "public"."message_medias" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/down.sql b/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/down.sql deleted file mode 100644 index f2b37e379..000000000 --- a/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."collection_products"; diff --git a/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/up.sql b/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/up.sql deleted file mode 100644 index 16ebe6b43..000000000 --- a/app-backend/hasura/migrations/jandb/1692604743434_create_table_public_collection_products/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."collection_products" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "collection_id" uuid NOT NULL, "product_id" uuid NOT NULL, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , UNIQUE ("collection_id", "product_id")); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_collection_products_updated_at" -BEFORE UPDATE ON "public"."collection_products" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_collection_products_updated_at" ON "public"."collection_products" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/down.sql b/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/down.sql deleted file mode 100644 index 34881bd4d..000000000 --- a/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "public"."product_prompts"; diff --git a/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/up.sql b/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/up.sql deleted file mode 100644 index b8bc3a57d..000000000 --- a/app-backend/hasura/migrations/jandb/1692604794719_create_table_public_product_prompts/up.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE "public"."product_prompts" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "product_id" uuid NOT NULL, "prompt_id" uuid NOT NULL, "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , UNIQUE ("product_id", "prompt_id")); -CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() -RETURNS TRIGGER AS $$ -DECLARE - _new record; -BEGIN - _new := NEW; - _new."updated_at" = NOW(); - RETURN _new; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER "set_public_product_prompts_updated_at" -BEFORE UPDATE ON "public"."product_prompts" -FOR EACH ROW -EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); -COMMENT ON TRIGGER "set_public_product_prompts_updated_at" ON "public"."product_prompts" -IS 'trigger to set value of column "updated_at" to current timestamp on row update'; -CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/down.sql b/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/down.sql deleted file mode 100644 index 49b450db6..000000000 --- a/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/down.sql +++ /dev/null @@ -1 +0,0 @@ -alter table "public"."collection_products" drop constraint "collection_products_collection_id_fkey"; diff --git a/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/up.sql b/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/up.sql deleted file mode 100644 index 29ee8b76b..000000000 --- a/app-backend/hasura/migrations/jandb/1692605865437_set_fk_public_collection_products_collection_id/up.sql +++ /dev/null @@ -1,5 +0,0 @@ -alter table "public"."collection_products" - add constraint "collection_products_collection_id_fkey" - foreign key ("collection_id") - references "public"."collections" - ("id") on update cascade on delete cascade; diff --git a/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/down.sql b/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/down.sql deleted file mode 100644 index 1ca809d97..000000000 --- a/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/down.sql +++ /dev/null @@ -1 +0,0 @@ -alter table "public"."collection_products" drop constraint "collection_products_product_id_fkey"; diff --git a/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/up.sql b/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/up.sql deleted file mode 100644 index ef8457ce6..000000000 --- a/app-backend/hasura/migrations/jandb/1692605887650_set_fk_public_collection_products_product_id/up.sql +++ /dev/null @@ -1,5 +0,0 @@ -alter table "public"."collection_products" - add constraint "collection_products_product_id_fkey" - foreign key ("product_id") - references "public"."products" - ("id") on update cascade on delete cascade; diff --git a/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/down.sql b/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/down.sql deleted file mode 100644 index 7d02924bb..000000000 --- a/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/down.sql +++ /dev/null @@ -1 +0,0 @@ -alter table "public"."messages" drop column "status"; diff --git a/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/up.sql b/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/up.sql deleted file mode 100644 index 428bf5b74..000000000 --- a/app-backend/hasura/migrations/jandb/1692885821205_alter_table_public_messages_add_column_status/up.sql +++ /dev/null @@ -1,2 +0,0 @@ -alter table "public"."messages" add column "status" varchar - null default 'ready'; diff --git a/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/down.sql b/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/down.sql deleted file mode 100644 index 29b407049..000000000 --- a/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/down.sql +++ /dev/null @@ -1 +0,0 @@ -alter table "public"."messages" drop column "prompt_cache"; \ No newline at end of file diff --git a/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/up.sql b/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/up.sql deleted file mode 100644 index ea23f42ed..000000000 --- a/app-backend/hasura/migrations/jandb/1692891470212_alter_table_public_messages_add_column_prompt_cache/up.sql +++ /dev/null @@ -1,2 +0,0 @@ -alter table "public"."messages" add column "prompt_cache" jsonb - null; diff --git a/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/down.sql b/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/down.sql deleted file mode 100644 index b72b858da..000000000 --- a/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- DO NOTHING WITH DATA MIGRATION DOWN diff --git a/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/up.sql b/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/up.sql deleted file mode 100644 index 7804caef7..000000000 --- a/app-backend/hasura/migrations/jandb/1694417935572_insert_products_migration/up.sql +++ /dev/null @@ -1,3 +0,0 @@ -INSERT INTO public.products ("slug", "name", "nsfw", "image_url", "description", "long_description", "technical_description", "author", "version", "source_url", "inputs", "outputs", "greeting") VALUES -('llama2', 'Llama-2-7B-Chat', 't', 'https://static-assets.jan.ai/llama2.jpg','Llama 2 is Meta`s open source large language model (LLM)', 'Llama 2 is a collection of pretrained and fine-tuned generative text models ranging in scale from 7 billion to 70 billion parameters. This is the repository for the 7B pretrained model. Links to other models can be found in the index at the bottom.', 'Meta developed and publicly released the Llama 2 family of large language models (LLMs), a collection of pretrained and fine-tuned generative text models ranging in scale from 7 billion to 70 billion parameters. Our fine-tuned LLMs, called Llama-2-Chat, are optimized for dialogue use cases. Llama-2-Chat models outperform open-source chat models on most benchmarks we tested, and in our human evaluations for helpfulness and safety, are on par with some popular closed-source models like ChatGPT and PaLM.', 'Meta', 'Llama2-7B-GGML', 'https://huggingface.co/TheBloke/airoboros-13B-gpt4-1.4-GGML', '{"body": [{"name": "messages", "type": "array", "items": [{"type": "object", "properties": [{"name": "role", "type": "string", "example": "system", "description": "Defines the role of the message."}, {"name": "content", "type": "string", "example": "Hello, world!", "description": "Contains the content of the message."}]}], "description": "An array of messages, each containing a role and content. The latest message is always at the end of the array."}, {"name": "stream", "type": "boolean", "example": true, "description": "Indicates whether the client wants to keep the connection open for streaming."}, {"name": "max_tokens", "type": "integer", "example": 500, "description": "Defines the maximum number of tokens that the client wants to receive."}], "slug": "llm", "headers": {"accept": "text/event-stream", "content-type": "application/json"}}', '{"slug": "llm", "type": "object", "properties": [{"name": "id", "type": "string", "example": "chatcmpl-4c4e5eb5-bf53-4dbc-9136-1cf69fc5fd7c", "description": "The unique identifier of the chat completion chunk."}, {"name": "model", "type": "string", "example": "gpt-3.5-turbo", "description": "The name of the GPT model used to generate the completion."}, {"name": "created", "type": "integer", "example": 1692169988, "description": "The Unix timestamp representing the time when the completion was generated."}, {"name": "object", "type": "string", "example": "chat.completion.chunk", "description": "A string indicating the type of the chat completion chunk."}, {"name": "choices", "type": "array", "items": [{"type": "object", "properties": [{"name": "index", "type": "integer", "example": 0, "description": "The index of the choice made by the GPT model."}, {"name": "delta", "type": "object", "properties": [{"name": "content", "type": "string", "example": "What", "description": "The content generated by the GPT model."}], "description": "A JSON object containing the content generated by the GPT model."}, {"name": "finish_reason", "type": "string", "example": null, "description": "A string indicating why the GPT model stopped generating content."}]}], "description": "An array containing the choices made by the GPT model to generate the completion."}], "description": "A JSON object representing a chat completion chunk."}', '👋I’m a versatile AI trained on a wide range of topics, here to answer your questions about the universe. What are you curious about today?') -ON CONFLICT (slug) DO NOTHING; diff --git a/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/down.sql b/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/down.sql deleted file mode 100644 index a089fbbf6..000000000 --- a/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- DO NOTHING WITH DATA MIGRATION DOWN \ No newline at end of file diff --git a/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/up.sql b/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/up.sql deleted file mode 100644 index de5d10f45..000000000 --- a/app-backend/hasura/migrations/jandb/1694417949946_insert_collections_migration/up.sql +++ /dev/null @@ -1,3 +0,0 @@ -INSERT INTO public.collections ("slug", "name", "description") VALUES -('conversational', 'Conversational', 'Converse with these models and get answers.') -ON CONFLICT (slug) DO NOTHING; diff --git a/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/down.sql b/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/down.sql deleted file mode 100644 index a089fbbf6..000000000 --- a/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- DO NOTHING WITH DATA MIGRATION DOWN \ No newline at end of file diff --git a/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/up.sql b/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/up.sql deleted file mode 100644 index c0c28cc8b..000000000 --- a/app-backend/hasura/migrations/jandb/1694417968422_insert_collection_products_migration/up.sql +++ /dev/null @@ -1,4 +0,0 @@ -INSERT INTO public.collection_products (collection_id, product_id) -SELECT (SELECT id FROM public.collections WHERE slug = 'conversational') AS collection_id, id AS product_id -FROM public.products -WHERE slug IN ('llama2') ON CONFLICT (collection_id, product_id) DO NOTHING; diff --git a/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/down.sql b/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/down.sql deleted file mode 100644 index a089fbbf6..000000000 --- a/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- DO NOTHING WITH DATA MIGRATION DOWN \ No newline at end of file diff --git a/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/up.sql b/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/up.sql deleted file mode 100644 index acf4ae014..000000000 --- a/app-backend/hasura/migrations/jandb/1694417980224_insert_prompts_migration/up.sql +++ /dev/null @@ -1,8 +0,0 @@ -INSERT INTO public.prompts ("slug", "content", "image_url") VALUES -('conversational-ai-future', 'What are possible developments for AI technology in the next decade?', ''), -('conversational-managing-stress', 'What are some tips for managing stress?', ''), -('conversational-postapoc-robot', 'Let''s role play. You are a robot in a post-apocalyptic world.', ''), -('conversational-python-pytorch', 'What is the difference between Python and Pytorch?', ''), -('conversational-quadratic-equation', 'Can you explain how to solve a quadratic equation?', ''), -('conversational-roman-history', 'What is the history of the Roman Empire?', '') -ON CONFLICT (slug) DO NOTHING; diff --git a/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/down.sql b/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/down.sql deleted file mode 100644 index a089fbbf6..000000000 --- a/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- DO NOTHING WITH DATA MIGRATION DOWN \ No newline at end of file diff --git a/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/up.sql b/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/up.sql deleted file mode 100644 index 6d3206ce5..000000000 --- a/app-backend/hasura/migrations/jandb/1694417991834_insert_product_prompts_migration/up.sql +++ /dev/null @@ -1,9 +0,0 @@ -INSERT INTO public.product_prompts (product_id, prompt_id) -SELECT p.id AS product_id, r.id AS prompt_id -FROM public.products p -JOIN public.prompts r -ON (p.id - IN (SELECT x.id FROM public.products x INNER JOIN public.collection_products y ON x.id = y.product_id - INNER JOIN public.collections z ON y.collection_id = z.id - WHERE z.slug = 'conversational')) -WHERE r.image_url IS NULL OR r.image_url = '' ON CONFLICT (product_id, prompt_id) DO NOTHING; diff --git a/app-backend/sample.env b/app-backend/sample.env deleted file mode 100644 index 9a7b438f1..000000000 --- a/app-backend/sample.env +++ /dev/null @@ -1,23 +0,0 @@ -## postgres database to store Hasura metadata -HASURA_GRAPHQL_METADATA_DATABASE_URL=postgres://postgres:postgrespassword@postgres:5432/postgres -## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs -PG_DATABASE_URL=postgres://postgres:postgrespassword@postgres:5432/postgres -## enable the console served by server -HASURA_GRAPHQL_ENABLE_CONSOLE="true" # set to "false" to disable console -## enable debugging mode. It is recommended to disable this in production -HASURA_GRAPHQL_DEV_MODE="true" -HASURA_GRAPHQL_ENABLED_LOG_TYPES=startup, http-log, webhook-log, websocket-log, query-log -## uncomment next line to run console offline (i.e load console assets from server instead of CDN) -# HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets -## uncomment next line to set an admin secret -HASURA_GRAPHQL_ADMIN_SECRET=myadminsecretkey -HASURA_GRAPHQL_UNAUTHORIZED_ROLE="public" -HASURA_GRAPHQL_METADATA_DEFAULTS='{"backend_configs":{"dataconnector":{"athena":{"uri":"http://data-connector-agent:8081/api/v1/athena"},"mariadb":{"uri":"http://data-connector-agent:8081/api/v1/mariadb"},"mysql8":{"uri":"http://data-connector-agent:8081/api/v1/mysql"},"oracle":{"uri":"http://data-connector-agent:8081/api/v1/oracle"},"snowflake":{"uri":"http://data-connector-agent:8081/api/v1/snowflake"}}}}' -HASURA_GRAPHQL_JWT_SECRET={"type": "RS256", "key": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"} - -# Environment variable for auto migrate -HASURA_GRAPHQL_MIGRATIONS_DIR=/migrations -HASURA_GRAPHQL_METADATA_DIR=/metadata -HASURA_GRAPHQL_ENABLE_CONSOLE='true' -HASURA_ACTION_STABLE_DIFFUSION_URL=http://sd:8000 -HASURA_EVENTS_HOOK_URL="http://worker:8787" \ No newline at end of file diff --git a/app-backend/sample.env_postgresql b/app-backend/sample.env_postgresql deleted file mode 100644 index 39aa93db5..000000000 --- a/app-backend/sample.env_postgresql +++ /dev/null @@ -1 +0,0 @@ -POSTGRES_PASSWORD=postgrespassword \ No newline at end of file diff --git a/conf/db/docker_psql_init.sql b/conf/db/docker_psql_init.sql deleted file mode 100644 index db34e8393..000000000 --- a/conf/db/docker_psql_init.sql +++ /dev/null @@ -1,26 +0,0 @@ -CREATE DATABASE "jan-keycloak" - WITH - OWNER = postgres - ENCODING = 'UTF8' - LC_COLLATE = 'en_US.utf8' - LC_CTYPE = 'en_US.utf8' - TABLESPACE = pg_default - CONNECTION LIMIT = -1; - -CREATE DATABASE "jan-hasura-data" - WITH - OWNER = postgres - ENCODING = 'UTF8' - LC_COLLATE = 'en_US.utf8' - LC_CTYPE = 'en_US.utf8' - TABLESPACE = pg_default - CONNECTION LIMIT = -1; - -CREATE DATABASE "jan-hasura-metadata" - WITH - OWNER = postgres - ENCODING = 'UTF8' - LC_COLLATE = 'en_US.utf8' - LC_CTYPE = 'en_US.utf8' - TABLESPACE = pg_default - CONNECTION LIMIT = -1; \ No newline at end of file diff --git a/conf/keycloak_conf/example-realm.json b/conf/keycloak_conf/example-realm.json deleted file mode 100644 index bc10dac64..000000000 --- a/conf/keycloak_conf/example-realm.json +++ /dev/null @@ -1,2311 +0,0 @@ -{ - "id": "d3ebd3d9-2493-4aa2-942b-3118a216b430", - "realm": "hasura", - "notBefore": 0, - "defaultSignatureAlgorithm": "RS256", - "revokeRefreshToken": false, - "refreshTokenMaxReuse": 0, - "accessTokenLifespan": 300, - "accessTokenLifespanForImplicitFlow": 900, - "ssoSessionIdleTimeout": 1800, - "ssoSessionMaxLifespan": 36000, - "ssoSessionIdleTimeoutRememberMe": 0, - "ssoSessionMaxLifespanRememberMe": 0, - "offlineSessionIdleTimeout": 2592000, - "offlineSessionMaxLifespanEnabled": false, - "offlineSessionMaxLifespan": 5184000, - "clientSessionIdleTimeout": 0, - "clientSessionMaxLifespan": 0, - "clientOfflineSessionIdleTimeout": 0, - "clientOfflineSessionMaxLifespan": 0, - "accessCodeLifespan": 60, - "accessCodeLifespanUserAction": 300, - "accessCodeLifespanLogin": 1800, - "actionTokenGeneratedByAdminLifespan": 43200, - "actionTokenGeneratedByUserLifespan": 300, - "oauth2DeviceCodeLifespan": 600, - "oauth2DevicePollingInterval": 5, - "enabled": true, - "sslRequired": "external", - "registrationAllowed": false, - "registrationEmailAsUsername": false, - "rememberMe": false, - "verifyEmail": false, - "loginWithEmailAllowed": true, - "duplicateEmailsAllowed": false, - "resetPasswordAllowed": false, - "editUsernameAllowed": false, - "bruteForceProtected": false, - "permanentLockout": false, - "maxFailureWaitSeconds": 900, - "minimumQuickLoginWaitSeconds": 60, - "waitIncrementSeconds": 60, - "quickLoginCheckMilliSeconds": 1000, - "maxDeltaTimeSeconds": 43200, - "failureFactor": 30, - "roles": { - "realm": [ - { - "id": "7219280c-2d93-4cb5-9ff9-fa4b639716fd", - "name": "uma_authorization", - "description": "${role_uma_authorization}", - "composite": false, - "clientRole": false, - "containerId": "d3ebd3d9-2493-4aa2-942b-3118a216b430", - "attributes": {} - }, - { - "id": "7fb465bc-beae-431b-8a38-06afa8b4c75c", - "name": "user", - "description": "", - "composite": false, - "clientRole": false, - "containerId": "d3ebd3d9-2493-4aa2-942b-3118a216b430", - "attributes": {} - }, - { - "id": "b34240e1-92b8-48e9-aaa5-82eecbdcb283", - "name": "default-roles-hasura", - "description": "${role_default-roles}", - "composite": true, - "composites": { - "realm": ["offline_access", "uma_authorization"], - "client": { - "account": ["manage-account", "view-profile"] - } - }, - "clientRole": false, - "containerId": "d3ebd3d9-2493-4aa2-942b-3118a216b430", - "attributes": {} - }, - { - "id": "3ece9760-6a06-4d75-9efc-27164c8253c8", - "name": "offline_access", - "description": "${role_offline-access}", - "composite": false, - "clientRole": false, - "containerId": "d3ebd3d9-2493-4aa2-942b-3118a216b430", - "attributes": {} - } - ], - "client": { - "realm-management": [ - { - "id": "c8c637d4-39a5-4170-8d2f-1aef0a2f9720", - "name": "query-groups", - "description": "${role_query-groups}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "e81f684f-c4ff-425e-861d-80507258b321", - "name": "manage-authorization", - "description": "${role_manage-authorization}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "88d97cbc-e7e1-4561-ad9c-8cf1161a55a0", - "name": "query-realms", - "description": "${role_query-realms}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "67063d5f-8023-4be9-8db2-37f81dfeb90b", - "name": "view-identity-providers", - "description": "${role_view-identity-providers}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "024c8120-8208-4ad4-b098-27c7c9d549df", - "name": "view-realm", - "description": "${role_view-realm}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "a2fe97c7-b0d2-444f-bdba-efb2bfecda0f", - "name": "create-client", - "description": "${role_create-client}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "bc2425ed-2269-431c-81f6-eb4401020952", - "name": "query-users", - "description": "${role_query-users}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "a2cb5869-dc32-4373-8a10-71b9132c850e", - "name": "view-authorization", - "description": "${role_view-authorization}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "a8b11879-261c-4e4f-8b05-414069988810", - "name": "manage-identity-providers", - "description": "${role_manage-identity-providers}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "0810aa4f-a32c-432a-9c16-0374233f17e6", - "name": "view-clients", - "description": "${role_view-clients}", - "composite": true, - "composites": { - "client": { - "realm-management": ["query-clients"] - } - }, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "53b48727-828f-406c-aa7e-b0d1c4109d0b", - "name": "impersonation", - "description": "${role_impersonation}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "27751c74-74f3-4fbf-b42a-124de7207dc0", - "name": "manage-clients", - "description": "${role_manage-clients}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "44c4d09a-8b0e-413e-91a4-c383ef17b345", - "name": "query-clients", - "description": "${role_query-clients}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "837d8209-0fbf-406d-a1f4-d3672879fd7c", - "name": "manage-realm", - "description": "${role_manage-realm}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "90b904a0-ddf1-4542-902e-f0f0cd4bc23e", - "name": "manage-users", - "description": "${role_manage-users}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "49328548-01c4-477e-90e8-5cdec6ede9d2", - "name": "view-events", - "description": "${role_view-events}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "5f381d33-4e28-4b50-87be-0cc0e4887e2f", - "name": "realm-admin", - "description": "${role_realm-admin}", - "composite": true, - "composites": { - "client": { - "realm-management": [ - "query-groups", - "manage-authorization", - "view-realm", - "view-identity-providers", - "query-realms", - "create-client", - "view-authorization", - "query-users", - "manage-identity-providers", - "view-clients", - "impersonation", - "manage-clients", - "query-clients", - "manage-realm", - "manage-users", - "view-events", - "view-users", - "manage-events" - ] - } - }, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "13b75adb-cf15-4f02-8c1e-b70bf405b692", - "name": "view-users", - "description": "${role_view-users}", - "composite": true, - "composites": { - "client": { - "realm-management": ["query-groups", "query-users"] - } - }, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - }, - { - "id": "b5126b18-1e29-4989-a0ce-3350feb02b42", - "name": "manage-events", - "description": "${role_manage-events}", - "composite": false, - "clientRole": true, - "containerId": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "attributes": {} - } - ], - "security-admin-console": [], - "admin-cli": [], - "account-console": [], - "broker": [ - { - "id": "ba86f97b-0032-465d-b52d-06d0cb1514b5", - "name": "read-token", - "description": "${role_read-token}", - "composite": false, - "clientRole": true, - "containerId": "4a3abf8b-7ce0-4eb3-8733-0b76bde3125d", - "attributes": {} - } - ], - "account": [ - { - "id": "8107bb62-629a-4c05-a6b3-9ec05db9feab", - "name": "manage-consent", - "description": "${role_manage-consent}", - "composite": true, - "composites": { - "client": { - "account": ["view-consent"] - } - }, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "cb761f1a-f422-4292-9f27-aeca063ae6ad", - "name": "view-applications", - "description": "${role_view-applications}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "b87631c3-f3bb-4684-825e-53b7b784687d", - "name": "manage-account", - "description": "${role_manage-account}", - "composite": true, - "composites": { - "client": { - "account": ["manage-account-links"] - } - }, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "81a519c5-d106-4b4c-986d-3416537d91b6", - "name": "view-groups", - "description": "${role_view-groups}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "e563f5f3-e86f-491c-882a-7acc3d84c6f0", - "name": "view-consent", - "description": "${role_view-consent}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "4434c108-c594-43e9-b8d4-8ded56196cc5", - "name": "view-profile", - "description": "${role_view-profile}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "c342ec0b-6885-4d8d-b036-1aafdc376c06", - "name": "delete-account", - "description": "${role_delete-account}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - }, - { - "id": "5c200c4e-fd80-4cd1-8723-562ba7430398", - "name": "manage-account-links", - "description": "${role_manage-account-links}", - "composite": false, - "clientRole": true, - "containerId": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "attributes": {} - } - ], - "hasura": [ - { - "id": "e971ec56-92a0-4c06-a8a2-a35946852ee6", - "name": "uma_protection", - "composite": false, - "clientRole": true, - "containerId": "4be1cdcc-b0b3-4581-957b-54fa17c0d929", - "attributes": {} - }, - { - "id": "8cbd62f4-daa2-4809-850b-88870e2c70fc", - "name": "user", - "description": "", - "composite": false, - "clientRole": true, - "containerId": "4be1cdcc-b0b3-4581-957b-54fa17c0d929", - "attributes": {} - } - ] - } - }, - "groups": [], - "defaultRole": { - "id": "b34240e1-92b8-48e9-aaa5-82eecbdcb283", - "name": "default-roles-hasura", - "description": "${role_default-roles}", - "composite": true, - "clientRole": false, - "containerId": "d3ebd3d9-2493-4aa2-942b-3118a216b430" - }, - "requiredCredentials": ["password"], - "otpPolicyType": "totp", - "otpPolicyAlgorithm": "HmacSHA1", - "otpPolicyInitialCounter": 0, - "otpPolicyDigits": 6, - "otpPolicyLookAheadWindow": 1, - "otpPolicyPeriod": 30, - "otpPolicyCodeReusable": false, - "otpSupportedApplications": [ - "totpAppGoogleName", - "totpAppMicrosoftAuthenticatorName", - "totpAppFreeOTPName" - ], - "webAuthnPolicyRpEntityName": "keycloak", - "webAuthnPolicySignatureAlgorithms": ["ES256"], - "webAuthnPolicyRpId": "", - "webAuthnPolicyAttestationConveyancePreference": "not specified", - "webAuthnPolicyAuthenticatorAttachment": "not specified", - "webAuthnPolicyRequireResidentKey": "not specified", - "webAuthnPolicyUserVerificationRequirement": "not specified", - "webAuthnPolicyCreateTimeout": 0, - "webAuthnPolicyAvoidSameAuthenticatorRegister": false, - "webAuthnPolicyAcceptableAaguids": [], - "webAuthnPolicyPasswordlessRpEntityName": "keycloak", - "webAuthnPolicyPasswordlessSignatureAlgorithms": ["ES256"], - "webAuthnPolicyPasswordlessRpId": "", - "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", - "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", - "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", - "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", - "webAuthnPolicyPasswordlessCreateTimeout": 0, - "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, - "webAuthnPolicyPasswordlessAcceptableAaguids": [], - "users": [ - { - "username": "username", - "enabled": true, - "emailVerified": true, - "credentials": [ - { - "type": "password", - "value": "password" - } - ], - "realmRoles": [ - "user", - "default-roles-hasura" - ], - "clientRoles": { - "hasura": [ - "user" - ] - } - }, - { - "id": "8728e38e-6b60-44d2-8830-f1e2ad284a02", - "createdTimestamp": 1692777925764, - "username": "service-account-hasura", - "enabled": true, - "totp": false, - "emailVerified": false, - "serviceAccountClientId": "hasura", - "disableableCredentialTypes": [], - "requiredActions": [], - "realmRoles": ["user", "default-roles-hasura"], - "clientRoles": { - "hasura": ["uma_protection"] - }, - "notBefore": 0, - "groups": [] - } - ], - "scopeMappings": [ - { - "clientScope": "offline_access", - "roles": ["offline_access"] - }, - { - "clientScope": "hasura", - "roles": ["user"] - } - ], - "clientScopeMappings": { - "account": [ - { - "client": "account-console", - "roles": ["manage-account", "view-groups"] - } - ] - }, - "clients": [ - { - "id": "ce02d0ff-b633-4d79-8a33-2c8241017d72", - "clientId": "account", - "name": "${client_account}", - "rootUrl": "${authBaseUrl}", - "baseUrl": "/realms/hasura/account/", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": ["/realms/hasura/account/*"], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": { - "post.logout.redirect.uris": "+" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - }, - { - "id": "101df256-3450-4b5c-8d0f-d29b531e3499", - "clientId": "account-console", - "name": "${client_account-console}", - "rootUrl": "${authBaseUrl}", - "baseUrl": "/realms/hasura/account/", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": ["/realms/hasura/account/*"], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": { - "post.logout.redirect.uris": "+", - "pkce.code.challenge.method": "S256" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "protocolMappers": [ - { - "id": "b06a98d0-6d91-4260-9406-aea123f842dc", - "name": "audience resolve", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-resolve-mapper", - "consentRequired": false, - "config": {} - } - ], - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - }, - { - "id": "db12bda8-7624-46cc-a84f-9c83cf99b370", - "clientId": "admin-cli", - "name": "${client_admin-cli}", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": false, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - }, - { - "id": "4a3abf8b-7ce0-4eb3-8733-0b76bde3125d", - "clientId": "broker", - "name": "${client_broker}", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": true, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - }, - { - "id": "4be1cdcc-b0b3-4581-957b-54fa17c0d929", - "clientId": "hasura", - "name": "Hasura", - "description": "", - "rootUrl": "", - "adminUrl": "", - "baseUrl": "", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "secret": "oMtCPAV7diKpE564SBspgKj4HqlKM4Hy", - "redirectUris": ["http://localhost:3000/*"], - "webOrigins": ["http://localhost:3000"], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": true, - "authorizationServicesEnabled": true, - "publicClient": false, - "frontchannelLogout": true, - "protocol": "openid-connect", - "attributes": { - "oidc.ciba.grant.enabled": "false", - "oauth2.device.authorization.grant.enabled": "false", - "client.secret.creation.time": "1692777925", - "backchannel.logout.session.required": "true", - "backchannel.logout.revoke.offline.tokens": "false" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": true, - "nodeReRegistrationTimeout": -1, - "protocolMappers": [ - { - "id": "c4016925-f659-455a-9cdb-29bba88327e9", - "name": "Client ID", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "client_id", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "client_id", - "jsonType.label": "String" - } - }, - { - "id": "e80e0f4c-cd0d-4bb8-a1e4-108a49f4d1a7", - "name": "Client Host", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "clientHost", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "clientHost", - "jsonType.label": "String" - } - }, - { - "id": "3cb8ba1a-81f2-42b7-91b0-3fbe29126262", - "name": "Client IP Address", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "clientAddress", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "clientAddress", - "jsonType.label": "String" - } - } - ], - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "hasura", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ], - "authorizationSettings": { - "allowRemoteResourceManagement": true, - "policyEnforcementMode": "ENFORCING", - "resources": [ - { - "name": "Default Resource", - "type": "urn:hasura:resources:default", - "ownerManagedAccess": false, - "attributes": {}, - "_id": "088f6856-3491-4600-ac5d-0287da57511c", - "uris": ["/*"] - } - ], - "policies": [ - { - "id": "f82ec078-33ce-4204-83c9-627a802c0821", - "name": "Default Policy", - "description": "A policy that grants access only for users within this realm", - "type": "role", - "logic": "POSITIVE", - "decisionStrategy": "AFFIRMATIVE", - "config": { - "roles": "[{\"id\":\"default-roles-hasura\",\"required\":false}]" - } - }, - { - "id": "2cad4a9f-b0f6-4067-98a7-4f42ed5e33ef", - "name": "Default Permission", - "description": "A permission that applies to the default resource type", - "type": "resource", - "logic": "POSITIVE", - "decisionStrategy": "UNANIMOUS", - "config": { - "defaultResourceType": "urn:hasura:resources:default", - "applyPolicies": "[\"Default Policy\"]" - } - } - ], - "scopes": [], - "decisionStrategy": "UNANIMOUS" - } - }, - { - "id": "5d7dda49-d56d-4c64-8a01-ee5dd5310c81", - "clientId": "realm-management", - "name": "${client_realm-management}", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": true, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - }, - { - "id": "29f3fff6-2a63-4f7b-9474-d2385f0eff32", - "clientId": "security-admin-console", - "name": "${client_security-admin-console}", - "rootUrl": "${authAdminUrl}", - "baseUrl": "/admin/hasura/console/", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": ["/admin/hasura/console/*"], - "webOrigins": ["+"], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": { - "post.logout.redirect.uris": "+", - "pkce.code.challenge.method": "S256" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "protocolMappers": [ - { - "id": "795b2582-0f87-46ac-8be0-13518ad27445", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - } - ], - "defaultClientScopes": [ - "web-origins", - "acr", - "roles", - "profile", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - } - ], - "clientScopes": [ - { - "id": "7df17b55-8301-4667-b9f3-41f9520a92cf", - "name": "offline_access", - "description": "OpenID Connect built-in scope: offline_access", - "protocol": "openid-connect", - "attributes": { - "consent.screen.text": "${offlineAccessScopeConsentText}", - "display.on.consent.screen": "true" - } - }, - { - "id": "9cf833ae-3238-4aa3-9a9a-bbb8bc3767e3", - "name": "roles", - "description": "OpenID Connect scope for add user roles to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "true", - "consent.screen.text": "${rolesScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "8d49f2bc-7ffc-4ee0-ae71-d82623330caf", - "name": "client roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-client-role-mapper", - "consentRequired": false, - "config": { - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "resource_access.${client_id}.roles", - "jsonType.label": "String", - "multivalued": "true" - } - }, - { - "id": "7e1a84a8-47d0-4cd8-ba0f-dc689588b7ec", - "name": "realm roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "realm_access.roles", - "jsonType.label": "String", - "multivalued": "true" - } - }, - { - "id": "807ae7c0-7c18-4d46-b1c6-9d191294bf7b", - "name": "audience resolve", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-resolve-mapper", - "consentRequired": false, - "config": {} - } - ] - }, - { - "id": "ad8bfcfe-469b-4e72-82ab-2e8b564efc14", - "name": "acr", - "description": "OpenID Connect scope for add acr (authentication context class reference) to the token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "96589cee-a8cc-4919-8b60-00a77a34ff87", - "name": "acr loa level", - "protocol": "openid-connect", - "protocolMapper": "oidc-acr-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "access.token.claim": "true" - } - } - ] - }, - { - "id": "2a8948cb-65cf-4ce4-ae11-fae5d9391fd3", - "name": "microprofile-jwt", - "description": "Microprofile - JWT built-in scope", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "6679f3f8-c764-4cd4-ae63-9da31200e7c5", - "name": "upn", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "upn", - "jsonType.label": "String" - } - }, - { - "id": "09a8bf42-8326-40a5-b1d3-0a65fe6236c3", - "name": "groups", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "multivalued": "true", - "user.attribute": "foo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "groups", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "794f2bc0-4b14-4cb3-a7f2-730b2fabc84d", - "name": "hasura", - "description": "", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "gui.order": "", - "consent.screen.text": "" - }, - "protocolMappers": [ - { - "id": "74c7a728-24a3-480e-bbb9-2129bd2dccb1", - "name": "x-hasura-default-role", - "protocol": "openid-connect", - "protocolMapper": "oidc-hardcoded-claim-mapper", - "consentRequired": false, - "config": { - "claim.value": "user", - "userinfo.token.claim": "true", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "https://hasura\\.io/jwt/claims.x-hasura-default-role", - "jsonType.label": "String", - "access.tokenResponse.claim": "false" - } - }, - { - "id": "b451832d-670a-4e0d-878e-904c2b1598c2", - "name": "x-hasura-user-id", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "id", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "https://hasura\\.io/jwt/claims.x-hasura-user-id", - "jsonType.label": "String" - } - }, - { - "id": "eb62cfc4-ea5f-454a-9c78-384cb5e80373", - "name": "x-hasura-allowed-roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-client-role-mapper", - "consentRequired": false, - "config": { - "multivalued": "true", - "userinfo.token.claim": "true", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "https://hasura\\.io/jwt/claims.x-hasura-allowed-roles", - "jsonType.label": "String", - "usermodel.clientRoleMapping.clientId": "hasura" - } - } - ] - }, - { - "id": "8321f73d-4f9e-486e-ae03-cde49fc78bc1", - "name": "role_list", - "description": "SAML role list", - "protocol": "saml", - "attributes": { - "consent.screen.text": "${samlRoleListScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "56bb56c7-0237-4263-b858-7f9cdba57a1d", - "name": "role list", - "protocol": "saml", - "protocolMapper": "saml-role-list-mapper", - "consentRequired": false, - "config": { - "single": "false", - "attribute.nameformat": "Basic", - "attribute.name": "Role" - } - } - ] - }, - { - "id": "c2c39673-f405-4fed-81a5-3bc3aa333b8b", - "name": "email", - "description": "OpenID Connect built-in scope: email", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${emailScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "01e5705c-f668-476d-8526-7d8851531832", - "name": "email", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "email", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email", - "jsonType.label": "String" - } - }, - { - "id": "66d6d45a-d4ca-4574-bcbe-b26982b4c7f8", - "name": "email verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "emailVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email_verified", - "jsonType.label": "boolean" - } - } - ] - }, - { - "id": "f03591f6-3ea2-405b-b47c-6eb797ec5926", - "name": "profile", - "description": "OpenID Connect built-in scope: profile", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${profileScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "3c61cc63-50f9-4cfb-b45e-422c59161709", - "name": "full name", - "protocol": "openid-connect", - "protocolMapper": "oidc-full-name-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "access.token.claim": "true", - "userinfo.token.claim": "true" - } - }, - { - "id": "2dfbc3d5-81f1-4160-9b0a-c58fd997fe68", - "name": "picture", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "picture", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "picture", - "jsonType.label": "String" - } - }, - { - "id": "a5e7f48a-219c-4bca-a491-d54e8788d8be", - "name": "username", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "preferred_username", - "jsonType.label": "String" - } - }, - { - "id": "837efb21-32d2-47e5-8b1c-fdf5d3ea17bc", - "name": "website", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "website", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "website", - "jsonType.label": "String" - } - }, - { - "id": "d1200744-27c1-426c-8332-ce4b0c433c50", - "name": "zoneinfo", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "zoneinfo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "zoneinfo", - "jsonType.label": "String" - } - }, - { - "id": "63eae02f-f44b-4fe6-91f2-a16d096c46db", - "name": "birthdate", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "birthdate", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "birthdate", - "jsonType.label": "String" - } - }, - { - "id": "5cbb20a8-2947-420d-9a5d-1ce4eb928117", - "name": "given name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "firstName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "given_name", - "jsonType.label": "String" - } - }, - { - "id": "fdb72b90-48f8-4dcf-be77-e246fc77814c", - "name": "family name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "lastName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "family_name", - "jsonType.label": "String" - } - }, - { - "id": "a61f7495-5229-48a8-a1d2-0596f13d1c06", - "name": "nickname", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "nickname", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "nickname", - "jsonType.label": "String" - } - }, - { - "id": "ac4150b4-0b5f-4187-a81f-21e582fde2b4", - "name": "profile", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "profile", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "profile", - "jsonType.label": "String" - } - }, - { - "id": "2f8cf479-e0f5-49a6-a46b-f4708f60840e", - "name": "middle name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "middleName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "middle_name", - "jsonType.label": "String" - } - }, - { - "id": "2530d28b-3135-442d-aabe-3dcd20d6370c", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - }, - { - "id": "68ca4cca-c6d3-4fa4-8079-ee0c81286577", - "name": "gender", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "gender", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "gender", - "jsonType.label": "String" - } - }, - { - "id": "ef95b412-17ff-4ef5-b9e9-8b95f7cc44b3", - "name": "updated at", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "updatedAt", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "updated_at", - "jsonType.label": "long" - } - } - ] - }, - { - "id": "8b3ba733-fa23-489f-b954-a0b89fba8b54", - "name": "web-origins", - "description": "OpenID Connect scope for add allowed web origins to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false", - "consent.screen.text": "" - }, - "protocolMappers": [ - { - "id": "43ee6247-a7fd-4649-8770-5c966a23b831", - "name": "allowed web origins", - "protocol": "openid-connect", - "protocolMapper": "oidc-allowed-origins-mapper", - "consentRequired": false, - "config": {} - } - ] - }, - { - "id": "818f4f96-a63c-4c1d-9251-d999517ede72", - "name": "address", - "description": "OpenID Connect built-in scope: address", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${addressScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "f9fbf5ed-195e-44f1-a5d3-6bf64919bb2b", - "name": "address", - "protocol": "openid-connect", - "protocolMapper": "oidc-address-mapper", - "consentRequired": false, - "config": { - "user.attribute.formatted": "formatted", - "user.attribute.country": "country", - "user.attribute.postal_code": "postal_code", - "userinfo.token.claim": "true", - "user.attribute.street": "street", - "id.token.claim": "true", - "user.attribute.region": "region", - "access.token.claim": "true", - "user.attribute.locality": "locality" - } - } - ] - }, - { - "id": "e3f2c7fe-ca50-4b01-b999-098c82beb362", - "name": "phone", - "description": "OpenID Connect built-in scope: phone", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${phoneScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "7ae1a4ac-99db-4a27-8f18-f537a8020e4f", - "name": "phone number", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "phoneNumber", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number", - "jsonType.label": "String" - } - }, - { - "id": "edd5d134-b2c1-47d8-9cc5-3558559cf407", - "name": "phone number verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "phoneNumberVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number_verified", - "jsonType.label": "boolean" - } - } - ] - } - ], - "defaultDefaultClientScopes": [ - "role_list", - "profile", - "email", - "roles", - "web-origins", - "acr", - "hasura" - ], - "defaultOptionalClientScopes": [ - "offline_access", - "address", - "phone", - "microprofile-jwt" - ], - "browserSecurityHeaders": { - "contentSecurityPolicyReportOnly": "", - "xContentTypeOptions": "nosniff", - "referrerPolicy": "no-referrer", - "xRobotsTag": "none", - "xFrameOptions": "SAMEORIGIN", - "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "xXSSProtection": "1; mode=block", - "strictTransportSecurity": "max-age=31536000; includeSubDomains" - }, - "smtpServer": {}, - "eventsEnabled": false, - "eventsListeners": ["jboss-logging"], - "enabledEventTypes": [], - "adminEventsEnabled": false, - "adminEventsDetailsEnabled": false, - "identityProviders": [], - "identityProviderMappers": [], - "components": { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ - { - "id": "e2254ce7-52d6-4450-aa77-5ba2b40b8e26", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allow-default-scopes": ["true"] - } - }, - { - "id": "b88f3a6b-b2a8-476d-9433-904ca547f64c", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "saml-user-attribute-mapper", - "oidc-usermodel-property-mapper", - "oidc-sha256-pairwise-sub-mapper", - "oidc-full-name-mapper", - "saml-user-property-mapper", - "saml-role-list-mapper", - "oidc-usermodel-attribute-mapper", - "oidc-address-mapper" - ] - } - }, - { - "id": "d9ba5290-8c0e-4fa7-bf53-afc4fab4ec4b", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allow-default-scopes": ["true"] - } - }, - { - "id": "1c24034f-5374-4020-b8e2-ba2eb4c0a944", - "name": "Full Scope Disabled", - "providerId": "scope", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "e66a399a-317f-42c0-8ec7-9e2ba781a53d", - "name": "Consent Required", - "providerId": "consent-required", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "eec0d3e9-e1e2-41c0-8a03-cc5f06c0f77e", - "name": "Trusted Hosts", - "providerId": "trusted-hosts", - "subType": "anonymous", - "subComponents": {}, - "config": { - "host-sending-registration-request-must-match": ["true"], - "client-uris-must-match": ["true"] - } - }, - { - "id": "01f2436b-aa02-4f55-ac64-6132dd6ee375", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "oidc-usermodel-property-mapper", - "saml-user-property-mapper", - "oidc-usermodel-attribute-mapper", - "saml-user-attribute-mapper", - "oidc-full-name-mapper", - "oidc-address-mapper", - "oidc-sha256-pairwise-sub-mapper", - "saml-role-list-mapper" - ] - } - }, - { - "id": "86fe59f0-cb96-4a39-8476-ae092479fb69", - "name": "Max Clients Limit", - "providerId": "max-clients", - "subType": "anonymous", - "subComponents": {}, - "config": { - "max-clients": ["200"] - } - } - ], - "org.keycloak.keys.KeyProvider": [ - { - "id": "796db70c-b8e9-4efa-b225-91d8cc8099ea", - "name": "rsa-enc-generated", - "providerId": "rsa-enc-generated", - "subComponents": {}, - "config": { - "priority": ["100"], - "algorithm": ["RSA-OAEP"] - } - }, - { - "id": "06ed66b9-a1ac-4662-afb4-889d176189b3", - "name": "hmac-generated", - "providerId": "hmac-generated", - "subComponents": {}, - "config": { - "priority": ["100"], - "algorithm": ["HS256"] - } - }, - { - "id": "fc8169fe-cb2b-4edb-befa-fa136215a184", - "name": "aes-generated", - "providerId": "aes-generated", - "subComponents": {}, - "config": { - "priority": ["100"] - } - }, - { - "id": "9c40d8de-d867-4f6a-9637-b99500551f15", - "name": "rsa-generated", - "providerId": "rsa-generated", - "subComponents": {}, - "config": { - "priority": ["100"] - } - } - ] - }, - "internationalizationEnabled": false, - "supportedLocales": [], - "authenticationFlows": [ - { - "id": "da3e4aa5-578c-4a70-a0ee-6bd0ac54acd5", - "alias": "Account verification options", - "description": "Method with which to verity the existing account", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-email-verification", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Verify Existing Account by Re-authentication", - "userSetupAllowed": false - } - ] - }, - { - "id": "489875e5-f48e-484a-8a82-d49e8af1834a", - "alias": "Browser - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "43d1a926-1785-4391-bf16-519da996ab47", - "alias": "Direct Grant - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "direct-grant-validate-otp", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "27d47660-5e77-4732-b781-36e88d2f6baf", - "alias": "First broker login - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "a7d1c2ef-57c8-4907-b21b-0d2df675c9c0", - "alias": "Handle Existing Account", - "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-confirm-link", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Account verification options", - "userSetupAllowed": false - } - ] - }, - { - "id": "5f97b94f-e60d-498e-8874-d719adbcc985", - "alias": "Reset - Conditional OTP", - "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-otp", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "22b24e38-53ff-4788-ae8a-dcbce66819a7", - "alias": "User creation or linking", - "description": "Flow for the existing/non-existing user alternatives", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorConfig": "create unique user config", - "authenticator": "idp-create-user-if-unique", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Handle Existing Account", - "userSetupAllowed": false - } - ] - }, - { - "id": "aa67bda7-bfc9-4cd2-84a5-22e371e89135", - "alias": "Verify Existing Account by Re-authentication", - "description": "Reauthentication of existing account", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "First broker login - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "f9b90830-656d-4378-bd98-c11d8a20295c", - "alias": "browser", - "description": "browser based authentication", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-spnego", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "identity-provider-redirector", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 25, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "forms", - "userSetupAllowed": false - } - ] - }, - { - "id": "9b00a800-deea-4b4a-b9cb-530886a7098a", - "alias": "clients", - "description": "Base authentication for clients", - "providerId": "client-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "client-secret", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-jwt", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-secret-jwt", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-x509", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 40, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "88c2fd63-c912-4727-8323-63d31333efaf", - "alias": "direct grant", - "description": "OpenID Connect Resource Owner Grant", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "direct-grant-validate-username", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "direct-grant-validate-password", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "Direct Grant - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "12a8d6fe-ad7e-4443-9b40-b8855535def0", - "alias": "docker auth", - "description": "Used by Docker clients to authenticate against the IDP", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "docker-http-basic-authenticator", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "c64af03f-9326-4689-ad7e-d804b3fe0d60", - "alias": "first broker login", - "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorConfig": "review profile config", - "authenticator": "idp-review-profile", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "User creation or linking", - "userSetupAllowed": false - } - ] - }, - { - "id": "b0e1e734-a068-4ab1-b643-9ac5e18b54b9", - "alias": "forms", - "description": "Username, password, otp and other auth forms.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Browser - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "8978b81a-5145-40bf-9a02-4b9f5c2270cf", - "alias": "registration", - "description": "registration flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-page-form", - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": true, - "flowAlias": "registration form", - "userSetupAllowed": false - } - ] - }, - { - "id": "dd0879d0-a1c7-47dd-8343-5495259359dc", - "alias": "registration form", - "description": "registration form", - "providerId": "form-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-user-creation", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-profile-action", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 40, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-password-action", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 50, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-recaptcha-action", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 60, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "2b5b0164-695d-406a-831d-de8e0864ba8b", - "alias": "reset credentials", - "description": "Reset credentials for a user if they forgot their password or something", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "reset-credentials-choose-user", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-credential-email", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-password", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 40, - "autheticatorFlow": true, - "flowAlias": "Reset - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "b26ac227-95e1-4dea-9673-9cf6f72950d7", - "alias": "saml ecp", - "description": "SAML ECP Profile Authentication Flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "http-basic-authenticator", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - } - ], - "authenticatorConfig": [ - { - "id": "2c59769e-dc23-4813-8ab7-deaa7cde4de5", - "alias": "create unique user config", - "config": { - "require.password.update.after.registration": "false" - } - }, - { - "id": "49f039b3-3d77-43d1-9a32-706285b18e3d", - "alias": "review profile config", - "config": { - "update.profile.on.first.login": "missing" - } - } - ], - "requiredActions": [ - { - "alias": "CONFIGURE_TOTP", - "name": "Configure OTP", - "providerId": "CONFIGURE_TOTP", - "enabled": true, - "defaultAction": false, - "priority": 10, - "config": {} - }, - { - "alias": "TERMS_AND_CONDITIONS", - "name": "Terms and Conditions", - "providerId": "TERMS_AND_CONDITIONS", - "enabled": false, - "defaultAction": false, - "priority": 20, - "config": {} - }, - { - "alias": "UPDATE_PASSWORD", - "name": "Update Password", - "providerId": "UPDATE_PASSWORD", - "enabled": true, - "defaultAction": false, - "priority": 30, - "config": {} - }, - { - "alias": "UPDATE_PROFILE", - "name": "Update Profile", - "providerId": "UPDATE_PROFILE", - "enabled": true, - "defaultAction": false, - "priority": 40, - "config": {} - }, - { - "alias": "VERIFY_EMAIL", - "name": "Verify Email", - "providerId": "VERIFY_EMAIL", - "enabled": true, - "defaultAction": false, - "priority": 50, - "config": {} - }, - { - "alias": "delete_account", - "name": "Delete Account", - "providerId": "delete_account", - "enabled": false, - "defaultAction": false, - "priority": 60, - "config": {} - }, - { - "alias": "webauthn-register", - "name": "Webauthn Register", - "providerId": "webauthn-register", - "enabled": true, - "defaultAction": false, - "priority": 70, - "config": {} - }, - { - "alias": "webauthn-register-passwordless", - "name": "Webauthn Register Passwordless", - "providerId": "webauthn-register-passwordless", - "enabled": true, - "defaultAction": false, - "priority": 80, - "config": {} - }, - { - "alias": "update_user_locale", - "name": "Update User Locale", - "providerId": "update_user_locale", - "enabled": true, - "defaultAction": false, - "priority": 1000, - "config": {} - } - ], - "browserFlow": "browser", - "registrationFlow": "registration", - "directGrantFlow": "direct grant", - "resetCredentialsFlow": "reset credentials", - "clientAuthenticationFlow": "clients", - "dockerAuthenticationFlow": "docker auth", - "attributes": { - "cibaBackchannelTokenDeliveryMode": "poll", - "cibaExpiresIn": "120", - "cibaAuthRequestedUserHint": "login_hint", - "oauth2DeviceCodeLifespan": "600", - "oauth2DevicePollingInterval": "5", - "parRequestUriLifespan": "60", - "cibaInterval": "5", - "realmReusableOtpCode": "false" - }, - "keycloakVersion": "22.0.0", - "userManagedAccessAllowed": false, - "clientProfiles": { - "profiles": [] - }, - "clientPolicies": { - "policies": [] - } -} diff --git a/conf/keycloak_theme/keywind/.DS_Store b/conf/keycloak_theme/keywind/.DS_Store deleted file mode 100644 index 694ba58ec..000000000 Binary files a/conf/keycloak_theme/keywind/.DS_Store and /dev/null differ diff --git a/conf/keycloak_theme/keywind/login/assets/icons/arrow-top-right-on-square.ftl b/conf/keycloak_theme/keywind/login/assets/icons/arrow-top-right-on-square.ftl deleted file mode 100644 index 81c4bf81d..000000000 --- a/conf/keycloak_theme/keywind/login/assets/icons/arrow-top-right-on-square.ftl +++ /dev/null @@ -1,7 +0,0 @@ -<#-- https://github.com/tailwindlabs/heroicons/blob/master/src/20/solid/arrow-top-right-on-square.svg --> -<#macro kw> - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/icons/chevron-down.ftl b/conf/keycloak_theme/keywind/login/assets/icons/chevron-down.ftl deleted file mode 100644 index 673ef1191..000000000 --- a/conf/keycloak_theme/keywind/login/assets/icons/chevron-down.ftl +++ /dev/null @@ -1,6 +0,0 @@ -<#-- https://github.com/tailwindlabs/heroicons/blob/master/src/20/solid/chevron-down.svg --> -<#macro kw> - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/bitbucket.ftl b/conf/keycloak_theme/keywind/login/assets/providers/bitbucket.ftl deleted file mode 100644 index 068bc73d8..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/bitbucket.ftl +++ /dev/null @@ -1,14 +0,0 @@ -<#-- https://atlassian.design/resources/logo-library --> -<#macro kw name="Bitbucket"> - - ${name} - - - - - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/discord.ftl b/conf/keycloak_theme/keywind/login/assets/providers/discord.ftl deleted file mode 100644 index 8ebecaa48..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/discord.ftl +++ /dev/null @@ -1,7 +0,0 @@ -<#-- https://discord.com/branding --> -<#macro kw name="Discord"> - - ${name} - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/facebook.ftl b/conf/keycloak_theme/keywind/login/assets/providers/facebook.ftl deleted file mode 100644 index bc692e759..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/facebook.ftl +++ /dev/null @@ -1,8 +0,0 @@ -<#-- https://www.facebook.com/brand/resources/facebookapp/logo --> -<#macro kw name="Facebook"> - - ${name} - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/github.ftl b/conf/keycloak_theme/keywind/login/assets/providers/github.ftl deleted file mode 100644 index 9523103c4..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/github.ftl +++ /dev/null @@ -1,7 +0,0 @@ -<#-- https://github.com/logos --> -<#macro kw name="GitHub"> - - ${name} - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/gitlab.ftl b/conf/keycloak_theme/keywind/login/assets/providers/gitlab.ftl deleted file mode 100644 index 4acfc132d..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/gitlab.ftl +++ /dev/null @@ -1,10 +0,0 @@ -<#-- https://about.gitlab.com/press/press-kit --> -<#macro kw name="GitLab"> - - ${name} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/google.ftl b/conf/keycloak_theme/keywind/login/assets/providers/google.ftl deleted file mode 100644 index b536cdbb8..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/google.ftl +++ /dev/null @@ -1,10 +0,0 @@ -<#-- https://developers.google.com/identity/branding-guidelines --> -<#macro kw name="Google"> - - ${name} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/instagram.ftl b/conf/keycloak_theme/keywind/login/assets/providers/instagram.ftl deleted file mode 100644 index c4996d880..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/instagram.ftl +++ /dev/null @@ -1,35 +0,0 @@ -<#-- https://www.facebook.com/brand/resources/instagram/instagram-brand --> -<#macro kw name="Instagram"> - - ${name} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/linkedin.ftl b/conf/keycloak_theme/keywind/login/assets/providers/linkedin.ftl deleted file mode 100644 index 944d14335..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/linkedin.ftl +++ /dev/null @@ -1,7 +0,0 @@ -<#-- https://brand.linkedin.com/downloads --> -<#macro kw name="LinkedIn"> - - ${name} - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/microsoft.ftl b/conf/keycloak_theme/keywind/login/assets/providers/microsoft.ftl deleted file mode 100644 index 408635b84..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/microsoft.ftl +++ /dev/null @@ -1,10 +0,0 @@ -<#-- https://learn.microsoft.com/azure/active-directory/develop/howto-add-branding-in-azure-ad-apps --> -<#macro kw name="Microsoft"> - - ${name} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/oidc.ftl b/conf/keycloak_theme/keywind/login/assets/providers/oidc.ftl deleted file mode 100644 index f7954ff5e..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/oidc.ftl +++ /dev/null @@ -1,9 +0,0 @@ -<#-- https://openid.net/add-openid/logos --> -<#macro kw name="OpenID"> - - ${name} - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/openshift.ftl b/conf/keycloak_theme/keywind/login/assets/providers/openshift.ftl deleted file mode 100644 index e85ddef7e..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/openshift.ftl +++ /dev/null @@ -1,11 +0,0 @@ -<#-- https://www.redhat.com/technologies/cloud-computing/openshift --> -<#macro kw name="Red Hat OpenShift"> - - ${name} - - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/paypal.ftl b/conf/keycloak_theme/keywind/login/assets/providers/paypal.ftl deleted file mode 100644 index 7946e03cd..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/paypal.ftl +++ /dev/null @@ -1,9 +0,0 @@ -<#-- https://www.paypal.com --> -<#macro kw name="PayPal"> - - ${name} - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/providers.ftl b/conf/keycloak_theme/keywind/login/assets/providers/providers.ftl deleted file mode 100644 index b9c55f6c8..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/providers.ftl +++ /dev/null @@ -1,79 +0,0 @@ -<#import "./bitbucket.ftl" as bitbucketIcon> -<#import "./discord.ftl" as discordIcon> -<#import "./facebook.ftl" as facebookIcon> -<#import "./github.ftl" as githubIcon> -<#import "./gitlab.ftl" as gitlabIcon> -<#import "./google.ftl" as googleIcon> -<#import "./instagram.ftl" as instagramIcon> -<#import "./linkedin.ftl" as linkedinIcon> -<#import "./microsoft.ftl" as microsoftIcon> -<#import "./oidc.ftl" as oidcIcon> -<#import "./openshift.ftl" as openshiftIcon> -<#import "./paypal.ftl" as paypalIcon> -<#import "./slack.ftl" as slackIcon> -<#import "./stackoverflow.ftl" as stackoverflowIcon> -<#import "./twitter.ftl" as twitterIcon> - -<#macro bitbucket> - <@bitbucketIcon.kw /> - - -<#macro discord> - <@discordIcon.kw /> - - -<#macro facebook> - <@facebookIcon.kw /> - - -<#macro github> - <@githubIcon.kw /> - - -<#macro gitlab> - <@gitlabIcon.kw /> - - -<#macro google> - <@googleIcon.kw /> - - -<#macro instagram> - <@instagramIcon.kw /> - - -<#macro linkedin> - <@linkedinIcon.kw /> - - -<#macro microsoft> - <@microsoftIcon.kw /> - - -<#macro oidc> - <@oidcIcon.kw /> - - -<#macro "openshift-v3"> - <@openshiftIcon.kw /> - - -<#macro "openshift-v4"> - <@openshiftIcon.kw /> - - -<#macro paypal> - <@paypalIcon.kw /> - - -<#macro slack> - <@slackIcon.kw /> - - -<#macro stackoverflow> - <@stackoverflowIcon.kw /> - - -<#macro twitter> - <@twitterIcon.kw /> - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/slack.ftl b/conf/keycloak_theme/keywind/login/assets/providers/slack.ftl deleted file mode 100644 index d4dffe3bb..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/slack.ftl +++ /dev/null @@ -1,14 +0,0 @@ -<#-- https://slack.com/media-kit --> -<#macro kw name="Slack"> - - ${name} - - - - - - - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/stackoverflow.ftl b/conf/keycloak_theme/keywind/login/assets/providers/stackoverflow.ftl deleted file mode 100644 index 1ffad8d6a..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/stackoverflow.ftl +++ /dev/null @@ -1,8 +0,0 @@ -<#-- https://stackoverflow.design/brand/logo --> -<#macro kw name="Stack Overflow"> - - ${name} - - - - diff --git a/conf/keycloak_theme/keywind/login/assets/providers/twitter.ftl b/conf/keycloak_theme/keywind/login/assets/providers/twitter.ftl deleted file mode 100644 index 2bc7e7e49..000000000 --- a/conf/keycloak_theme/keywind/login/assets/providers/twitter.ftl +++ /dev/null @@ -1,7 +0,0 @@ -<#-- https://about.twitter.com/en/who-we-are/brand-toolkit --> -<#macro kw name="Twitter"> - - ${name} - - - diff --git a/conf/keycloak_theme/keywind/login/components/atoms/alert.ftl b/conf/keycloak_theme/keywind/login/components/atoms/alert.ftl deleted file mode 100644 index 58e8309f0..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/alert.ftl +++ /dev/null @@ -1,22 +0,0 @@ -<#macro kw color=""> - <#switch color> - <#case "error"> - <#assign colorClass="bg-red-100 text-red-600"> - <#break> - <#case "info"> - <#assign colorClass="bg-blue-100 text-blue-600"> - <#break> - <#case "success"> - <#assign colorClass="bg-green-100 text-green-600"> - <#break> - <#case "warning"> - <#assign colorClass="bg-orange-100 text-orange-600"> - <#break> - <#default> - <#assign colorClass="bg-blue-100 text-blue-600"> - - - - diff --git a/conf/keycloak_theme/keywind/login/components/atoms/body.ftl b/conf/keycloak_theme/keywind/login/components/atoms/body.ftl deleted file mode 100644 index dcc94a06e..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/body.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> - - <#nested> - - diff --git a/conf/keycloak_theme/keywind/login/components/atoms/button-group.ftl b/conf/keycloak_theme/keywind/login/components/atoms/button-group.ftl deleted file mode 100644 index 459120917..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/button-group.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> -
- <#nested> -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/button.ftl b/conf/keycloak_theme/keywind/login/components/atoms/button.ftl deleted file mode 100644 index eeb0af7b7..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/button.ftl +++ /dev/null @@ -1,33 +0,0 @@ -<#macro kw color="" component="button" size="" rest...> - <#switch color> - <#case "primary"> - <#assign colorClass="bg-primary-600 text-white focus:ring-primary-600 hover:bg-primary-700"> - <#break> - <#case "secondary"> - <#assign colorClass="bg-secondary-100 text-secondary-600 focus:ring-secondary-600 hover:bg-secondary-200 hover:text-secondary-900"> - <#break> - <#default> - <#assign colorClass="bg-primary-600 text-white focus:ring-primary-600 hover:bg-primary-700"> - - - <#switch size> - <#case "medium"> - <#assign sizeClass="px-4 py-2 text-sm"> - <#break> - <#case "small"> - <#assign sizeClass="px-2 py-1 text-xs"> - <#break> - <#default> - <#assign sizeClass="px-4 py-2 text-sm"> - - - <${component} - class="${colorClass} ${sizeClass} flex justify-center relative rounded-lg w-full focus:outline-none focus:ring-2 focus:ring-offset-2" - - <#list rest as attrName, attrValue> - ${attrName}="${attrValue}" - - > - <#nested> - - diff --git a/conf/keycloak_theme/keywind/login/components/atoms/card.ftl b/conf/keycloak_theme/keywind/login/components/atoms/card.ftl deleted file mode 100644 index c1e808df1..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/card.ftl +++ /dev/null @@ -1,19 +0,0 @@ -<#macro kw content="" footer="" header=""> -
- <#if header?has_content> -
- ${header} -
- - <#if content?has_content> -
- ${content} -
- - <#if footer?has_content> -
- ${footer} -
- -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/checkbox.ftl b/conf/keycloak_theme/keywind/login/components/atoms/checkbox.ftl deleted file mode 100644 index e47fd619a..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/checkbox.ftl +++ /dev/null @@ -1,19 +0,0 @@ -<#macro kw checked=false label="" name="" rest...> -
- checked - - class="border-secondary-200 h-4 rounded text-primary-600 w-4 focus:ring-primary-200 focus:ring-opacity-50" - id="${name}" - name="${name}" - type="checkbox" - - <#list rest as attrName, attrValue> - ${attrName}="${attrValue}" - - > - -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/container.ftl b/conf/keycloak_theme/keywind/login/components/atoms/container.ftl deleted file mode 100644 index 34ead183c..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/container.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> -
- <#nested> -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/form.ftl b/conf/keycloak_theme/keywind/login/components/atoms/form.ftl deleted file mode 100644 index 014bb4f1c..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/form.ftl +++ /dev/null @@ -1,11 +0,0 @@ -<#macro kw rest...> -
- ${attrName}="${attrValue}" - - > - <#nested> -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/heading.ftl b/conf/keycloak_theme/keywind/login/components/atoms/heading.ftl deleted file mode 100644 index 7665c0196..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/heading.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> -

- <#nested> -

- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/input.ftl b/conf/keycloak_theme/keywind/login/components/atoms/input.ftl deleted file mode 100644 index 01e2897ad..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/input.ftl +++ /dev/null @@ -1,37 +0,0 @@ -<#macro - kw - autofocus=false - disabled=false - invalid=false - label="" - message="" - name="" - required=true - rest... -> -
- - autofocus - <#if disabled>disabled - <#if required>required - - aria-invalid="${invalid?c}" - class="block border-secondary-200 mt-1 rounded-md w-full focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50 sm:text-sm" - id="${name}" - name="${name}" - placeholder="${label}" - - <#list rest as attrName, attrValue> - ${attrName}="${attrValue}" - - > - <#if invalid?? && message??> -
- ${message?no_esc} -
- -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/link.ftl b/conf/keycloak_theme/keywind/login/components/atoms/link.ftl deleted file mode 100644 index bde766653..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/link.ftl +++ /dev/null @@ -1,30 +0,0 @@ -<#macro kw color="" component="a" size="" rest...> - <#switch color> - <#case "primary"> - <#assign colorClass="text-primary-600 hover:text-primary-500"> - <#break> - <#case "secondary"> - <#assign colorClass="text-secondary-600 hover:text-secondary-900"> - <#break> - <#default> - <#assign colorClass="text-primary-600 hover:text-primary-500"> - - - <#switch size> - <#case "small"> - <#assign sizeClass="text-sm"> - <#break> - <#default> - <#assign sizeClass=""> - - - <${component} - class="<#compress>${colorClass} ${sizeClass} inline-flex" - - <#list rest as attrName, attrValue> - ${attrName}="${attrValue}" - - > - <#nested> - - diff --git a/conf/keycloak_theme/keywind/login/components/atoms/logo.ftl b/conf/keycloak_theme/keywind/login/components/atoms/logo.ftl deleted file mode 100644 index f166403e6..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/logo.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> -
- <#nested> -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/nav.ftl b/conf/keycloak_theme/keywind/login/components/atoms/nav.ftl deleted file mode 100644 index 81a4abf63..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/nav.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> -
- <#nested> -
- diff --git a/conf/keycloak_theme/keywind/login/components/atoms/radio.ftl b/conf/keycloak_theme/keywind/login/components/atoms/radio.ftl deleted file mode 100644 index 5596d5c4b..000000000 --- a/conf/keycloak_theme/keywind/login/components/atoms/radio.ftl +++ /dev/null @@ -1,18 +0,0 @@ -<#macro kw checked=false id="" label="" rest...> -
- checked - - class="border-secondary-200 focus:ring-primary-600" - id="${id}" - type="radio" - - <#list rest as attrName, attrValue> - ${attrName}="${attrValue}" - - > - -
- diff --git a/conf/keycloak_theme/keywind/login/components/molecules/identity-provider.ftl b/conf/keycloak_theme/keywind/login/components/molecules/identity-provider.ftl deleted file mode 100644 index 50c9c81c7..000000000 --- a/conf/keycloak_theme/keywind/login/components/molecules/identity-provider.ftl +++ /dev/null @@ -1,78 +0,0 @@ -<#import "/assets/providers/providers.ftl" as providerIcons> - -<#macro kw providers=[]> -
- ${msg("identity-provider-login-label")} -
-
- <#list providers as provider> - <#switch provider.alias> - <#case "bitbucket"> - <#assign colorClass="hover:bg-provider-bitbucket/10"> - <#break> - <#case "discord"> - <#assign colorClass="hover:bg-provider-discord/10"> - <#break> - <#case "facebook"> - <#assign colorClass="hover:bg-provider-facebook/10"> - <#break> - <#case "github"> - <#assign colorClass="hover:bg-provider-github/10"> - <#break> - <#case "gitlab"> - <#assign colorClass="hover:bg-provider-gitlab/10"> - <#break> - <#case "google"> - <#assign colorClass="hover:bg-provider-google/10"> - <#break> - <#case "instagram"> - <#assign colorClass="hover:bg-provider-instagram/10"> - <#break> - <#case "linkedin"> - <#assign colorClass="hover:bg-provider-linkedin/10"> - <#break> - <#case "microsoft"> - <#assign colorClass="hover:bg-provider-microsoft/10"> - <#break> - <#case "oidc"> - <#assign colorClass="hover:bg-provider-oidc/10"> - <#break> - <#case "openshift-v3"> - <#assign colorClass="hover:bg-provider-openshift/10"> - <#break> - <#case "openshift-v4"> - <#assign colorClass="hover:bg-provider-openshift/10"> - <#break> - <#case "paypal"> - <#assign colorClass="hover:bg-provider-paypal/10"> - <#break> - <#case "slack"> - <#assign colorClass="hover:bg-provider-slack/10"> - <#break> - <#case "stackoverflow"> - <#assign colorClass="hover:bg-provider-stackoverflow/10"> - <#break> - <#case "twitter"> - <#assign colorClass="hover:bg-provider-twitter/10"> - <#break> - <#default> - <#assign colorClass="hover:bg-secondary-100"> - - - - <#if providerIcons[provider.alias]??> -
- <@providerIcons[provider.alias] /> -
- <#else> - ${provider.displayName!} - -
- -
- diff --git a/conf/keycloak_theme/keywind/login/components/molecules/locale-provider.ftl b/conf/keycloak_theme/keywind/login/components/molecules/locale-provider.ftl deleted file mode 100644 index 198e5be10..000000000 --- a/conf/keycloak_theme/keywind/login/components/molecules/locale-provider.ftl +++ /dev/null @@ -1,29 +0,0 @@ -<#import "/assets/icons/chevron-down.ftl" as icon> -<#import "/components/atoms/link.ftl" as link> - -<#macro kw currentLocale="" locales=[]> -
- <@link.kw @click="open = true" color="secondary" component="button" type="button"> -
- ${currentLocale} - <@icon.kw /> -
- -
- <#list locales as locale> - <#if currentLocale != locale.label> -
- <@link.kw color="secondary" href=locale.url size="small"> - ${locale.label} - -
- - -
-
- diff --git a/conf/keycloak_theme/keywind/login/components/molecules/username.ftl b/conf/keycloak_theme/keywind/login/components/molecules/username.ftl deleted file mode 100644 index ba6339389..000000000 --- a/conf/keycloak_theme/keywind/login/components/molecules/username.ftl +++ /dev/null @@ -1,15 +0,0 @@ -<#import "/assets/icons/arrow-top-right-on-square.ftl" as icon> -<#import "/components/atoms/link.ftl" as link> - -<#macro kw linkHref="" linkTitle="" name=""> -
- ${name} - <@link.kw - color="primary" - href=linkHref - title=linkTitle - > - <@icon.kw /> - -
- diff --git a/conf/keycloak_theme/keywind/login/document.ftl b/conf/keycloak_theme/keywind/login/document.ftl deleted file mode 100644 index 188e16a31..000000000 --- a/conf/keycloak_theme/keywind/login/document.ftl +++ /dev/null @@ -1,35 +0,0 @@ -<#macro kw script=""> - ${msg("loginTitle", (realm.displayName!""))} - - - - - - <#if properties.meta?has_content> - <#list properties.meta?split(" ") as meta> - - - - - <#if properties.favicons?has_content> - <#list properties.favicons?split(" ") as favicon> - - - - - <#if properties.styles?has_content> - <#list properties.styles?split(" ") as style> - - - - - <#if script?has_content> - - - - <#if properties.scripts?has_content> - <#list properties.scripts?split(" ") as script> - - - - diff --git a/conf/keycloak_theme/keywind/login/error.ftl b/conf/keycloak_theme/keywind/login/error.ftl deleted file mode 100644 index 52af9c1e6..000000000 --- a/conf/keycloak_theme/keywind/login/error.ftl +++ /dev/null @@ -1,18 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/alert.ftl" as alert> -<#import "components/atoms/link.ftl" as link> - -<@layout.registrationLayout displayMessage=false; section> - <#if section="header"> - ${kcSanitize(msg("errorTitle"))?no_esc} - <#elseif section="form"> - <@alert.kw color="error">${kcSanitize(message.summary)?no_esc} - <#if !skipLink??> - <#if client?? && client.baseUrl?has_content> - <@link.kw color="secondary" href=client.baseUrl size="small"> - ${kcSanitize(msg("backToApplication"))?no_esc} - - - - - diff --git a/conf/keycloak_theme/keywind/login/features/labels/totp-device.ftl b/conf/keycloak_theme/keywind/login/features/labels/totp-device.ftl deleted file mode 100644 index 98ae12f8d..000000000 --- a/conf/keycloak_theme/keywind/login/features/labels/totp-device.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> - <#compress> - ${msg("loginTotpDeviceName")} <#if totp.otpCredentials?size gte 1>* - - diff --git a/conf/keycloak_theme/keywind/login/features/labels/totp.ftl b/conf/keycloak_theme/keywind/login/features/labels/totp.ftl deleted file mode 100644 index be5158ebe..000000000 --- a/conf/keycloak_theme/keywind/login/features/labels/totp.ftl +++ /dev/null @@ -1,5 +0,0 @@ -<#macro kw> - <#compress> - ${msg("authenticatorCode")} * - - diff --git a/conf/keycloak_theme/keywind/login/features/labels/username.ftl b/conf/keycloak_theme/keywind/login/features/labels/username.ftl deleted file mode 100644 index 6c01d6b34..000000000 --- a/conf/keycloak_theme/keywind/login/features/labels/username.ftl +++ /dev/null @@ -1,11 +0,0 @@ -<#macro kw> - <#compress> - <#if !realm.loginWithEmailAllowed> - ${msg("username")} - <#elseif !realm.registrationEmailAsUsername> - ${msg("usernameOrEmail")} - <#else> - ${msg("email")} - - - diff --git a/conf/keycloak_theme/keywind/login/login-config-totp.ftl b/conf/keycloak_theme/keywind/login/login-config-totp.ftl deleted file mode 100644 index e0b64c634..000000000 --- a/conf/keycloak_theme/keywind/login/login-config-totp.ftl +++ /dev/null @@ -1,110 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> -<#import "features/labels/totp.ftl" as totpLabel> -<#import "features/labels/totp-device.ftl" as totpDeviceLabel> - -<#assign totpLabel><@totpLabel.kw /> -<#assign totpDeviceLabel><@totpDeviceLabel.kw /> - -<@layout.registrationLayout - displayMessage=!messagesPerField.existsError("totp", "userLabel") - displayRequiredFields=false - ; - section -> - <#if section="header"> - ${msg("loginTotpTitle")} - <#elseif section="form"> -
    -
  1. -

    ${msg("loginTotpStep1")}

    - -
  2. - <#if mode?? && mode="manual"> -
  3. -

    ${msg("loginTotpManualStep2")}

    -

    ${totp.totpSecretEncoded}

    -
  4. -
  5. - <@link.kw color="primary" href=totp.qrUrl> - ${msg("loginTotpScanBarcode")} - -
  6. -
  7. -

    ${msg("loginTotpManualStep3")}

    - -
  8. - <#else> -
  9. -

    ${msg("loginTotpStep2")}

    - Figure: Barcode - <@link.kw color="primary" href=totp.manualUrl> - ${msg("loginTotpUnableToScan")} - -
  10. - -
  11. ${msg("loginTotpStep3")}
  12. -
  13. ${msg("loginTotpStep3DeviceName")}
  14. -
- <@form.kw action=url.loginAction method="post"> - - <#if mode??> - - - <@input.kw - autocomplete="off" - autofocus=true - invalid=messagesPerField.existsError("totp") - label=totpLabel - message=kcSanitize(messagesPerField.get("totp")) - name="totp" - required=false - type="text" - /> - <@input.kw - autocomplete="off" - invalid=messagesPerField.existsError("userLabel") - label=totpDeviceLabel - message=kcSanitize(messagesPerField.get("userLabel")) - name="userLabel" - required=false - type="text" - /> - <@buttonGroup.kw> - <#if isAppInitiatedAction??> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - <@button.kw color="secondary" name="cancel-aia" type="submit" value="true"> - ${msg("doCancel")} - - <#else> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-idp-link-confirm.ftl b/conf/keycloak_theme/keywind/login/login-idp-link-confirm.ftl deleted file mode 100644 index 9a2554d51..000000000 --- a/conf/keycloak_theme/keywind/login/login-idp-link-confirm.ftl +++ /dev/null @@ -1,18 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/form.ftl" as form> - -<@layout.registrationLayout; section> - <#if section="header"> - ${msg("confirmLinkIdpTitle")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - <@button.kw color="primary" name="submitAction" type="submit" value="updateProfile"> - ${msg("confirmLinkIdpReviewProfile")} - - <@button.kw color="primary" name="submitAction" type="submit" value="linkAccount"> - ${msg("confirmLinkIdpContinue", idpDisplayName)} - - - - diff --git a/conf/keycloak_theme/keywind/login/login-oauth-grant.ftl b/conf/keycloak_theme/keywind/login/login-oauth-grant.ftl deleted file mode 100644 index aa4173cbf..000000000 --- a/conf/keycloak_theme/keywind/login/login-oauth-grant.ftl +++ /dev/null @@ -1,62 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> - -<@layout.registrationLayout; section> - <#if section="header"> - <#if client.attributes.logoUri??> - - -

- <#if client.name?has_content> - ${msg("oauthGrantTitle", advancedMsg(client.name))} - <#else> - ${msg("oauthGrantTitle", client.clientId)} - -

- <#elseif section="form"> -

${msg("oauthGrantRequest")}

- - <#if client.attributes.policyUri?? || client.attributes.tosUri??> -

- <#if client.name?has_content> - ${msg("oauthGrantInformation",advancedMsg(client.name))} - <#else> - ${msg("oauthGrantInformation",client.clientId)} - - <#if client.attributes.tosUri??> - ${msg("oauthGrantReview")} - ${msg("oauthGrantTos")} - - <#if client.attributes.policyUri??> - ${msg("oauthGrantReview")} - ${msg("oauthGrantPolicy")} - -

- - <@form.kw action=url.oauthAction method="post"> - - <@buttonGroup.kw> - <@button.kw color="primary" name="accept" type="submit"> - ${msg("doYes")} - - <@button.kw color="secondary" name="cancel" type="submit"> - ${msg("doNo")} - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-otp.ftl b/conf/keycloak_theme/keywind/login/login-otp.ftl deleted file mode 100644 index b1bb3b975..000000000 --- a/conf/keycloak_theme/keywind/login/login-otp.ftl +++ /dev/null @@ -1,50 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/radio.ftl" as radio> -<#import "features/labels/totp.ftl" as totpLabel> - -<#assign totpLabel><@totpLabel.kw /> - -<@layout.registrationLayout - displayMessage=!messagesPerField.existsError("totp") - ; - section -> - <#if section="header"> - ${msg("doLogIn")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - <#if otpLogin.userOtpCredentials?size gt 1> -
- <#list otpLogin.userOtpCredentials as otpCredential> - <@radio.kw - checked=(otpCredential.id == otpLogin.selectedCredentialId) - id="kw-otp-credential-${otpCredential?index}" - label=otpCredential.userLabel - name="selectedCredentialId" - tabindex=otpCredential?index - value=otpCredential.id - /> - -
- - <@input.kw - autocomplete="off" - autofocus=true - invalid=messagesPerField.existsError("totp") - label=totpLabel - message=kcSanitize(messagesPerField.get("totp")) - name="otp" - type="text" - /> - <@buttonGroup.kw> - <@button.kw color="primary" name="submitAction" type="submit"> - ${msg("doLogIn")} - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-page-expired.ftl b/conf/keycloak_theme/keywind/login/login-page-expired.ftl deleted file mode 100644 index 2b6288d94..000000000 --- a/conf/keycloak_theme/keywind/login/login-page-expired.ftl +++ /dev/null @@ -1,18 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> - -<@layout.registrationLayout; section> - <#if section="header"> - ${msg("pageExpiredTitle")} - <#elseif section="form"> - <@buttonGroup.kw> - <@button.kw color="primary" component="a" href=url.loginRestartFlowUrl> - ${msg("doTryAgain")} - - <@button.kw color="secondary" component="a" href=url.loginAction> - ${msg("doContinue")} - - - - diff --git a/conf/keycloak_theme/keywind/login/login-password.ftl b/conf/keycloak_theme/keywind/login/login-password.ftl deleted file mode 100644 index 54e7d9dca..000000000 --- a/conf/keycloak_theme/keywind/login/login-password.ftl +++ /dev/null @@ -1,39 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> - -<@layout.registrationLayout displayMessage=!messagesPerField.existsError("password"); section> - <#if section="header"> - ${msg("doLogIn")} - <#elseif section="form"> - <@form.kw - action=url.loginAction - method="post" - onsubmit="login.disabled = true; return true;" - > - <@input.kw - autofocus=true - invalid=messagesPerField.existsError("password") - label=msg("password") - message=kcSanitize(messagesPerField.get("password"))?no_esc - name="password" - type="password" - /> - <#if realm.resetPasswordAllowed> -
- <@link.kw color="primary" href=url.loginResetCredentialsUrl size="small"> - ${msg("doForgotPassword")} - -
- - <@buttonGroup.kw> - <@button.kw color="primary" name="login" type="submit"> - ${msg("doLogIn")} - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-recovery-authn-code-config.ftl b/conf/keycloak_theme/keywind/login/login-recovery-authn-code-config.ftl deleted file mode 100644 index 186d71080..000000000 --- a/conf/keycloak_theme/keywind/login/login-recovery-authn-code-config.ftl +++ /dev/null @@ -1,91 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/alert.ftl" as alert> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/checkbox.ftl" as checkbox> -<#import "components/atoms/form.ftl" as form> - -<@layout.registrationLayout script="dist/recoveryCodes.js"; section> - <#if section="header"> - ${msg("recovery-code-config-header")} - <#elseif section="form"> -
- <@alert.kw color="warning"> -
-

${msg("recovery-code-config-warning-title")}

-

${msg("recovery-code-config-warning-message")}

-
- - -
- <@button.kw @click="print" color="secondary" size="small" type="button"> - ${msg("recovery-codes-print")} - - <@button.kw @click="download" color="secondary" size="small" type="button"> - ${msg("recovery-codes-download")} - - <@button.kw @click="copy" color="secondary" size="small" type="button"> - ${msg("recovery-codes-copy")} - -
- <@form.kw action=url.loginAction method="post"> - - - - <@checkbox.kw - label=msg("recovery-codes-confirmation-message") - name="kcRecoveryCodesConfirmationCheck" - required="required" - x\-ref="confirmationCheck" - /> - <@buttonGroup.kw> - <#if isAppInitiatedAction??> - <@button.kw color="primary" type="submit"> - ${msg("recovery-codes-action-complete")} - - <@button.kw - @click="$refs.confirmationCheck.required = false" - color="secondary" - name="cancel-aia" - type="submit" - value="true" - > - ${msg("recovery-codes-action-cancel")} - - <#else> - <@button.kw color="primary" type="submit"> - ${msg("recovery-codes-action-complete")} - - - - -
- - - - diff --git a/conf/keycloak_theme/keywind/login/login-recovery-authn-code-input.ftl b/conf/keycloak_theme/keywind/login/login-recovery-authn-code-input.ftl deleted file mode 100644 index a46bcfa09..000000000 --- a/conf/keycloak_theme/keywind/login/login-recovery-authn-code-input.ftl +++ /dev/null @@ -1,26 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> - -<@layout.registrationLayout; section> - <#if section="header"> - ${msg("auth-recovery-code-header")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - <@input.kw - autocomplete="off" - autofocus=true - label=msg("auth-recovery-code-prompt", recoveryAuthnCodesInputBean.codeNumber?c) - name="recoveryCodeInput" - type="text" - /> - <@buttonGroup.kw> - <@button.kw color="primary" name="login" type="submit"> - ${msg("doLogIn")} - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-reset-password.ftl b/conf/keycloak_theme/keywind/login/login-reset-password.ftl deleted file mode 100644 index b0516aae8..000000000 --- a/conf/keycloak_theme/keywind/login/login-reset-password.ftl +++ /dev/null @@ -1,44 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> -<#import "features/labels/username.ftl" as usernameLabel> - -<#assign usernameLabel><@usernameLabel.kw /> - -<@layout.registrationLayout - displayInfo=true - displayMessage=!messagesPerField.existsError("username") - ; - section -> - <#if section="header"> - ${msg("emailForgotTitle")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - <@input.kw - autocomplete=realm.loginWithEmailAllowed?string("email", "username") - autofocus=true - invalid=messagesPerField.existsError("username") - label=usernameLabel - message=kcSanitize(messagesPerField.get("username")) - name="username" - type="text" - value=(auth?has_content && auth.showUsername())?then(auth.attemptedUsername, '') - /> - <@buttonGroup.kw> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - - - <#elseif section="info"> - ${msg("emailInstruction")} - <#elseif section="nav"> - <@link.kw color="secondary" href=url.loginUrl size="small"> - ${kcSanitize(msg("backToLogin"))?no_esc} - - - diff --git a/conf/keycloak_theme/keywind/login/login-update-password.ftl b/conf/keycloak_theme/keywind/login/login-update-password.ftl deleted file mode 100644 index ed82380e2..000000000 --- a/conf/keycloak_theme/keywind/login/login-update-password.ftl +++ /dev/null @@ -1,64 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/checkbox.ftl" as checkbox> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> - -<@layout.registrationLayout - displayMessage=!messagesPerField.existsError("password", "password-confirm") - ; - section -> - <#if section="header"> - ${msg("updatePasswordTitle")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - - - <@input.kw - autocomplete="new-password" - autofocus=true - invalid=messagesPerField.existsError("password", "password-confirm") - label=msg("passwordNew") - name="password-new" - type="password" - /> - <@input.kw - autocomplete="new-password" - invalid=messagesPerField.existsError("password-confirm") - label=msg("passwordConfirm") - message=kcSanitize(messagesPerField.get("password-confirm")) - name="password-confirm" - type="password" - /> - <#if isAppInitiatedAction??> - <@checkbox.kw - checked=true - label=msg("logoutOtherSessions") - name="logout-sessions" - value="on" - /> - - <@buttonGroup.kw> - <#if isAppInitiatedAction??> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - <@button.kw color="secondary" name="cancel-aia" type="submit" value="true"> - ${msg("doCancel")} - - <#else> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-update-profile.ftl b/conf/keycloak_theme/keywind/login/login-update-profile.ftl deleted file mode 100644 index 306bad944..000000000 --- a/conf/keycloak_theme/keywind/login/login-update-profile.ftl +++ /dev/null @@ -1,71 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> - -<@layout.registrationLayout - displayMessage=!messagesPerField.existsError("email", "firstName", "lastName", "username") - ; - section -> - <#if section="header"> - ${msg("loginProfileTitle")} - <#elseif section="form"> - <@form.kw action=url.loginAction method="post"> - <#if user.editUsernameAllowed> - <@input.kw - autocomplete="username" - autofocus=true - invalid=messagesPerField.existsError("username") - label=msg("username") - message=kcSanitize(messagesPerField.get("username")) - name="username" - type="text" - value=(user.username)!'' - /> - - <@input.kw - autocomplete="email" - invalid=messagesPerField.existsError("email") - label=msg("email") - message=kcSanitize(messagesPerField.get("email")) - name="email" - type="email" - value=(user.email)!'' - /> - <@input.kw - autocomplete="given-name" - invalid=messagesPerField.existsError("firstName") - label=msg("firstName") - message=kcSanitize(messagesPerField.get("firstName")) - name="firstName" - type="text" - value=(user.firstName)!'' - /> - <@input.kw - autocomplete="family-name" - invalid=messagesPerField.existsError("lastName") - label=msg("lastName") - message=kcSanitize(messagesPerField.get("lastName")) - name="lastName" - type="text" - value=(user.lastName)!'' - /> - <@buttonGroup.kw> - <#if isAppInitiatedAction??> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - <@button.kw color="secondary" name="cancel-aia" type="submit" value="true"> - ${msg("doCancel")} - - <#else> - <@button.kw color="primary" type="submit"> - ${msg("doSubmit")} - - - - - - diff --git a/conf/keycloak_theme/keywind/login/login-username.ftl b/conf/keycloak_theme/keywind/login/login-username.ftl deleted file mode 100644 index b8064b2da..000000000 --- a/conf/keycloak_theme/keywind/login/login-username.ftl +++ /dev/null @@ -1,71 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/checkbox.ftl" as checkbox> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> -<#import "components/molecules/identity-provider.ftl" as identityProvider> -<#import "features/labels/username.ftl" as usernameLabel> - -<#assign usernameLabel><@usernameLabel.kw /> - -<@layout.registrationLayout - displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled?? - displayMessage=!messagesPerField.existsError("username") - ; - section -> - <#if section="header"> - ${msg("loginAccountTitle")} - <#elseif section="form"> - <#if realm.password> - <@form.kw - action=url.loginAction - method="post" - onsubmit="login.disabled = true; return true;" - > - <#if !usernameHidden??> - <@input.kw - autocomplete=realm.loginWithEmailAllowed?string("email", "username") - autofocus=true - disabled=usernameEditDisabled?? - invalid=messagesPerField.existsError("username") - label=usernameLabel - message=kcSanitize(messagesPerField.get("username"))?no_esc - name="username" - type="text" - value=(login.username)!'' - /> - - <#if realm.rememberMe && !usernameHidden??> -
- <@checkbox.kw - checked=login.rememberMe?? - label=msg("rememberMe") - name="rememberMe" - /> -
- - <@buttonGroup.kw> - <@button.kw color="primary" name="login" type="submit"> - ${msg("doLogIn")} - - - - - <#elseif section="info"> - <#if realm.password && realm.registrationAllowed && !registrationDisabled??> -
- ${msg("noAccount")} - <@link.kw color="primary" href=url.registrationUrl> - ${msg("doRegister")} - -
- - <#elseif section="socialProviders"> - <#if realm.password && social.providers??> - <@identityProvider.kw providers=social.providers /> - - - diff --git a/conf/keycloak_theme/keywind/login/login.ftl b/conf/keycloak_theme/keywind/login/login.ftl deleted file mode 100644 index 308413817..000000000 --- a/conf/keycloak_theme/keywind/login/login.ftl +++ /dev/null @@ -1,88 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/checkbox.ftl" as checkbox> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> -<#import "components/molecules/identity-provider.ftl" as identityProvider> -<#import "features/labels/username.ftl" as usernameLabel> - -<#assign usernameLabel><@usernameLabel.kw /> - -<@layout.registrationLayout - displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled?? - displayMessage=!messagesPerField.existsError("username", "password") - ; - section -> - <#if section="header"> - ${msg("loginAccountTitle")} - <#elseif section="form"> - <#if realm.password> - <@form.kw - action=url.loginAction - method="post" - onsubmit="login.disabled = true; return true;" - > - - <@input.kw - autocomplete=realm.loginWithEmailAllowed?string("email", "username") - autofocus=true - disabled=usernameEditDisabled?? - invalid=messagesPerField.existsError("username", "password") - label=usernameLabel - message=kcSanitize(messagesPerField.getFirstError("username", "password")) - name="username" - type="text" - value=(login.username)!'username' - /> - <@input.kw - invalid=messagesPerField.existsError("username", "password") - label=msg("password") - name="password" - type="password" - value=(login.password)!'password' - /> - <#if realm.rememberMe && !usernameEditDisabled?? || realm.resetPasswordAllowed> -
- <#if realm.rememberMe && !usernameEditDisabled??> - <@checkbox.kw - checked=login.rememberMe?? - label=msg("rememberMe") - name="rememberMe" - /> - - <#if realm.resetPasswordAllowed> - <@link.kw color="primary" href=url.loginResetCredentialsUrl size="small"> - ${msg("doForgotPassword")} - - -
- - <@buttonGroup.kw> - <@button.kw color="primary" name="login" type="submit"> - ${msg("doLogIn")} - - - - - <#elseif section="info"> - <#if realm.password && realm.registrationAllowed && !registrationDisabled??> -
- ${msg("noAccount")} - <@link.kw color="primary" href=url.registrationUrl> - ${msg("doRegister")} - -
- - <#elseif section="socialProviders"> - <#if realm.password && social.providers??> - <@identityProvider.kw providers=social.providers /> - - - diff --git a/conf/keycloak_theme/keywind/login/logout-confirm.ftl b/conf/keycloak_theme/keywind/login/logout-confirm.ftl deleted file mode 100644 index e7ec48626..000000000 --- a/conf/keycloak_theme/keywind/login/logout-confirm.ftl +++ /dev/null @@ -1,25 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/link.ftl" as link> - -<@layout.registrationLayout; section> - <#if section="header"> - ${msg("logoutConfirmTitle")} - <#elseif section="form"> -

${msg("logoutConfirmHeader")}

- <@form.kw action=url.logoutConfirmAction method="post"> - - <@button.kw color="primary" name="confirmLogout" type="submit" value=msg('doLogout')> - ${msg("doLogout")} - - - <#if !logoutConfirm.skipLink> - <#if (client.baseUrl)?has_content> - <@link.kw color="secondary" href=client.baseUrl size="small"> - ${kcSanitize(msg("backToApplication"))?no_esc} - - - - - diff --git a/conf/keycloak_theme/keywind/login/register.ftl b/conf/keycloak_theme/keywind/login/register.ftl deleted file mode 100644 index c1a2f061f..000000000 --- a/conf/keycloak_theme/keywind/login/register.ftl +++ /dev/null @@ -1,88 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> -<#import "components/atoms/form.ftl" as form> -<#import "components/atoms/input.ftl" as input> -<#import "components/atoms/link.ftl" as link> - -<@layout.registrationLayout - displayMessage=!messagesPerField.existsError("firstName", "lastName", "email", "username", "password", "password-confirm") - ; - section -> - <#if section="header"> - ${msg("registerTitle")} - <#elseif section="form"> - <@form.kw action=url.registrationAction method="post"> - <@input.kw - autocomplete="given-name" - autofocus=true - invalid=messagesPerField.existsError("firstName") - label=msg("firstName") - message=kcSanitize(messagesPerField.get("firstName")) - name="firstName" - type="text" - value=(register.formData.firstName)!'' - /> - <@input.kw - autocomplete="family-name" - invalid=messagesPerField.existsError("lastName") - label=msg("lastName") - message=kcSanitize(messagesPerField.get("lastName")) - name="lastName" - type="text" - value=(register.formData.lastName)!'' - /> - <@input.kw - autocomplete="email" - invalid=messagesPerField.existsError("email") - label=msg("email") - message=kcSanitize(messagesPerField.get("email")) - name="email" - type="email" - value=(register.formData.email)!'' - /> - <#if !realm.registrationEmailAsUsername> - <@input.kw - autocomplete="username" - invalid=messagesPerField.existsError("username") - label=msg("username") - message=kcSanitize(messagesPerField.get("username")) - name="username" - type="text" - value=(register.formData.username)!'' - /> - - <#if passwordRequired??> - <@input.kw - autocomplete="new-password" - invalid=messagesPerField.existsError("password", "password-confirm") - label=msg("password") - message=kcSanitize(messagesPerField.getFirstError("password", "password-confirm")) - name="password" - type="password" - /> - <@input.kw - autocomplete="new-password" - invalid=messagesPerField.existsError("password-confirm") - label=msg("passwordConfirm") - message=kcSanitize(messagesPerField.get("password-confirm")) - name="password-confirm" - type="password" - /> - - <#if recaptchaRequired??> -
- - <@buttonGroup.kw> - <@button.kw color="primary" type="submit"> - ${msg("doRegister")} - - - - <#elseif section="nav"> - <@link.kw color="secondary" href=url.loginUrl size="small"> - ${kcSanitize(msg("backToLogin"))?no_esc} - - - diff --git a/conf/keycloak_theme/keywind/login/resources/dist/assets/index-a7b84447.js b/conf/keycloak_theme/keywind/login/resources/dist/assets/index-a7b84447.js deleted file mode 100644 index c1b2f3c66..000000000 --- a/conf/keycloak_theme/keywind/login/resources/dist/assets/index-a7b84447.js +++ /dev/null @@ -1 +0,0 @@ -var s={};Object.defineProperty(s,"__esModule",{value:!0});function v(e,r,a){var l;if(a===void 0&&(a={}),!r.codes){r.codes={};for(var n=0;n=8&&(t-=8,c[u++]=255&i>>t)}if(t>=r.bits||255&i<<8-t)throw new SyntaxError("Unexpected end of data");return c}function o(e,r,a){a===void 0&&(a={});for(var l=a,n=l.pad,b=n===void 0?!0:n,c=(1<r.bits;)i-=r.bits,t+=r.chars[c&u>>i];if(i&&(t+=r.chars[c&u<Te&&R.splice(t,1)}function $r(){!Me&&!Ce&&(Ce=!0,queueMicrotask(Rr))}function Rr(){Ce=!1,Me=!0;for(let e=0;ee.effect(t,{scheduler:r=>{Ie?Ir(r):r()}}),yt=e.raw}function ct(e){z=e}function Lr(e){let t=()=>{};return[n=>{let i=z(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),Z(i))},i},()=>{t()}]}var xt=[],bt=[],mt=[];function Fr(e){mt.push(e)}function wt(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,bt.push(t))}function Kr(e){xt.push(e)}function Dr(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Et(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var qe=new MutationObserver(Je),We=!1;function Ve(){qe.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),We=!0}function St(){Br(),qe.disconnect(),We=!1}var U=[],Ee=!1;function Br(){U=U.concat(qe.takeRecords()),U.length&&!Ee&&(Ee=!0,queueMicrotask(()=>{kr(),Ee=!1}))}function kr(){Je(U),U.length=0}function x(e){if(!We)return e();St();let t=e();return Ve(),t}var Ue=!1,ae=[];function zr(){Ue=!0}function Hr(){Ue=!1,Je(ae),ae=[]}function Je(e){if(Ue){ae=ae.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,u=e[o].oldValue,c=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},l=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&u===null?c():s.hasAttribute(a)?(l(),c()):l()}i.forEach((o,s)=>{Et(s,o)}),n.forEach((o,s)=>{xt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(bt.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||o.isConnected&&(delete o._x_ignoreSelf,delete o._x_ignore,mt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function At(e){return ee(K(e))}function X(e,t,r){return e._x_dataStack=[t,...K(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function lt(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([n,i])=>{r[n]=i})}function K(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?K(e.host):e.parentNode?K(e.parentNode):[]}function ee(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,u=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...u,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function Ot(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let u=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,u,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,u)})};return r(e)}function Ct(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>qr(n,i),s=>Pe(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let u=n.initialize(o,s,a);return r.initialValue=u,i(o,s,a)}}else r.initialValue=n;return r}}function qr(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function Pe(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Pe(e[t[0]],t.slice(1),r)}}var Mt={};function S(e,t){Mt[e]=t}function $e(e,t){return Object.entries(Mt).forEach(([r,n])=>{Object.defineProperty(e,`$${r}`,{get(){let[i,o]=Rt(t);return i={interceptor:Ct,...i},wt(t,o),n(t,i)},enumerable:!1})}),e}function Wr(e,t,r,...n){try{return r(...n)}catch(i){Y(i,e,t)}}function Y(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} - -${r?'Expression: "'+r+`" - -`:""}`,t),setTimeout(()=>{throw e},0)}var se=!0;function Vr(e){let t=se;se=!1,e(),se=t}function F(e,t,r={}){let n;return m(e,t)(i=>n=i,r),n}function m(...e){return Tt(...e)}var Tt=It;function Ur(e){Tt=e}function It(e,t){let r={};$e(r,e);let n=[r,...K(e)],i=typeof t=="function"?Jr(n,t):Yr(n,t,e);return Wr.bind(null,e,t,i)}function Jr(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(ee([n,...e]),i);ue(r,o)}}var Se={};function Gr(e,t){if(Se[e])return Se[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(async()=>{ ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return Y(s,t,e),Promise.resolve()}})();return Se[e]=o,o}function Yr(e,t,r){let n=Gr(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=ee([o,...e]);if(typeof n=="function"){let u=n(n,a).catch(c=>Y(c,r,t));n.finished?(ue(i,n.result,a,s,r),n.result=void 0):u.then(c=>{ue(i,c,a,s,r)}).catch(c=>Y(c,r,t)).finally(()=>n.result=void 0)}}}function ue(e,t,r,n,i){if(se&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>ue(e,s,r,n)).catch(s=>Y(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var Ge="x-";function H(e=""){return Ge+e}function Qr(e){Ge=e}var Re={};function g(e,t){return Re[e]=t,{before(r){if(!Re[r]){console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");return}const n=$.indexOf(r);$.splice(n>=0?n:$.indexOf("DEFAULT"),0,e)}}}function Ye(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,u])=>({name:a,value:u})),s=Pt(o);o=o.map(a=>s.find(u=>u.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(Lt((o,s)=>n[o]=s)).filter(Kt).map(en(n,r)).sort(tn).map(o=>Xr(e,o))}function Pt(e){return Array.from(e).map(Lt()).filter(t=>!Kt(t))}var je=!1,V=new Map,$t=Symbol();function Zr(e){je=!0;let t=Symbol();$t=t,V.set(t,[]);let r=()=>{for(;V.get(t).length;)V.get(t).shift()();V.delete(t)},n=()=>{je=!1,r()};e(r),n()}function Rt(e){let t=[],r=a=>t.push(a),[n,i]=Lr(e);return t.push(i),[{Alpine:re,effect:n,cleanup:r,evaluateLater:m.bind(m,e),evaluate:F.bind(F,e)},()=>t.forEach(a=>a())]}function Xr(e,t){let r=()=>{},n=Re[t.type]||r,[i,o]=Rt(e);Dr(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),je?V.get($t).push(n):n())};return s.runCleanups=o,s}var jt=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Nt=e=>e;function Lt(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=Ft.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var Ft=[];function Qe(e){Ft.push(e)}function Kt({name:e}){return Dt().test(e)}var Dt=()=>new RegExp(`^${Ge}([^:^.]+)\\b`);function en(e,t){return({name:r,value:n})=>{let i=r.match(Dt()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(u=>u.replace(".","")),expression:n,original:a}}}var Ne="DEFAULT",$=["ignore","ref","data","id","bind","init","for","model","modelable","transition","show","if",Ne,"teleport"];function tn(e,t){let r=$.indexOf(e.type)===-1?Ne:e.type,n=$.indexOf(t.type)===-1?Ne:t.type;return $.indexOf(r)-$.indexOf(n)}function J(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function M(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>M(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)M(n,t),n=n.nextElementSibling}function D(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function rn(){document.body||D("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` diff --git a/conf/keycloak_theme/keywind/login/webauthn-error.ftl b/conf/keycloak_theme/keywind/login/webauthn-error.ftl deleted file mode 100644 index 852d1e3d5..000000000 --- a/conf/keycloak_theme/keywind/login/webauthn-error.ftl +++ /dev/null @@ -1,34 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> - -<@layout.registrationLayout displayMessage=true; section> - <#if section="header"> - ${kcSanitize(msg("webauthn-error-title"))?no_esc} - <#elseif section="form"> -
-
- - -
- <@buttonGroup.kw> - <@button.kw - @click="$refs.executionValueInput.value = '${execution}'; $refs.isSetRetryInput.value = 'retry'; $refs.errorCredentialForm.submit()" - color="primary" - name="try-again" - tabindex="4" - type="button" - > - ${kcSanitize(msg("doTryAgain"))?no_esc} - - <#if isAppInitiatedAction??> -
- <@button.kw color="secondary" name="cancel-aia" type="submit" value="true"> - ${msg("doCancel")} - -
- - -
- - diff --git a/conf/keycloak_theme/keywind/login/webauthn-register.ftl b/conf/keycloak_theme/keywind/login/webauthn-register.ftl deleted file mode 100644 index 57f4dad87..000000000 --- a/conf/keycloak_theme/keywind/login/webauthn-register.ftl +++ /dev/null @@ -1,54 +0,0 @@ -<#import "template.ftl" as layout> -<#import "components/atoms/button.ftl" as button> -<#import "components/atoms/button-group.ftl" as buttonGroup> - -<@layout.registrationLayout script="dist/webAuthnRegister.js"; section> - <#if section="title"> - title - <#elseif section="header"> - ${kcSanitize(msg("webauthn-registration-title"))?no_esc} - <#elseif section="form"> -
-
- - - - - - -
- <@buttonGroup.kw> - <@button.kw @click="registerSecurityKey" color="primary" type="submit"> - ${msg("doRegister")} - - <#if !isSetRetry?has_content && isAppInitiatedAction?has_content> -
- <@button.kw color="secondary" name="cancel-aia" type="submit" value="true"> - ${msg("doCancel")} - -
- - -
- - - - diff --git a/conf/sample.env_app-backend b/conf/sample.env_app-backend deleted file mode 100644 index e75a8c98c..000000000 --- a/conf/sample.env_app-backend +++ /dev/null @@ -1,23 +0,0 @@ -## postgres database to store Hasura metadata -HASURA_GRAPHQL_METADATA_DATABASE_URL=postgres://postgres:postgrespassword@postgres:5432/jan-hasura-metadata -## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs -PG_DATABASE_URL=postgres://postgres:postgrespassword@postgres:5432/jan-hasura-data -## enable the console served by server -HASURA_GRAPHQL_ENABLE_CONSOLE="true" # set to "false" to disable console -## enable debugging mode. It is recommended to disable this in production -HASURA_GRAPHQL_DEV_MODE="true" -HASURA_GRAPHQL_ENABLED_LOG_TYPES=startup, http-log, webhook-log, websocket-log, query-log -## uncomment next line to run console offline (i.e load console assets from server instead of CDN) -# HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets -## uncomment next line to set an admin secret -HASURA_GRAPHQL_ADMIN_SECRET=myadminsecretkey -HASURA_GRAPHQL_UNAUTHORIZED_ROLE="public" -HASURA_GRAPHQL_METADATA_DEFAULTS='{"backend_configs":{"dataconnector":{"athena":{"uri":"http://data-connector-agent:8081/api/v1/athena"},"mariadb":{"uri":"http://data-connector-agent:8081/api/v1/mariadb"},"mysql8":{"uri":"http://data-connector-agent:8081/api/v1/mysql"},"oracle":{"uri":"http://data-connector-agent:8081/api/v1/oracle"},"snowflake":{"uri":"http://data-connector-agent:8081/api/v1/snowflake"}}}}' -HASURA_GRAPHQL_JWT_SECRET={"jwk_url": "http://keycloak:8088/realms/hasura/protocol/openid-connect/certs"} - -# Environment variable for auto migrate -HASURA_GRAPHQL_MIGRATIONS_DIR=/migrations -HASURA_GRAPHQL_METADATA_DIR=/metadata -HASURA_GRAPHQL_ENABLE_CONSOLE='true' -HASURA_ACTION_STABLE_DIFFUSION_URL=http://sd:8000 -HASURA_EVENTS_HOOK_URL="http://worker:8787" \ No newline at end of file diff --git a/conf/sample.env_app-backend-postgres b/conf/sample.env_app-backend-postgres deleted file mode 100644 index 39aa93db5..000000000 --- a/conf/sample.env_app-backend-postgres +++ /dev/null @@ -1 +0,0 @@ -POSTGRES_PASSWORD=postgrespassword \ No newline at end of file diff --git a/conf/sample.env_web-client b/conf/sample.env_web-client deleted file mode 100644 index e024bb762..000000000 --- a/conf/sample.env_web-client +++ /dev/null @@ -1,15 +0,0 @@ -NEXT_PUBLIC_ENV=development -NEXT_PUBLIC_WEB_URL=http://localhost:3000 -NEXT_PUBLIC_DISCORD_INVITATION_URL=# -NEXT_PUBLIC_DOWNLOAD_APP_IOS=# -NEXT_PUBLIC_DOWNLOAD_APP_ANDROID=# -NEXT_PUBLIC_GRAPHQL_ENGINE_URL=http://localhost:8080/v1/graphql -NEXT_PUBLIC_GRAPHQL_ENGINE_WEB_SOCKET_URL=ws://localhost:8080/v1/graphql -NEXT_PUBLIC_OPENAPI_ENDPOINT=http://localhost:8000/v1/chat/completions -KEYCLOAK_CLIENT_ID=hasura -KEYCLOAK_CLIENT_SECRET=oMtCPAV7diKpE564SBspgKj4HqlKM4Hy -AUTH_ISSUER=http://localhost:8088/realms/$KEYCLOAK_CLIENT_ID -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=my-secret -END_SESSION_URL=http://localhost:8088/realms/$KEYCLOAK_CLIENT_ID/protocol/openid-connect/logout -REFRESH_TOKEN_URL=http://localhost:8088/realms/$KEYCLOAK_CLIENT_ID/protocol/openid-connect/token diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 2a0c2bad7..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,121 +0,0 @@ -# docker version -version: "3" - -services: - keycloak: - image: quay.io/keycloak/keycloak:${KEYCLOAK_VERSION-22.0.0} - command: ["start-dev", "--import-realm", "--http-port", "8088"] - environment: - KC_DB: postgres - KC_DB_URL_HOST: postgres - KC_DB_URL_DATABASE: jan-keycloak - KC_DB_PASSWORD: postgrespassword - KC_DB_USERNAME: postgres - KC_DB_SCHEMA: public - KC_HEALTH_ENABLED: "true" - KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN-admin} - KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD-admin} - volumes: - - ./conf/keycloak_conf:/opt/keycloak/data/import - - ./conf/keycloak_theme/keywind:/opt/keycloak/themes/keywind - ports: - - "8088:8088" - depends_on: - postgres: - condition: service_healthy - networks: - jan_community: - ipv4_address: 172.20.0.9 - - postgres: - image: postgres:15 - command: postgres -c jit=off - restart: always - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgrespassword - ports: - - "5432:5432" - healthcheck: - test: "exit 0" - volumes: - - ./conf/db/docker_psql_init.sql:/docker-entrypoint-initdb.d/docker_postgres_init.sql - networks: - jan_community: - ipv4_address: 172.20.0.11 - - graphql-engine: - image: hasura/graphql-engine:v2.31.0.cli-migrations-v3 - ports: - - 8080:8080 - restart: always - env_file: - - conf/sample.env_app-backend - volumes: - - ./app-backend/hasura/migrations:/migrations - - ./app-backend/hasura/metadata:/metadata - depends_on: - data-connector-agent: - condition: service_healthy - keycloak: - condition: service_started - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"] - interval: 10s - timeout: 10s - retries: 30 - networks: - jan_community: - ipv4_address: 172.20.0.12 - - data-connector-agent: - image: hasura/graphql-data-connector:v2.31.0 - restart: always - ports: - - 8081:8081 - environment: - QUARKUS_LOG_LEVEL: ERROR # FATAL, ERROR, WARN, INFO, DEBUG, TRACE - ## https://quarkus.io/guides/opentelemetry#configuration-reference - QUARKUS_OPENTELEMETRY_ENABLED: "false" - ## QUARKUS_OPENTELEMETRY_TRACER_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317 - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8081/api/v1/athena/health"] - interval: 5s - timeout: 10s - retries: 5 - start_period: 5s - networks: - jan_community: - ipv4_address: 172.20.0.14 - - web: - build: - context: ./web-client - dockerfile: ./dev.Dockerfile - restart: always - volumes: - - ./web-client/:/app - - /app/node_modules - - /app/.next - env_file: - - conf/sample.env_web-client - ports: - - 3000:3000 - environment: - NODE_ENV: development - extra_hosts: - - "localhost:172.20.0.9" - depends_on: - graphql-engine: - condition: service_healthy - networks: - jan_community: - ipv4_address: 172.20.0.15 - -networks: - jan_community: - driver: bridge - ipam: - driver: default - config: - - subnet: 172.20.0.0/16 diff --git a/docs/docs/privacy/privacy.md b/docs/docs/privacy/privacy.md new file mode 100644 index 000000000..56e81f3a1 --- /dev/null +++ b/docs/docs/privacy/privacy.md @@ -0,0 +1,25 @@ +# Privacy Policy + +Jan is committed to protecting your privacy and ensuring that your personal information is handled in a safe and responsible way. This policy outlines how we collect, store, and use your personal information when you use our mobile application. + +## Data Collection and Usage + +When you use Jan, we may collect certain information about you, including your name, email address, and other personal information that you provide to us. We use this information to provide you with the best possible experience when using our app. + +We may also collect certain non-personal information, such as your device type, operating system, and app usage data. This information is used to improve our app and to provide you with a better user experience. + +## Data Sharing + +We do not share your personal information with third parties except as required by law or as necessary to provide you with the services you have requested. We may share non-personal information with third parties for the purpose of improving our app and providing you with a better user experience. + +## Data Security + +We take the security of your personal information seriously and have implemented appropriate technical and organizational measures to protect your personal information from unauthorized access, disclosure, or misuse. + +## Your Choices + +You have the right to access, update, and delete your personal information at any time. You may also opt-out of receiving marketing communications from us by following the unsubscribe link included in our emails. + +## Contact Us + +If you have any questions or concerns about our privacy policy, please contact us at hello@jan.ai. diff --git a/docs/docs/support/support.md b/docs/docs/support/support.md new file mode 100644 index 000000000..6f2b77548 --- /dev/null +++ b/docs/docs/support/support.md @@ -0,0 +1,6 @@ +# Support + +- Bugs & requests: file a Github ticket [here](https://github.com/janhq/jan/issues) +- For discussion: join our Discord [here](https://discord.gg/FTk2MvZwJH) +- For business inquiries: email hello@jan.ai +- For jobs: please email hr@jan.ai diff --git a/docs/package.json b/docs/package.json index aace8464c..ed81ad1c6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "docusaurus": "docusaurus", - "start": "docusaurus start", + "start": "docusaurus start --port 3001", "build": "docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", diff --git a/docs/src/components/Elements/dropdown.js b/docs/src/components/Elements/dropdown.js index 95835575e..6d9bd0697 100644 --- a/docs/src/components/Elements/dropdown.js +++ b/docs/src/components/Elements/dropdown.js @@ -6,22 +6,22 @@ import { ChevronDownIcon } from "@heroicons/react/20/solid"; const items = [ { name: "Download for Mac (M1/M2)", - href: "#", + href: "https://github.com/janhq/jan/releases/download/v0.1.2/Jan-0.1.2-arm64.dmg", logo: require("@site/static/img/apple-logo-white.png").default, }, { name: "Download for Mac (Intel)", - href: "#", + href: "https://github.com/janhq/jan/releases/download/v0.1.2/Jan-0.1.2-arm64.dmg", logo: require("@site/static/img/apple-logo-white.png").default, }, { name: "Download for Windows", - href: "#", + href: "https://static.vecteezy.com/system/resources/previews/004/243/615/non_2x/creative-coming-soon-teaser-background-free-vector.jpg", logo: require("@site/static/img/windows-logo-white.png").default, }, { name: "Download for Linux", - href: "#", + href: "https://static.vecteezy.com/system/resources/previews/004/243/615/non_2x/creative-coming-soon-teaser-background-free-vector.jpg", logo: require("@site/static/img/linux-logo-white.png").default, }, ]; @@ -34,9 +34,9 @@ export default function Dropdown() { return (
{/* TODO dynamically detect users OS through browser */} - + Open OS options diff --git a/docs/src/components/Homepage/banner.js b/docs/src/components/Homepage/banner.js index 43bd96711..24520e747 100644 --- a/docs/src/components/Homepage/banner.js +++ b/docs/src/components/Homepage/banner.js @@ -1,32 +1,32 @@ import React from "react"; import { XMarkIcon } from "@heroicons/react/20/solid"; +import { useColorMode } from "@docusaurus/theme-common"; export default function HomepageBanner() { - return ( -
-

- - GeneriCon 2023 - - Join us in Denver from June 7 – 9 to see what’s coming next  - - -

-
- + const { colorMode } = useColorMode(); + const bannerText = + "🚧 This site is under construction - expect breaking changes! 🚧"; + return colorMode === "dark" ? ( +
+ {bannerText} +
+ ) : ( +
+ ); } diff --git a/docs/src/components/Homepage/hero.js b/docs/src/components/Homepage/hero.js index e285f7d75..64dbd83f2 100644 --- a/docs/src/components/Homepage/hero.js +++ b/docs/src/components/Homepage/hero.js @@ -1,5 +1,5 @@ import React from "react"; -import { ChevronRightIcon } from "@heroicons/react/20/solid"; +import { ArrowTopRightOnSquareIcon } from "@heroicons/react/20/solid"; import { useColorMode } from "@docusaurus/theme-common"; import Dropdown from "@site/src/components/Elements/dropdown"; @@ -47,7 +47,9 @@ export default function HomepageHero() { Run your own AI

- Jan lets you run AI on your own hardware, and with 1-click installs for the latest models. Easy-to-use yet powerful, with helpful tools to monitor and manage software-hardware performance. + Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui + lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat + fugiat aliqua.

{/* TODO: handle mobile model download app instead */} @@ -55,8 +57,16 @@ export default function HomepageHero() {
@@ -64,9 +74,9 @@ export default function HomepageHero() { App screenshot
@@ -64,7 +66,14 @@ export default function HomepageSectionOne() {
Product screenshot +
-
-

- Run AI on any OS +
+

+ AI on your own hardware means

-

+

Unlimited Use

-

- No uncontrolled cloud spending. No hidden fees. No limits. -

- {/* Cost comparitor */} -
-
-
-
-
- - - - - - - - - - {people.map((person) => ( - - - - - - ))} - -
- Name - - Title - - Email -
- {person.name} - - {person.title} - - {person.email} -
-
+

+ No uncontrolled cloud spending. No hidden fees. No limits. +

+ {/*
+ + + Payment frequency + + {frequencies.map((option) => ( + + classNames( + checked ? "bg-indigo-600 text-white" : "text-gray-500", + "cursor-pointer rounded-full px-2.5 py-1" + ) + } + > + {option.label} + + ))} + +
*/} +
+ {tiers.map((tier) => ( +
+
+

+ {tier.name} +

+ {tier.mostPopular ? ( +

+ Fully private +

+ ) : null}
+

+ {tier.description} +

+

+ + {tier.price[frequency.value]} + + + {frequency.priceSuffix} + +

+ {/* + Buy plan + */} +
    + {tier.features.map((feature) => ( +
  • +
  • + ))} +
-
+ ))}
diff --git a/docs/src/components/Homepage/sectionTwo.js b/docs/src/components/Homepage/sectionTwo.js index 616c909b9..d9ff18666 100644 --- a/docs/src/components/Homepage/sectionTwo.js +++ b/docs/src/components/Homepage/sectionTwo.js @@ -8,18 +8,19 @@ import { RocketLaunchIcon, ServerIcon, } from "@heroicons/react/20/solid"; +import { useColorMode } from "@docusaurus/theme-common"; const features = [ { - name: "Data security and privacy.", + name: "Data Security and Privacy.", description: - "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.", + "Jan runs locally on your machine. Your data never leaves your computer. You can even run Jan offline.", icon: CloudArrowUpIcon, }, { - name: "Always accessible.", + name: "Cross Device Compatible.", description: - "Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo.", + "Jan runs Nitro, a C++ inference engine, that is compatible with all major operating systems (CPU and GPU).", icon: LockClosedIcon, }, { @@ -30,6 +31,7 @@ const features = [ ]; export default function sectionTwo() { + const { colorMode } = useColorMode(); return (
@@ -43,9 +45,8 @@ export default function sectionTwo() { AI that you control

- Lorem ipsum, dolor sit amet consectetur adipisicing elit. - Maiores impedit perferendis suscipit eaque, iste dolor - cupiditate blanditiis ratione. + Jan is a source-available, cross device, and privacy focused AI + engine and Desktop app that runs locally on your machine.

{features.map((feature) => ( @@ -64,7 +65,12 @@ export default function sectionTwo() {
Product screenshot - {/* */} +
- - + {/* + */}
); diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index 9f71a5da7..6fdd6da59 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -3,7 +3,7 @@ * and scoped locally. */ -.heroBanner { +/* .heroBanner { padding: 4rem 0; text-align: center; position: relative; @@ -20,4 +20,4 @@ display: flex; align-items: center; justify-content: center; -} +} */ diff --git a/docs/static/img/desktop-screenshot-dark.png b/docs/static/img/desktop-explore-models-dark.png similarity index 100% rename from docs/static/img/desktop-screenshot-dark.png rename to docs/static/img/desktop-explore-models-dark.png diff --git a/docs/static/img/desktop-screenshot.png b/docs/static/img/desktop-explore-models.png similarity index 100% rename from docs/static/img/desktop-screenshot.png rename to docs/static/img/desktop-explore-models.png diff --git a/docs/static/img/desktop-llm-chat.png b/docs/static/img/desktop-llm-chat.png new file mode 100644 index 000000000..b235dfc0a Binary files /dev/null and b/docs/static/img/desktop-llm-chat.png differ diff --git a/docs/static/img/desktop-model-settings.png b/docs/static/img/desktop-model-settings.png new file mode 100644 index 000000000..d22014991 Binary files /dev/null and b/docs/static/img/desktop-model-settings.png differ diff --git a/docs/static/img/jan-social-card.png b/docs/static/img/jan-social-card.png index f6e09f014..ed606e685 100644 Binary files a/docs/static/img/jan-social-card.png and b/docs/static/img/jan-social-card.png differ diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c49a..000000000 --- a/docs/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf08f..000000000 --- a/docs/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d339..000000000 --- a/docs/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/electron/core/plugin-manager/execution/Activation.js b/electron/core/plugin-manager/execution/Activation.js new file mode 100644 index 000000000..3381e428f --- /dev/null +++ b/electron/core/plugin-manager/execution/Activation.js @@ -0,0 +1,37 @@ +import { callExport } from "./import-manager.js" + +class Activation { + /** @type {string} Name of the registered plugin. */ + plugin + + /** @type {string} Name of the activation point that is registered to. */ + activationPoint + + /** @type {string} location of the file containing the activation function. */ + url + + /** @type {boolean} Whether the activation has been activated. */ + activated + + constructor(plugin, activationPoint, url) { + this.plugin = plugin + this.activationPoint = activationPoint + this.url = url + this.activated = false + } + + /** + * Trigger the activation function in the plugin once, + * providing the list of extension points or an object with the extension point's register, execute and executeSerial functions. + * @returns {boolean} Whether the activation has already been activated. + */ + async trigger() { + if (!this.activated) { + await callExport(this.url, this.activationPoint, this.plugin) + this.activated = true + } + return this.activated + } +} + +export default Activation diff --git a/electron/core/plugin-manager/execution/ExtensionPoint.js b/electron/core/plugin-manager/execution/ExtensionPoint.js new file mode 100644 index 000000000..b3caba012 --- /dev/null +++ b/electron/core/plugin-manager/execution/ExtensionPoint.js @@ -0,0 +1,145 @@ +/** + * @typedef {Object} Extension An extension registered to an extension point + * @property {string} name Unique name for the extension. + * @property {Object|Callback} response Object to be returned or function to be called by the extension point. + * @property {number} [priority] Order priority for execution used for executing in serial. + */ + +/** + * Represents a point in the consumer's code that can be extended by a plugin. + * The plugin can register a callback or object to the extension point. + * When the extension point is triggered, the provided function will then be called or object will be returned. + */ +class ExtensionPoint { + /** @type {string} Name of the extension point */ + name + + /** + * @type {Array.} The list of all extensions registered with this extension point. + * @private + */ + _extensions = [] + + /** + * @type {Array.} A list of functions to be executed when the list of extensions changes. + * @private + */ + #changeListeners = [] + + constructor(name) { + this.name = name + } + + /** + * Register new extension with this extension point. + * The registered response will be executed (if callback) or returned (if object) + * when the extension point is executed (see below). + * @param {string} name Unique name for the extension. + * @param {Object|Callback} response Object to be returned or function to be called by the extension point. + * @param {number} [priority] Order priority for execution used for executing in serial. + * @returns {void} + */ + register(name, response, priority = 0) { + const index = this._extensions.findIndex(p => p.priority > priority) + const newExt = { name, response, priority } + if (index > -1) { + this._extensions.splice(index, 0, newExt) + } else { + this._extensions.push(newExt) + } + + this.#emitChange() + } + + /** + * Remove an extension from the registry. It will no longer be part of the extension point execution. + * @param {RegExp } name Matcher for the name of the extension to remove. + * @returns {void} + */ + unregister(name) { + const index = this._extensions.findIndex(ext => ext.name.match(name)) + if (index > -1) this._extensions.splice(index, 1) + + this.#emitChange() + } + + /** + * Empty the registry of all extensions. + * @returns {void} + */ + clear() { + this._extensions = [] + this.#emitChange() + } + + /** + * Get a specific extension registered with the extension point + * @param {string} name Name of the extension to return + * @returns {Object|Callback|undefined} The response of the extension. If this is a function the function is returned, not its response. + */ + get(name) { + const ep = this._extensions.find(ext => ext.name === name) + return ep && ep.response + } + + /** + * Execute (if callback) and return or just return (if object) the response for each extension registered to this extension point. + * Any asynchronous responses will be executed in parallel and the returned array will contain a promise for each of these responses. + * @param {*} input Input to be provided as a parameter to each response if response is a callback. + * @returns {Array} List of responses from the extensions. + */ + execute(input) { + return this._extensions.map(p => { + if (typeof p.response === 'function') { + return p.response(input) + } else { + return p.response + } + }) + } + + /** + * Execute (if callback) and return the response, or push it to the array if the previous response is an array + * for each extension registered to this extension point in serial, + * feeding the result from the last response as input to the next. + * @param {*} input Input to be provided as a parameter to the 1st callback + * @returns {Promise.<*>} Result of the last extension that was called + */ + async executeSerial(input) { + return await this._extensions.reduce(async (throughput, p) => { + let tp = await throughput + if (typeof p.response === 'function') { + tp = await p.response(tp) + } else if (Array.isArray(tp)) { + tp.push(p.response) + } + return tp + }, input) + } + + /** + * Register a callback to be executed if the list of extensions changes. + * @param {string} name Name of the listener needed if it is to be removed. + * @param {Function} callback The callback function to trigger on a change. + */ + onRegister(name, callback) { + if (typeof callback === 'function') this.#changeListeners.push({ name, callback }) + } + + /** + * Unregister a callback from the extension list changes. + * @param {string} name The name of the listener to remove. + */ + offRegister(name) { + const index = this.#changeListeners.findIndex(l => l.name === name) + if (index > -1) this.#changeListeners.splice(index, 1) + } + + #emitChange() { + for (const l of this.#changeListeners) { + l.callback(this) + } + } +} + +export default ExtensionPoint \ No newline at end of file diff --git a/electron/core/plugin-manager/execution/ExtensionPoint.test.js b/electron/core/plugin-manager/execution/ExtensionPoint.test.js new file mode 100644 index 000000000..54d7b37ec --- /dev/null +++ b/electron/core/plugin-manager/execution/ExtensionPoint.test.js @@ -0,0 +1,116 @@ +import Ep from './ExtensionPoint' + +/** @type {Ep} */ +let ep +const changeListener = jest.fn() + +const objectRsp = { foo: 'bar' } +const funcRsp = arr => { + arr || (arr = []) + arr.push({ foo: 'baz' }) + return arr +} + +beforeEach(() => { + ep = new Ep('test-ep') + ep.register('test-ext-obj', objectRsp) + ep.register('test-ext-func', funcRsp, 10) + ep.onRegister('test', changeListener) +}) + + +it('should create a new extension point by providing a name', () => { + expect(ep.name).toEqual('test-ep') +}) + +it('should register extension with extension point', () => { + expect(ep._extensions).toContainEqual({ + name: 'test-ext-func', + response: funcRsp, + priority: 10 + }) +}) + +it('should register extension with a default priority of 0 if not provided', () => { + expect(ep._extensions).toContainEqual({ + name: 'test-ext-obj', + response: objectRsp, + priority: 0 + }) +}) + +it('should execute the change listeners on registering a new extension', () => { + changeListener.mockClear() + ep.register('test-change-listener', true) + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should unregister an extension with the provided name if it exists', () => { + ep.unregister('test-ext-obj') + + expect(ep._extensions).not.toContainEqual( + expect.objectContaining({ + name: 'test-ext-obj' + }) + ) +}) + +it('should not unregister any extensions if the provided name does not exist', () => { + ep.unregister('test-ext-invalid') + + expect(ep._extensions.length).toBe(2) +}) + +it('should execute the change listeners on unregistering an extension', () => { + changeListener.mockClear() + ep.unregister('test-ext-obj') + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should empty the registry of all extensions on clearing', () => { + ep.clear() + + expect(ep._extensions).toEqual([]) +}) + +it('should execute the change listeners on clearing extensions', () => { + changeListener.mockClear() + ep.clear() + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should return the relevant extension using the get method', () => { + const ext = ep.get('test-ext-obj') + + expect(ext).toEqual({ foo: 'bar' }) +}) + +it('should return the false using the get method if the extension does not exist', () => { + const ext = ep.get('test-ext-invalid') + + expect(ext).toBeUndefined() +}) + +it('should provide an array with all responses, including promises where necessary, using the execute method', async () => { + ep.register('test-ext-async', () => new Promise(resolve => setTimeout(resolve, 0, { foo: 'delayed' }))) + const arr = ep.execute([]) + + const res = await Promise.all(arr) + + expect(res).toContainEqual({ foo: 'bar' }) + expect(res).toContainEqual([{ foo: 'baz' }]) + expect(res).toContainEqual({ foo: 'delayed' }) + expect(res.length).toBe(3) +}) + +it('should provide an array including all responses in priority order, using the executeSerial method provided with an array', async () => { + const res = await ep.executeSerial([]) + + expect(res).toEqual([{ "foo": "bar" }, { "foo": "baz" }]) +}) + +it('should provide an array including the last response using the executeSerial method provided with something other than an array', async () => { + const res = await ep.executeSerial() + + expect(res).toEqual([{ "foo": "baz" }]) +}) diff --git a/electron/core/plugin-manager/execution/Plugin.js b/electron/core/plugin-manager/execution/Plugin.js new file mode 100644 index 000000000..5c6462aee --- /dev/null +++ b/electron/core/plugin-manager/execution/Plugin.js @@ -0,0 +1,35 @@ +import { callExport } from "./import-manager" + +/** + * A slimmed down representation of a plugin for the renderer. + */ +class Plugin { + /** @type {string} Name of the package. */ + name + + /** @type {string} The electron url where this plugin is located. */ + url + + /** @type {Array} List of activation points. */ + activationPoints + + /** @type {boolean} Whether this plugin should be activated when its activation points are triggered. */ + active + + constructor(name, url, activationPoints, active) { + this.name = name + this.url = url + this.activationPoints = activationPoints + this.active = active + } + + /** + * Trigger an exported callback on the plugin's main file. + * @param {string} exp exported callback to trigger. + */ + triggerExport(exp) { + callExport(this.url, exp, this.name) + } +} + +export default Plugin \ No newline at end of file diff --git a/electron/core/plugin-manager/execution/Plugin.test.js b/electron/core/plugin-manager/execution/Plugin.test.js new file mode 100644 index 000000000..7982decdc --- /dev/null +++ b/electron/core/plugin-manager/execution/Plugin.test.js @@ -0,0 +1,22 @@ +import { setImporter } from "./import-manager" +import Plugin from './Plugin' + +describe('triggerExport', () => { + it('should call the provided export on the plugin\'s main file', async () => { + // Set up mock importer with mock main plugin file + const mockExport = jest.fn() + const mockImporter = jest.fn(() => ({ + lifeCycleFn: mockExport + })) + setImporter(mockImporter) + + // Call triggerExport on new plugin + const plgUrl = 'main' + const plugin = new Plugin('test', plgUrl, ['ap1'], true) + await plugin.triggerExport('lifeCycleFn') + + // Check results + expect(mockImporter.mock.lastCall).toEqual([plgUrl]) + expect(mockExport.mock.calls.length).toBeTruthy() + }) +}) \ No newline at end of file diff --git a/electron/core/plugin-manager/execution/activation-manager.js b/electron/core/plugin-manager/execution/activation-manager.js new file mode 100644 index 000000000..01eeed2a2 --- /dev/null +++ b/electron/core/plugin-manager/execution/activation-manager.js @@ -0,0 +1,88 @@ +import Activation from "./Activation.js" + +/** + * This object contains a register of plugin registrations to an activation points, and the means to work with them. + * @namespace activationPoints + */ + +/** + * @constant {Array.} activationRegister + * @private + * Store of activations used by the consumer + */ +const activationRegister = [] + +/** + * Register a plugin with its activation points (as defined in its manifest). + * @param {Plugin} plugin plugin object as provided by the main process. + * @returns {void} + * @alias activationPoints.register + */ +export function register(plugin) { + if (!Array.isArray(plugin.activationPoints)) throw new Error( + `Plugin ${plugin.name || 'without name'} does not have any activation points set up in its manifest.` + ) + for (const ap of plugin.activationPoints) { + // Ensure plugin is not already registered to activation point + const duplicate = activationRegister.findIndex(act => + act.plugin === plugin.name && act.activationPoint === ap + ) + + // Create new activation and add it to the register + if (duplicate < 0) activationRegister.push(new Activation(plugin.name, ap, plugin.url)) + } +} + +/** + * Trigger all activations registered to the given activation point. See {@link Plugin}. + * This will call the function with the same name as the activation point on the path specified in the plugin. + * @param {string} activationPoint Name of the activation to trigger + * @returns {Promise.} Resolves to true when the activations are complete. + * @alias activationPoints.trigger + */ +export async function trigger(activationPoint) { + // Make sure all triggers are complete before returning + await Promise.all( + // Trigger each relevant activation point from the register and return an array of trigger promises + activationRegister.reduce((triggered, act) => { + if (act.activationPoint === activationPoint) { + triggered.push(act.trigger()) + } + return triggered + }, []) + ) + return true +} + +/** + * Remove a plugin from the activations register. + * @param {string} plugin Name of the plugin to remove. + * @returns {void} + * @alias activationPoints.remove + */ +export function remove(plugin) { + let i = activationRegister.length + while (i--) { + if (activationRegister[i].plugin === plugin) { + activationRegister.splice(i, 1) + } + } +} + +/** + * Remove all activations from the activation register. + * @returns {void} + * @alias activationPoints.clear + */ +export function clear() { + activationRegister.length = 0 +} + +/** + * Fetch all activations. + * @returns {Array.} Found extension points + * @alias activationPoints.get + */ +export function get() { + return [...activationRegister] +} \ No newline at end of file diff --git a/electron/core/plugin-manager/execution/activation-manager.test.js b/electron/core/plugin-manager/execution/activation-manager.test.js new file mode 100644 index 000000000..dd7ff9251 --- /dev/null +++ b/electron/core/plugin-manager/execution/activation-manager.test.js @@ -0,0 +1,307 @@ +import { setup } from './index' +import { register, trigger, remove, clear, get } from "./activation-manager"; +import { add } from './extension-manager' + +let mockPlugins = {} +setup({ + importer(plugin) { return mockPlugins[plugin] } +}) + +afterEach(() => { + clear() + mockPlugins = {} +}) + +describe('register', () => { + it('should add a new activation point to the register when a new, valid plugin is registered', + () => { + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + expect(get()).toEqual([ + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap2', + activated: false + } + ]) + } + ) + + it('should not add an activation point to the register when an existing, valid plugin is registered', + () => { + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap2', 'ap3'], + active: true + }) + + expect(get()).toEqual([ + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should throw an error when an invalid plugin is registered', + () => { + const noActivationPoints = () => register({ + name: 'test', + url: 'testPkg', + active: true + }) + + expect(noActivationPoints).toThrow(/does not have any activation points set up in its manifest/) + } + ) +}) + +describe('trigger', () => { + it('should trigger all and only the activations with for the given execution point on triggering an execution, using the defined importer', + async () => { + const triggered = [] + + mockPlugins.plugin1 = { + ap1() { triggered.push('plugin1-ap1') } + } + mockPlugins.plugin2 = { + ap2() { triggered.push('plugin2-ap2') } + } + mockPlugins.plugin3 = { + ap1() { triggered.push('plugin3-ap1') }, + ap2() { triggered.push('plugin3-ap2') } + } + + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'], + active: true + }) + register({ + name: 'plugin2', + url: 'plugin2', + activationPoints: ['ap2'], + active: true + }) + register({ + name: 'plugin3', + url: 'plugin3', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + await trigger('ap1') + + expect(triggered).toEqual(['plugin1-ap1', 'plugin3-ap1']) + } + ) + + it('should return an error if an activation point is triggered on a plugin that does not include it', + async () => { + mockPlugins.plugin1 = { + wrongAp() { } + } + + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await expect(() => trigger('ap1')).rejects.toThrow(/was triggered but does not exist on plugin/) + } + ) + + it('should provide the registered extension points to the triggered activation point if presetEPs is set to true in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + presetEPs: true, + }) + + let ap1Res + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + add('ep1') + add('ep2') + + await trigger('ap1') + + expect(ap1Res.ep1.constructor.name).toEqual('ExtensionPoint') + expect(ap1Res.ep2.constructor.name).toEqual('ExtensionPoint') + } + ) + + it('should allow registration, execution and serial execution of execution points when an activation point is triggered if presetEPs is set to false in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + }) + + let ap1Res + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await trigger('ap1') + + expect(typeof ap1Res.register).toBe('function') + expect(typeof ap1Res.execute).toBe('function') + expect(typeof ap1Res.executeSerial).toBe('function') + } + ) + + it('should not provide any reference to extension points during activation point triggering if presetEPs is set to null in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + presetEPs: null, + }) + + let ap1Res = true + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await trigger('ap1') + + expect(ap1Res).not.toBeDefined() + } + ) +}) + +describe('remove and clear', () => { + + beforeEach(() => { + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + register({ + name: 'plugin2', + url: 'plugin2', + activationPoints: ['ap2', 'ap3'], + active: true + }) + }) + it('should remove all and only the activations for the given plugin from the register when removing activations', + () => { + remove('plugin1') + + expect(get()).toEqual([ + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should not remove any activations from the register if no plugin name is provided', + () => { + remove() + + expect(get()).toEqual([ + { + plugin: 'plugin1', + url: 'plugin1', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'plugin1', + url: 'plugin1', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should remove all activations from the register when clearing the register', + () => { + clear() + + expect(get()).toEqual([]) + } + ) +}) diff --git a/electron/core/plugin-manager/execution/extension-manager.js b/electron/core/plugin-manager/execution/extension-manager.js new file mode 100644 index 000000000..48b2e893a --- /dev/null +++ b/electron/core/plugin-manager/execution/extension-manager.js @@ -0,0 +1,98 @@ +/** + * This object contains a register of {@link ExtensionPoint|extension points} and the means to work with them. + * @namespace extensionPoints + */ + +import ExtensionPoint from "./ExtensionPoint.js" + +/** + * @constant {Object.} extensionPoints + * @private + * Register of extension points created by the consumer + */ +const _extensionPoints = {} + +/** + * Create new extension point and add it to the registry. + * @param {string} name Name of the extension point. + * @returns {void} + * @alias extensionPoints.add + */ +export function add(name) { + _extensionPoints[name] = new ExtensionPoint(name) +} + +/** + * Remove an extension point from the registry. + * @param {string} name Name of the extension point + * @returns {void} + * @alias extensionPoints.remove + */ +export function remove(name) { + delete _extensionPoints[name] +} + +/** + * Create extension point if it does not exist and then register the given extension to it. + * @param {string} ep Name of the extension point. + * @param {string} extension Unique name for the extension. + * @param {Object|Callback} response Object to be returned or function to be called by the extension point. + * @param {number} [priority=0] Order priority for execution used for executing in serial. + * @returns {void} + * @alias extensionPoints.register + */ +export function register(ep, extension, response, priority) { + if (!_extensionPoints[ep]) add(ep) + if (_extensionPoints[ep].register) { + _extensionPoints[ep].register(extension, response, priority) + } +} + +/** + * Remove extensions matching regular expression from all extension points. + * @param {RegExp} name Matcher for the name of the extension to remove. + * @alias extensionPoints.unregisterAll + */ +export function unregisterAll(name) { + for (const ep in _extensionPoints) _extensionPoints[ep].unregister(name) +} + +/** + * Fetch extension point by name. or all extension points if no name is given. + * @param {string} [ep] Extension point to return + * @returns {Object. | ExtensionPoint} Found extension points + * @alias extensionPoints.get + */ +export function get(ep) { + return (ep ? _extensionPoints[ep] : { ..._extensionPoints }) +} + +/** + * Call all the extensions registered to an extension point synchronously. See execute on {@link ExtensionPoint}. + * Call this at the point in the base code where you want it to be extended. + * @param {string} name Name of the extension point to call + * @param {*} [input] Parameter to provide to the extensions if they are a function + * @returns {Array} Result of Promise.all or Promise.allSettled depending on exitOnError + * @alias extensionPoints.execute + */ +export function execute(name, input) { + if (!_extensionPoints[name] || !_extensionPoints[name].execute) throw new Error( + `The extension point "${name}" is not a valid extension point` + ) + return _extensionPoints[name].execute(input) +} + +/** + * Calls all the extensions registered to the extension point in serial. See executeSerial on {@link ExtensionPoint} + * Call this at the point in the base code where you want it to be extended. + * @param {string} name Name of the extension point to call + * @param {*} [input] Parameter to provide to the extensions if they are a function + * @returns {Promise.<*>} Result of the last extension that was called + * @alias extensionPoints.executeSerial + */ +export function executeSerial(name, input) { + if (!_extensionPoints[name] || !_extensionPoints[name].executeSerial) throw new Error( + `The extension point "${name}" is not a valid extension point` + ) + return _extensionPoints[name].executeSerial(input) +} diff --git a/electron/core/plugin-manager/execution/extension-manager.test.js b/electron/core/plugin-manager/execution/extension-manager.test.js new file mode 100644 index 000000000..dd934f872 --- /dev/null +++ b/electron/core/plugin-manager/execution/extension-manager.test.js @@ -0,0 +1,116 @@ +import { add, remove, register, get, execute, executeSerial, unregisterAll } from './extension-manager' +import ExtensionPoint from './ExtensionPoint' + +beforeEach(() => { + add('ep1') + add('ep2') +}) + +afterEach(() => { + remove('ep1') + remove('ep2') + remove('ep3') +}) + +describe('get', () => { + it('should return the extension point with the given name if it exists', () => { + expect(get('ep1')).toBeInstanceOf(ExtensionPoint) + }) + + it('should return all extension points if no name is provided', () => { + expect(get()).toEqual(expect.objectContaining({ ep1: expect.any(ExtensionPoint) })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) +}) + +describe('Add and remove', () => { + it('should add a new extension point with the given name using the add function', () => { + add('ep1') + + expect(get('ep1')).toBeInstanceOf(ExtensionPoint) + }) + + it('should remove only the extension point with the given name using the remove function', () => { + remove('ep1') + + expect(get()).not.toEqual(expect.objectContaining({ ep1: expect.anything() })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) + + it('should not remove any extension points if no name is provided using the remove function', () => { + remove() + + expect(get()).toEqual(expect.objectContaining({ ep1: expect.any(ExtensionPoint) })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) +}) + +describe('register', () => { + it('should register an extension to an existing extension point if the point has already been created', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(get('ep1')._extensions).toContainEqual(expect.objectContaining({ name: 'extension1' })) + }) + + it('should create an extension point and register an extension to it if the point has not yet been created', () => { + register('ep3', 'extension1', { foo: 'bar' }) + + expect(get('ep3')._extensions).toContainEqual(expect.objectContaining({ name: 'extension1' })) + }) +}) + +describe('unregisterAll', () => { + it('should unregister all extension points matching the give name regex', () => { + // Register example extensions + register('ep1', 'remove1', { foo: 'bar' }) + register('ep2', 'remove2', { foo: 'bar' }) + register('ep1', 'keep', { foo: 'bar' }) + + // Remove matching extensions + unregisterAll(/remove/) + + // Extract all registered extensions + const eps = Object.values(get()).map(ep => ep._extensions) + const extensions = eps.flat() + + // Test extracted extensions + expect(extensions).toContainEqual(expect.objectContaining({ name: 'keep' })) + expect(extensions).not.toContainEqual(expect.objectContaining({ name: 'ep1' })) + expect(extensions).not.toContainEqual(expect.objectContaining({ name: 'ep2' })) + }) +}) + +describe('execute', () => { + it('should execute the extensions registered to the named extension point with the provided input', () => { + const result = [] + register('ep1', 'extension1', input => result.push(input + 'bar')) + register('ep1', 'extension2', input => result.push(input + 'baz')) + + execute('ep1', 'foo') + + expect(result).toEqual(['foobar', 'foobaz']) + }) + + it('should throw an error if the named extension point does not exist', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(() => execute('ep3')).toThrow(/not a valid extension point/) + }) +}) + +describe('executeSerial', () => { + it('should execute the extensions in serial registered to the named extension point with the provided input', async () => { + register('ep1', 'extension1', input => input + 'bar') + register('ep1', 'extension2', input => input + 'baz') + + const result = await executeSerial('ep1', 'foo') + + expect(result).toEqual('foobarbaz') + }) + + it('should throw an error if the named extension point does not exist', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(() => executeSerial('ep3')).toThrow(/not a valid extension point/) + }) +}) diff --git a/electron/core/plugin-manager/execution/facade.js b/electron/core/plugin-manager/execution/facade.js new file mode 100644 index 000000000..d153e283c --- /dev/null +++ b/electron/core/plugin-manager/execution/facade.js @@ -0,0 +1,148 @@ +/** + * Helper functions to access the plugin management in the main process. + * Note that the facade needs to be imported separately as "pluggable-electron/facade" as described above. + * It is then available on the global window object as describe in the {@link https://www.electronjs.org/docs/api/context-bridge|Electron documentation} + * @namespace plugins + */ + +import Plugin from "./Plugin"; +import { register } from "./activation-manager"; + +/** + * @typedef {Object.} installOptions The {@link https://www.npmjs.com/package/pacote|pacote options} + * used to install the plugin. + * @param {string} specifier the NPM specifier that identifies the package. + * @param {boolean} [activate=true] Whether this plugin should be activated after installation. + */ + +/** + * Install a new plugin. + * @param {Array.} plugins A list of NPM specifiers, or installation configuration objects. + * @returns {Promise. | false>} plugin as defined by the main process. Has property cancelled set to true if installation was cancelled in the main process. + * @alias plugins.install + */ +export async function install(plugins) { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.install(plugins); + if (plgList.cancelled) return false; + return plgList.map((plg) => { + const plugin = new Plugin( + plg.name, + plg.url, + plg.activationPoints, + plg.active + ); + register(plugin); + return plugin; + }); +} + +/** + * Uninstall provided plugins + * @param {Array.} plugins List of names of plugins to uninstall. + * @param {boolean} reload Whether to reload all renderers after updating the plugins. + * @returns {Promise.} Whether uninstalling the plugins was successful. + * @alias plugins.uninstall + */ +export function uninstall(plugins, reload = true) { + if (typeof window === "undefined") { + return; + } + return window.pluggableElectronIpc.uninstall(plugins, reload); +} + +/** + * Fetch a list of all the active plugins. + * @returns {Promise.>} List of plugins as defined by the main process. + * @alias plugins.getActive + */ +export async function getActive() { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.getActive(); + return plgList.map( + (plugin) => + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ); +} + +/** + * Register all the active plugins. + * @returns {Promise.>} List of plugins as defined by the main process. + * @alias plugins.registerActive + */ +export async function registerActive() { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.getActive(); + plgList.forEach((plugin) => + register( + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ) + ); +} + +/** + * Update provided plugins to its latest version. + * @param {Array.} plugins List of plugins to update by name. + * @param {boolean} reload Whether to reload all renderers after updating the plugins. + * @returns {Promise.>} Updated plugin as defined by the main process. + * @alias plugins.update + */ +export async function update(plugins, reload = true) { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.update(plugins, reload); + return plgList.map( + (plugin) => + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ); +} + +/** + * Check if an update is available for provided plugins. + * @param {Array.} plugin List of plugin names to check for available updates. + * @returns {Object.} Object with plugins as keys and new version if update is available or false as values. + * @alias plugins.updatesAvailable + */ +export function updatesAvailable(plugin) { + if (typeof window === "undefined") { + return; + } + return window.pluggableElectronIpc.updatesAvailable(plugin); +} + +/** + * Toggle a plugin's active state. This determines if a plugin should be loaded in initialisation. + * @param {String} plugin Plugin to toggle. + * @param {boolean} active Whether plugin should be activated (true) or deactivated (false). + * @returns {Promise.} Updated plugin as defined by the main process. + * @alias plugins.toggleActive + */ +export async function toggleActive(plugin, active) { + if (typeof window === "undefined") { + return; + } + const plg = await window.pluggableElectronIpc.toggleActive(plugin, active); + return new Plugin(plg.name, plg.url, plg.activationPoints, plg.active); +} diff --git a/electron/core/plugin-manager/execution/import-manager.js b/electron/core/plugin-manager/execution/import-manager.js new file mode 100644 index 000000000..0d25297a2 --- /dev/null +++ b/electron/core/plugin-manager/execution/import-manager.js @@ -0,0 +1,77 @@ +import { + get as getEPs, + register, + execute, + executeSerial, +} from "./extension-manager.js"; +/** + * Used to import a plugin entry point. + * Ensure your bundler does no try to resolve this import as the plugins are not known at build time. + * @callback importer + * @param {string} entryPoint File to be imported. + * @returns {module} The module containing the entry point function. + */ + +/** + * @private + * @type {importer} + */ +export let importer; + +/** + * @private + * Set the plugin importer function. + * @param {importer} callback Callback to import plugins. + */ +export function setImporter(callback) { + importer = callback; +} + +/** + * @private + * @type {Boolean|null} + */ +export let presetEPs; + +/** + * @private + * Define how extension points are accessed. + * @param {Boolean|null} peps Whether extension points are predefined. + */ +export function definePresetEps(peps) { + presetEPs = peps === null || peps === true ? peps : false; +} + +/** + * @private + * Call exported function on imported module. + * @param {string} url @see Activation + * @param {string} exp Export to call + * @param {string} [plugin] @see Activation + */ +export async function callExport(url, exp, plugin) { + if (!importer) throw new Error("Importer callback has not been set"); + + const main = await importer(url); + if (!main || typeof main[exp] !== "function") { + throw new Error( + `Activation point "${exp}" was triggered but does not exist on ${ + plugin ? "plugin " + plugin : "unknown plugin" + }` + ); + } + const activate = main[exp]; + switch (presetEPs) { + case true: + activate(getEPs()); + break; + + case null: + activate(); + break; + + default: + activate({ register, execute, executeSerial }); + break; + } +} diff --git a/electron/core/plugin-manager/execution/index.js b/electron/core/plugin-manager/execution/index.js new file mode 100644 index 000000000..83fe0ce17 --- /dev/null +++ b/electron/core/plugin-manager/execution/index.js @@ -0,0 +1,24 @@ +import { definePresetEps, setImporter } from "./import-manager.js"; + +export * as extensionPoints from "./extension-manager.js"; +export * as activationPoints from "./activation-manager.js"; +export * as plugins from "./facade.js"; +export { default as ExtensionPoint } from "./ExtensionPoint.js"; + +if (typeof window !== "undefined" && !window.pluggableElectronIpc) + console.warn( + "Facade is not registered in preload. Facade functions will throw an error if used." + ); + +/** + * Set the renderer options for Pluggable Electron. Should be called before any other Pluggable Electron function in the renderer + * @param {Object} options + * @param {importer} options.importer The callback function used to import the plugin entry points. + * @param {Boolean|null} [options.presetEPs=false] Whether the Extension Points have been predefined (true), + * can be created on the fly(false) or should not be provided through the input at all (null). + * @returns {void} + */ +export function setup(options) { + setImporter(options.importer); + definePresetEps(options.presetEPs); +} diff --git a/electron/core/plugin-manager/execution/index.test.js b/electron/core/plugin-manager/execution/index.test.js new file mode 100644 index 000000000..75f8e5933 --- /dev/null +++ b/electron/core/plugin-manager/execution/index.test.js @@ -0,0 +1,28 @@ +import { setup } from "." +import { importer, presetEPs } from "./import-manager" + +describe('setup', () => { + const mockImporter = jest.fn() + + it('should store the importer function', () => { + setup({ importer: mockImporter }) + + expect(importer).toBe(mockImporter) + }) + + it('should set presetEPS to false if not provided', () => { + expect(presetEPs).toBe(false) + }) + + it('should set presetEPS to the provided value if it is true', () => { + setup({ presetEPs: true }) + + expect(presetEPs).toBe(true) + }) + + it('should set presetEPS to the provided value if it is null', () => { + setup({ presetEPs: null }) + + expect(presetEPs).toBe(null) + }) +}) \ No newline at end of file diff --git a/electron/core/plugin-manager/facade/index.js b/electron/core/plugin-manager/facade/index.js new file mode 100644 index 000000000..2257fbd4d --- /dev/null +++ b/electron/core/plugin-manager/facade/index.js @@ -0,0 +1,30 @@ +import { ipcRenderer, contextBridge } from "electron" + +export default function useFacade() { + const interfaces = { + install(plugins) { + return ipcRenderer.invoke('pluggable:install', plugins) + }, + uninstall(plugins, reload) { + return ipcRenderer.invoke('pluggable:uninstall', plugins, reload) + }, + getActive() { + return ipcRenderer.invoke('pluggable:getActivePlugins') + }, + update(plugins, reload) { + return ipcRenderer.invoke('pluggable:update', plugins, reload) + }, + updatesAvailable(plugin) { + return ipcRenderer.invoke('pluggable:updatesAvailable', plugin) + }, + toggleActive(plugin, active) { + return ipcRenderer.invoke('pluggable:togglePluginActive', plugin, active) + }, + } + + if (contextBridge) { + contextBridge.exposeInMainWorld('pluggableElectronIpc', interfaces) + } + + return interfaces +} diff --git a/electron/core/plugin-manager/facade/index.test.js b/electron/core/plugin-manager/facade/index.test.js new file mode 100644 index 000000000..0e4bae62d --- /dev/null +++ b/electron/core/plugin-manager/facade/index.test.js @@ -0,0 +1,196 @@ +jest.mock('electron', () => { + const handlers = {} + + return { + ipcMain: { + handle(channel, callback) { + handlers[channel] = callback + } + }, + ipcRenderer: { + invoke(channel, ...args) { + return Promise.resolve(handlers[channel].call(undefined, 'event', ...args)) + } + }, + webContents: { + getAllWebContents: jest.fn(() => []) + }, + contextBridge: { + exposeInMainWorld(key, val) { + global.window = { [key]: val } + } + } + } +}) + +jest.mock('../pluginMgr/store', () => { + const setActive = jest.fn(() => true) + const uninstall = jest.fn() + const update = jest.fn(() => true) + const isUpdateAvailable = jest.fn(() => false) + + class Plugin { + constructor(name) { + this.name = name + this.activationPoints = ['test'] + } + setActive = setActive + uninstall = uninstall + update = update + isUpdateAvailable = isUpdateAvailable + } + + return { + getPlugin: jest.fn(name => new Plugin(name)), + getActivePlugins: jest.fn(() => [new Plugin('test')]), + installPlugins: jest.fn(async plugins => plugins.map(name => new Plugin(name))), + removePlugin: jest.fn() + } +}) + +const { rmSync } = require('fs') +const { webContents } = require('electron') +const useFacade = require('./index') +const { getActive, install, toggleActive, uninstall, update, updatesAvailable, registerActive } = require('../execution/facade') +const { setPluginsPath, setConfirmInstall } = require('../pluginMgr/globals') +const router = require('../pluginMgr/router') +const { getPlugin, getActivePlugins, removePlugin } = require('../pluginMgr/store') +const { get: getActivations } = require('../execution/activation-manager') + +const pluginsPath = './testPlugins' +const confirmInstall = jest.fn(() => true) + +beforeAll(async () => { + setPluginsPath(pluginsPath) + router() + useFacade() +}) + +afterAll(() => { + rmSync(pluginsPath, { recursive: true }) +}) + +describe('install', () => { + it('should return cancelled state if the confirmPlugin callback returns falsy', async () => { + setConfirmInstall(() => false) + const plugins = await install(['test-install']) + expect(plugins).toEqual(false) + }) + + it('should perform a security check of the install using confirmInstall if facade is used', async () => { + setConfirmInstall(confirmInstall) + await install(['test-install']) + expect(confirmInstall.mock.calls.length).toBeTruthy() + }) + + it('should register all installed plugins', async () => { + const pluginName = 'test-install' + await install([pluginName]) + expect(getActivations()).toContainEqual(expect.objectContaining({ + plugin: pluginName + })) + }) + + it('should return a list of plugins', async () => { + setConfirmInstall(confirmInstall) + const pluginName = 'test-install' + const plugins = await install([pluginName]) + expect(plugins).toEqual([expect.objectContaining({ name: pluginName })]) + }) +}) + +describe('uninstall', () => { + it('should uninstall all plugins with the provided name, remove it from the store and refresh all renderers', async () => { + // Reset mock functions + const mockUninstall = getPlugin().uninstall + mockUninstall.mockClear() + removePlugin.mockClear() + webContents.getAllWebContents.mockClear() + getPlugin.mockClear() + + // Uninstall plugins + const specs = ['test-uninstall-1', 'test-uninstall-2'] + await uninstall(specs) + + // Test result + expect(getPlugin.mock.calls).toEqual(specs.map(spec => [spec])) + expect(mockUninstall.mock.calls.length).toBeTruthy() + expect(removePlugin.mock.calls.length).toBeTruthy() + expect(webContents.getAllWebContents.mock.calls.length).toBeTruthy() + }) +}) + +describe('getActive', () => { + it('should return all active plugins', async () => { + getActivePlugins.mockClear() + await getActive() + expect(getActivePlugins.mock.calls.length).toBeTruthy() + }) +}) + +describe('registerActive', () => { + it('should register all active plugins', async () => { + await registerActive() + expect(getActivations()).toContainEqual(expect.objectContaining({ + plugin: 'test' + })) + }) +}) + +describe('update', () => { + const specs = ['test-uninstall-1', 'test-uninstall-2'] + const mockUpdate = getPlugin().update + + beforeAll(async () => { + // Reset mock functions + mockUpdate.mockClear() + webContents.getAllWebContents.mockClear() + getPlugin.mockClear() + + // Update plugins + await update(specs) + }) + + it('should call the update function on all provided plugins', async () => { + // Check result + expect(getPlugin.mock.calls).toEqual(specs.map(spec => [spec])) + expect(mockUpdate.mock.calls.length).toBe(2) + }) + + it('should reload the renderers if reload is true', () => { + expect(webContents.getAllWebContents.mock.calls.length).toBeTruthy() + }) + + it('should not reload the renderer if reload is false', async () => { + webContents.getAllWebContents.mockClear() + await update(['test-uninstall'], false) + expect(webContents.getAllWebContents.mock.calls.length).toBeFalsy() + }) +}) + +describe('toggleActive', () => { + it('call the setActive function on the plugin with the provided name, with the provided active state', async () => { + await toggleActive('test-toggleActive', true) + expect(getPlugin.mock.lastCall).toEqual(['test-toggleActive']) + const mockSetActive = getPlugin().setActive + expect(mockSetActive.mock.lastCall).toEqual([true]) + }) +}) + +describe('updatesAvailable', () => { + it('should return the new versions for the provided plugins if provided', async () => { + // Reset mock functions + const mockIsUpdAvailable = getPlugin().isUpdateAvailable + mockIsUpdAvailable.mockClear() + getPlugin.mockClear() + + // Get available updates + const testPlugin1 = 'test-plugin-1' + const testPlugin2 = 'test-update-2' + const updates = await updatesAvailable([testPlugin1, testPlugin2]) + expect(updates).toEqual({ + [testPlugin1]: false, + [testPlugin2]: false, + }) + }) +}) diff --git a/electron/core/plugin-manager/pluginMgr/Plugin.js b/electron/core/plugin-manager/pluginMgr/Plugin.js new file mode 100644 index 000000000..3e9ca609f --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/Plugin.js @@ -0,0 +1,189 @@ +import { rmdir } from "fs/promises" +import { resolve, join } from "path" +import { manifest, extract } from "pacote" +import Arborist from '@npmcli/arborist' + +import { pluginsPath } from "./globals" + +/** + * An NPM package that can be used as a Pluggable Electron plugin. + * Used to hold all the information and functions necessary to handle the plugin lifecycle. + */ +class Plugin { + /** + * @property {string} origin Original specification provided to fetch the package. + * @property {Object} installOptions Options provided to pacote when fetching the manifest. + * @property {name} name The name of the plugin as defined in the manifest. + * @property {string} url Electron URL where the package can be accessed. + * @property {string} version Version of the package as defined in the manifest. + * @property {Array} activationPoints List of {@link ./Execution-API#activationPoints|activation points}. + * @property {string} main The entry point as defined in the main entry of the manifest. + */ + + /** @private */ + _active = false + + /** + * @private + * @property {Object.} #listeners A list of callbacks to be executed when the Plugin is updated. + */ + #listeners = {} + + /** + * Set installOptions with defaults for options that have not been provided. + * @param {string} [origin] Original specification provided to fetch the package. + * @param {Object} [options] Options provided to pacote when fetching the manifest. + */ + constructor(origin, options = {}) { + const defaultOpts = { + version: false, + fullMetadata: false, + Arborist + } + + this.origin = origin + this.installOptions = { ...defaultOpts, ...options } + } + + /** + * Package name with version number. + * @type {string} + */ + get specifier() { + return this.origin + (this.installOptions.version ? '@' + this.installOptions.version : '') + } + + /** + * Whether the plugin should be registered with its activation points. + * @type {boolean} + */ + get active() { + return this._active + } + + /** + * Set Package details based on it's manifest + * @returns {Promise.} Resolves to true when the action completed + */ + async #getManifest() { + // Get the package's manifest (package.json object) + try { + const mnf = await manifest(this.specifier, this.installOptions) + + // set the Package properties based on the it's manifest + this.name = mnf.name + this.version = mnf.version + this.activationPoints = mnf.activationPoints || null + this.main = mnf.main + + } catch (error) { + throw new Error(`Package ${this.origin} does not contain a valid manifest: ${error}`) + } + + return true + } + + /** + * Extract plugin to plugins folder. + * @returns {Promise.} This plugin + * @private + */ + async _install() { + try { + // import the manifest details + await this.#getManifest() + + // Install the package in a child folder of the given folder + await extract(this.specifier, join(pluginsPath, this.name), this.installOptions) + + if (!Array.isArray(this.activationPoints)) + throw new Error('The plugin does not contain any activation points') + + // Set the url using the custom plugins protocol + this.url = `plugin://${this.name}/${this.main}` + + this.#emitUpdate() + + } catch (err) { + // Ensure the plugin is not stored and the folder is removed if the installation fails + this.setActive(false) + throw err + } + + return [this] + } + + /** + * Subscribe to updates of this plugin + * @param {string} name name of the callback to register + * @param {callback} cb The function to execute on update + */ + subscribe(name, cb) { + this.#listeners[name] = cb + } + + /** + * Remove subscription + * @param {string} name name of the callback to remove + */ + unsubscribe(name) { + delete this.#listeners[name] + } + + /** + * Execute listeners + */ + #emitUpdate() { + for (const cb in this.#listeners) { + this.#listeners[cb].call(null, this) + } + } + + /** + * Check for updates and install if available. + * @param {string} version The version to update to. + * @returns {boolean} Whether an update was performed. + */ + async update(version = false) { + if (this.isUpdateAvailable()) { + this.installOptions.version = version + await this._install(false) + return true + } + + return false + } + + /** + * Check if a new version of the plugin is available at the origin. + * @returns the latest available version if a new version is available or false if not. + */ + async isUpdateAvailable() { + const mnf = await manifest(this.origin) + return mnf.version !== this.version ? mnf.version : false + } + + /** + * Remove plugin and refresh renderers. + * @returns {Promise} + */ + async uninstall() { + const plgPath = resolve(pluginsPath, this.name) + await rmdir(plgPath, { recursive: true }) + + this.#emitUpdate() + } + + /** + * Set a plugin's active state. This determines if a plugin should be loaded on initialisation. + * @param {boolean} active State to set _active to + * @returns {Plugin} This plugin + */ + setActive(active) { + this._active = active + this.#emitUpdate() + return this + } +} + +export default Plugin diff --git a/electron/core/plugin-manager/pluginMgr/Plugin.test.js b/electron/core/plugin-manager/pluginMgr/Plugin.test.js new file mode 100644 index 000000000..c0326bd06 --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/Plugin.test.js @@ -0,0 +1,212 @@ +import { init } from "." +import { join } from 'path' +import Plugin from "./Plugin" +import { mkdirSync, writeFileSync, existsSync, readFileSync, rmSync } from "fs" + +const pluginsDir = './testPlugins' +const testPluginDir = './testPluginSrc' +const testPluginName = 'test-plugin' +const manifest = join(testPluginDir, 'package.json') +const main = 'index' + +/** @type Plugin */ +let plugin + +beforeAll(() => { + init({ + confirmInstall: () => true, + pluginsPath: pluginsDir, + }) + + mkdirSync(testPluginDir) + + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + main, + }), 'utf8') + + plugin = new Plugin(testPluginDir) +}) + +afterAll(() => { + rmSync(pluginsDir, { recursive: true }) + rmSync(testPluginDir, { recursive: true }) +}) + + +describe('subscribe', () => { + let res = false + it('should register the provided callback', () => { + plugin.subscribe('test', () => res = true) + plugin.setActive(true) + + expect(res).toBeTruthy() + }) +}) + +describe('unsubscribe', () => { + it(`should remove the provided callback from the register + after which it should not be executed anymore when the plugin is updated`, () => { + let res = false + plugin.subscribe('test', () => res = true) + plugin.unsubscribe('test') + plugin.setActive(true) + + expect(res).toBeFalsy() + }) +}) + +describe('install', () => { + beforeAll(async () => { + await plugin._install() + }) + + it('should store all the relevant manifest values on the plugin', async () => { + expect(plugin).toMatchObject({ + origin: testPluginDir, + installOptions: { + version: false, + fullMetadata: false, + }, + name: testPluginName, + url: `plugin://${testPluginName}/${main}`, + activationPoints: [] + }) + }) + + it('should create a folder for the plugin if it does not yet exist and copy the plugin files to it', () => { + expect(existsSync(join(pluginsDir, testPluginName))).toBeTruthy() + }) + + it('should replace the existing plugin files in the plugin folder if it already exist', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + main: 'updated', + }), 'utf8') + + await plugin._install() + + const savedPkg = JSON.parse(readFileSync(join(pluginsDir, testPluginName, 'package.json'))) + + expect(savedPkg.main).toBe('updated') + }) + + it('should throw an error and the plugin should be set to inactive if no manifest could be found', async () => { + rmSync(join(testPluginDir, 'package.json')) + + await expect(() => plugin._install()).rejects.toThrow(/does not contain a valid manifest/) + }) + + it('should throw an error and the plugin should be set to inactive if plugin does not contain any activation points', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + main, + }), 'utf8') + + await expect(() => plugin._install()).rejects.toThrow('The plugin does not contain any activation points') + expect(plugin.active).toBe(false) + }) +}) + +describe('update', () => { + let updatedPlugin + let subscription = false + let beforeUpd + + beforeAll(async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.1', + main, + }), 'utf8') + + await plugin._install() + + plugin.subscribe('test', () => subscription = true) + beforeUpd = Object.assign({}, plugin) + + await plugin.update() + }) + + it('should not do anything if no version update is available', () => { + expect(beforeUpd).toMatchObject(plugin) + }) + + it('should update the plugin files to the latest version if there is a new version available for the plugin', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.2', + main, + }), 'utf8') + + await plugin.update() + + expect(plugin).toMatchObject({ + origin: testPluginDir, + installOptions: { + version: false, + fullMetadata: false, + }, + name: testPluginName, + version: '0.0.2', + url: `plugin://${testPluginName}/${main}`, + activationPoints: [] + }) + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + expect(subscription).toBeTruthy() + }) +}) + +describe('isUpdateAvailable', () => { + it('should return false if no new version is available', async () => { + await expect(plugin.isUpdateAvailable()).resolves.toBe(false) + }) + + it('should return the latest version number if a new version is available', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.3', + main, + }), 'utf8') + + await expect(plugin.isUpdateAvailable()).resolves.toBe('0.0.3') + }) +}) + +describe('setActive', () => { + it('should set the plugin to be active', () => { + plugin.setActive(true) + expect(plugin.active).toBeTruthy() + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + let res = false + plugin.subscribe('test', () => res = true) + plugin.setActive(true) + + expect(res).toBeTruthy() + }) +}) + +describe('uninstall', () => { + let subscription = false + beforeAll(async () => { + plugin.subscribe('test', () => subscription = true) + await plugin.uninstall() + }) + + it('should remove the installed plugin from the plugins folder', () => { + expect(existsSync(join(pluginsDir, testPluginName))).toBe(false) + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + expect(subscription).toBeTruthy() + }) +}) diff --git a/electron/core/plugin-manager/pluginMgr/globals.js b/electron/core/plugin-manager/pluginMgr/globals.js new file mode 100644 index 000000000..a0fc3718d --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/globals.js @@ -0,0 +1,57 @@ +import { existsSync, mkdirSync, writeFileSync } from "fs" +import { join, resolve } from "path" + +export let pluginsPath = null + +/** + * @private + * Set path to plugins directory and create the directory if it does not exist. + * @param {string} plgPath path to plugins directory + */ +export function setPluginsPath(plgPath) { + // Create folder if it does not exist + let plgDir + try { + plgDir = resolve(plgPath) + if (plgDir.length < 2) throw new Error() + + if (!existsSync(plgDir)) mkdirSync(plgDir) + + const pluginsJson = join(plgDir, 'plugins.json') + if (!existsSync(pluginsJson)) writeFileSync(pluginsJson, '{}', 'utf8') + + pluginsPath = plgDir + + } catch (error) { + throw new Error('Invalid path provided to the plugins folder') + } + +} + +/** +* @private + * Get the path to the plugins.json file. + * @returns location of plugins.json + */ +export function getPluginsFile() { return join(pluginsPath, 'plugins.json') } + + +export let confirmInstall = function () { + return new Error( + 'The facade.confirmInstall callback needs to be set in when initializing Pluggable Electron in the main process.' + ) +} + +/** + * @private + * Set callback to use as confirmInstall. + * @param {confirmInstall} cb Callback + */ +export function setConfirmInstall(cb) { confirmInstall = cb } + +/** + * This function is executed when plugins are installed to verify that the user indeed wants to install the plugin. + * @callback confirmInstall + * @param {Array.} plg The specifiers used to locate the packages (from NPM or local file) + * @returns {Promise} Whether to proceed with the plugin installation + */ diff --git a/electron/core/plugin-manager/pluginMgr/index.js b/electron/core/plugin-manager/pluginMgr/index.js new file mode 100644 index 000000000..ae7bff759 --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/index.js @@ -0,0 +1,123 @@ +import { readFileSync } from "fs" +import { protocol } from 'electron' +import { normalize } from "path" + +import Plugin from "./Plugin" +import { getAllPlugins, removePlugin, persistPlugins, installPlugins, getPlugin, getActivePlugins, addPlugin } from "./store" +import { pluginsPath as storedPluginsPath, setPluginsPath, getPluginsFile, setConfirmInstall } from './globals' +import router from "./router" + +/** + * Sets up the required communication between the main and renderer processes. + * Additionally sets the plugins up using {@link usePlugins} if a pluginsPath is provided. + * @param {Object} options configuration for setting up the renderer facade. + * @param {confirmInstall} [options.confirmInstall] Function to validate that a plugin should be installed. + * @param {Boolean} [options.useFacade=true] Whether to make a facade to the plugins available in the renderer. + * @param {string} [options.pluginsPath] Optional path to the plugins folder. + * @returns {pluginManager|Object} A set of functions used to manage the plugin lifecycle if usePlugins is provided. + * @function + */ +export function init(options) { + if (!Object.prototype.hasOwnProperty.call(options, 'useFacade') || options.useFacade) { + // Store the confirmInstall function + setConfirmInstall(options.confirmInstall) + // Enable IPC to be used by the facade + router() + } + + // Create plugins protocol to serve plugins to renderer + registerPluginProtocol() + + // perform full setup if pluginsPath is provided + if (options.pluginsPath) { + return usePlugins(options.pluginsPath) + } + + return {} + +} + +/** + * Create plugins protocol to provide plugins to renderer + * @private + * @returns {boolean} Whether the protocol registration was successful + */ +function registerPluginProtocol() { + return protocol.registerFileProtocol('plugin', (request, callback) => { + const entry = request.url.substr(8) + const url = normalize(storedPluginsPath + entry) + callback({ path: url }) + }) +} + +/** + * Set Pluggable Electron up to run from the pluginPath folder if it is provided and + * load plugins persisted in that folder. + * @param {string} pluginsPath Path to the plugins folder. Required if not yet set up. + * @returns {pluginManager} A set of functions used to manage the plugin lifecycle. + */ +export function usePlugins(pluginsPath) { + if (!pluginsPath) throw Error('A path to the plugins folder is required to use Pluggable Electron') + // Store the path to the plugins folder + setPluginsPath(pluginsPath) + + // Remove any registered plugins + for (const plugin of getAllPlugins()) { + removePlugin(plugin.name, false) + } + + // Read plugin list from plugins folder + const plugins = JSON.parse(readFileSync(getPluginsFile())) + try { + // Create and store a Plugin instance for each plugin in list + for (const p in plugins) { + loadPlugin(plugins[p]) + } + persistPlugins() + + } catch (error) { + // Throw meaningful error if plugin loading fails + throw new Error('Could not successfully rebuild list of installed plugins.\n' + + error + + '\nPlease check the plugins.json file in the plugins folder.') + } + + // Return the plugin lifecycle functions + return getStore() +} + +/** + * Check the given plugin object. If it is marked for uninstalling, the plugin files are removed. + * Otherwise a Plugin instance for the provided object is created and added to the store. + * @private + * @param {Object} plg Plugin info + */ +function loadPlugin(plg) { + // Create new plugin, populate it with plg details and save it to the store + const plugin = new Plugin() + + for (const key in plg) { + plugin[key] = plg[key] + } + + addPlugin(plugin, false) + plugin.subscribe('pe-persist', persistPlugins) +} + +/** + * Returns the publicly available store functions. + * @returns {pluginManager} A set of functions used to manage the plugin lifecycle. + */ +export function getStore() { + if (!storedPluginsPath) { + throw new Error('The plugin path has not yet been set up. Please run usePlugins before accessing the store') + } + + return { + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + } +} diff --git a/electron/core/plugin-manager/pluginMgr/index.test.js b/electron/core/plugin-manager/pluginMgr/index.test.js new file mode 100644 index 000000000..37055db62 --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/index.test.js @@ -0,0 +1,150 @@ +import { usePlugins, getStore, init } from './index' +import { installPlugins, getPlugin, getAllPlugins, getActivePlugins, addPlugin, removePlugin } from './store' +import Plugin from './Plugin' +import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs' +import { join } from 'path' +import { protocol } from 'electron' + +// Set up variables for test folders and test plugins. +const pluginDir = './testPlugins' +const registeredPluginName = 'registered-plugin' +const demoPlugin = { + origin: ".\\demo-plugin\\demo-plugin-1.5.0.tgz", + installOptions: { + version: false, + fullMetadata: false + }, + name: "demoPlugin", + version: "1.5.0", + activationPoints: [ + "init" + ], + main: "index.js", + _active: true, + url: "plugin://demo-plugin/index.js" +} + +describe('before setting a plugin path', () => { + describe('getStore', () => { + it('should throw an error if called without a plugin path set', () => { + expect(() => getStore()).toThrowError('The plugin path has not yet been set up. Please run usePlugins before accessing the store') + }) + }) + + describe('usePlugins', () => { + it('should throw an error if called without a plugin path whilst no plugin path is set', () => { + expect(() => usePlugins()).toThrowError('A path to the plugins folder is required to use Pluggable Electron') + }) + + it('should throw an error if called with an invalid plugin path', () => { + expect(() => usePlugins('http://notsupported')).toThrowError('Invalid path provided to the plugins folder') + }) + + it('should create the plugin path if it does not yet exist', () => { + // Execute usePlugins with a folder that does not exist + const newPluginDir = './test-new-plugins' + usePlugins(newPluginDir) + expect(existsSync(newPluginDir)).toBe(true) + + // Remove created folder to clean up + rmSync(newPluginDir, { recursive: true }) + }) + }) +}) + +describe('after setting a plugin path', () => { + let pm + + beforeAll(() => { + // Create folders to contain plugins + mkdirSync(pluginDir) + + // Create initial + writeFileSync(join(pluginDir, 'plugins.json'), JSON.stringify({ demoPlugin }), 'utf8') + + // Register a plugin before using plugins + const registeredPLugin = new Plugin(registeredPluginName) + registeredPLugin.name = registeredPluginName + addPlugin(registeredPLugin, false) + + // Load plugins + pm = usePlugins(pluginDir) + }) + + afterAll(() => { + rmSync(pluginDir, { recursive: true }) + }) + + describe('getStore', () => { + it('should return the plugin lifecycle functions if no plugin path is provided', () => { + expect(getStore()).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) + }) + + describe('usePlugins', () => { + it('should return the plugin lifecycle functions if a plugin path is provided', () => { + expect(pm).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) + + it('should load the plugins defined in plugins.json in the provided plugins folder if a plugin path is provided', () => { + expect(getPlugin('demoPlugin')).toEqual(demoPlugin) + }) + + it('should unregister any registered plugins before registering the new ones if a plugin path is provided', () => { + expect(() => getPlugin(registeredPluginName)).toThrowError(`Plugin ${registeredPluginName} does not exist`) + }) + }) +}) + +describe('init', () => { + // Enabling the facade and registering the confirm install function is tested with the router. + let pm + + beforeAll(() => { + // Create test plugins folder + mkdirSync(pluginDir) + + // Initialize Pluggable Electron without a plugin folder + pm = init({ confirmInstall: () => true }) + }) + + afterAll(() => { + // Remove test plugins folder + rmSync(pluginDir, { recursive: true }) + }) + + it('should make the plugin files available through the plugin protocol', async () => { + expect(protocol.isProtocolRegistered('plugin')).toBeTruthy() + }) + + it('should return an empty object if no plugin path is provided', () => { + expect(pm).toEqual({}) + }) + + it('should return the plugin lifecycle functions if a plugin path is provided', () => { + pm = init({ + confirmInstall: () => true, + pluginsPath: pluginDir, + }) + + expect(pm).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) +}) \ No newline at end of file diff --git a/electron/core/plugin-manager/pluginMgr/router.js b/electron/core/plugin-manager/pluginMgr/router.js new file mode 100644 index 000000000..17e5ba2f5 --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/router.js @@ -0,0 +1,91 @@ +import { ipcMain, webContents } from "electron" + +import { getPlugin, getActivePlugins, installPlugins, removePlugin, getAllPlugins } from "./store" +import { pluginsPath, confirmInstall } from './globals' + +// Throw an error if pluginsPath has not yet been provided by usePlugins. +const checkPluginsPath = () => { + if (!pluginsPath) throw Error('Path to plugins folder has not yet been set up.') +} +let active = false +/** + * Provide the renderer process access to the plugins. + **/ +export default function () { + if (active) return + // Register IPC route to install a plugin + ipcMain.handle('pluggable:install', async (e, plugins) => { + checkPluginsPath() + + // Validate install request from backend for security. + const specs = plugins.map(plg => typeof plg === 'object' ? plg.specifier : plg) + const conf = await confirmInstall(specs) + if (!conf) return { cancelled: true } + + // Install and activate all provided plugins + const installed = await installPlugins(plugins) + return JSON.parse(JSON.stringify(installed)) + }) + + // Register IPC route to uninstall a plugin + ipcMain.handle('pluggable:uninstall', async (e, plugins, reload) => { + checkPluginsPath() + + // Uninstall all provided plugins + for (const plg of plugins) { + const plugin = getPlugin(plg) + await plugin.uninstall() + removePlugin(plugin.name) + } + + // Reload all renderer pages if needed + reload && webContents.getAllWebContents().forEach(wc => wc.reload()) + return true + }) + + // Register IPC route to update a plugin + ipcMain.handle('pluggable:update', (e, plugins, reload) => { + checkPluginsPath() + + // Update all provided plugins + let updated = [] + for (const plg of plugins) { + const plugin = getPlugin(plg) + const res = plugin.update() + if (res) updated.push(plugin) + } + + // Reload all renderer pages if needed + if (updated.length && reload) webContents.getAllWebContents().forEach(wc => wc.reload()) + + return JSON.parse(JSON.stringify(updated)) + }) + + // Register IPC route to check if updates are available for a plugin + ipcMain.handle('pluggable:updatesAvailable', (e, names) => { + checkPluginsPath() + + const plugins = names ? names.map(name => getPlugin(name)) : getAllPlugins() + + const updates = {} + for (const plugin of plugins) { + updates[plugin.name] = plugin.isUpdateAvailable() + } + return updates + }) + + // Register IPC route to get the list of active plugins + ipcMain.handle('pluggable:getActivePlugins', () => { + checkPluginsPath() + return JSON.parse(JSON.stringify(getActivePlugins())) + }) + + // Register IPC route to toggle the active state of a plugin + ipcMain.handle('pluggable:togglePluginActive', (e, plg, active) => { + checkPluginsPath() + const plugin = getPlugin(plg) + return JSON.parse(JSON.stringify(plugin.setActive(active))) + }) + + active = true +} diff --git a/electron/core/plugin-manager/pluginMgr/store.js b/electron/core/plugin-manager/pluginMgr/store.js new file mode 100644 index 000000000..16a647930 --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/store.js @@ -0,0 +1,129 @@ +/** + * Provides access to the plugins stored by Pluggable Electron + * @typedef {Object} pluginManager + * @prop {getPlugin} getPlugin + * @prop {getAllPlugins} getAllPlugins + * @prop {getActivePlugins} getActivePlugins + * @prop {installPlugins} installPlugins + * @prop {removePlugin} removePlugin + */ + +import { writeFileSync } from "fs" +import Plugin from "./Plugin" +import { getPluginsFile } from './globals' + +/** + * @module store + * @private + */ + +/** + * Register of installed plugins + * @type {Object.} plugin - List of installed plugins + */ +const plugins = {} + +/** + * Get a plugin from the stored plugins. + * @param {string} name Name of the plugin to retrieve + * @returns {Plugin} Retrieved plugin + * @alias pluginManager.getPlugin + */ +export function getPlugin(name) { + if (!Object.prototype.hasOwnProperty.call(plugins, name)) { + throw new Error(`Plugin ${name} does not exist`) + } + + return plugins[name] +} + +/** + * Get list of all plugin objects. + * @returns {Array.} All plugin objects + * @alias pluginManager.getAllPlugins + */ +export function getAllPlugins() { return Object.values(plugins) } + +/** + * Get list of active plugin objects. + * @returns {Array.} Active plugin objects + * @alias pluginManager.getActivePlugins + */ +export function getActivePlugins() { + return Object.values(plugins).filter(plugin => plugin.active) +} + +/** + * Remove plugin from store and maybe save stored plugins to file + * @param {string} name Name of the plugin to remove + * @param {boolean} persist Whether to save the changes to plugins to file + * @returns {boolean} Whether the delete was successful + * @alias pluginManager.removePlugin + */ +export function removePlugin(name, persist = true) { + const del = delete plugins[name] + if (persist) persistPlugins() + return del +} + +/** + * Add plugin to store and maybe save stored plugins to file + * @param {Plugin} plugin Plugin to add to store + * @param {boolean} persist Whether to save the changes to plugins to file + * @returns {void} + */ +export function addPlugin(plugin, persist = true) { + plugins[plugin.name] = plugin + if (persist) { + persistPlugins() + plugin.subscribe('pe-persist', persistPlugins) + } +} + +/** + * Save stored plugins to file + * @returns {void} + */ +export function persistPlugins() { + const persistData = {} + for (const name in plugins) { + persistData[name] = plugins[name] + } + writeFileSync(getPluginsFile(), JSON.stringify(persistData), 'utf8') +} + +/** + * Create and install a new plugin for the given specifier. + * @param {Array.} plugins A list of NPM specifiers, or installation configuration objects. + * @param {boolean} [store=true] Whether to store the installed plugins in the store + * @returns {Promise.>} New plugin + * @alias pluginManager.installPlugins + */ +export async function installPlugins(plugins, store = true) { + const installed = [] + for (const plg of plugins) { + // Set install options and activation based on input type + const isObject = typeof plg === 'object' + const spec = isObject ? [plg.specifier, plg] : [plg] + const activate = isObject ? plg.activate !== false : true + + // Install and possibly activate plugin + const plugin = new Plugin(...spec) + await plugin._install() + if (activate) plugin.setActive(true) + + // Add plugin to store if needed + if (store) addPlugin(plugin) + installed.push(plugin) + } + + // Return list of all installed plugins + return installed +} + +/** + * @typedef {Object.} installOptions The {@link https://www.npmjs.com/package/pacote|pacote} + * options used to install the plugin with some extra options. + * @param {string} specifier the NPM specifier that identifies the package. + * @param {boolean} [activate] Whether this plugin should be activated after installation. Defaults to true. + */ \ No newline at end of file diff --git a/electron/core/plugin-manager/pluginMgr/store.test.js b/electron/core/plugin-manager/pluginMgr/store.test.js new file mode 100644 index 000000000..e99cb7c7d --- /dev/null +++ b/electron/core/plugin-manager/pluginMgr/store.test.js @@ -0,0 +1,108 @@ +import { getActivePlugins, getAllPlugins, getPlugin, installPlugins } from './store' +import { init } from "." +import { join } from 'path' +import Plugin from "./Plugin" +import { mkdirSync, writeFileSync, rmSync } from "fs" + +// Temporary directory to install plugins to +const pluginsDir = './testPlugins' + +// Temporary directory containing the active plugin to install +const activePluginDir = './activePluginSrc' +const activePluginName = 'active-plugin' +const activeManifest = join(activePluginDir, 'package.json') + +// Temporary directory containing the inactive plugin to install +const inactivePluginDir = './inactivePluginSrc' +const inactivePluginName = 'inactive-plugin' +const inactiveManifest = join(inactivePluginDir, 'package.json') + +// Mock name for the entry file in the plugins +const main = 'index' + +/** @type Array. */ +let activePlugins +/** @type Array. */ +let inactivePlugins + +beforeAll(async () => { + // Initialize pluggable Electron + init({ + confirmInstall: () => true, + pluginsPath: pluginsDir, + }) + + // Create active plugin + mkdirSync(activePluginDir) + writeFileSync(activeManifest, JSON.stringify({ + name: activePluginName, + activationPoints: [], + main, + }), 'utf8') + + // Create active plugin + mkdirSync(inactivePluginDir) + writeFileSync(inactiveManifest, JSON.stringify({ + name: inactivePluginName, + activationPoints: [], + main, + }), 'utf8') + + // Install plugins + activePlugins = await installPlugins([activePluginDir], true) + activePlugins[0].setActive(true) + inactivePlugins = await installPlugins([{ + specifier: inactivePluginDir, + activate: false + }], true) +}) + +afterAll(() => { + // Remove all test files and folders + rmSync(pluginsDir, { recursive: true }) + rmSync(activePluginDir, { recursive: true }) + rmSync(inactivePluginDir, { recursive: true }) +}) + +describe('installPlugins', () => { + it('should create a new plugin found at the given location and return it if store is false', async () => { + const res = await installPlugins([activePluginDir], false) + + expect(res[0]).toBeInstanceOf(Plugin) + }) + + it('should create a new plugin found at the given location and register it if store is true', () => { + expect(activePlugins[0]).toBeInstanceOf(Plugin) + expect(getPlugin(activePluginName)).toBe(activePlugins[0]) + }) + + it('should activate the installed plugin by default', () => { + expect(getPlugin(activePluginName).active).toBe(true) + }) + + it('should set plugin to inactive if activate is set to false in the install options', async () => { + expect(inactivePlugins[0].active).toBe(false) + }) +}) + +describe('getPlugin', () => { + it('should return the plugin with the given name if it is registered', () => { + expect(getPlugin(activePluginName)).toBeInstanceOf(Plugin) + }) + + it('should return an error if the plugin with the given name is not registered', () => { + expect(() => getPlugin('wrongName')).toThrowError('Plugin wrongName does not exist') + }) +}) + +describe('getAllPlugins', () => { + it('should return a list of all registered plugins', () => { + expect(getAllPlugins()).toEqual([activePlugins[0], inactivePlugins[0]]) + }) +}) + +describe('getActivePlugins', () => { + it('should return a list of all and only the registered plugins that are active', () => { + expect(getActivePlugins()).toEqual(activePlugins) + }) +}) \ No newline at end of file diff --git a/electron/core/plugins/data-plugin/README.md b/electron/core/plugins/data-plugin/README.md new file mode 100644 index 000000000..2197d9ad2 --- /dev/null +++ b/electron/core/plugins/data-plugin/README.md @@ -0,0 +1,8 @@ +## Database handler plugin for Jan App + +**Notice**: please only install dependencies and run build using npm and not yarn. + +- index.ts: Main entry point for the plugin. +- module.ts: Defines the plugin module which would be executed by the main node process. +- package.json: Defines the plugin metadata. +- tsconfig.json: Defines the typescript configuration. diff --git a/electron/core/plugins/data-plugin/index.ts b/electron/core/plugins/data-plugin/index.ts new file mode 100644 index 000000000..c2f91d89a --- /dev/null +++ b/electron/core/plugins/data-plugin/index.ts @@ -0,0 +1,152 @@ +// Provide an async method to manipulate the price provided by the extension point +const MODULE_PATH = "data-plugin/dist/module.js"; + +const storeModel = (model: any) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "storeModel", model) + .then((res: any) => resolve(res)); + } + }); + +const getFinishedDownloadModels = () => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getFinishedDownloadModels") + .then((res: any) => resolve(res)); + } + }); + +const getModelById = (modelId: string) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getModelById", modelId) + .then((res: any) => resolve(res)); + } + }); + +const updateFinishedDownloadAt = (fileName: string) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc( + MODULE_PATH, + "updateFinishedDownloadAt", + fileName, + Date.now() + ) + .then((res: any) => resolve(res)); + } + }); + +const getUnfinishedDownloadModels = () => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getUnfinishedDownloadModels") + .then((res: any[]) => resolve(res)); + } else { + resolve([]); + } + }); + +const deleteDownloadModel = (modelId: string) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "deleteDownloadModel", modelId) + .then((res: any) => resolve(res)); + } + }); + +const getConversations = () => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getConversations") + .then((res: any[]) => resolve(res)); + } else { + resolve([]); + } + }); +const getConversationMessages = (id: any) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getConversationMessages", id) + .then((res: any[]) => resolve(res)); + } else { + resolve([]); + } + }); + +const createConversation = (conversation: any) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "storeConversation", conversation) + .then((res: any) => { + resolve(res); + }); + } else { + resolve("-"); + } + }); +const createMessage = (message: any) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "storeMessage", message) + .then((res: any) => resolve(res)); + } else { + resolve("-"); + } + }); + +const deleteConversation = (id: any) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "deleteConversation", id) + .then((res: any) => { + resolve(res); + }); + } else { + resolve("-"); + } + }); + +const setupDb = () => { + window.electronAPI.invokePluginFunc(MODULE_PATH, "init"); +}; + +// Register all the above functions and objects with the relevant extension points +export function init({ register }: { register: any }) { + setupDb(); + register("getConversations", "getConv", getConversations, 1); + register("createConversation", "insertConv", createConversation); + register("deleteConversation", "deleteConv", deleteConversation); + register("createMessage", "insertMessage", createMessage); + register("getConversationMessages", "getMessages", getConversationMessages); + register("storeModel", "storeModel", storeModel); + register( + "updateFinishedDownloadAt", + "updateFinishedDownloadAt", + updateFinishedDownloadAt + ); + register( + "getUnfinishedDownloadModels", + "getUnfinishedDownloadModels", + getUnfinishedDownloadModels + ); + register("deleteDownloadModel", "deleteDownloadModel", deleteDownloadModel); + register("getModelById", "getModelById", getModelById); + register( + "getFinishedDownloadModels", + "getFinishedDownloadModels", + getFinishedDownloadModels + ); +} diff --git a/electron/core/plugins/data-plugin/module.ts b/electron/core/plugins/data-plugin/module.ts new file mode 100644 index 000000000..384e538ae --- /dev/null +++ b/electron/core/plugins/data-plugin/module.ts @@ -0,0 +1,371 @@ +const sqlite3 = require("sqlite3").verbose(); +const path = require("path"); +const { app } = require("electron"); + +const MODEL_TABLE_CREATION = ` +CREATE TABLE IF NOT EXISTS models ( + id TEXT PRIMARY KEY, + slug TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL, + avatar_url TEXT, + long_description TEXT NOT NULL, + technical_description TEXT NOT NULL, + author TEXT NOT NULL, + version TEXT NOT NULL, + model_url TEXT NOT NULL, + nsfw INTEGER NOT NULL, + greeting TEXT NOT NULL, + type TEXT NOT NULL, + file_name TEXT NOT NULL, + download_url TEXT NOT NULL, + start_download_at INTEGER DEFAULT -1, + finish_download_at INTEGER DEFAULT -1, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +);`; + +const MODEL_TABLE_INSERTION = ` +INSERT INTO models ( + id, + slug, + name, + description, + avatar_url, + long_description, + technical_description, + author, + version, + model_url, + nsfw, + greeting, + type, + file_name, + download_url, + start_download_at +) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`; + +function init() { + const db = new sqlite3.Database(path.join(app.getPath("userData"), "jan.db")); + console.log( + `Database located at ${path.join(app.getPath("userData"), "jan.db")}` + ); + + db.serialize(() => { + db.run(MODEL_TABLE_CREATION); + db.run( + "CREATE TABLE IF NOT EXISTS conversations ( id INTEGER PRIMARY KEY, name TEXT, model_id TEXT, image TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);" + ); + db.run( + "CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY, name TEXT, conversation_id INTEGER, user TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);" + ); + }); + + const stmt = db.prepare( + "INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)" + ); + stmt.finalize(); + db.close(); +} + +/** + * Store a model in the database when user start downloading it + * + * @param model Product + */ +function storeModel(model: any) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + console.debug("Inserting", JSON.stringify(model)); + db.serialize(() => { + const stmt = db.prepare(MODEL_TABLE_INSERTION); + stmt.run( + model.id, + model.slug, + model.name, + model.description, + model.avatarUrl, + model.longDescription, + model.technicalDescription, + model.author, + model.version, + model.modelUrl, + model.nsfw, + model.greeting, + model.type, + model.fileName, + model.downloadUrl, + Date.now(), + function (err: any) { + if (err) { + // Handle the insertion error here + console.error(err.message); + res(undefined); + return; + } + // @ts-ignoreF + const id = this.lastID; + res(id); + return; + } + ); + stmt.finalize(); + }); + + db.close(); + }); +} + +/** + * Update the finished download time of a model + * + * @param model Product + */ +function updateFinishedDownloadAt(fileName: string, time: number) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + console.debug(`Updating fileName ${fileName} to ${time}`); + const stmt = `UPDATE models SET finish_download_at = ? WHERE file_name = ?`; + db.run(stmt, [time, fileName], (err: any) => { + if (err) { + console.log(err); + } else { + console.log("Updated 1 row"); + res("Updated"); + } + }); + + db.close(); + }); +} + +/** + * Get all unfinished models from the database + */ +function getUnfinishedDownloadModels() { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + const query = `SELECT * FROM models WHERE finish_download_at = -1 ORDER BY start_download_at DESC`; + db.all(query, (err: Error, row: any) => { + res(row); + }); + db.close(); + }); +} + +function getFinishedDownloadModels() { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + const query = `SELECT * FROM models WHERE finish_download_at != -1 ORDER BY finish_download_at DESC`; + db.all(query, (err: Error, row: any) => { + res(row); + }); + db.close(); + }); +} + +function deleteDownloadModel(modelId: string) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + console.log(`Deleting ${modelId}`); + db.serialize(() => { + const stmt = db.prepare("DELETE FROM models WHERE id = ?"); + stmt.run(modelId); + stmt.finalize(); + }); + + db.close(); + }); +} + +function getModelById(modelId: string) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + console.debug("Get model by id", modelId); + db.get( + `SELECT * FROM models WHERE id = ?`, + [modelId], + (err: any, row: any) => { + console.debug("Get model by id result", row); + + if (row) { + const product = { + id: row.id, + slug: row.slug, + name: row.name, + description: row.description, + avatarUrl: row.avatar_url, + longDescription: row.long_description, + technicalDescription: row.technical_description, + author: row.author, + version: row.version, + modelUrl: row.model_url, + nsfw: row.nsfw, + greeting: row.greeting, + type: row.type, + inputs: row.inputs, + outputs: row.outputs, + createdAt: new Date(row.created_at), + updatedAt: new Date(row.updated_at), + fileName: row.file_name, + downloadUrl: row.download_url, + }; + res(product); + } + } + ); + + db.close(); + }); +} + +function getConversations() { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.all( + "SELECT * FROM conversations ORDER BY created_at DESC", + (err: any, row: any) => { + res(row); + } + ); + db.close(); + }); +} +function storeConversation(conversation: any) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const stmt = db.prepare( + "INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)" + ); + stmt.run( + conversation.name, + conversation.model_id, + conversation.image, + conversation.message, + function (err: any) { + if (err) { + // Handle the insertion error here + console.error(err.message); + res(undefined); + return; + } + // @ts-ignoreF + const id = this.lastID; + res(id); + return; + } + ); + stmt.finalize(); + }); + + db.close(); + }); +} + +function storeMessage(message: any) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const stmt = db.prepare( + "INSERT INTO messages (name, conversation_id, user, message) VALUES (?, ?, ?, ?)" + ); + stmt.run( + message.name, + message.conversation_id, + message.user, + message.message, + (err: any) => { + if (err) { + // Handle the insertion error here + console.error(err.message); + res(undefined); + return; + } + //@ts-ignore + const id = this.lastID; + res(id); + return; + } + ); + stmt.finalize(); + }); + + db.close(); + }); +} + +function deleteConversation(id: any) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const deleteConv = db.prepare("DELETE FROM conversations WHERE id = ?"); + deleteConv.run(id); + deleteConv.finalize(); + const deleteMessages = db.prepare( + "DELETE FROM messages WHERE conversation_id = ?" + ); + deleteMessages.run(id); + deleteMessages.finalize(); + res([]); + }); + + db.close(); + }); +} + +function getConversationMessages(conversation_id: any) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + const query = `SELECT * FROM messages WHERE conversation_id = ${conversation_id} ORDER BY created_at DESC`; + db.all(query, (err: Error, row: any) => { + res(row); + }); + db.close(); + }); +} + +module.exports = { + init, + getConversations, + deleteConversation, + storeConversation, + storeMessage, + getConversationMessages, + storeModel, + updateFinishedDownloadAt, + getUnfinishedDownloadModels, + getFinishedDownloadModels, + deleteDownloadModel, + getModelById, +}; diff --git a/electron/core/plugins/data-plugin/package.json b/electron/core/plugins/data-plugin/package.json new file mode 100644 index 000000000..83f148f7e --- /dev/null +++ b/electron/core/plugins/data-plugin/package.json @@ -0,0 +1,41 @@ +{ + "name": "data-plugin", + "version": "2.1.0", + "description": "", + "main": "dist/index.js", + "author": "Jan", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "build": "tsc -b . && webpack --config webpack.config.js", + "build:package": "rimraf ./data-plugin*.tgz && npm run build && npm pack", + "build:publish": "npm run build:package && cpx *.tgz ../../pre-install" + }, + "exports": { + ".": "./dist/index.js", + "./main": "./dist/module.js" + }, + "devDependencies": { + "cpx": "^1.5.0", + "rimraf": "^3.0.2", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", + "typescript": "^5.2.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "bundledDependencies": [ + "sql.js", + "sqlite3" + ], + "files": [ + "dist/**", + "package.json", + "node_modules" + ], + "dependencies": { + "sqlite3": "^5.1.6" + } +} diff --git a/electron/core/plugins/data-plugin/tsconfig.json b/electron/core/plugins/data-plugin/tsconfig.json new file mode 100644 index 000000000..72d6f3732 --- /dev/null +++ b/electron/core/plugins/data-plugin/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + /* Modules */ + "module": "ES6" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "." /* Specify the base directory to resolve non-relative module names. */, + // "paths": {} /* Specify a set of entries that re-map imports to additional lookup locations. */, + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + /* Type Checking */ + "strict": false /* Enable all strict type-checking options. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/electron/core/plugins/data-plugin/types/index.d.ts b/electron/core/plugins/data-plugin/types/index.d.ts new file mode 100644 index 000000000..a7ac3c8ac --- /dev/null +++ b/electron/core/plugins/data-plugin/types/index.d.ts @@ -0,0 +1,7 @@ +export {}; + +declare global { + interface Window { + electronAPI?: any | undefined; + } +} diff --git a/electron/core/plugins/data-plugin/webpack.config.js b/electron/core/plugins/data-plugin/webpack.config.js new file mode 100644 index 000000000..18696aa34 --- /dev/null +++ b/electron/core/plugins/data-plugin/webpack.config.js @@ -0,0 +1,25 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.ts", // Adjust the entry point to match your project's main file + mode: "production", + module: { + rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + ], + }, + output: { + filename: "index.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".ts", ".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/electron/core/plugins/inference-plugin/index.js b/electron/core/plugins/inference-plugin/index.js new file mode 100644 index 000000000..76c1445fc --- /dev/null +++ b/electron/core/plugins/inference-plugin/index.js @@ -0,0 +1,25 @@ +const MODULE_PATH = "inference-plugin/dist/module.js"; + +const prompt = async (prompt) => + new Promise(async (resolve) => { + if (window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "prompt", prompt) + .then((res) => resolve(res)); + } + }); + +const initModel = async (product) => + new Promise(async (resolve) => { + if (window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "initModel", product) + .then((res) => resolve(res)); + } + }); + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + register("initModel", "initModel", initModel); + register("prompt", "prompt", prompt); +} diff --git a/electron/core/plugins/inference-plugin/module.js b/electron/core/plugins/inference-plugin/module.js new file mode 100644 index 000000000..763c632cc --- /dev/null +++ b/electron/core/plugins/inference-plugin/module.js @@ -0,0 +1,55 @@ +const path = require("path"); +const { app, dialog } = require("electron"); +const _importDynamic = new Function("modulePath", "return import(modulePath)"); + +let llamaSession = null; + +async function initModel(product) { + // fileName fallback + if (!product.fileName) { + product.fileName = product.file_name; + } + + if (!product.fileName) { + await dialog.showMessageBox({ + message: "Selected model does not have file name..", + }); + + return; + } + + console.info(`Initializing model: ${product.name}..`); + _importDynamic("../node_modules/node-llama-cpp/dist/index.js") + .then(({ LlamaContext, LlamaChatSession, LlamaModel }) => { + const modelPath = path.join(app.getPath("userData"), product.fileName); + const model = new LlamaModel({ modelPath }); + const context = new LlamaContext({ model }); + llamaSession = new LlamaChatSession({ context }); + console.info(`Init model ${product.name} successfully!`); + }) + .catch(async (e) => { + console.error(e); + await dialog.showMessageBox({ + message: "Failed to import LLM module", + }); + }); +} + +async function prompt(prompt) { + if (!llamaSession) { + await dialog.showMessageBox({ + message: "Model not initialized", + }); + + return; + } + console.log("prompt: ", prompt); + const response = await llamaSession.prompt(prompt); + console.log("response: ", response); + return response; +} + +module.exports = { + initModel, + prompt, +}; diff --git a/electron/core/plugins/inference-plugin/package.json b/electron/core/plugins/inference-plugin/package.json new file mode 100644 index 000000000..170a2f0eb --- /dev/null +++ b/electron/core/plugins/inference-plugin/package.json @@ -0,0 +1,38 @@ +{ + "name": "inference-plugin", + "version": "0.0.1", + "description": "", + "main": "dist/index.js", + "author": "James", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "build": "webpack --config webpack.config.js", + "build:package": "rimraf ./*.tgz && npm run build && cpx \"module.js\" \"dist\" && npm pack", + "build:publish": "yarn build:package && cpx *.tgz ../../pre-install" + }, + "devDependencies": { + "cpx": "^1.5.0", + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "bundledDependencies": [ + "electron-is-dev", + "node-llama-cpp" + ], + "dependencies": { + "electron-is-dev": "^2.0.0", + "node-llama-cpp": "^2.4.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/electron/core/plugins/inference-plugin/webpack.config.js b/electron/core/plugins/inference-plugin/webpack.config.js new file mode 100644 index 000000000..2821852d4 --- /dev/null +++ b/electron/core/plugins/inference-plugin/webpack.config.js @@ -0,0 +1,25 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + mode: "production", + module: { + rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + ], + }, + output: { + filename: "index.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/electron/core/plugins/model-management-plugin/index.js b/electron/core/plugins/model-management-plugin/index.js new file mode 100644 index 000000000..0d2449931 --- /dev/null +++ b/electron/core/plugins/model-management-plugin/index.js @@ -0,0 +1,47 @@ +const MODULE_PATH = "model-management-plugin/dist/module.js"; + +const getDownloadedModels = async () => + new Promise(async (resolve) => { + if (window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getDownloadedModels") + .then((res) => resolve(res)); + } + }); + +const getAvailableModels = async () => + new Promise(async (resolve) => { + if (window.electronAPI) { + window.electronAPI + .invokePluginFunc(MODULE_PATH, "getAvailableModels") + .then((res) => resolve(res)); + } + }); + +const downloadModel = async (product) => + new Promise(async (resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .downloadFile(product.downloadUrl, product.fileName) + .then((res) => resolve(res)); + } else { + resolve("-"); + } + }); + +const deleteModel = async (path) => + new Promise(async (resolve) => { + if (window.electronAPI) { + console.debug(`Delete model model management plugin: ${path}`); + const response = await window.electronAPI.deleteFile(path); + resolve(response); + } + }); + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + register("getDownloadedModels", "getDownloadedModels", getDownloadedModels); + register("getAvailableModels", "getAvailableModels", getAvailableModels); + register("downloadModel", "downloadModel", downloadModel); + register("deleteModel", "deleteModel", deleteModel); +} diff --git a/electron/core/plugins/model-management-plugin/module.js b/electron/core/plugins/model-management-plugin/module.js new file mode 100644 index 000000000..d1472656b --- /dev/null +++ b/electron/core/plugins/model-management-plugin/module.js @@ -0,0 +1,101 @@ +const path = require("path"); +const { readdirSync, lstatSync } = require("fs"); +const { app } = require("electron"); + +const ALL_MODELS = [ + { + id: "llama-2-7b-chat.Q4_K_M.gguf.bin", + slug: "llama-2-7b-chat.Q4_K_M.gguf.bin", + name: "Llama 2 7B Chat - GGUF", + description: "medium, balanced quality - recommended", + avatarUrl: + "https://aeiljuispo.cloudimg.io/v7/https://cdn-uploads.huggingface.co/production/uploads/6426d3f3a7723d62b53c259b/tvPikpAzKTKGN5wrpadOJ.jpeg?w=200&h=200&f=face", + longDescription: + "GGUF is a new format introduced by the llama.cpp team on August 21st 2023. It is a replacement for GGML, which is no longer supported by llama.cpp. GGUF offers numerous advantages over GGML, such as better tokenisation, and support for special tokens. It is also supports metadata, and is designed to be extensible.", + technicalDescription: + 'GGML_TYPE_Q4_K - "type-1" 4-bit quantization in super-blocks containing 8 blocks, each block having 32 weights. Scales and mins are quantized with 6 bits. This ends up using 4.5 bpw.', + author: "The Bloke", + version: "1.0.0", + modelUrl: "https://google.com", + nsfw: false, + greeting: "Hello there", + type: "LLM", + inputs: undefined, + outputs: undefined, + createdAt: 0, + updatedAt: undefined, + fileName: "llama-2-7b-chat.Q4_K_M.gguf.bin", + downloadUrl: + "https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf", + }, + { + id: "llama-2-13b-chat.Q4_K_M.gguf", + slug: "llama-2-13b-chat.Q4_K_M.gguf", + name: "Llama 2 13B Chat - GGUF", + description: "medium, balanced quality - recommended", + avatarUrl: + "https://aeiljuispo.cloudimg.io/v7/https://cdn-uploads.huggingface.co/production/uploads/6426d3f3a7723d62b53c259b/tvPikpAzKTKGN5wrpadOJ.jpeg?w=200&h=200&f=face", + longDescription: + "GGUF is a new format introduced by the llama.cpp team on August 21st 2023. It is a replacement for GGML, which is no longer supported by llama.cpp. GGUF offers numerous advantages over GGML, such as better tokenisation, and support for special tokens. It is also supports metadata, and is designed to be extensible.", + technicalDescription: + 'GGML_TYPE_Q4_K - "type-1" 4-bit quantization in super-blocks containing 8 blocks, each block having 32 weights. Scales and mins are quantized with 6 bits. This ends up using 4.5 bpw.', + author: "The Bloke", + version: "1.0.0", + modelUrl: "https://google.com", + nsfw: false, + greeting: "Hello there", + type: "LLM", + inputs: undefined, + outputs: undefined, + createdAt: 0, + updatedAt: undefined, + fileName: "llama-2-13b-chat.Q4_K_M.gguf.bin", + downloadUrl: + "https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF/resolve/main/llama-2-13b-chat.Q4_K_M.gguf", + }, +]; + +function getDownloadedModels() { + const userDataPath = app.getPath("userData"); + + const allBinariesName = []; + var files = readdirSync(userDataPath); + for (var i = 0; i < files.length; i++) { + var filename = path.join(userDataPath, files[i]); + var stat = lstatSync(filename); + if (stat.isDirectory()) { + // ignore + } else if (filename.endsWith(".bin")) { + var binaryName = path.basename(filename); + allBinariesName.push(binaryName); + } + } + + const downloadedModels = ALL_MODELS.map((model) => { + if ( + model.fileName && + allBinariesName + .map((t) => t.toLowerCase()) + .includes(model.fileName.toLowerCase()) + ) { + return model; + } + return undefined; + }).filter((m) => m !== undefined); + + return downloadedModels; +} + +function getAvailableModels() { + const downloadedModelIds = getDownloadedModels().map((model) => model.id); + return ALL_MODELS.filter((model) => { + if (!downloadedModelIds.includes(model.id)) { + return model; + } + }); +} + +module.exports = { + getDownloadedModels, + getAvailableModels, +}; diff --git a/electron/core/plugins/model-management-plugin/package.json b/electron/core/plugins/model-management-plugin/package.json new file mode 100644 index 000000000..dd7d61d3c --- /dev/null +++ b/electron/core/plugins/model-management-plugin/package.json @@ -0,0 +1,27 @@ +{ + "name": "model-management-plugin", + "version": "0.0.1", + "description": "", + "main": "dist/index.js", + "author": "James", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "build": "webpack --config webpack.config.js", + "build:package": "rimraf ./*.tgz && npm run build && cpx \"module.js\" \"dist\" && npm pack", + "build:publish": "yarn build:package && cpx *.tgz ../../pre-install" + }, + "devDependencies": { + "cpx": "^1.5.0", + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/electron/core/plugins/model-management-plugin/webpack.config.js b/electron/core/plugins/model-management-plugin/webpack.config.js new file mode 100644 index 000000000..2821852d4 --- /dev/null +++ b/electron/core/plugins/model-management-plugin/webpack.config.js @@ -0,0 +1,25 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + mode: "production", + module: { + rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + ], + }, + output: { + filename: "index.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/electron/core/plugins/monitoring-plugin/index.js b/electron/core/plugins/monitoring-plugin/index.js new file mode 100644 index 000000000..ac47a9adc --- /dev/null +++ b/electron/core/plugins/monitoring-plugin/index.js @@ -0,0 +1,36 @@ +// Provide an async method to manipulate the price provided by the extension point +const PLUGIN_NAME = "monitoring-plugin/dist/module.js"; + +const getResourcesInfo = () => { + return new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "getResourcesInfo") + .then((res) => { + resolve(res); + }); + } else { + resolve({}); + } + }); +}; + +const getCurrentLoad = () => { + return new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "getCurrentLoad") + .then((res) => { + resolve(res); + }); + } else { + resolve({}); + } + }); +}; + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + register("getResourcesInfo", "getResourcesInfo", getResourcesInfo); + register("getCurrentLoad", "getCurrentLoad", getCurrentLoad); +} diff --git a/electron/core/plugins/monitoring-plugin/module.js b/electron/core/plugins/monitoring-plugin/module.js new file mode 100644 index 000000000..6fe5881c2 --- /dev/null +++ b/electron/core/plugins/monitoring-plugin/module.js @@ -0,0 +1,25 @@ +const si = require("systeminformation"); + +const getResourcesInfo = async () => + new Promise(async (resolve) => { + const cpu = await si.cpu(); + const mem = await si.mem(); + const gpu = await si.graphics(); + const response = { + cpu, + mem, + gpu, + }; + resolve(response); + }); + +const getCurrentLoad = async () => + new Promise(async (resolve) => { + const currentLoad = await si.currentLoad(); + resolve(currentLoad); + }); + +module.exports = { + getResourcesInfo, + getCurrentLoad, +}; diff --git a/electron/core/plugins/monitoring-plugin/package.json b/electron/core/plugins/monitoring-plugin/package.json new file mode 100644 index 000000000..34d110ab5 --- /dev/null +++ b/electron/core/plugins/monitoring-plugin/package.json @@ -0,0 +1,32 @@ +{ + "name": "monitoring-plugin", + "version": "0.0.1", + "description": "", + "main": "dist/bundle.js", + "author": "Jan", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "build": "webpack --config webpack.config.js", + "build:package": "rimraf ./*.tgz && npm run build && cpx \"module.js\" \"dist\" && npm pack", + "build:publish": "yarn build:package && cpx *.tgz ../../pre-install" + }, + "devDependencies": { + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "systeminformation": "^5.21.8" + }, + "bundledDependencies": [ + "systeminformation" + ], + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/electron/core/plugins/monitoring-plugin/webpack.config.js b/electron/core/plugins/monitoring-plugin/webpack.config.js new file mode 100644 index 000000000..7248a0990 --- /dev/null +++ b/electron/core/plugins/monitoring-plugin/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + output: { + filename: "bundle.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/models/.gitkeep b/electron/core/pre-install/.gitkeep similarity index 100% rename from models/.gitkeep rename to electron/core/pre-install/.gitkeep diff --git a/electron/icon.png b/electron/icon.png new file mode 100644 index 000000000..289f99ded Binary files /dev/null and b/electron/icon.png differ diff --git a/electron/main.ts b/electron/main.ts new file mode 100644 index 000000000..5419668a5 --- /dev/null +++ b/electron/main.ts @@ -0,0 +1,204 @@ +import { + app, + BrowserWindow, + screen as electronScreen, + ipcMain, + dialog, + shell, +} from "electron"; +import { readdirSync } from "fs"; +import { resolve, join, extname } from "path"; +import { unlink, createWriteStream } from "fs"; +import isDev = require("electron-is-dev"); +import { init } from "./core/plugin-manager/pluginMgr"; +const { autoUpdater } = require("electron-updater"); +// @ts-ignore +import request = require("request"); +// @ts-ignore +import progress = require("request-progress"); + +let mainWindow: BrowserWindow | undefined = undefined; + +autoUpdater.autoDownload = false; +autoUpdater.autoInstallOnAppQuit = true; + +const createMainWindow = () => { + mainWindow = new BrowserWindow({ + width: electronScreen.getPrimaryDisplay().workArea.width, + height: electronScreen.getPrimaryDisplay().workArea.height, + show: false, + backgroundColor: "white", + webPreferences: { + nodeIntegration: true, + preload: join(__dirname, "preload.js"), + }, + }); + + ipcMain.handle( + "invokePluginFunc", + async (event, modulePath, method, ...args) => { + const module = join(app.getPath("userData"), "plugins", modulePath); + return await import(/* webpackIgnore: true */ module) + .then((plugin) => { + if (typeof plugin[method] === "function") { + return plugin[method](...args); + } else { + console.log(plugin[method]); + console.error(`Function "${method}" does not exist in the module.`); + } + }) + .then((res) => { + return res; + }) + .catch((err) => console.log(err)); + } + ); + + const startURL = isDev + ? "http://localhost:3000" + : `file://${join(__dirname, "../renderer/index.html")}`; + + mainWindow.loadURL(startURL); + + mainWindow.once("ready-to-show", () => mainWindow?.show()); + mainWindow.on("closed", () => { + if (process.platform !== "darwin") app.quit(); + }); + + if (isDev) mainWindow.webContents.openDevTools(); +}; + +app.whenReady().then(() => { + createMainWindow(); + setupPlugins(); + autoUpdater.checkForUpdates(); + + ipcMain.handle("basePlugins", async (event) => { + const basePluginPath = join( + __dirname, + "../", + isDev ? "/core/pre-install" : "../app.asar.unpacked/core/pre-install" + ); + return readdirSync(basePluginPath) + .filter((file) => extname(file) === ".tgz") + .map((file) => join(basePluginPath, file)); + }); + + ipcMain.handle("pluginPath", async (event) => { + return join(app.getPath("userData"), "plugins"); + }); + ipcMain.handle("appVersion", async (event) => { + return app.getVersion(); + }); + ipcMain.handle("openExternalUrl", async (event, url) => { + shell.openExternal(url); + }); + + /** + * Used to delete a file from the user data folder + */ + ipcMain.handle("deleteFile", async (_event, filePath) => { + const userDataPath = app.getPath("userData"); + const fullPath = join(userDataPath, filePath); + + let result = "NULL"; + unlink(fullPath, function (err) { + if (err && err.code == "ENOENT") { + result = `File not exist: ${err}`; + } else if (err) { + result = `File delete error: ${err}`; + } else { + result = "File deleted successfully"; + } + console.log(`Delete file ${filePath} from ${fullPath} result: ${result}`); + }); + + return result; + }); + + /** + * Used to download a file from a given url + */ + ipcMain.handle("downloadFile", async (_event, url, fileName) => { + const userDataPath = app.getPath("userData"); + const destination = resolve(userDataPath, fileName); + + progress(request(url), {}) + .on("progress", function (state: any) { + mainWindow?.webContents.send("FILE_DOWNLOAD_UPDATE", { + ...state, + fileName, + }); + }) + .on("error", function (err: Error) { + mainWindow?.webContents.send("FILE_DOWNLOAD_ERROR", { + fileName, + err, + }); + }) + .on("end", function () { + mainWindow?.webContents.send("FILE_DOWNLOAD_COMPLETE", { + fileName, + }); + }) + .pipe(createWriteStream(destination)); + }); + + app.on("activate", () => { + if (!BrowserWindow.getAllWindows().length) { + createMainWindow(); + } + }); +}); + +/*New Update Available*/ +autoUpdater.on("update-available", async (info: any) => { + const action = await dialog.showMessageBox({ + message: `Update available. Do you want to download the latest update?`, + buttons: ["Download", "Later"], + }); + if (action.response === 0) await autoUpdater.downloadUpdate(); +}); + +/*App Update Completion Message*/ +autoUpdater.on("update-downloaded", async (info: any) => { + mainWindow?.webContents.send("APP_UPDATE_COMPLETE", {}); + const action = await dialog.showMessageBox({ + message: `Update downloaded. Please restart the application to apply the updates.`, + buttons: ["Restart", "Later"], + }); + if (action.response === 0) { + autoUpdater.quitAndInstall(); + } +}); + +/*App Update Error */ +autoUpdater.on("error", (info: any) => { + dialog.showMessageBox({ message: info.message }); + mainWindow?.webContents.send("APP_UPDATE_ERROR", {}); +}); + +/*App Update Progress */ +autoUpdater.on("download-progress", (progress: any) => { + console.log("app update progress: ", progress.percent); + mainWindow?.webContents.send("APP_UPDATE_PROGRESS", { + percent: progress.percent, + }); +}); + +app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); + } +}); + +function setupPlugins() { + init({ + // Function to check from the main process that user wants to install a plugin + confirmInstall: async (plugins: string[]) => { + return true; + }, + // Path to install plugin to + pluginsPath: join(app.getPath("userData"), "plugins"), + }); +} diff --git a/electron/package.json b/electron/package.json new file mode 100644 index 000000000..abb8ac016 --- /dev/null +++ b/electron/package.json @@ -0,0 +1,55 @@ +{ + "name": "jan-electron", + "version": "0.1.1", + "main": "./build/main.js", + "author": "Jan", + "license": "MIT", + "homepage": "./", + "build": { + "appId": "jan.ai.app", + "productName": "Jan", + "files": [ + "renderer/**/*", + "build/*.{js,map}", + "build/core/plugin-manager/**/*", + "core/pre-install" + ], + "asarUnpack": [ + "core/pre-install" + ], + "publish": [ + { + "provider": "github", + "owner": "janhq", + "repo": "jan" + } + ], + "extends": null, + "mac": { + "type": "distribution" + } + }, + "scripts": { + "dev": "tsc -p . && electron .", + "build": "tsc -p . && electron-builder -p never -mw", + "build:publish": "tsc -p . && electron-builder -p onTagOrDraft -mw", + "postinstall": "electron-builder install-app-deps" + }, + "dependencies": { + "electron-is-dev": "^2.0.0", + "electron-updater": "^6.1.4", + "node-llama-cpp": "^2.4.1", + "pluggable-electron": "^0.6.0", + "request": "^2.88.2", + "request-progress": "^3.0.0" + }, + "devDependencies": { + "concurrently": "^8.2.1", + "electron": "26.2.1", + "electron-builder": "^24.6.4", + "wait-on": "^7.0.1" + }, + "installConfig": { + "hoistingLimits": "workspaces" + } +} diff --git a/electron/preload.ts b/electron/preload.ts new file mode 100644 index 000000000..18a9e78a0 --- /dev/null +++ b/electron/preload.ts @@ -0,0 +1,43 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +// Make Pluggable Electron's facade available to the renderer on window.plugins +//@ts-ignore +const useFacade = require("pluggable-electron/facade"); +useFacade(); +//@ts-ignore +const { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("electronAPI", { + invokePluginFunc: (plugin: any, method: any, ...args: any[]) => + ipcRenderer.invoke("invokePluginFunc", plugin, method, ...args), + + basePlugins: () => ipcRenderer.invoke("basePlugins"), + + pluginPath: () => ipcRenderer.invoke("pluginPath"), + + appVersion: () => ipcRenderer.invoke("appVersion"), + + openExternalUrl: (url: string) => ipcRenderer.invoke("openExternalUrl", url), + + deleteFile: (filePath: string) => ipcRenderer.invoke("deleteFile", filePath), + + downloadFile: (url: string, path: string) => + ipcRenderer.invoke("downloadFile", url, path), + + onFileDownloadUpdate: (callback: any) => + ipcRenderer.on("FILE_DOWNLOAD_UPDATE", callback), + + onFileDownloadError: (callback: any) => + ipcRenderer.on("FILE_DOWNLOAD_ERROR", callback), + + onFileDownloadSuccess: (callback: any) => + ipcRenderer.on("FILE_DOWNLOAD_COMPLETE", callback), + + onAppUpdateDownloadUpdate: (callback: any) => + ipcRenderer.on("APP_UPDATE_PROGRESS", callback), + + onAppUpdateDownloadError: (callback: any) => + ipcRenderer.on("APP_UPDATE_ERROR", callback), + + onAppUpdateDownloadSuccess: (callback: any) => + ipcRenderer.on("APP_UPDATE_COMPLETE", callback), +}); diff --git a/electron/tsconfig.json b/electron/tsconfig.json new file mode 100644 index 000000000..675a6abec --- /dev/null +++ b/electron/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "sourceMap": true, + "strict": true, + "outDir": "./build", + "rootDir": "./", + "noEmitOnError": true, + "allowJs": true, + "typeRoots": ["node_modules/@types"] + }, + "exclude": ["core", "build", "node_modules"] +} diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 000000000..42a6cb985 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,12 @@ +{ + "systemParams": "darwin-arm64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 000000000..827d81d8a --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "jan-app", + "private": true, + "workspaces": { + "packages": [ + "electron", + "web" + ], + "nohoist": [ + "electron", + "electron/**", + "web", + "web/**" + ] + }, + "scripts": { + "dev:electron": "yarn workspace jan-electron dev", + "dev:web": "yarn workspace jan-web dev", + "dev": "concurrently --kill-others-on-fail \"yarn dev:web\" \"wait-on http://localhost:3000 && yarn dev:electron\"", + "build:web": "yarn workspace jan-web build && cpx \"web/out/**\" \"electron/renderer/\"", + "build:electron": "yarn workspace jan-electron build", + "build:plugins": "rm -f ./electron/core/pre-install/*.tgz && concurrently \"cd ./electron/core/plugins/data-plugin && npm install && npm run build:publish\" \"cd ./electron/core/plugins/inference-plugin && npm install && npm run build:publish\" \"cd ./electron/core/plugins/model-management-plugin && npm install && npm run build:publish\" \"cd ./electron/core/plugins/monitoring-plugin && npm install && npm run build:publish\"", + "build": "yarn build:web && yarn build:electron", + "build:publish": "yarn build:web && yarn workspace jan-electron build:publish" + }, + "devDependencies": { + "concurrently": "^8.2.1", + "cpx": "^1.5.0", + "wait-on": "^7.0.1" + }, + "version": "0.0.0" +} diff --git a/run.sh b/run.sh deleted file mode 100755 index 2856f8770..000000000 --- a/run.sh +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/bash -### Clean sub-processes on exit -trap "trap - SIGTERM && kill -- -$$" SIGINT - -MAX_STEPS=13 -progress() { - local BAR_SIZE="##########" - local MAX_BAR_SIZE="${#BAR_SIZE}" - local CLEAR_LINE="\\033[K" - spin[0]="-" - spin[1]="\\" - spin[2]="|" - spin[3]="/" - perc=$((($3 + 1) * 100 / MAX_STEPS)) - percBar=$((perc * MAX_BAR_SIZE / 100)) - - eval "$1" >/dev/null 2>error.log & - pid=$! - - echo -ne "\\r- [$3/$MAX_STEPS] [ ] $2 ...$CLEAR_LINE\\n" - while kill -0 $pid >/dev/null 2>&1; do - for i in "${spin[@]}"; do - echo -ne "\\r\\033[1A- [$3/$MAX_STEPS] [$i] $2 $CLEAR_LINE\\n" - sleep 0.1 - done - done - if [ -s "error.log" ] && [[ "$(cat error.log)" != "WARNING"* ]]; then - echo -ne "\\r\\033[1A- [$3/$MAX_STEPS] [x] $2\\n $(cat error.log)" - exit 1 - fi - echo -ne "\\r\\033[1A- [$3/$MAX_STEPS] [✔] $2 $CLEAR_LINE\\n" -} -step=1 - -mkdir -p models/ - -### macOS setup -if [[ "$OSTYPE" == "darwin"* ]]; then - MAX_STEPS=13 - if [[ ! -x "$(command -v brew)" ]]; then - progress '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"' "Installing Homebrew" 1 - else - progress '' "Homebrew - Installed" $((step++)) - fi - - xcode-select -p &>/dev/null - if [ $? -ne 0 ]; then - progress 'xcode-select --install' "Installing Xcode Command Line Tools" $((step++)) - else - progress '' "Xcode Command Line Tools - Installed" $((step++)) - fi - - if [[ ! -x "$(command -v git)" ]]; then - progress 'brew install git' "Installing Git" $((step++)) - else - progress '' "Git - Installed" $((step++)) - fi - - if [[ ! -x "$(command -v wget)" ]]; then - progress 'brew install wget' "Installing Wget" $((step++)) - else - progress '' "Wget - Installed" $((step++)) - fi - - if [[ ! -x "$(command -v docker)" ]]; then - progress 'brew install --cask docker' "Installing Docker" $((step++)) - else - progress '' "Docker - Installed" $((step++)) - fi - - docker compose version &>/dev/null - if [ $? -ne 0 ] && [ ! -x "$(command -v docker-compose)" ]; then - progress 'brew install docker-compose' "Installing Docker Compose" $((step++)) - else - progress '' "docker-compose - Installed" $((step++)) - fi -fi -### - -### Debian setup -if [[ "$OSTYPE" == "linux"* ]]; then - MAX_STEPS=12 - progress "sudo apt update 2>/dev/null" "Apt Updating" $((step++)) - - if [[ ! -x "$(command -v git)" ]]; then - progress 'sudo apt install git' "Installing Git" $((step++)) - else - progress '' "Git - Installed" $((step++)) - fi - - if [[ ! -x "$(command -v wget)" ]]; then - progress 'sudo apt install wget' "Installing Wget" $((step++)) - else - progress '' "Wget - Installed" $((step++)) - fi - - if [[ ! -x "$(command -v docker)" ]]; then - progress '/bin/bash -c "$(curl -fsSL https://get.docker.com/) 2>/dev/null"' "Installing Docker" $((step++)) - else - progress '' "Docker - Installed" $((step++)) - fi - - docker compose version &>/dev/null - if [ $? -ne 0 ] && [ ! -x "$(command -v docker-compose)" ]; then - progress 'sudo apt install docker-compose' "Installing Docker Compose" $((step++)) - else - progress '' "docker-compose - Installed" $((step++)) - fi -fi -### - -### Pull Jan -if [ -d "jan" ]; then - cd jan - progress 'git pull 2>/dev/null' "Git pull" $((step++)) -else - progress 'git clone --quiet https://github.com/janhq/jan' "Git clone" $((step++)) - cd jan -fi - -progress 'git submodule update --init --recursive' "Pull submodule" $((step++)) -### - -### Prepare environment -progress 'cp -f sample.env .env' "Prepare .env file" $((step++)) -### - -### Download Model -if [ -f "/models/llama-2-7b.Q4_K_S.gguf" ]; then - progress '' "Llama model - Installed" $((step++)) -else - progress 'wget https://huggingface.co/TheBloke/Llama-2-7B-GGUF/resolve/main/llama-2-7b.Q4_K_S.gguf -P models' "Download Llama model" $((step++)) -fi -### - -### Launch Docker & Docker compose up -if [[ "$OSTYPE" == "darwin"* ]]; then - progress $' - if (! docker stats --no-stream 2>/dev/null ); then - open /Applications/Docker.app - while (! docker stats --no-stream 2>/dev/null ); do - sleep 0.3 - done - fi' "Waiting for docker to launch" $((step++)) -elif [[ "$OSTYPE" == "linux"* ]]; then - progress 'sudo service docker start 2>/dev/null' "Starting Docker Service" $((step++)) -fi - -docker compose version &>/dev/null -if [[ "$OSTYPE" == "darwin"* ]]; then - if [ $? == 0 ]; then - progress 'docker compose up -d --quiet-pull --remove-orphans 2>/dev/null' "Docker compose up" $((step++)) - elif [[ -x "$(command -v docker-compose)" ]]; then - progress 'docker-compose up -d --quiet-pull --remove-orphans 2>/dev/null' "Docker compose up" $((step++)) - fi -elif [[ "$OSTYPE" == "linux"* ]]; then - if [[ $? == 0 ]]; then - progress 'sudo docker compose up -d --quiet-pull --remove-orphans 2>/dev/null' "Docker compose up" $((step++)) - elif [[ -x "$(command -v docker-compose)" ]]; then - progress 'sudo docker-compose up -d --quiet-pull --remove-orphans 2>/dev/null' "Docker compose up" $((step++)) - fi -else - echo >&2 "Can not find docker compose runner" - exit 2 -fi - -### - -### Wait for service ready -progress $' - while (true); do - if curl -sL -w "%{http_code}\\n" "http://localhost:3000" -o /dev/null | grep -q "200"; then - break - fi -done -' "Waiting for service ready" $((step++)) -### - -echo -ne "\\r You can now view Jan app in the browser: http://localhost:3000 \\n" diff --git a/sample.env b/sample.env deleted file mode 100644 index ab897ce1a..000000000 --- a/sample.env +++ /dev/null @@ -1,8 +0,0 @@ -KEYCLOAK_VERSION=22.0.0 -KEYCLOAK_ADMIN=admin -KEYCLOAK_ADMIN_PASSWORD=admin - -# Inference -## LLM -LLM_MODEL_URL=https://huggingface.co/TheBloke/CodeLlama-13B-GGUF/resolve/main/codellama-13b.Q3_K_L.gguf -LLM_MODEL_FILE=llama-2-7b-chat.ggmlv3.q4_1.bin \ No newline at end of file diff --git a/web-client/README.md b/web-client/README.md deleted file mode 100644 index ef0d70d5e..000000000 --- a/web-client/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# Jan Web - -Jan Web is a Next.js application designed to provide users with the ability to interact with the Language Model (LLM) through chat or generate art using Stable Diffusion. This application runs as a single-page application (SPA) and is encapsulated within a Docker container for easy local deployment. - -## Features - -- Chat with the Language Model: Engage in interactive conversations with the Language Model. Ask questions, seek information, or simply have a chat. - -- Generate Art with Stable Diffusion: Utilize the power of Stable Diffusion to generate unique and captivating pieces of art. Experiment with various parameters to achieve desired results. - -## Installation and Usage - -### Use as complete suite -For using our complete solution, check [this](https://github.com/janhq/jan) - -### For interactive development - -1. **Clone the Repository:** - - ``` - git clone https://github.com/your-username/jan-web.git - cd jan-web - ``` - -2. **Install dependencies:** - - ``` - yarn - ``` - -3. **Run development:** - - ``` - yarn dev - ``` -4. **Regenerate Graphql:** - - ``` - HASURA_ADMIN_TOKEN="[hasura_admin_secret_key]" yarn generate - ``` - -5. **Access Jan Web:** - - Open your web browser and navigate to `http://localhost:3000` to access the Jan Web application. - -## Configuration - -You can customize the endpoint of the Jan Web application through environment file. These options can be found in the `.env` file located in the project's root directory. - -```env -// .env - -KEYCLOAK_CLIENT_ID=hasura -KEYCLOAK_CLIENT_SECRET=********** -AUTH_ISSUER=http://localhost:8088/realms/hasura -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=my-secret -END_SESSION_URL=http://localhost:8088/realms/hasura/protocol/openid-connect/logout -REFRESH_TOKEN_URL=http://localhost:8088/realms/hasura/protocol/openid-connect/token -HASURA_ADMIN_TOKEN=myadminsecretkey -NEXT_PUBLIC_GRAPHQL_ENGINE_URL=localhost:8080 -``` - -Replace above configuration with your actual infrastructure. - -## Dependencies - -|Library| Category | Version | Description | -|--|--|--|--| -| [next](https://nextjs.org/) | Framework | 13.4.10 | -| [typescript](https://www.typescriptlang.org/) | Language | 5.1.6 | -| [tailwindcss](https://tailwindcss.com/) | UI | 3.3.3 | -| [Tailwind UI](https://tailwindui.com/) | UI | | -| [react-hook-form](https://www.react-hook-form.com/) | UI | ^7.45.4 | -| [@headlessui/react](https://headlessui.com/) | UI | ^1.7.15 | -| [@heroicons/react](https://heroicons.com/) | UI | ^2.0.18 | -| [@tailwindcss/typography](https://tailwindcss.com/docs/typography-plugin) | UI | ^0.5.9 | -| [embla-carousel](https://www.embla-carousel.com/) | UI | ^8.0.0-rc11 | -| [@apollo/client](https://www.apollographql.com/docs/react/) | State management | ^3.8.1 | -| [jotai](https://jotai.org/) | State management | ^2.4.0 | - - -## Deploy to Netlify -Clone this repository on own GitHub account and deploy to Netlify: - -[![Netlify Deploy button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/janhq/jan-web) - -## Deploy to Vercel - -Deploy Jan Web on Vercel in one click: - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/janhq/jan-web) - - -## Contributing - -Contributions are welcome! If you find a bug or have suggestions for improvements, feel free to open an issue or submit a pull request on the [GitHub repository](https://github.com/janhq/jan-web/tree/6337306c54e735a4a5c2132dcd1377f21fd76a33). - -## License - -This project is licensed under the Fair-code License - see the [License](https://faircode.io/#licenses) for more details. - ---- - -Feel free to reach out [Discord](https://jan.ai/discord) if you have any questions or need further assistance. Happy coding with Jan Web and exploring the capabilities of the Language Model and Stable Diffusion! 🚀🎨🤖 \ No newline at end of file diff --git a/web-client/app/_components/ActionButton/index.tsx b/web-client/app/_components/ActionButton/index.tsx deleted file mode 100644 index a23bb51e2..000000000 --- a/web-client/app/_components/ActionButton/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import classNames from "classnames"; -import Image from "next/image"; - -type Props = { - title: string; - icon: string; - isLoading?: boolean; - onClick: () => void; -}; - -const ActionButton: React.FC = (props) => { - return ( - <> - {!props.isLoading && ( - - )} - {props.isLoading && ( -
- loading -
- )} - - ); -}; - -export default ActionButton; diff --git a/web-client/app/_components/ApiPane/index.tsx b/web-client/app/_components/ApiPane/index.tsx deleted file mode 100644 index dc451a487..000000000 --- a/web-client/app/_components/ApiPane/index.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import Image from "next/image"; -import { useState } from "react"; -import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; -import js from "react-syntax-highlighter/dist/esm/languages/hljs/javascript"; -import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs"; -import useGetModelApiInfo from "@/_hooks/useGetModelApiInfo"; - -SyntaxHighlighter.registerLanguage("javascript", js); - -const ApiPane: React.FC = () => { - const [expend, setExpend] = useState(true); - const { data } = useGetModelApiInfo(); - const [highlightCode, setHighlightCode] = useState(data[0]); - - return ( -
-
- -
-
-
- {data.map((item, index) => ( - - ))} -
- -
- - {highlightCode?.stringCode} - -
-
-
- ); -}; - -export default ApiPane; \ No newline at end of file diff --git a/web-client/app/_components/ChatContainer/index.tsx b/web-client/app/_components/ChatContainer/index.tsx deleted file mode 100644 index 391ad60c2..000000000 --- a/web-client/app/_components/ChatContainer/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -"use client"; - -import ModelDetailSideBar from "../ModelDetailSideBar"; -import ProductOverview from "../ProductOverview"; -import { useAtomValue } from "jotai"; -import { - getActiveConvoIdAtom, - showingProductDetailAtom, -} from "@/_helpers/JotaiWrapper"; -import { ReactNode } from "react"; - -type Props = { - children: ReactNode; -}; - -export default function ChatContainer({ children }: Props) { - const activeConvoId = useAtomValue(getActiveConvoIdAtom); - const showingProductDetail = useAtomValue(showingProductDetailAtom); - - if (!activeConvoId) { - return ; - } - - return ( -
- {children} - {showingProductDetail ? : null} -
- ); -} diff --git a/web-client/app/_components/GenerativeSampleContainer/index.tsx b/web-client/app/_components/GenerativeSampleContainer/index.tsx deleted file mode 100644 index f42be8be3..000000000 --- a/web-client/app/_components/GenerativeSampleContainer/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import JanWelcomeTitle from "../JanWelcomeTitle"; -import { GetProductPromptsQuery, GetProductPromptsDocument } from "@/graphql"; -import { useQuery } from "@apollo/client"; -import { Product } from "@/_models/Product"; -import { useSetAtom } from "jotai"; -import { currentPromptAtom } from "@/_helpers/JotaiWrapper"; - -type Props = { - product: Product; -}; - -const GenerativeSampleContainer: React.FC = ({ product }) => { - const setCurrentPrompt = useSetAtom(currentPromptAtom); - const { data } = useQuery(GetProductPromptsDocument, { - variables: { productSlug: product.slug }, - }); - - return ( -
- -
-

- Create now -

-
- {data?.prompts.map((item) => ( - - ))} -
-
-
- ); -}; - -export default GenerativeSampleContainer; diff --git a/web-client/app/_components/Header/index.tsx b/web-client/app/_components/Header/index.tsx deleted file mode 100644 index 98a3a125d..000000000 --- a/web-client/app/_components/Header/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import UserProfileDropDown from "../UserProfileDropDown"; -import LoginButton from "../LoginButton"; -import HamburgerButton from "../HamburgerButton"; - -const Header: React.FC = () => ( -
- - - -
-); - -export default Header; diff --git a/web-client/app/_components/HistoryEmpty/index.tsx b/web-client/app/_components/HistoryEmpty/index.tsx deleted file mode 100644 index ed4f07f2c..000000000 --- a/web-client/app/_components/HistoryEmpty/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; - -const HistoryEmpty: React.FC = () => { - return ( -
- -

- Jan allows you to use 100s of AIs on your mobile phone -

- - Explore AIs - -
- ); -}; - -export default React.memo(HistoryEmpty); diff --git a/web-client/app/_components/LeftContainer/index.tsx b/web-client/app/_components/LeftContainer/index.tsx deleted file mode 100644 index 69f4c6aab..000000000 --- a/web-client/app/_components/LeftContainer/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -"use client"; - -import { useAtomValue } from "jotai"; -import AdvancedPrompt from "../AdvancedPrompt"; -import CompactSideBar from "../CompactSideBar"; -import LeftSidebar from "../LeftSidebar"; -import { showingAdvancedPromptAtom } from "@/_helpers/JotaiWrapper"; - -const LeftContainer: React.FC = () => { - const isShowingAdvPrompt = useAtomValue(showingAdvancedPromptAtom); - - if (isShowingAdvPrompt) { - return ( -
- - -
- ); - } - - return ; -}; - -export default LeftContainer; diff --git a/web-client/app/_components/LoadingIndicator.tsx b/web-client/app/_components/LoadingIndicator.tsx deleted file mode 100644 index 21220305d..000000000 --- a/web-client/app/_components/LoadingIndicator.tsx +++ /dev/null @@ -1,13 +0,0 @@ -const LoadingIndicator = () => { - let circleCommonClasses = "h-1.5 w-1.5 bg-current rounded-full"; - - return ( -
-
-
-
-
- ); -}; - -export default LoadingIndicator; diff --git a/web-client/app/_components/LoginButton/index.tsx b/web-client/app/_components/LoginButton/index.tsx deleted file mode 100644 index f2712eeaf..000000000 --- a/web-client/app/_components/LoginButton/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -"use client"; - -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; -import useSignIn from "@/_hooks/useSignIn"; - -const LoginButton: React.FC = () => { - const { signInWithKeyCloak } = useSignIn(); - const { user, loading } = useGetCurrentUser(); - - if (loading || user) { - return
; - } - - return ( -
- -
- ); -}; - -export default LoginButton; diff --git a/web-client/app/_components/MenuHeader/index.tsx b/web-client/app/_components/MenuHeader/index.tsx deleted file mode 100644 index f04f5d1b4..000000000 --- a/web-client/app/_components/MenuHeader/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Link from "next/link"; -import { Popover, Transition } from "@headlessui/react"; -import { Fragment } from "react"; -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; -import { useSetAtom } from "jotai"; -import { showConfirmSignOutModalAtom } from "@/_helpers/JotaiWrapper"; - -export const MenuHeader: React.FC = () => { - const setShowConfirmSignOutModal = useSetAtom(showConfirmSignOutModalAtom); - const { user } = useGetCurrentUser(); - - if (!user) { - return
; - } - - return ( - - -
-

- {user.displayName} -

- - {user.email} - -
-
- -
-
- - Privacy - -
- - Support - -
- - - ); -}; diff --git a/web-client/app/_components/ProductOverview/index.tsx b/web-client/app/_components/ProductOverview/index.tsx deleted file mode 100644 index 2ab063456..000000000 --- a/web-client/app/_components/ProductOverview/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import Slider from "../Slider"; -import ConversationalList from "../ConversationalList"; -import GenerateImageList from "../GenerateImageList"; -import Image from "next/image"; -import useGetProducts from "@/_hooks/useGetProducts"; - -const ProductOverview: React.FC = () => { - const { loading, featured, conversational, generativeArts } = - useGetProducts(); - - if (loading) { - return ( -
- loading -
- ); - } - - return ( -
- - - -
- ); -}; - -export default ProductOverview; diff --git a/web-client/app/_components/ShortcutList/index.tsx b/web-client/app/_components/ShortcutList/index.tsx deleted file mode 100644 index 2c2e9930f..000000000 --- a/web-client/app/_components/ShortcutList/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -"use client"; - -import React, { useEffect, useState } from "react"; -import ShortcutItem from "../ShortcutItem"; -import { GetProductsDocument, GetProductsQuery } from "@/graphql"; -import ExpandableHeader from "../ExpandableHeader"; -import { useQuery } from "@apollo/client"; -import { useAtomValue } from "jotai"; -import { searchAtom } from "@/_helpers/JotaiWrapper"; -import { Product, toProduct } from "@/_models/Product"; - -const ShortcutList: React.FC = () => { - const searchText = useAtomValue(searchAtom); - const { data } = useQuery(GetProductsDocument); - const [expand, setExpand] = useState(true); - const [featuredProducts, setFeaturedProducts] = useState([]); - - useEffect(() => { - if (data?.products) { - const products: Product[] = data.products.map((p) => toProduct(p)); - setFeaturedProducts( - [...(products || [])] - .sort(() => 0.5 - Math.random()) - .slice(0, 3) - .filter( - (e) => - searchText === "" || - e.name.toLowerCase().includes(searchText.toLowerCase()) - ) || [] - ); - } - }, [data?.products, searchText]); - - return ( -
- setExpand(!expand)} - /> - {expand ? ( -
- {featuredProducts.map((product) => ( - - ))} -
- ) : null} -
- ); -}; - -export default ShortcutList; diff --git a/web-client/app/_components/TryItYourself/index.tsx b/web-client/app/_components/TryItYourself/index.tsx deleted file mode 100644 index 707569a51..000000000 --- a/web-client/app/_components/TryItYourself/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { currentProductAtom, currentPromptAtom } from "@/_helpers/JotaiWrapper"; -import { GetProductPromptsQuery, GetProductPromptsDocument } from "@/graphql"; -import { useQuery } from "@apollo/client"; -import { useAtomValue, useSetAtom } from "jotai"; - -const TryItYourself = () => { - const setCurrentPrompt = useSetAtom(currentPromptAtom); - const product = useAtomValue(currentProductAtom); - const { data } = useQuery(GetProductPromptsDocument, { - variables: { productSlug: product?.slug ?? "" }, - }); - - if (!data || data.prompts.length === 0) { - return
; - } - - const promps = data.prompts; - - return ( -
-

Try it yourself

-
    - {promps.map((prompt, index) => ( - - ))} -
-
- ); -}; - -export default TryItYourself; diff --git a/web-client/app/_components/UserProfileDropDown/index.tsx b/web-client/app/_components/UserProfileDropDown/index.tsx deleted file mode 100644 index 3b2f10ca5..000000000 --- a/web-client/app/_components/UserProfileDropDown/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -"use client"; - -import React from "react"; -import { Popover } from "@headlessui/react"; -import { MenuHeader } from "../MenuHeader"; -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; - -const UserProfileDropDown: React.FC = () => { - const { loading, user } = useGetCurrentUser(); - - if (loading || !user) { - return
; - } - - return ( - - - - -
-

- {user.displayName} -

-
-
- -
-
- ); -}; - -export default UserProfileDropDown; diff --git a/web-client/app/_helpers/ApolloWrapper.tsx b/web-client/app/_helpers/ApolloWrapper.tsx deleted file mode 100644 index 8afcd2295..000000000 --- a/web-client/app/_helpers/ApolloWrapper.tsx +++ /dev/null @@ -1,74 +0,0 @@ -"use client"; - -import { - ApolloProvider, - ApolloClient, - InMemoryCache, - HttpLink, - concat, - split, -} from "@apollo/client"; -import { GraphQLWsLink } from "@apollo/client/link/subscriptions"; -import { setContext } from "@apollo/client/link/context"; -import { createClient } from "graphql-ws"; -import { getMainDefinition } from "@apollo/client/utilities"; -import { getAccessToken } from "@/_utils/tokenAccessor"; -import { ReactNode } from "react"; - -const authMiddleware = setContext(async (_, { headers }) => { - const token = await getAccessToken(); - return { - headers: { - ...headers, - ...(token && { authorization: token ? `Bearer ${token}` : "" }), - }, - }; -}); - -const wsLink = - typeof window !== "undefined" - ? new GraphQLWsLink( - createClient({ - url: `${process.env.NEXT_PUBLIC_GRAPHQL_ENGINE_WEB_SOCKET_URL}`, - connectionParams: async () => { - const token = await getAccessToken(); - return { - headers: { - Authorization: `Bearer ${token}`, - }, - }; - }, - }) - ) - : null; -const httpLink = new HttpLink({ - uri: `${process.env.NEXT_PUBLIC_GRAPHQL_ENGINE_URL}`, -}); - -const link = - typeof window !== "undefined" && wsLink != null - ? split( - ({ query }) => { - const definition = getMainDefinition(query); - return ( - definition.kind === "OperationDefinition" && - definition.operation === "subscription" - ); - }, - wsLink, - httpLink - ) - : httpLink; - -type Props = { - children: ReactNode; -}; - -export const ApolloWrapper: React.FC = ({ children }) => { - const client = new ApolloClient({ - link: concat(authMiddleware, link), - cache: new InMemoryCache(), - }); - - return {children}; -}; diff --git a/web-client/app/_hooks/useChatMessageSubscription.ts b/web-client/app/_hooks/useChatMessageSubscription.ts deleted file mode 100644 index 0cbb54bde..000000000 --- a/web-client/app/_hooks/useChatMessageSubscription.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - SubscribeMessageSubscription, - SubscribeMessageDocument, -} from "@/graphql"; -import { useSubscription } from "@apollo/client"; - -const useChatMessageSubscription = (messageId: string) => { - const { data, loading, error } = - useSubscription(SubscribeMessageDocument, { - variables: { id: messageId }, - }); - - return { data, loading, error }; -}; - -export default useChatMessageSubscription; diff --git a/web-client/app/_hooks/useChatMessages.ts b/web-client/app/_hooks/useChatMessages.ts deleted file mode 100644 index 47914edc0..000000000 --- a/web-client/app/_hooks/useChatMessages.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - addOldMessagesAtom, - conversationStatesAtom, - currentConversationAtom, - updateConversationHasMoreAtom, -} from "@/_helpers/JotaiWrapper"; -import { ChatMessage, toChatMessage } from "@/_models/ChatMessage"; -import { MESSAGE_PER_PAGE } from "@/_utils/const"; -import { - GetConversationMessagesQuery, - GetConversationMessagesDocument, - GetConversationMessagesQueryVariables, - MessageDetailFragment, -} from "@/graphql"; -import { useLazyQuery } from "@apollo/client"; -import { useAtomValue, useSetAtom } from "jotai"; -import { useEffect } from "react"; - -/** - * Custom hooks to get chat messages for current(active) conversation - * - * @param offset for pagination purpose - * @returns - */ -const useChatMessages = (offset = 0) => { - const addOldChatMessages = useSetAtom(addOldMessagesAtom); - const currentConvo = useAtomValue(currentConversationAtom); - if (!currentConvo) { - throw new Error("activeConversation is null"); - } - const convoStates = useAtomValue(conversationStatesAtom); - const updateConvoHasMore = useSetAtom(updateConversationHasMoreAtom); - const [getConversationMessages, { loading, error }] = - useLazyQuery(GetConversationMessagesDocument); - - useEffect(() => { - const hasMore = convoStates[currentConvo.id]?.hasMore ?? true; - if (!hasMore) return; - - const variables: GetConversationMessagesQueryVariables = { - conversation_id: currentConvo.id, - limit: MESSAGE_PER_PAGE, - offset: offset, - }; - - getConversationMessages({ variables }).then((data) => { - parseMessages(data.data?.messages ?? []).then((newMessages) => { - const isHasMore = newMessages.length === MESSAGE_PER_PAGE; - addOldChatMessages(newMessages); - updateConvoHasMore(currentConvo.id, isHasMore); - }); - }); - }, [offset, currentConvo.id]); - - return { - loading, - error, - hasMore: convoStates[currentConvo.id]?.hasMore ?? true, - }; -}; - -async function parseMessages( - messages: MessageDetailFragment[] -): Promise { - const newMessages: ChatMessage[] = []; - for (const m of messages) { - const chatMessage = await toChatMessage(m); - newMessages.push(chatMessage); - } - return newMessages; -} - -export default useChatMessages; diff --git a/web-client/app/_hooks/useCreateConversation.ts b/web-client/app/_hooks/useCreateConversation.ts deleted file mode 100644 index badf3ff4c..000000000 --- a/web-client/app/_hooks/useCreateConversation.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { - CreateConversationMutation, - CreateConversationDocument, - CreateConversationMutationVariables, -} from "@/graphql"; -import useGetCurrentUser from "./useGetCurrentUser"; -import { useMutation } from "@apollo/client"; -import useSignIn from "./useSignIn"; -import { useAtom, useSetAtom } from "jotai"; -import { - addNewConversationStateAtom, - setActiveConvoIdAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; -import { Conversation } from "@/_models/Conversation"; -import { Product } from "@/_models/Product"; -import { MessageSenderType, MessageType } from "@/_models/ChatMessage"; - -const useCreateConversation = () => { - const [userConversations, setUserConversations] = useAtom( - userConversationsAtom - ); - const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); - const addNewConvoState = useSetAtom(addNewConversationStateAtom); - const { user } = useGetCurrentUser(); - const { signInWithKeyCloak } = useSignIn(); - const [createConversation] = useMutation( - CreateConversationDocument - ); - - const requestCreateConvo = async ( - product: Product, - forceCreate: boolean = false - ) => { - if (!user) { - signInWithKeyCloak(); - return; - } - - // search if any fresh convo with particular product id - const convo = userConversations.find( - (convo) => convo.product.slug === product.slug - ); - - if (convo && !forceCreate) { - setActiveConvoId(convo.id); - return; - } - - const variables: CreateConversationMutationVariables = { - data: { - product_id: product.id, - user_id: user.id, - last_image_url: "", - last_text_message: product.greeting, - conversation_messages: { - data: [ - { - content: product.greeting || "Hello there 👋", - sender: MessageSenderType.Ai, - sender_name: product.name, - sender_avatar_url: product.avatarUrl, - message_type: MessageType.Text, - message_sender_type: MessageSenderType.Ai, - }, - ], - }, - }, - }; - const result = await createConversation({ - variables, - }); - const newConvo = result.data?.insert_conversations_one; - - if (newConvo) { - const mappedConvo: Conversation = { - id: newConvo.id, - product: product, - user: { - id: user.id, - displayName: user.displayName, - }, - lastTextMessage: newConvo.last_text_message ?? "", - createdAt: Date.now(), - updatedAt: Date.now(), - }; - addNewConvoState(newConvo.id, { - hasMore: true, - waitingForResponse: false, - }); - setUserConversations([...userConversations, mappedConvo]); - setActiveConvoId(newConvo.id); - } - // if not found, create new convo and set it as current - }; - - return { - requestCreateConvo, - }; -}; - -export default useCreateConversation; diff --git a/web-client/app/_hooks/useGetProducts.ts b/web-client/app/_hooks/useGetProducts.ts deleted file mode 100644 index a87c6537e..000000000 --- a/web-client/app/_hooks/useGetProducts.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ProductType, toProduct } from "@/_models/Product"; -import { GetProductsDocument, GetProductsQuery } from "@/graphql"; -import { useQuery } from "@apollo/client"; - -export default function useGetProducts() { - const { loading, data } = useQuery(GetProductsDocument, { - variables: { slug: "conversational" }, - }); - - const allProducts = (data?.products ?? []).map((e) => toProduct(e)); - - const featured = allProducts.sort(() => 0.5 - Math.random()).slice(0, 3); - const conversational = allProducts.filter((e) => e.type === ProductType.LLM); - const generativeArts = allProducts.filter( - (e) => e.type === ProductType.GenerativeArt - ); - - return { - loading, - featured, - conversational, - generativeArts, - }; -} diff --git a/web-client/app/_hooks/useGetUserConversations.ts b/web-client/app/_hooks/useGetUserConversations.ts deleted file mode 100644 index 883518d9b..000000000 --- a/web-client/app/_hooks/useGetUserConversations.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { GetConversationsQuery, GetConversationsDocument } from "@/graphql"; -import { useLazyQuery } from "@apollo/client"; -import { ConversationState, toConversation } from "@/_models/Conversation"; -import { useSetAtom } from "jotai"; -import { - conversationStatesAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; - -const useGetUserConversations = () => { - const setConversationStates = useSetAtom(conversationStatesAtom); - const setConversations = useSetAtom(userConversationsAtom); - const [getConvos] = useLazyQuery( - GetConversationsDocument - ); - - const getUserConversations = async () => { - const results = await getConvos(); - if (!results || !results.data || results.data.conversations.length === 0) { - return; - } - - const convos = results.data.conversations.map((e) => toConversation(e)); - const convoStates: Record = {}; - convos.forEach((convo) => { - convoStates[convo.id] = { - hasMore: true, - waitingForResponse: false, - }; - }); - setConversationStates(convoStates); - setConversations(convos); - }; - - return { - getUserConversations, - }; -}; - -export default useGetUserConversations; diff --git a/web-client/app/_hooks/useSendChatMessage.ts b/web-client/app/_hooks/useSendChatMessage.ts deleted file mode 100644 index c67f7c668..000000000 --- a/web-client/app/_hooks/useSendChatMessage.ts +++ /dev/null @@ -1,383 +0,0 @@ -import { - addNewMessageAtom, - currentChatMessagesAtom, - currentConversationAtom, - currentPromptAtom, - currentStreamingMessageAtom, - setConvoLastImageAtom, - setConvoUpdatedAtAtom, - updateConversationWaitingForResponseAtom, - updateMessageAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; -import { - ChatMessage, - MessageSenderType, - MessageStatus, - MessageType, -} from "@/_models/ChatMessage"; -import { Conversation } from "@/_models/Conversation"; -import { ProductType } from "@/_models/Product"; -import { - CreateMessageDocument, - CreateMessageMutation, - CreateMessageMutationVariables, - GenerateImageDocument, - GenerateImageMutation, - GenerateImageMutationVariables, - UpdateMessageMutation, - UpdateMessageDocument, - UpdateMessageMutationVariables, - UpdateConversationMutation, - UpdateConversationDocument, - UpdateConversationMutationVariables, -} from "@/graphql"; -import { useMutation } from "@apollo/client"; -import { useAtom, useAtomValue, useSetAtom } from "jotai"; -import useSignIn from "./useSignIn"; -import useGetCurrentUser from "./useGetCurrentUser"; -import { Role } from "@/_models/User"; - -export default function useSendChatMessage() { - const { user } = useGetCurrentUser(); - const { signInWithKeyCloak } = useSignIn(); - const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom); - const [userConversations, setUserConversations] = useAtom( - userConversationsAtom - ); - const addNewMessage = useSetAtom(addNewMessageAtom); - const activeConversation = useAtomValue(currentConversationAtom); - const currentMessages = useAtomValue(currentChatMessagesAtom); - const [createMessageMutation] = useMutation( - CreateMessageDocument - ); - const [updateMessageMutation] = useMutation( - UpdateMessageDocument - ); - const [updateConversationMutation] = useMutation( - UpdateConversationDocument - ); - const [imageGenerationMutation] = useMutation( - GenerateImageDocument - ); - const updateConvoWaitingState = useSetAtom( - updateConversationWaitingForResponseAtom - ); - const updateMessageText = useSetAtom(updateMessageAtom); - const [, setTextMessage] = useAtom(currentStreamingMessageAtom); - const setConvoLastImageUrl = useSetAtom(setConvoLastImageAtom); - const setConvoUpdateAt = useSetAtom(setConvoUpdatedAtAtom); - - const sendTextToTextMessage = async ( - conversation: Conversation, - latestUserMessage: ChatMessage - ) => { - // TODO: handle case timeout using higher order function - const messageToSend = [ - latestUserMessage, - ...currentMessages.slice(0, 4), - ].reverse(); - const latestMessages = messageToSend.map((e) => ({ - role: - e.messageSenderType === MessageSenderType.User - ? Role.User - : Role.Assistant, - content: e.text, - })); - - const variables: CreateMessageMutationVariables = { - data: { - conversation_id: conversation.id, - sender: MessageSenderType.Ai, - message_sender_type: MessageSenderType.Ai, - message_type: MessageType.Text, - sender_avatar_url: conversation.product.avatarUrl, - sender_name: conversation.product.name, - prompt_cache: latestMessages, - status: MessageStatus.Pending, - }, - }; - const result = await createMessageMutation({ - variables, - }); - - if (!result.data?.insert_messages_one?.id) { - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(conversation.id, false); - return; - } - - const aiResponseMessage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: conversation.id, - messageType: MessageType.Text, - messageSenderType: MessageSenderType.Ai, - senderUid: conversation.product.slug, - senderName: conversation.product.name, - senderAvatarUrl: conversation.product.avatarUrl ?? "/icons/app_icon.svg", - text: "", - status: MessageStatus.Pending, - createdAt: Date.now(), - }; - - setTextMessage(aiResponseMessage); - addNewMessage(aiResponseMessage); - - try { - const response = await fetch( - `${process.env.NEXT_PUBLIC_OPENAPI_ENDPOINT}`, - { - method: "POST", - cache: "no-cache", - keepalive: true, - headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - }, - body: JSON.stringify({ - messages: latestMessages, - model: "gpt-3.5-turbo", - stream: true, - max_tokens: 500, - }), - } - ); - if (!response.ok) { - updateMessageText( - aiResponseMessage.id, - conversation.id, - "There is an error while retrieving the result. Please try again later." - ); - } else { - const data = response.body; - if (!data) { - return; - } - const reader = data.getReader(); - const decoder = new TextDecoder(); - let done = false; - - let currentResponse: string = ""; - updateConvoWaitingState(conversation.id, false); - while (!done) { - const { value, done: doneReading } = await reader.read(); - done = doneReading; - const chunkValue = decoder.decode(value); - chunkValue.split("\n").forEach((chunk) => { - console.log("chunk", chunk); - const text = parsedBuffer(chunk) ?? ""; - currentResponse += text; - updateMessageText( - aiResponseMessage.id, - conversation.id, - currentResponse - ); - }); - } - mutateMessageText( - aiResponseMessage.id, - conversation.id, - currentResponse - ); - } - } catch (err) { - const errorText = - "There is an error while retrieving the result. Please try again later."; - updateMessageText(aiResponseMessage.id, conversation.id, errorText); - mutateMessageText(aiResponseMessage.id, conversation.id, errorText); - } - updateConvoWaitingState(conversation.id, false); - }; - - const sendTextToImageMessage = async (conversation: Conversation) => { - // TODO: handle case timeout using higher order function - const variables: GenerateImageMutationVariables = { - model: conversation.product.slug, - prompt: currentPrompt, - neg_prompt: "", - seed: Math.floor(Math.random() * 429496729), - steps: 30, - width: 512, - height: 512, - }; - - const data = await imageGenerationMutation({ - variables, - }); - - if (!data.data?.imageGeneration?.url) { - // TODO: display error - console.error("Error creating user message", JSON.stringify(data.errors)); - updateConvoWaitingState(conversation.id, false); - return; - } - - const imageUrl: string = data.data.imageGeneration.url; - - const createMessageVariables: CreateMessageMutationVariables = { - data: { - conversation_id: conversation.id, - content: currentPrompt, - sender: MessageSenderType.Ai, - message_sender_type: MessageSenderType.Ai, - message_type: MessageType.Image, - sender_avatar_url: conversation.product.avatarUrl, - sender_name: conversation.product.name, - status: MessageStatus.Ready, - message_medias: { - data: [ - { - media_url: imageUrl, - mime_type: "image/jpeg", - }, - ], - }, - }, - }; - const result = await createMessageMutation({ - variables: createMessageVariables, - }); - - if (!result.data?.insert_messages_one?.id) { - // TODO: display error - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(conversation.id, false); - return; - } - - const imageResponseMessage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: conversation.id, - messageType: MessageType.Image, - messageSenderType: MessageSenderType.Ai, - senderUid: conversation.product.slug, - senderName: conversation.product.name, - senderAvatarUrl: conversation.product.avatarUrl, - text: currentPrompt, - imageUrls: [imageUrl], - createdAt: Date.now(), - status: MessageStatus.Ready, - }; - - addNewMessage(imageResponseMessage); - setConvoUpdateAt(conversation.id); - setConvoLastImageUrl(conversation.id, imageUrl); - updateConvoWaitingState(conversation.id, false); - }; - - const sendChatMessage = async () => { - if (!user) { - signInWithKeyCloak(); - return; - } - if (currentPrompt.trim().length === 0) return; - - if (!activeConversation) { - console.error("No active conversation"); - return; - } - - updateConvoWaitingState(activeConversation.id, true); - const variables: CreateMessageMutationVariables = { - data: { - conversation_id: activeConversation.id, - content: currentPrompt, - sender: user.id, - message_sender_type: MessageSenderType.User, - message_type: MessageType.Text, - sender_avatar_url: user.avatarUrl, - sender_name: user.displayName, - }, - }; - const result = await createMessageMutation({ variables }); - - if (!result.data?.insert_messages_one?.id) { - // TODO: display error - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(activeConversation.id, false); - return; - } - - const userMesssage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: activeConversation.id, - messageType: MessageType.Text, - messageSenderType: MessageSenderType.User, - senderUid: user.id, - senderName: user.displayName, - senderAvatarUrl: user.avatarUrl ?? "/icons/app_icon.svg", - text: currentPrompt, - createdAt: Date.now(), - status: MessageStatus.Ready, - }; - - addNewMessage(userMesssage); - const newUserConversations = userConversations.map((e) => { - if (e.id === activeConversation.id) { - e.lastTextMessage = userMesssage.text; - } - return e; - }); - - setUserConversations(newUserConversations); - - if (activeConversation.product.type === ProductType.LLM) { - await sendTextToTextMessage(activeConversation, userMesssage); - setCurrentPrompt(""); - } else if (activeConversation.product.type === ProductType.GenerativeArt) { - await sendTextToImageMessage(activeConversation); - setCurrentPrompt(""); - } else { - console.error( - "We do not support this model type yet:", - activeConversation.product.type - ); - } - }; - - const parsedBuffer = (buffer: string) => { - try { - const json = buffer.replace("data: ", ""); - return JSON.parse(json).choices[0].delta.content; - } catch (e) { - return ""; - } - }; - - const mutateMessageText = ( - messageId: string, - convId: string, - text: string - ) => { - const variables: UpdateMessageMutationVariables = { - data: { - content: text, - status: MessageStatus.Ready, - }, - id: messageId, - }; - updateMessageMutation({ - variables, - }); - - updateConversationMutation({ - variables: { - id: convId, - lastMessageText: text, - }, - }); - }; - - return { - sendChatMessage, - }; -} diff --git a/web-client/app/_models/ChatMessage.ts b/web-client/app/_models/ChatMessage.ts deleted file mode 100644 index 083fa1d2c..000000000 --- a/web-client/app/_models/ChatMessage.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { MessageDetailFragment } from "@/graphql"; -import { remark } from "remark"; -import html from "remark-html"; - -export enum MessageType { - Text = "Text", - Image = "Image", - ImageWithText = "ImageWithText", - Error = "Error", -} - -export enum MessageSenderType { - Ai = "Ai", - User = "User", -} - -export enum MessageStatus { - Ready = "ready", - Pending = "pending", -} - -export interface ChatMessage { - id: string; - conversationId: string; - messageType: MessageType; - messageSenderType: MessageSenderType; - senderUid: string; - senderName: string; - senderAvatarUrl: string; - text: string | undefined; - imageUrls?: string[] | undefined; - createdAt: number; - status: MessageStatus; -} - -export const toChatMessage = async ( - m: MessageDetailFragment -): Promise => { - const createdAt = new Date(m.created_at).getTime(); - const imageUrls: string[] = []; - const imageUrl = - m.message_medias.length > 0 ? m.message_medias[0].media_url : null; - if (imageUrl) { - imageUrls.push(imageUrl); - } - - const messageType = m.message_type - ? MessageType[m.message_type as keyof typeof MessageType] - : MessageType.Text; - const messageSenderType = m.message_sender_type - ? MessageSenderType[m.message_sender_type as keyof typeof MessageSenderType] - : MessageSenderType.Ai; - - const content = m.content ?? ""; - const processedContent = await remark().use(html).process(content); - const contentHtml = processedContent.toString(); - - return { - id: m.id, - conversationId: m.conversation_id, - messageType: messageType, - messageSenderType: messageSenderType, - senderUid: m.sender, - senderName: m.sender_name ?? "", - senderAvatarUrl: m.sender_avatar_url ?? "/icons/app_icon.svg", - text: contentHtml, - imageUrls: imageUrls, - createdAt: createdAt, - status: m.status as MessageStatus, - }; -}; diff --git a/web-client/app/_models/Conversation.ts b/web-client/app/_models/Conversation.ts deleted file mode 100644 index 890c1c9e6..000000000 --- a/web-client/app/_models/Conversation.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ConversationDetailFragment } from "@/graphql"; -import { Product, toProduct } from "./Product"; - -export interface Conversation { - id: string; - product: Product; - createdAt: number; - updatedAt?: number; - lastImageUrl?: string; - lastTextMessage?: string; -} - -/** - * Store the state of conversation like fetching, waiting for response, etc. - */ -export type ConversationState = { - hasMore: boolean; - waitingForResponse: boolean; -}; - -export const toConversation = ( - convo: ConversationDetailFragment -): Conversation => { - const product = convo.conversation_product; - if (!product) { - throw new Error("Product is not defined"); - } - return { - id: convo.id, - product: toProduct(product), - lastImageUrl: convo.last_image_url ?? undefined, - lastTextMessage: convo.last_text_message ?? undefined, - createdAt: new Date(convo.created_at).getTime(), - updatedAt: convo.updated_at - ? new Date(convo.updated_at).getTime() - : undefined, - }; -}; diff --git a/web-client/app/_models/Product.ts b/web-client/app/_models/Product.ts deleted file mode 100644 index 570e0b3e3..000000000 --- a/web-client/app/_models/Product.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ProductDetailFragment } from "@/graphql"; -import { ProductInput } from "./ProductInput"; -import { ProductOutput } from "./ProductOutput"; - -export enum ProductType { - LLM = "LLM", - GenerativeArt = "GenerativeArt", - ControlNet = "ControlNet", -} - -export interface Product { - id: string; - slug: string; - name: string; - description: string; - avatarUrl: string; - longDescription: string; - technicalDescription: string; - author: string; - version: string; - modelUrl: string; - nsfw: boolean; - greeting: string; - type: ProductType; - inputs?: ProductInput; - outputs?: ProductOutput; - createdAt: number; - updatedAt?: number; -} - -export function toProduct( - productDetailFragment: ProductDetailFragment -): Product { - const { - id, - slug, - name, - description, - image_url, - long_description, - technical_description, - author, - version, - source_url, - nsfw, - greeting, - created_at, - updated_at, - } = productDetailFragment; - let modelType: ProductType | undefined = undefined; - if (productDetailFragment.inputs.slug === "llm") { - modelType = ProductType.LLM; - } else if (productDetailFragment.inputs.slug === "sd") { - modelType = ProductType.GenerativeArt; - } else if (productDetailFragment.inputs.slug === "controlnet") { - modelType = ProductType.ControlNet; - } else { - throw new Error("Model type not supported"); - } - - const product: Product = { - id, - slug, - name, - description: description ?? "", - avatarUrl: image_url ?? "/icons/app_icon.svg", - longDescription: long_description ?? "", - technicalDescription: technical_description ?? "", - author: author ?? "", - version: version ?? "", - modelUrl: source_url ?? "", - nsfw: nsfw ?? false, - greeting: greeting ?? "", - type: modelType, - createdAt: new Date(created_at).getTime(), - updatedAt: new Date(updated_at).getTime(), - }; - - return product; -} diff --git a/web-client/app/_services/controlnet.ts b/web-client/app/_services/controlnet.ts deleted file mode 100644 index 86c0a365a..000000000 --- a/web-client/app/_services/controlnet.ts +++ /dev/null @@ -1,42 +0,0 @@ -export const controlNetRequest = async ( - token: string, - prompt: string, - negPrompt: string, - fileInput: any -): Promise | undefined> => { - const formData = new FormData(); - - const advancedPrompt: AdvancedPrompt = { - prompt: prompt, - neg_prompt: negPrompt ?? "", - control_net_model: "controlnet_canny", - seed: 1024, - steps: 20, - control_scale: 1.0, - }; - - formData.append("file", fileInput); - formData.append("data", JSON.stringify(advancedPrompt)); - - const res = await fetch("https://sd-inference.jan.ai/controlnet_inference", { - method: "POST", - body: formData, - }); - - if (!res.ok) { - console.error("fetchConversations error", res); - return; - } - const body = await res.json(); - - return body.url; -}; - -export type AdvancedPrompt = { - prompt: string; - neg_prompt: string; - control_net_model: string; - seed: number; - steps: number; - control_scale: number; -}; diff --git a/web-client/app/_utils/tokenAccessor.ts b/web-client/app/_utils/tokenAccessor.ts deleted file mode 100644 index 90b9c88b6..000000000 --- a/web-client/app/_utils/tokenAccessor.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getSession } from "next-auth/react"; - -export async function getAccessToken() { - const session = await getSession(); - if (session) { - // @ts-ignore - return session.access_token; - } - return null; -} - -export async function getIdToken() { - const session = await getSession(); - if (session) { - // @ts-ignore - return session.id_token; - } - return null; -} diff --git a/web-client/app/api/auth/[...nextauth]/route.ts b/web-client/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index 474673d8b..000000000 --- a/web-client/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,74 +0,0 @@ -// @ts-nocheck -import NextAuth from "next-auth/next"; -import KeycloakProvider from "next-auth/providers/keycloak"; -import jwt_decode from "jwt-decode"; - -async function refreshAccessToken(token) { - const resp = await fetch(`${process.env.REFRESH_TOKEN_URL}`, { - headers: { "Content-Type": "application/x-www-form-urlencoded" }, - body: new URLSearchParams({ - client_id: process.env.KEYCLOAK_CLIENT_ID, - client_secret: process.env.KEYCLOAK_CLIENT_SECRET, - grant_type: "refresh_token", - refresh_token: token.refresh_token, - }), - method: "POST", - }); - const refreshToken = await resp.json(); - if (!resp.ok) throw refreshToken; - return { - ...token, - access_token: refreshToken.access_token, - decoded: jwt_decode(refreshToken.access_token), - id_token: refreshToken.id_token, - expired_at: Math.floor(Date.now() / 1000) + refreshToken.expired_in, - refresh_token: refreshToken.refresh_token, - }; -} - -export const authOptions = { - providers: [ - KeycloakProvider({ - clientId: `${process.env.KEYCLOAK_CLIENT_ID}`, - clientSecret: `${process.env.KEYCLOAK_CLIENT_SECRET}`, - issuer: `${process.env.AUTH_ISSUER}`, - }), - ], - secret: `${process.env.NEXTAUTH_SECRET}`, - callbacks: { - async jwt({ token, account }) { - const nowTimestamp = Math.floor(Date.now() / 1000); - if (account) { - token.decoded = jwt_decode(account.id_token); - token.access_token = account.access_token; - token.id_token = account.id_token; - token.expires_at = account.expires_at; - token.refresh_token = account.refresh_token; - return token; - } else if (nowTimestamp < token.expires_at) { - return token; - } else { - console.log("token is expired, refresh it"); - try { - const refreshedToken = await refreshAccessToken(token); - console.log("token is refreshed"); - return refreshedToken; - } catch (e) { - console.error("Error refreshing access token", e); - return { ...token, error: "RefreshAccessTokenError" }; - } - } - }, - async session({ session, token }) { - session.access_token = token.access_token; - session.id_token = token.id_token; - session.user.user_id = token.sub; - session.error = token.error; - return session; - }, - }, -}; - -const handler = NextAuth(authOptions); - -export { handler as GET, handler as POST }; diff --git a/web-client/app/api/auth/logout/route.ts b/web-client/app/api/auth/logout/route.ts deleted file mode 100644 index 8f1f02d0b..000000000 --- a/web-client/app/api/auth/logout/route.ts +++ /dev/null @@ -1,23 +0,0 @@ -// @ts-nocheck -import { getServerSession } from "next-auth"; -import { authOptions } from "../[...nextauth]/route"; - -export async function GET() { - const session = await getServerSession(authOptions); - if (session) { - const url = `${process.env.END_SESSION_URL}?id_token_hint=${ - session.id_token - }&post_logout_redirect_uri=${encodeURIComponent( - process.env.NEXTAUTH_URL ?? "/" - )}`; - - try { - await fetch(url, { method: "GET" }); - } catch (e) { - console.error(e); - return new Response({ status: 500 }); - } - } - - return new Response({ status: 200 }); -} diff --git a/web-client/app/api/openai/route.ts b/web-client/app/api/openai/route.ts deleted file mode 100644 index 4ed892ccb..000000000 --- a/web-client/app/api/openai/route.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { OpenAI } from "openai-streams"; - -export async function POST(req: Request) { - const { messages } = await req.json(); - if (!messages) { - return new Response(null, { - status: 400, - statusText: "Did not include `messages` parameter", - }); - } - const completionsStream = await OpenAI( - "chat", - { - model: "gpt-3.5-turbo", - stream: true, - messages, - max_tokens: 500, - }, - { - apiBase: process.env.OPENAPI_ENDPOINT, - apiKey: process.env.OPENAPI_KEY, - } - ); - - return new Response(completionsStream); -} diff --git a/web-client/app/download/page.tsx b/web-client/app/download/page.tsx deleted file mode 100644 index a14d34612..000000000 --- a/web-client/app/download/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useEffect } from "react"; -import { redirect } from "next/navigation"; - -const Page = () => { - useEffect(() => { - var userAgent = navigator.userAgent || navigator.vendor; - // iOS detection from: http://stackoverflow.com/a/9039885/177710 - if (/iPad|iPhone|iPod/.test(userAgent)) { - window.open(process.env.NEXT_PUBLIC_DOWNLOAD_APP_IOS, "_blank_"); - } else { - window.open(process.env.NEXT_PUBLIC_DOWNLOAD_APP_ANDROID, "_blank_"); - } - redirect("/", undefined); - }, []); - return <>; -}; -export default Page; diff --git a/web-client/app/layout.tsx b/web-client/app/layout.tsx deleted file mode 100644 index 1ebe5f4d0..000000000 --- a/web-client/app/layout.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import "./globals.css"; -import { Inter } from "next/font/google"; -import classNames from "classnames"; -import { Metadata } from "next"; -import SessionProviderWrapper from "@/_components/SessionProviderWrapper"; - -const inter = Inter({ subsets: ["latin"] }); - -export const metadata: Metadata = { - title: "Jan", - description: - "Self-hosted, local, AI Inference Platform that scales from personal use to production deployments for a team.", - metadataBase: new URL( - process.env.NEXT_PUBLIC_WEB_URL ?? "https://cloud.jan.ai" - ), - openGraph: { - images: "/images/preview.jpg", - }, -}; - -type Props = { - children: React.ReactNode; -}; - -export default function RootLayout({ children }: Props) { - return ( - - {/* suppressHydrationWarning is for next-themes */} - - {children} - - - ); -} diff --git a/web-client/app/page.tsx b/web-client/app/page.tsx deleted file mode 100644 index 8112809d1..000000000 --- a/web-client/app/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { ApolloWrapper } from "./_helpers/ApolloWrapper"; -import { ThemeWrapper } from "./_helpers/ThemeWrapper"; -import JotaiWrapper from "./_helpers/JotaiWrapper"; -import LeftContainer from "./_components/LeftContainer"; -import RightContainer from "./_components/RightContainer"; -import { ModalWrapper } from "./_helpers/ModalWrapper"; - -const Page: React.FC = () => ( - - - - -
- - -
-
-
-
-
-); - -export default Page; diff --git a/web-client/codegen.ts b/web-client/codegen.ts deleted file mode 100644 index 521d0fe29..000000000 --- a/web-client/codegen.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { CodegenConfig } from "@graphql-codegen/cli"; -import dotenv from "dotenv"; -dotenv.config(); - -const config: CodegenConfig = { - overwrite: true, - schema: { - "http://localhost:8080/v1/graphql": { - headers: { - "x-hasura-admin-secret": process.env.HASURA_ADMIN_TOKEN || "", - }, - }, - }, - documents: "graphql/**/*.graphql", - generates: { - "graphql/generated/": { - preset: "client", - plugins: [], - presetConfig: { - gqlTagName: "gql", - fragmentMasking: false, - }, - }, - }, -}; - -export default config; diff --git a/web-client/graphql/fragments/collection.graphql b/web-client/graphql/fragments/collection.graphql deleted file mode 100644 index fdbb34cd5..000000000 --- a/web-client/graphql/fragments/collection.graphql +++ /dev/null @@ -1,4 +0,0 @@ -fragment CollectionDetail on collections { - slug - name -} \ No newline at end of file diff --git a/web-client/graphql/fragments/conversation.graphql b/web-client/graphql/fragments/conversation.graphql deleted file mode 100644 index 621c0cb71..000000000 --- a/web-client/graphql/fragments/conversation.graphql +++ /dev/null @@ -1,12 +0,0 @@ -fragment ConversationDetail on conversations { - id - product_id - user_id - last_image_url - last_text_message - created_at - updated_at - conversation_product { - ...ProductDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/fragments/media.graphql b/web-client/graphql/fragments/media.graphql deleted file mode 100644 index bb905ef98..000000000 --- a/web-client/graphql/fragments/media.graphql +++ /dev/null @@ -1,7 +0,0 @@ -fragment MessageMedia on message_medias { - id - message_id - media_url - mime_type - updated_at -} diff --git a/web-client/graphql/fragments/message.graphql b/web-client/graphql/fragments/message.graphql deleted file mode 100644 index eee01ec93..000000000 --- a/web-client/graphql/fragments/message.graphql +++ /dev/null @@ -1,16 +0,0 @@ -fragment MessageDetail on messages { - id - conversation_id - sender - sender_name - sender_avatar_url - content - message_type - message_sender_type - created_at - updated_at - status - message_medias { - ...MessageMedia - } -} \ No newline at end of file diff --git a/web-client/graphql/fragments/product.graphql b/web-client/graphql/fragments/product.graphql deleted file mode 100644 index 9717b63f5..000000000 --- a/web-client/graphql/fragments/product.graphql +++ /dev/null @@ -1,18 +0,0 @@ -fragment ProductDetail on products { - id - name - slug - description - long_description - technical_description - image_url - author - greeting - source_url - version - inputs - outputs - nsfw - created_at - updated_at -} \ No newline at end of file diff --git a/web-client/graphql/fragments/prompt.graphql b/web-client/graphql/fragments/prompt.graphql deleted file mode 100644 index 4281e844a..000000000 --- a/web-client/graphql/fragments/prompt.graphql +++ /dev/null @@ -1,5 +0,0 @@ -fragment PromptDetail on prompts { - slug - content - image_url -} diff --git a/web-client/graphql/generated/gql.ts b/web-client/graphql/generated/gql.ts deleted file mode 100644 index 425e7cc21..000000000 --- a/web-client/graphql/generated/gql.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* eslint-disable */ -import * as types from './graphql'; -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; - -/** - * Map of all GraphQL operations in the project. - * - * This map has several performance disadvantages: - * 1. It is not tree-shakeable, so it will include all operations in the project. - * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. - * 3. It does not support dead code elimination, so it will add unused operations. - * - * Therefore it is highly recommended to use the babel or swc plugin for production. - */ -const documents = { - "fragment CollectionDetail on collections {\n slug\n name\n}": types.CollectionDetailFragmentDoc, - "fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}": types.ConversationDetailFragmentDoc, - "fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}": types.MessageMediaFragmentDoc, - "fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}": types.MessageDetailFragmentDoc, - "fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}": types.ProductDetailFragmentDoc, - "fragment PromptDetail on prompts {\n slug\n content\n image_url\n}": types.PromptDetailFragmentDoc, - "mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}": types.CreateConversationDocument, - "mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}": types.CreateMessageDocument, - "mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}": types.DeleteConversationDocument, - "mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}": types.GenerateImageDocument, - "mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}": types.UpdateConversationDocument, - "mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}": types.UpdateMessageDocument, - "query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}": types.GetCollectionsDocument, - "query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}": types.GetConversationMessagesDocument, - "query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}": types.GetConversationsDocument, - "query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}": types.GetProductsByCollectionSlugDocument, - "query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}": types.GetProductPromptsDocument, - "query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}": types.GetProductsDocument, - "query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}": types.GetProductsInDocument, - "subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}": types.SubscribeMessageDocument, -}; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - * - * - * @example - * ```ts - * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); - * ``` - * - * The query argument is unknown! - * Please regenerate the types. - */ -export function gql(source: string): unknown; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment CollectionDetail on collections {\n slug\n name\n}"): (typeof documents)["fragment CollectionDetail on collections {\n slug\n name\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}"): (typeof documents)["fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}"): (typeof documents)["fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}"): (typeof documents)["fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}"): (typeof documents)["fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment PromptDetail on prompts {\n slug\n content\n image_url\n}"): (typeof documents)["fragment PromptDetail on prompts {\n slug\n content\n image_url\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}"): (typeof documents)["mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}"): (typeof documents)["mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}"): (typeof documents)["mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}"): (typeof documents)["mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}"): (typeof documents)["mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}"): (typeof documents)["mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}"): (typeof documents)["query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}"): (typeof documents)["query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}"): (typeof documents)["query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"): (typeof documents)["query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}"): (typeof documents)["query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"): (typeof documents)["query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}"): (typeof documents)["query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}"): (typeof documents)["subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}"]; - -export function gql(source: string) { - return (documents as any)[source] ?? {}; -} - -export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/web-client/graphql/generated/graphql.ts b/web-client/graphql/generated/graphql.ts deleted file mode 100644 index 1734c7b91..000000000 --- a/web-client/graphql/generated/graphql.ts +++ /dev/null @@ -1,3774 +0,0 @@ -/* eslint-disable */ -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type MakeEmpty = { [_ in K]?: never }; -export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - jsonb: { input: any; output: any; } - timestamptz: { input: any; output: any; } - uuid: { input: any; output: any; } -}; - -/** Boolean expression to compare columns of type "Boolean". All fields are combined with logical 'AND'. */ -export type Boolean_Comparison_Exp = { - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - _in?: InputMaybe>; - _is_null?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - _nin?: InputMaybe>; -}; - -export type ImageGenerationInput = { - height: Scalars['Int']['input']; - model: Scalars['String']['input']; - neg_prompt: Scalars['String']['input']; - prompt: Scalars['String']['input']; - seed: Scalars['Int']['input']; - steps: Scalars['Int']['input']; - width: Scalars['Int']['input']; -}; - -export type ImageGenerationOutput = { - __typename?: 'ImageGenerationOutput'; - url: Scalars['String']['output']; -}; - -/** Boolean expression to compare columns of type "Int". All fields are combined with logical 'AND'. */ -export type Int_Comparison_Exp = { - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - _in?: InputMaybe>; - _is_null?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - _nin?: InputMaybe>; -}; - -/** Boolean expression to compare columns of type "String". All fields are combined with logical 'AND'. */ -export type String_Comparison_Exp = { - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - /** does the column match the given case-insensitive pattern */ - _ilike?: InputMaybe; - _in?: InputMaybe>; - /** does the column match the given POSIX regular expression, case insensitive */ - _iregex?: InputMaybe; - _is_null?: InputMaybe; - /** does the column match the given pattern */ - _like?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - /** does the column NOT match the given case-insensitive pattern */ - _nilike?: InputMaybe; - _nin?: InputMaybe>; - /** does the column NOT match the given POSIX regular expression, case insensitive */ - _niregex?: InputMaybe; - /** does the column NOT match the given pattern */ - _nlike?: InputMaybe; - /** does the column NOT match the given POSIX regular expression, case sensitive */ - _nregex?: InputMaybe; - /** does the column NOT match the given SQL regular expression */ - _nsimilar?: InputMaybe; - /** does the column match the given POSIX regular expression, case sensitive */ - _regex?: InputMaybe; - /** does the column match the given SQL regular expression */ - _similar?: InputMaybe; -}; - -/** columns and relationships of "collection_products" */ -export type Collection_Products = { - __typename?: 'collection_products'; - collection_id: Scalars['uuid']['output']; - /** An array relationship */ - collections: Array; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - product_id: Scalars['uuid']['output']; - /** An array relationship */ - products: Array; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsCollectionsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsCollections_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsProducts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "collection_products" */ -export type Collection_Products_Aggregate = { - __typename?: 'collection_products_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Collection_Products_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Collection_Products_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "collection_products" */ -export type Collection_Products_Aggregate_Fields = { - __typename?: 'collection_products_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "collection_products" */ -export type Collection_Products_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "collection_products" */ -export type Collection_Products_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "collection_products" */ -export type Collection_Products_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "collection_products". All fields are combined with a logical 'AND'. */ -export type Collection_Products_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - collection_id?: InputMaybe; - collections?: InputMaybe; - collections_aggregate?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products?: InputMaybe; - products_aggregate?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "collection_products" */ -export enum Collection_Products_Constraint { - /** unique or primary key constraint on columns "product_id", "collection_id" */ - CollectionProductsCollectionIdProductIdKey = 'collection_products_collection_id_product_id_key', - /** unique or primary key constraint on columns "id" */ - CollectionProductsPkey = 'collection_products_pkey' -} - -/** input type for inserting data into table "collection_products" */ -export type Collection_Products_Insert_Input = { - collection_id?: InputMaybe; - collections?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Collection_Products_Max_Fields = { - __typename?: 'collection_products_max_fields'; - collection_id?: Maybe; - created_at?: Maybe; - id?: Maybe; - product_id?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "collection_products" */ -export type Collection_Products_Max_Order_By = { - collection_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Collection_Products_Min_Fields = { - __typename?: 'collection_products_min_fields'; - collection_id?: Maybe; - created_at?: Maybe; - id?: Maybe; - product_id?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "collection_products" */ -export type Collection_Products_Min_Order_By = { - collection_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "collection_products" */ -export type Collection_Products_Mutation_Response = { - __typename?: 'collection_products_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** on_conflict condition type for table "collection_products" */ -export type Collection_Products_On_Conflict = { - constraint: Collection_Products_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "collection_products". */ -export type Collection_Products_Order_By = { - collection_id?: InputMaybe; - collections_aggregate?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products_aggregate?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: collection_products */ -export type Collection_Products_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "collection_products" */ -export enum Collection_Products_Select_Column { - /** column name */ - CollectionId = 'collection_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "collection_products" */ -export type Collection_Products_Set_Input = { - collection_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "collection_products" */ -export type Collection_Products_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Collection_Products_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Collection_Products_Stream_Cursor_Value_Input = { - collection_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "collection_products" */ -export enum Collection_Products_Update_Column { - /** column name */ - CollectionId = 'collection_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Collection_Products_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Collection_Products_Bool_Exp; -}; - -/** columns and relationships of "collections" */ -export type Collections = { - __typename?: 'collections'; - /** An array relationship */ - collection_products: Array; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - created_at: Scalars['timestamptz']['output']; - description: Scalars['String']['output']; - id: Scalars['uuid']['output']; - name: Scalars['String']['output']; - slug: Scalars['String']['output']; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "collections" */ -export type CollectionsCollection_ProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "collections" */ -export type CollectionsCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "collections" */ -export type Collections_Aggregate = { - __typename?: 'collections_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Collections_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Collections_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "collections" */ -export type Collections_Aggregate_Fields = { - __typename?: 'collections_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "collections" */ -export type Collections_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "collections" */ -export type Collections_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "collections" */ -export type Collections_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "collections". All fields are combined with a logical 'AND'. */ -export type Collections_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - collection_products?: InputMaybe; - collection_products_aggregate?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "collections" */ -export enum Collections_Constraint { - /** unique or primary key constraint on columns "id" */ - CollectionsPkey = 'collections_pkey', - /** unique or primary key constraint on columns "slug" */ - CollectionsSlugKey = 'collections_slug_key' -} - -/** input type for inserting data into table "collections" */ -export type Collections_Insert_Input = { - collection_products?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Collections_Max_Fields = { - __typename?: 'collections_max_fields'; - created_at?: Maybe; - description?: Maybe; - id?: Maybe; - name?: Maybe; - slug?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "collections" */ -export type Collections_Max_Order_By = { - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Collections_Min_Fields = { - __typename?: 'collections_min_fields'; - created_at?: Maybe; - description?: Maybe; - id?: Maybe; - name?: Maybe; - slug?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "collections" */ -export type Collections_Min_Order_By = { - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "collections" */ -export type Collections_Mutation_Response = { - __typename?: 'collections_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** on_conflict condition type for table "collections" */ -export type Collections_On_Conflict = { - constraint: Collections_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "collections". */ -export type Collections_Order_By = { - collection_products_aggregate?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: collections */ -export type Collections_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "collections" */ -export enum Collections_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Id = 'id', - /** column name */ - Name = 'name', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "collections" */ -export type Collections_Set_Input = { - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "collections" */ -export type Collections_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Collections_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Collections_Stream_Cursor_Value_Input = { - created_at?: InputMaybe; - description?: InputMaybe; - id?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "collections" */ -export enum Collections_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Id = 'id', - /** column name */ - Name = 'name', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Collections_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Collections_Bool_Exp; -}; - -/** columns and relationships of "conversations" */ -export type Conversations = { - __typename?: 'conversations'; - /** An array relationship */ - conversation_messages: Array; - /** An aggregate relationship */ - conversation_messages_aggregate: Messages_Aggregate; - /** An object relationship */ - conversation_product?: Maybe; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - last_image_url?: Maybe; - last_text_message?: Maybe; - product_id: Scalars['uuid']['output']; - updated_at: Scalars['timestamptz']['output']; - user_id: Scalars['String']['output']; -}; - - -/** columns and relationships of "conversations" */ -export type ConversationsConversation_MessagesArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "conversations" */ -export type ConversationsConversation_Messages_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "conversations" */ -export type Conversations_Aggregate = { - __typename?: 'conversations_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -/** aggregate fields of "conversations" */ -export type Conversations_Aggregate_Fields = { - __typename?: 'conversations_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "conversations" */ -export type Conversations_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "conversations". All fields are combined with a logical 'AND'. */ -export type Conversations_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - conversation_messages?: InputMaybe; - conversation_messages_aggregate?: InputMaybe; - conversation_product?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - last_image_url?: InputMaybe; - last_text_message?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; - user_id?: InputMaybe; -}; - -/** unique or primary key constraints on table "conversations" */ -export enum Conversations_Constraint { - /** unique or primary key constraint on columns "id" */ - ConversationsPkey = 'conversations_pkey' -} - -/** input type for inserting data into table "conversations" */ -export type Conversations_Insert_Input = { - conversation_messages?: InputMaybe; - conversation_product?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - last_image_url?: InputMaybe; - last_text_message?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; - user_id?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Conversations_Max_Fields = { - __typename?: 'conversations_max_fields'; - created_at?: Maybe; - id?: Maybe; - last_image_url?: Maybe; - last_text_message?: Maybe; - product_id?: Maybe; - updated_at?: Maybe; - user_id?: Maybe; -}; - -/** aggregate min on columns */ -export type Conversations_Min_Fields = { - __typename?: 'conversations_min_fields'; - created_at?: Maybe; - id?: Maybe; - last_image_url?: Maybe; - last_text_message?: Maybe; - product_id?: Maybe; - updated_at?: Maybe; - user_id?: Maybe; -}; - -/** response of any mutation on the table "conversations" */ -export type Conversations_Mutation_Response = { - __typename?: 'conversations_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** input type for inserting object relation for remote table "conversations" */ -export type Conversations_Obj_Rel_Insert_Input = { - data: Conversations_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** on_conflict condition type for table "conversations" */ -export type Conversations_On_Conflict = { - constraint: Conversations_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "conversations". */ -export type Conversations_Order_By = { - conversation_messages_aggregate?: InputMaybe; - conversation_product?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - last_image_url?: InputMaybe; - last_text_message?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; - user_id?: InputMaybe; -}; - -/** primary key columns input for table: conversations */ -export type Conversations_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "conversations" */ -export enum Conversations_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - LastImageUrl = 'last_image_url', - /** column name */ - LastTextMessage = 'last_text_message', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - UserId = 'user_id' -} - -/** input type for updating data in table "conversations" */ -export type Conversations_Set_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - last_image_url?: InputMaybe; - last_text_message?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; - user_id?: InputMaybe; -}; - -/** Streaming cursor of the table "conversations" */ -export type Conversations_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Conversations_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Conversations_Stream_Cursor_Value_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - last_image_url?: InputMaybe; - last_text_message?: InputMaybe; - product_id?: InputMaybe; - updated_at?: InputMaybe; - user_id?: InputMaybe; -}; - -/** update columns of table "conversations" */ -export enum Conversations_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - LastImageUrl = 'last_image_url', - /** column name */ - LastTextMessage = 'last_text_message', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - UserId = 'user_id' -} - -export type Conversations_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Conversations_Bool_Exp; -}; - -/** ordering argument of a cursor */ -export enum Cursor_Ordering { - /** ascending ordering of the cursor */ - Asc = 'ASC', - /** descending ordering of the cursor */ - Desc = 'DESC' -} - -export type Jsonb_Cast_Exp = { - String?: InputMaybe; -}; - -/** Boolean expression to compare columns of type "jsonb". All fields are combined with logical 'AND'. */ -export type Jsonb_Comparison_Exp = { - _cast?: InputMaybe; - /** is the column contained in the given json value */ - _contained_in?: InputMaybe; - /** does the column contain the given json value at the top level */ - _contains?: InputMaybe; - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - /** does the string exist as a top-level key in the column */ - _has_key?: InputMaybe; - /** do all of these strings exist as top-level keys in the column */ - _has_keys_all?: InputMaybe>; - /** do any of these strings exist as top-level keys in the column */ - _has_keys_any?: InputMaybe>; - _in?: InputMaybe>; - _is_null?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - _nin?: InputMaybe>; -}; - -/** columns and relationships of "message_medias" */ -export type Message_Medias = { - __typename?: 'message_medias'; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - /** An object relationship */ - media_message?: Maybe; - media_url?: Maybe; - message_id: Scalars['uuid']['output']; - mime_type?: Maybe; - updated_at: Scalars['timestamptz']['output']; -}; - -/** aggregated selection of "message_medias" */ -export type Message_Medias_Aggregate = { - __typename?: 'message_medias_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Message_Medias_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Message_Medias_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "message_medias" */ -export type Message_Medias_Aggregate_Fields = { - __typename?: 'message_medias_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "message_medias" */ -export type Message_Medias_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "message_medias" */ -export type Message_Medias_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "message_medias" */ -export type Message_Medias_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "message_medias". All fields are combined with a logical 'AND'. */ -export type Message_Medias_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - created_at?: InputMaybe; - id?: InputMaybe; - media_message?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "message_medias" */ -export enum Message_Medias_Constraint { - /** unique or primary key constraint on columns "id" */ - MessageMediasPkey = 'message_medias_pkey' -} - -/** input type for inserting data into table "message_medias" */ -export type Message_Medias_Insert_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - media_message?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Message_Medias_Max_Fields = { - __typename?: 'message_medias_max_fields'; - created_at?: Maybe; - id?: Maybe; - media_url?: Maybe; - message_id?: Maybe; - mime_type?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "message_medias" */ -export type Message_Medias_Max_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Message_Medias_Min_Fields = { - __typename?: 'message_medias_min_fields'; - created_at?: Maybe; - id?: Maybe; - media_url?: Maybe; - message_id?: Maybe; - mime_type?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "message_medias" */ -export type Message_Medias_Min_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "message_medias" */ -export type Message_Medias_Mutation_Response = { - __typename?: 'message_medias_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** on_conflict condition type for table "message_medias" */ -export type Message_Medias_On_Conflict = { - constraint: Message_Medias_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "message_medias". */ -export type Message_Medias_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - media_message?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: message_medias */ -export type Message_Medias_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "message_medias" */ -export enum Message_Medias_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MediaUrl = 'media_url', - /** column name */ - MessageId = 'message_id', - /** column name */ - MimeType = 'mime_type', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "message_medias" */ -export type Message_Medias_Set_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "message_medias" */ -export type Message_Medias_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Message_Medias_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Message_Medias_Stream_Cursor_Value_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - media_url?: InputMaybe; - message_id?: InputMaybe; - mime_type?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "message_medias" */ -export enum Message_Medias_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MediaUrl = 'media_url', - /** column name */ - MessageId = 'message_id', - /** column name */ - MimeType = 'mime_type', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Message_Medias_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Message_Medias_Bool_Exp; -}; - -/** columns and relationships of "messages" */ -export type Messages = { - __typename?: 'messages'; - content?: Maybe; - conversation_id: Scalars['uuid']['output']; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - /** An object relationship */ - message_conversation?: Maybe; - /** An array relationship */ - message_medias: Array; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - message_sender_type?: Maybe; - message_type?: Maybe; - prompt_cache?: Maybe; - sender: Scalars['String']['output']; - sender_avatar_url?: Maybe; - sender_name?: Maybe; - status?: Maybe; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "messages" */ -export type MessagesMessage_MediasArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "messages" */ -export type MessagesMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "messages" */ -export type MessagesPrompt_CacheArgs = { - path?: InputMaybe; -}; - -/** aggregated selection of "messages" */ -export type Messages_Aggregate = { - __typename?: 'messages_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Messages_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Messages_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "messages" */ -export type Messages_Aggregate_Fields = { - __typename?: 'messages_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "messages" */ -export type Messages_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "messages" */ -export type Messages_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** append existing jsonb value of filtered columns with new jsonb value */ -export type Messages_Append_Input = { - prompt_cache?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "messages" */ -export type Messages_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "messages". All fields are combined with a logical 'AND'. */ -export type Messages_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_conversation?: InputMaybe; - message_medias?: InputMaybe; - message_medias_aggregate?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - prompt_cache?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "messages" */ -export enum Messages_Constraint { - /** unique or primary key constraint on columns "id" */ - MessagesPkey = 'messages_pkey' -} - -/** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ -export type Messages_Delete_At_Path_Input = { - prompt_cache?: InputMaybe>; -}; - -/** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ -export type Messages_Delete_Elem_Input = { - prompt_cache?: InputMaybe; -}; - -/** delete key/value pair or string element. key/value pairs are matched based on their key value */ -export type Messages_Delete_Key_Input = { - prompt_cache?: InputMaybe; -}; - -/** input type for inserting data into table "messages" */ -export type Messages_Insert_Input = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_conversation?: InputMaybe; - message_medias?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - prompt_cache?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Messages_Max_Fields = { - __typename?: 'messages_max_fields'; - content?: Maybe; - conversation_id?: Maybe; - created_at?: Maybe; - id?: Maybe; - message_sender_type?: Maybe; - message_type?: Maybe; - sender?: Maybe; - sender_avatar_url?: Maybe; - sender_name?: Maybe; - status?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "messages" */ -export type Messages_Max_Order_By = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Messages_Min_Fields = { - __typename?: 'messages_min_fields'; - content?: Maybe; - conversation_id?: Maybe; - created_at?: Maybe; - id?: Maybe; - message_sender_type?: Maybe; - message_type?: Maybe; - sender?: Maybe; - sender_avatar_url?: Maybe; - sender_name?: Maybe; - status?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "messages" */ -export type Messages_Min_Order_By = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "messages" */ -export type Messages_Mutation_Response = { - __typename?: 'messages_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** input type for inserting object relation for remote table "messages" */ -export type Messages_Obj_Rel_Insert_Input = { - data: Messages_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** on_conflict condition type for table "messages" */ -export type Messages_On_Conflict = { - constraint: Messages_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "messages". */ -export type Messages_Order_By = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_conversation?: InputMaybe; - message_medias_aggregate?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - prompt_cache?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: messages */ -export type Messages_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** prepend existing jsonb value of filtered columns with new jsonb value */ -export type Messages_Prepend_Input = { - prompt_cache?: InputMaybe; -}; - -/** select columns of table "messages" */ -export enum Messages_Select_Column { - /** column name */ - Content = 'content', - /** column name */ - ConversationId = 'conversation_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MessageSenderType = 'message_sender_type', - /** column name */ - MessageType = 'message_type', - /** column name */ - PromptCache = 'prompt_cache', - /** column name */ - Sender = 'sender', - /** column name */ - SenderAvatarUrl = 'sender_avatar_url', - /** column name */ - SenderName = 'sender_name', - /** column name */ - Status = 'status', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "messages" */ -export type Messages_Set_Input = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - prompt_cache?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "messages" */ -export type Messages_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Messages_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Messages_Stream_Cursor_Value_Input = { - content?: InputMaybe; - conversation_id?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - message_sender_type?: InputMaybe; - message_type?: InputMaybe; - prompt_cache?: InputMaybe; - sender?: InputMaybe; - sender_avatar_url?: InputMaybe; - sender_name?: InputMaybe; - status?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "messages" */ -export enum Messages_Update_Column { - /** column name */ - Content = 'content', - /** column name */ - ConversationId = 'conversation_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MessageSenderType = 'message_sender_type', - /** column name */ - MessageType = 'message_type', - /** column name */ - PromptCache = 'prompt_cache', - /** column name */ - Sender = 'sender', - /** column name */ - SenderAvatarUrl = 'sender_avatar_url', - /** column name */ - SenderName = 'sender_name', - /** column name */ - Status = 'status', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Messages_Updates = { - /** append existing jsonb value of filtered columns with new jsonb value */ - _append?: InputMaybe; - /** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ - _delete_at_path?: InputMaybe; - /** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ - _delete_elem?: InputMaybe; - /** delete key/value pair or string element. key/value pairs are matched based on their key value */ - _delete_key?: InputMaybe; - /** prepend existing jsonb value of filtered columns with new jsonb value */ - _prepend?: InputMaybe; - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Messages_Bool_Exp; -}; - -/** mutation root */ -export type Mutation_Root = { - __typename?: 'mutation_root'; - /** delete data from the table: "collection_products" */ - delete_collection_products?: Maybe; - /** delete single row from the table: "collection_products" */ - delete_collection_products_by_pk?: Maybe; - /** delete data from the table: "collections" */ - delete_collections?: Maybe; - /** delete single row from the table: "collections" */ - delete_collections_by_pk?: Maybe; - /** delete data from the table: "conversations" */ - delete_conversations?: Maybe; - /** delete single row from the table: "conversations" */ - delete_conversations_by_pk?: Maybe; - /** delete data from the table: "message_medias" */ - delete_message_medias?: Maybe; - /** delete single row from the table: "message_medias" */ - delete_message_medias_by_pk?: Maybe; - /** delete data from the table: "messages" */ - delete_messages?: Maybe; - /** delete single row from the table: "messages" */ - delete_messages_by_pk?: Maybe; - /** delete data from the table: "product_prompts" */ - delete_product_prompts?: Maybe; - /** delete single row from the table: "product_prompts" */ - delete_product_prompts_by_pk?: Maybe; - /** delete data from the table: "products" */ - delete_products?: Maybe; - /** delete single row from the table: "products" */ - delete_products_by_pk?: Maybe; - /** delete data from the table: "prompts" */ - delete_prompts?: Maybe; - /** delete single row from the table: "prompts" */ - delete_prompts_by_pk?: Maybe; - imageGeneration?: Maybe; - /** insert data into the table: "collection_products" */ - insert_collection_products?: Maybe; - /** insert a single row into the table: "collection_products" */ - insert_collection_products_one?: Maybe; - /** insert data into the table: "collections" */ - insert_collections?: Maybe; - /** insert a single row into the table: "collections" */ - insert_collections_one?: Maybe; - /** insert data into the table: "conversations" */ - insert_conversations?: Maybe; - /** insert a single row into the table: "conversations" */ - insert_conversations_one?: Maybe; - /** insert data into the table: "message_medias" */ - insert_message_medias?: Maybe; - /** insert a single row into the table: "message_medias" */ - insert_message_medias_one?: Maybe; - /** insert data into the table: "messages" */ - insert_messages?: Maybe; - /** insert a single row into the table: "messages" */ - insert_messages_one?: Maybe; - /** insert data into the table: "product_prompts" */ - insert_product_prompts?: Maybe; - /** insert a single row into the table: "product_prompts" */ - insert_product_prompts_one?: Maybe; - /** insert data into the table: "products" */ - insert_products?: Maybe; - /** insert a single row into the table: "products" */ - insert_products_one?: Maybe; - /** insert data into the table: "prompts" */ - insert_prompts?: Maybe; - /** insert a single row into the table: "prompts" */ - insert_prompts_one?: Maybe; - /** update data of the table: "collection_products" */ - update_collection_products?: Maybe; - /** update single row of the table: "collection_products" */ - update_collection_products_by_pk?: Maybe; - /** update multiples rows of table: "collection_products" */ - update_collection_products_many?: Maybe>>; - /** update data of the table: "collections" */ - update_collections?: Maybe; - /** update single row of the table: "collections" */ - update_collections_by_pk?: Maybe; - /** update multiples rows of table: "collections" */ - update_collections_many?: Maybe>>; - /** update data of the table: "conversations" */ - update_conversations?: Maybe; - /** update single row of the table: "conversations" */ - update_conversations_by_pk?: Maybe; - /** update multiples rows of table: "conversations" */ - update_conversations_many?: Maybe>>; - /** update data of the table: "message_medias" */ - update_message_medias?: Maybe; - /** update single row of the table: "message_medias" */ - update_message_medias_by_pk?: Maybe; - /** update multiples rows of table: "message_medias" */ - update_message_medias_many?: Maybe>>; - /** update data of the table: "messages" */ - update_messages?: Maybe; - /** update single row of the table: "messages" */ - update_messages_by_pk?: Maybe; - /** update multiples rows of table: "messages" */ - update_messages_many?: Maybe>>; - /** update data of the table: "product_prompts" */ - update_product_prompts?: Maybe; - /** update single row of the table: "product_prompts" */ - update_product_prompts_by_pk?: Maybe; - /** update multiples rows of table: "product_prompts" */ - update_product_prompts_many?: Maybe>>; - /** update data of the table: "products" */ - update_products?: Maybe; - /** update single row of the table: "products" */ - update_products_by_pk?: Maybe; - /** update multiples rows of table: "products" */ - update_products_many?: Maybe>>; - /** update data of the table: "prompts" */ - update_prompts?: Maybe; - /** update single row of the table: "prompts" */ - update_prompts_by_pk?: Maybe; - /** update multiples rows of table: "prompts" */ - update_prompts_many?: Maybe>>; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collection_ProductsArgs = { - where: Collection_Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_CollectionsArgs = { - where: Collections_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_ConversationsArgs = { - where: Conversations_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Conversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Message_MediasArgs = { - where: Message_Medias_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Message_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_MessagesArgs = { - where: Messages_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Messages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Product_PromptsArgs = { - where: Product_Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Product_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_ProductsArgs = { - where: Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_PromptsArgs = { - where: Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootImageGenerationArgs = { - input: ImageGenerationInput; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collection_ProductsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collection_Products_OneArgs = { - object: Collection_Products_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_CollectionsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collections_OneArgs = { - object: Collections_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_ConversationsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Conversations_OneArgs = { - object: Conversations_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Message_MediasArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Message_Medias_OneArgs = { - object: Message_Medias_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_MessagesArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Messages_OneArgs = { - object: Messages_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Product_PromptsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Product_Prompts_OneArgs = { - object: Product_Prompts_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_ProductsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Products_OneArgs = { - object: Products_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_PromptsArgs = { - objects: Array; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Prompts_OneArgs = { - object: Prompts_Insert_Input; - on_conflict?: InputMaybe; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_ProductsArgs = { - _set?: InputMaybe; - where: Collection_Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_Products_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Collection_Products_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_Products_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_CollectionsArgs = { - _set?: InputMaybe; - where: Collections_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collections_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Collections_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collections_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_ConversationsArgs = { - _set?: InputMaybe; - where: Conversations_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Conversations_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Conversations_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Conversations_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_MediasArgs = { - _set?: InputMaybe; - where: Message_Medias_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_Medias_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Message_Medias_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_Medias_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_MessagesArgs = { - _append?: InputMaybe; - _delete_at_path?: InputMaybe; - _delete_elem?: InputMaybe; - _delete_key?: InputMaybe; - _prepend?: InputMaybe; - _set?: InputMaybe; - where: Messages_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Messages_By_PkArgs = { - _append?: InputMaybe; - _delete_at_path?: InputMaybe; - _delete_elem?: InputMaybe; - _delete_key?: InputMaybe; - _prepend?: InputMaybe; - _set?: InputMaybe; - pk_columns: Messages_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Messages_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_PromptsArgs = { - _set?: InputMaybe; - where: Product_Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_Prompts_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Product_Prompts_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_Prompts_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_ProductsArgs = { - _append?: InputMaybe; - _delete_at_path?: InputMaybe; - _delete_elem?: InputMaybe; - _delete_key?: InputMaybe; - _prepend?: InputMaybe; - _set?: InputMaybe; - where: Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Products_By_PkArgs = { - _append?: InputMaybe; - _delete_at_path?: InputMaybe; - _delete_elem?: InputMaybe; - _delete_key?: InputMaybe; - _prepend?: InputMaybe; - _set?: InputMaybe; - pk_columns: Products_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Products_ManyArgs = { - updates: Array; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_PromptsArgs = { - _set?: InputMaybe; - where: Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Prompts_By_PkArgs = { - _set?: InputMaybe; - pk_columns: Prompts_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Prompts_ManyArgs = { - updates: Array; -}; - -/** column ordering options */ -export enum Order_By { - /** in ascending order, nulls last */ - Asc = 'asc', - /** in ascending order, nulls first */ - AscNullsFirst = 'asc_nulls_first', - /** in ascending order, nulls last */ - AscNullsLast = 'asc_nulls_last', - /** in descending order, nulls first */ - Desc = 'desc', - /** in descending order, nulls first */ - DescNullsFirst = 'desc_nulls_first', - /** in descending order, nulls last */ - DescNullsLast = 'desc_nulls_last' -} - -/** columns and relationships of "product_prompts" */ -export type Product_Prompts = { - __typename?: 'product_prompts'; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - product_id: Scalars['uuid']['output']; - /** An array relationship */ - products: Array; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - prompt_id: Scalars['uuid']['output']; - /** An array relationship */ - prompts: Array; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsProducts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsPromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsPrompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "product_prompts" */ -export type Product_Prompts_Aggregate = { - __typename?: 'product_prompts_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Product_Prompts_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Product_Prompts_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "product_prompts" */ -export type Product_Prompts_Aggregate_Fields = { - __typename?: 'product_prompts_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "product_prompts" */ -export type Product_Prompts_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "product_prompts" */ -export type Product_Prompts_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "product_prompts" */ -export type Product_Prompts_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "product_prompts". All fields are combined with a logical 'AND'. */ -export type Product_Prompts_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products?: InputMaybe; - products_aggregate?: InputMaybe; - prompt_id?: InputMaybe; - prompts?: InputMaybe; - prompts_aggregate?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "product_prompts" */ -export enum Product_Prompts_Constraint { - /** unique or primary key constraint on columns "id" */ - ProductPromptsPkey = 'product_prompts_pkey', - /** unique or primary key constraint on columns "product_id", "prompt_id" */ - ProductPromptsProductIdPromptIdKey = 'product_prompts_product_id_prompt_id_key' -} - -/** input type for inserting data into table "product_prompts" */ -export type Product_Prompts_Insert_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products?: InputMaybe; - prompt_id?: InputMaybe; - prompts?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Product_Prompts_Max_Fields = { - __typename?: 'product_prompts_max_fields'; - created_at?: Maybe; - id?: Maybe; - product_id?: Maybe; - prompt_id?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "product_prompts" */ -export type Product_Prompts_Max_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - prompt_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Product_Prompts_Min_Fields = { - __typename?: 'product_prompts_min_fields'; - created_at?: Maybe; - id?: Maybe; - product_id?: Maybe; - prompt_id?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "product_prompts" */ -export type Product_Prompts_Min_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - prompt_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "product_prompts" */ -export type Product_Prompts_Mutation_Response = { - __typename?: 'product_prompts_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** on_conflict condition type for table "product_prompts" */ -export type Product_Prompts_On_Conflict = { - constraint: Product_Prompts_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "product_prompts". */ -export type Product_Prompts_Order_By = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - products_aggregate?: InputMaybe; - prompt_id?: InputMaybe; - prompts_aggregate?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: product_prompts */ -export type Product_Prompts_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "product_prompts" */ -export enum Product_Prompts_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - PromptId = 'prompt_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "product_prompts" */ -export type Product_Prompts_Set_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - prompt_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "product_prompts" */ -export type Product_Prompts_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Product_Prompts_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Product_Prompts_Stream_Cursor_Value_Input = { - created_at?: InputMaybe; - id?: InputMaybe; - product_id?: InputMaybe; - prompt_id?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "product_prompts" */ -export enum Product_Prompts_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - PromptId = 'prompt_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Product_Prompts_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Product_Prompts_Bool_Exp; -}; - -/** columns and relationships of "products" */ -export type Products = { - __typename?: 'products'; - author?: Maybe; - created_at: Scalars['timestamptz']['output']; - description?: Maybe; - greeting?: Maybe; - id: Scalars['uuid']['output']; - image_url?: Maybe; - inputs?: Maybe; - long_description?: Maybe; - name: Scalars['String']['output']; - nsfw: Scalars['Boolean']['output']; - outputs?: Maybe; - /** An array relationship */ - product_collections: Array; - /** An aggregate relationship */ - product_collections_aggregate: Collection_Products_Aggregate; - /** An array relationship */ - product_prompts: Array; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - slug: Scalars['String']['output']; - source_url?: Maybe; - technical_description?: Maybe; - updated_at: Scalars['timestamptz']['output']; - version?: Maybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsInputsArgs = { - path?: InputMaybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsOutputsArgs = { - path?: InputMaybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_CollectionsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_Collections_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_PromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "products" */ -export type Products_Aggregate = { - __typename?: 'products_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Products_Aggregate_Bool_Exp = { - bool_and?: InputMaybe; - bool_or?: InputMaybe; - count?: InputMaybe; -}; - -export type Products_Aggregate_Bool_Exp_Bool_And = { - arguments: Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_And_Arguments_Columns; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Boolean_Comparison_Exp; -}; - -export type Products_Aggregate_Bool_Exp_Bool_Or = { - arguments: Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Boolean_Comparison_Exp; -}; - -export type Products_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "products" */ -export type Products_Aggregate_Fields = { - __typename?: 'products_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "products" */ -export type Products_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "products" */ -export type Products_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** append existing jsonb value of filtered columns with new jsonb value */ -export type Products_Append_Input = { - inputs?: InputMaybe; - outputs?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "products" */ -export type Products_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "products". All fields are combined with a logical 'AND'. */ -export type Products_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - inputs?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - nsfw?: InputMaybe; - outputs?: InputMaybe; - product_collections?: InputMaybe; - product_collections_aggregate?: InputMaybe; - product_prompts?: InputMaybe; - product_prompts_aggregate?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** unique or primary key constraints on table "products" */ -export enum Products_Constraint { - /** unique or primary key constraint on columns "id" */ - ProductsPkey = 'products_pkey', - /** unique or primary key constraint on columns "slug" */ - ProductsSlugKey = 'products_slug_key' -} - -/** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ -export type Products_Delete_At_Path_Input = { - inputs?: InputMaybe>; - outputs?: InputMaybe>; -}; - -/** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ -export type Products_Delete_Elem_Input = { - inputs?: InputMaybe; - outputs?: InputMaybe; -}; - -/** delete key/value pair or string element. key/value pairs are matched based on their key value */ -export type Products_Delete_Key_Input = { - inputs?: InputMaybe; - outputs?: InputMaybe; -}; - -/** input type for inserting data into table "products" */ -export type Products_Insert_Input = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - inputs?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - nsfw?: InputMaybe; - outputs?: InputMaybe; - product_collections?: InputMaybe; - product_prompts?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Products_Max_Fields = { - __typename?: 'products_max_fields'; - author?: Maybe; - created_at?: Maybe; - description?: Maybe; - greeting?: Maybe; - id?: Maybe; - image_url?: Maybe; - long_description?: Maybe; - name?: Maybe; - slug?: Maybe; - source_url?: Maybe; - technical_description?: Maybe; - updated_at?: Maybe; - version?: Maybe; -}; - -/** order by max() on columns of table "products" */ -export type Products_Max_Order_By = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Products_Min_Fields = { - __typename?: 'products_min_fields'; - author?: Maybe; - created_at?: Maybe; - description?: Maybe; - greeting?: Maybe; - id?: Maybe; - image_url?: Maybe; - long_description?: Maybe; - name?: Maybe; - slug?: Maybe; - source_url?: Maybe; - technical_description?: Maybe; - updated_at?: Maybe; - version?: Maybe; -}; - -/** order by min() on columns of table "products" */ -export type Products_Min_Order_By = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** response of any mutation on the table "products" */ -export type Products_Mutation_Response = { - __typename?: 'products_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** input type for inserting object relation for remote table "products" */ -export type Products_Obj_Rel_Insert_Input = { - data: Products_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** on_conflict condition type for table "products" */ -export type Products_On_Conflict = { - constraint: Products_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "products". */ -export type Products_Order_By = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - inputs?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - nsfw?: InputMaybe; - outputs?: InputMaybe; - product_collections_aggregate?: InputMaybe; - product_prompts_aggregate?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** primary key columns input for table: products */ -export type Products_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** prepend existing jsonb value of filtered columns with new jsonb value */ -export type Products_Prepend_Input = { - inputs?: InputMaybe; - outputs?: InputMaybe; -}; - -/** select columns of table "products" */ -export enum Products_Select_Column { - /** column name */ - Author = 'author', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Greeting = 'greeting', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Inputs = 'inputs', - /** column name */ - LongDescription = 'long_description', - /** column name */ - Name = 'name', - /** column name */ - Nsfw = 'nsfw', - /** column name */ - Outputs = 'outputs', - /** column name */ - Slug = 'slug', - /** column name */ - SourceUrl = 'source_url', - /** column name */ - TechnicalDescription = 'technical_description', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - Version = 'version' -} - -/** select "products_aggregate_bool_exp_bool_and_arguments_columns" columns of table "products" */ -export enum Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_And_Arguments_Columns { - /** column name */ - Nsfw = 'nsfw' -} - -/** select "products_aggregate_bool_exp_bool_or_arguments_columns" columns of table "products" */ -export enum Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns { - /** column name */ - Nsfw = 'nsfw' -} - -/** input type for updating data in table "products" */ -export type Products_Set_Input = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - inputs?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - nsfw?: InputMaybe; - outputs?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** Streaming cursor of the table "products" */ -export type Products_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Products_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Products_Stream_Cursor_Value_Input = { - author?: InputMaybe; - created_at?: InputMaybe; - description?: InputMaybe; - greeting?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - inputs?: InputMaybe; - long_description?: InputMaybe; - name?: InputMaybe; - nsfw?: InputMaybe; - outputs?: InputMaybe; - slug?: InputMaybe; - source_url?: InputMaybe; - technical_description?: InputMaybe; - updated_at?: InputMaybe; - version?: InputMaybe; -}; - -/** update columns of table "products" */ -export enum Products_Update_Column { - /** column name */ - Author = 'author', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Greeting = 'greeting', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Inputs = 'inputs', - /** column name */ - LongDescription = 'long_description', - /** column name */ - Name = 'name', - /** column name */ - Nsfw = 'nsfw', - /** column name */ - Outputs = 'outputs', - /** column name */ - Slug = 'slug', - /** column name */ - SourceUrl = 'source_url', - /** column name */ - TechnicalDescription = 'technical_description', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - Version = 'version' -} - -export type Products_Updates = { - /** append existing jsonb value of filtered columns with new jsonb value */ - _append?: InputMaybe; - /** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ - _delete_at_path?: InputMaybe; - /** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ - _delete_elem?: InputMaybe; - /** delete key/value pair or string element. key/value pairs are matched based on their key value */ - _delete_key?: InputMaybe; - /** prepend existing jsonb value of filtered columns with new jsonb value */ - _prepend?: InputMaybe; - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Products_Bool_Exp; -}; - -/** columns and relationships of "prompts" */ -export type Prompts = { - __typename?: 'prompts'; - content?: Maybe; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - image_url?: Maybe; - /** An array relationship */ - prompt_products: Array; - /** An aggregate relationship */ - prompt_products_aggregate: Product_Prompts_Aggregate; - slug: Scalars['String']['output']; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "prompts" */ -export type PromptsPrompt_ProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -/** columns and relationships of "prompts" */ -export type PromptsPrompt_Products_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - -/** aggregated selection of "prompts" */ -export type Prompts_Aggregate = { - __typename?: 'prompts_aggregate'; - aggregate?: Maybe; - nodes: Array; -}; - -export type Prompts_Aggregate_Bool_Exp = { - count?: InputMaybe; -}; - -export type Prompts_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe>; - distinct?: InputMaybe; - filter?: InputMaybe; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "prompts" */ -export type Prompts_Aggregate_Fields = { - __typename?: 'prompts_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe; - min?: Maybe; -}; - - -/** aggregate fields of "prompts" */ -export type Prompts_Aggregate_FieldsCountArgs = { - columns?: InputMaybe>; - distinct?: InputMaybe; -}; - -/** order by aggregate values of table "prompts" */ -export type Prompts_Aggregate_Order_By = { - count?: InputMaybe; - max?: InputMaybe; - min?: InputMaybe; -}; - -/** input type for inserting array relation for remote table "prompts" */ -export type Prompts_Arr_Rel_Insert_Input = { - data: Array; - /** upsert condition */ - on_conflict?: InputMaybe; -}; - -/** Boolean expression to filter rows from the table "prompts". All fields are combined with a logical 'AND'. */ -export type Prompts_Bool_Exp = { - _and?: InputMaybe>; - _not?: InputMaybe; - _or?: InputMaybe>; - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - prompt_products?: InputMaybe; - prompt_products_aggregate?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** unique or primary key constraints on table "prompts" */ -export enum Prompts_Constraint { - /** unique or primary key constraint on columns "id" */ - PromptsPkey = 'prompts_pkey', - /** unique or primary key constraint on columns "slug" */ - PromptsSlugKey = 'prompts_slug_key' -} - -/** input type for inserting data into table "prompts" */ -export type Prompts_Insert_Input = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - prompt_products?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate max on columns */ -export type Prompts_Max_Fields = { - __typename?: 'prompts_max_fields'; - content?: Maybe; - created_at?: Maybe; - id?: Maybe; - image_url?: Maybe; - slug?: Maybe; - updated_at?: Maybe; -}; - -/** order by max() on columns of table "prompts" */ -export type Prompts_Max_Order_By = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** aggregate min on columns */ -export type Prompts_Min_Fields = { - __typename?: 'prompts_min_fields'; - content?: Maybe; - created_at?: Maybe; - id?: Maybe; - image_url?: Maybe; - slug?: Maybe; - updated_at?: Maybe; -}; - -/** order by min() on columns of table "prompts" */ -export type Prompts_Min_Order_By = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** response of any mutation on the table "prompts" */ -export type Prompts_Mutation_Response = { - __typename?: 'prompts_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array; -}; - -/** on_conflict condition type for table "prompts" */ -export type Prompts_On_Conflict = { - constraint: Prompts_Constraint; - update_columns?: Array; - where?: InputMaybe; -}; - -/** Ordering options when selecting data from "prompts". */ -export type Prompts_Order_By = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - prompt_products_aggregate?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** primary key columns input for table: prompts */ -export type Prompts_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "prompts" */ -export enum Prompts_Select_Column { - /** column name */ - Content = 'content', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "prompts" */ -export type Prompts_Set_Input = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** Streaming cursor of the table "prompts" */ -export type Prompts_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Prompts_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe; -}; - -/** Initial value of the column from where the streaming should start */ -export type Prompts_Stream_Cursor_Value_Input = { - content?: InputMaybe; - created_at?: InputMaybe; - id?: InputMaybe; - image_url?: InputMaybe; - slug?: InputMaybe; - updated_at?: InputMaybe; -}; - -/** update columns of table "prompts" */ -export enum Prompts_Update_Column { - /** column name */ - Content = 'content', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Prompts_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe; - /** filter the rows which have to be updated */ - where: Prompts_Bool_Exp; -}; - -export type Query_Root = { - __typename?: 'query_root'; - /** An array relationship */ - collection_products: Array; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - /** fetch data from the table: "collection_products" using primary key columns */ - collection_products_by_pk?: Maybe; - /** An array relationship */ - collections: Array; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - /** fetch data from the table: "collections" using primary key columns */ - collections_by_pk?: Maybe; - /** fetch data from the table: "conversations" */ - conversations: Array; - /** fetch aggregated fields from the table: "conversations" */ - conversations_aggregate: Conversations_Aggregate; - /** fetch data from the table: "conversations" using primary key columns */ - conversations_by_pk?: Maybe; - /** An array relationship */ - message_medias: Array; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - /** fetch data from the table: "message_medias" using primary key columns */ - message_medias_by_pk?: Maybe; - /** fetch data from the table: "messages" */ - messages: Array; - /** fetch aggregated fields from the table: "messages" */ - messages_aggregate: Messages_Aggregate; - /** fetch data from the table: "messages" using primary key columns */ - messages_by_pk?: Maybe; - /** An array relationship */ - product_prompts: Array; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - /** fetch data from the table: "product_prompts" using primary key columns */ - product_prompts_by_pk?: Maybe; - /** An array relationship */ - products: Array; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - /** fetch data from the table: "products" using primary key columns */ - products_by_pk?: Maybe; - /** An array relationship */ - prompts: Array; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - /** fetch data from the table: "prompts" using primary key columns */ - prompts_by_pk?: Maybe; -}; - - -export type Query_RootCollection_ProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootCollection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootCollectionsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootCollections_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootCollections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootConversationsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootConversations_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootConversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootMessage_MediasArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootMessage_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootMessagesArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootMessages_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootMessages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootProduct_PromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootProduct_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootProducts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootProducts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootPromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootPrompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Query_RootPrompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - -export type Subscription_Root = { - __typename?: 'subscription_root'; - /** An array relationship */ - collection_products: Array; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - /** fetch data from the table: "collection_products" using primary key columns */ - collection_products_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "collection_products" */ - collection_products_stream: Array; - /** An array relationship */ - collections: Array; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - /** fetch data from the table: "collections" using primary key columns */ - collections_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "collections" */ - collections_stream: Array; - /** fetch data from the table: "conversations" */ - conversations: Array; - /** fetch aggregated fields from the table: "conversations" */ - conversations_aggregate: Conversations_Aggregate; - /** fetch data from the table: "conversations" using primary key columns */ - conversations_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "conversations" */ - conversations_stream: Array; - /** An array relationship */ - message_medias: Array; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - /** fetch data from the table: "message_medias" using primary key columns */ - message_medias_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "message_medias" */ - message_medias_stream: Array; - /** fetch data from the table: "messages" */ - messages: Array; - /** fetch aggregated fields from the table: "messages" */ - messages_aggregate: Messages_Aggregate; - /** fetch data from the table: "messages" using primary key columns */ - messages_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "messages" */ - messages_stream: Array; - /** An array relationship */ - product_prompts: Array; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - /** fetch data from the table: "product_prompts" using primary key columns */ - product_prompts_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "product_prompts" */ - product_prompts_stream: Array; - /** An array relationship */ - products: Array; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - /** fetch data from the table: "products" using primary key columns */ - products_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "products" */ - products_stream: Array; - /** An array relationship */ - prompts: Array; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - /** fetch data from the table: "prompts" using primary key columns */ - prompts_by_pk?: Maybe; - /** fetch data from the table in a streaming manner: "prompts" */ - prompts_stream: Array; -}; - - -export type Subscription_RootCollection_ProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootCollection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootCollection_Products_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootCollectionsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootCollections_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootCollections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootCollections_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootConversationsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootConversations_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootConversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootConversations_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessage_MediasArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessage_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootMessage_Medias_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessagesArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessages_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootMessages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootMessages_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootProduct_PromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootProduct_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootProduct_Prompts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootProductsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootProducts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootProducts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootProducts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - - -export type Subscription_RootPromptsArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootPrompts_AggregateArgs = { - distinct_on?: InputMaybe>; - limit?: InputMaybe; - offset?: InputMaybe; - order_by?: InputMaybe>; - where?: InputMaybe; -}; - - -export type Subscription_RootPrompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootPrompts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array>; - where?: InputMaybe; -}; - -/** Boolean expression to compare columns of type "timestamptz". All fields are combined with logical 'AND'. */ -export type Timestamptz_Comparison_Exp = { - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - _in?: InputMaybe>; - _is_null?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - _nin?: InputMaybe>; -}; - -/** Boolean expression to compare columns of type "uuid". All fields are combined with logical 'AND'. */ -export type Uuid_Comparison_Exp = { - _eq?: InputMaybe; - _gt?: InputMaybe; - _gte?: InputMaybe; - _in?: InputMaybe>; - _is_null?: InputMaybe; - _lt?: InputMaybe; - _lte?: InputMaybe; - _neq?: InputMaybe; - _nin?: InputMaybe>; -}; - -export type CollectionDetailFragment = { __typename?: 'collections', slug: string, name: string }; - -export type ConversationDetailFragment = { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null }; - -export type MessageMediaFragment = { __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }; - -export type MessageDetailFragment = { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }; - -export type ProductDetailFragment = { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any }; - -export type PromptDetailFragment = { __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }; - -export type CreateConversationMutationVariables = Exact<{ - data: Conversations_Insert_Input; -}>; - - -export type CreateConversationMutation = { __typename?: 'mutation_root', insert_conversations_one?: { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null } | null }; - -export type CreateMessageMutationVariables = Exact<{ - data: Messages_Insert_Input; -}>; - - -export type CreateMessageMutation = { __typename?: 'mutation_root', insert_messages_one?: { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> } | null }; - -export type DeleteConversationMutationVariables = Exact<{ - id: Scalars['uuid']['input']; -}>; - - -export type DeleteConversationMutation = { __typename?: 'mutation_root', delete_conversations_by_pk?: { __typename?: 'conversations', id: any } | null }; - -export type GenerateImageMutationVariables = Exact<{ - model?: InputMaybe; - neg_prompt?: InputMaybe; - prompt?: InputMaybe; - seed?: InputMaybe; - steps?: InputMaybe; - width?: InputMaybe; - height?: InputMaybe; -}>; - - -export type GenerateImageMutation = { __typename?: 'mutation_root', imageGeneration?: { __typename?: 'ImageGenerationOutput', url: string } | null }; - -export type UpdateConversationMutationVariables = Exact<{ - id: Scalars['uuid']['input']; - lastMessageText?: InputMaybe; - lastMessageUrl?: InputMaybe; -}>; - - -export type UpdateConversationMutation = { __typename?: 'mutation_root', update_conversations_by_pk?: { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null } | null }; - -export type UpdateMessageMutationVariables = Exact<{ - id?: InputMaybe; - data: Messages_Set_Input; -}>; - - -export type UpdateMessageMutation = { __typename?: 'mutation_root', update_messages_by_pk?: { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> } | null }; - -export type GetCollectionsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetCollectionsQuery = { __typename?: 'query_root', collections: Array<{ __typename?: 'collections', slug: string, name: string, collection_products: Array<{ __typename?: 'collection_products', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }> }> }> }> }; - -export type GetConversationMessagesQueryVariables = Exact<{ - conversation_id?: InputMaybe; - limit?: InputMaybe; - offset?: InputMaybe; -}>; - - -export type GetConversationMessagesQuery = { __typename?: 'query_root', messages: Array<{ __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }> }; - -export type GetConversationsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetConversationsQuery = { __typename?: 'query_root', conversations: Array<{ __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_messages: Array<{ __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }>, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null }> }; - -export type GetProductsByCollectionSlugQueryVariables = Exact<{ - slug?: InputMaybe; -}>; - - -export type GetProductsByCollectionSlugQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }>, product_collections: Array<{ __typename?: 'collection_products', collections: Array<{ __typename?: 'collections', slug: string, name: string }> }> }> }; - -export type GetProductPromptsQueryVariables = Exact<{ - productSlug?: InputMaybe; -}>; - - -export type GetProductPromptsQuery = { __typename?: 'query_root', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }; - -export type GetProductsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetProductsQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }>, product_collections: Array<{ __typename?: 'collection_products', collections: Array<{ __typename?: 'collections', slug: string, name: string }> }> }> }; - -export type GetProductsInQueryVariables = Exact<{ - _in?: InputMaybe | Scalars['String']['input']>; -}>; - - -export type GetProductsInQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any }> }; - -export type SubscribeMessageSubscriptionVariables = Exact<{ - id?: InputMaybe; -}>; - - -export type SubscribeMessageSubscription = { __typename?: 'subscription_root', messages_by_pk?: { __typename?: 'messages', id: any, content?: string | null, status?: string | null } | null }; - -export const CollectionDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const ProductDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode; -export const ConversationDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode; -export const MessageMediaFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode; -export const MessageDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode; -export const PromptDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode; -export const CreateConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"conversations_insert_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"insert_conversations_one"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"object"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}}]} as unknown as DocumentNode; -export const CreateMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"messages_insert_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"insert_messages_one"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"object"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode; -export const DeleteConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"deleteConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"delete_conversations_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; -export const GenerateImageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"generateImage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"model"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"neg_prompt"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"prompt"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"seed"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"10"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"steps"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"10"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"width"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"512"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"height"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"512"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"imageGeneration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"model"},"value":{"kind":"Variable","name":{"kind":"Name","value":"model"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"neg_prompt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"neg_prompt"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"prompt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"prompt"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"seed"},"value":{"kind":"Variable","name":{"kind":"Name","value":"seed"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"steps"},"value":{"kind":"Variable","name":{"kind":"Name","value":"steps"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"width"},"value":{"kind":"Variable","name":{"kind":"Name","value":"width"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"height"},"value":{"kind":"Variable","name":{"kind":"Name","value":"height"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"updateConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageText"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageUrl"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"update_conversations_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pk_columns"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}},{"kind":"Argument","name":{"kind":"Name","value":"_set"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"last_text_message"},"value":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageText"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"last_image_url"},"value":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageUrl"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"updateMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"messages_set_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"update_messages_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pk_columns"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}},{"kind":"Argument","name":{"kind":"Name","value":"_set"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode; -export const GetCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}},{"kind":"Field","name":{"kind":"Name","value":"collection_products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode; -export const GetConversationMessagesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getConversationMessages"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"conversation_id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"100"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"100"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"messages"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"conversation_id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"conversation_id"}}}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"created_at"},"value":{"kind":"EnumValue","value":"desc"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode; -export const GetConversationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getConversations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"conversations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"updated_at"},"value":{"kind":"EnumValue","value":"desc"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_messages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode; -export const GetProductsByCollectionSlugDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductsByCollectionSlug"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"slug"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"product_collections"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"collections"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"slug"}}}]}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"product_collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const GetProductPromptsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductPrompts"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"productSlug"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"prompt_products"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"products"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"productSlug"}}}]}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode; -export const GetProductsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProducts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"product_collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const GetProductsInDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductsIn"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"_in"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_in"},"value":{"kind":"Variable","name":{"kind":"Name","value":"_in"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode; -export const SubscribeMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"subscribeMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"messages_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/web-client/graphql/generated/index.ts b/web-client/graphql/generated/index.ts deleted file mode 100644 index af7839936..000000000 --- a/web-client/graphql/generated/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./gql"; \ No newline at end of file diff --git a/web-client/graphql/mutations/createConversation.graphql b/web-client/graphql/mutations/createConversation.graphql deleted file mode 100644 index ad8fef426..000000000 --- a/web-client/graphql/mutations/createConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation createConversation($data: conversations_insert_input!) { - insert_conversations_one(object: $data) { - ...ConversationDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/createMessage.graphql b/web-client/graphql/mutations/createMessage.graphql deleted file mode 100644 index 36578d9c6..000000000 --- a/web-client/graphql/mutations/createMessage.graphql +++ /dev/null @@ -1,9 +0,0 @@ -mutation createMessage( - $data: messages_insert_input! -) { - insert_messages_one( - object: $data - ) { - ...MessageDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/deleteConversation.graphql b/web-client/graphql/mutations/deleteConversation.graphql deleted file mode 100644 index 0e1f5d2c3..000000000 --- a/web-client/graphql/mutations/deleteConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation deleteConversation($id: uuid!) { - delete_conversations_by_pk(id: $id) { - id - } -} diff --git a/web-client/graphql/mutations/imageGeneration.graphql b/web-client/graphql/mutations/imageGeneration.graphql deleted file mode 100644 index fcda3070f..000000000 --- a/web-client/graphql/mutations/imageGeneration.graphql +++ /dev/null @@ -1,23 +0,0 @@ -mutation generateImage( - $model: String = "" - $neg_prompt: String = "" - $prompt: String = "" - $seed: Int = 10 - $steps: Int = 10 - $width: Int = 512 - $height: Int = 512 -) { - imageGeneration( - input: { - model: $model - neg_prompt: $neg_prompt - prompt: $prompt - seed: $seed - steps: $steps - width: $width - height: $height - } - ) { - url - } -} diff --git a/web-client/graphql/mutations/updateConversation.graphql b/web-client/graphql/mutations/updateConversation.graphql deleted file mode 100644 index 4e391c0a2..000000000 --- a/web-client/graphql/mutations/updateConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) { - update_conversations_by_pk(pk_columns: {id: $id}, _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}) { - ...ConversationDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/updateMessage.graphql b/web-client/graphql/mutations/updateMessage.graphql deleted file mode 100644 index 886f9de5a..000000000 --- a/web-client/graphql/mutations/updateMessage.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation updateMessage($id: uuid = "", $data: messages_set_input!) { - update_messages_by_pk(pk_columns: { id: $id }, _set: $data) { - ...MessageDetail - } -} diff --git a/web-client/graphql/queries/getCollections.graphql b/web-client/graphql/queries/getCollections.graphql deleted file mode 100644 index f5a3ed20f..000000000 --- a/web-client/graphql/queries/getCollections.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getCollections { - collections { - ...CollectionDetail - collection_products { - products { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getConversationMessages.graphql b/web-client/graphql/queries/getConversationMessages.graphql deleted file mode 100644 index 43f5c585e..000000000 --- a/web-client/graphql/queries/getConversationMessages.graphql +++ /dev/null @@ -1,14 +0,0 @@ -query getConversationMessages( - $conversation_id: uuid = "", - $limit: Int = 100, - $offset: Int = 100, -) { - messages( - offset: $offset, - limit: $limit, - where: { conversation_id: { _eq: $conversation_id } }, - order_by: {created_at: desc} - ) { - ...MessageDetail - } -} diff --git a/web-client/graphql/queries/getConversations.graphql b/web-client/graphql/queries/getConversations.graphql deleted file mode 100644 index bbadccd08..000000000 --- a/web-client/graphql/queries/getConversations.graphql +++ /dev/null @@ -1,11 +0,0 @@ -query getConversations { - conversations(order_by: {updated_at: desc}) { - ...ConversationDetail - conversation_messages { - ...MessageDetail - message_medias { - ...MessageMedia - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProductByCollectionSlug.graphql b/web-client/graphql/queries/getProductByCollectionSlug.graphql deleted file mode 100644 index 514d817c6..000000000 --- a/web-client/graphql/queries/getProductByCollectionSlug.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getProductsByCollectionSlug($slug: String = "") { - products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - product_collections { - collections { - ...CollectionDetail - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProductPrompts.graphql b/web-client/graphql/queries/getProductPrompts.graphql deleted file mode 100644 index e307de8c4..000000000 --- a/web-client/graphql/queries/getProductPrompts.graphql +++ /dev/null @@ -1,5 +0,0 @@ -query getProductPrompts($productSlug: String = "") { - prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) { - ...PromptDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProducts.graphql b/web-client/graphql/queries/getProducts.graphql deleted file mode 100644 index 0ac975360..000000000 --- a/web-client/graphql/queries/getProducts.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getProducts { - products { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - product_collections { - collections { - ...CollectionDetail - } - } - } -} diff --git a/web-client/graphql/queries/getProductsIn.graphql b/web-client/graphql/queries/getProductsIn.graphql deleted file mode 100644 index d2d0d434a..000000000 --- a/web-client/graphql/queries/getProductsIn.graphql +++ /dev/null @@ -1,5 +0,0 @@ -query getProductsIn($_in: [String!] = "") { - products(where: {slug: {_in: $_in}}) { - ...ProductDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/subscriptions/subscribeMessage.graphql b/web-client/graphql/subscriptions/subscribeMessage.graphql deleted file mode 100644 index 8cdf9d2f4..000000000 --- a/web-client/graphql/subscriptions/subscribeMessage.graphql +++ /dev/null @@ -1,7 +0,0 @@ -subscription subscribeMessage($id: uuid = "") { - messages_by_pk(id: $id) { - id - content - status - } -} diff --git a/web-client/next.config.js b/web-client/next.config.js deleted file mode 100644 index d287ee0c8..000000000 --- a/web-client/next.config.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - serverActions: true, - }, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "**", - }, - ], - }, -}; - -module.exports = nextConfig; diff --git a/web-client/yarn.lock b/web-client/yarn.lock deleted file mode 100644 index a76cde32c..000000000 --- a/web-client/yarn.lock +++ /dev/null @@ -1,6069 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apollo/client@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.8.1.tgz#a1e3045a5fb276c08e38f7b5f930551d79741257" - integrity sha512-JGGj/9bdoLEqzatRikDeN8etseY5qeFAY0vSAx/Pd0ePNsaflKzHx6V2NZ0NsGkInq+9IXXX3RLVDf0EotizMA== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.7.3" - "@wry/equality" "^0.5.6" - "@wry/trie" "^0.4.3" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.17.5" - prop-types "^15.7.2" - response-iterator "^0.2.6" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@ardatan/relay-compiler@12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" - integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== - dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/runtime" "^7.0.0" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.4.0" - chalk "^4.0.0" - fb-watchman "^2.0.0" - fbjs "^3.0.0" - glob "^7.1.1" - immutable "~3.7.6" - invariant "^2.2.4" - nullthrows "^1.1.1" - relay-runtime "12.0.0" - signedsource "^1.0.0" - yargs "^15.3.1" - -"@ardatan/sync-fetch@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" - integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== - dependencies: - node-fetch "^2.6.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== - dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" - -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== - -"@babel/core@^7.14.0", "@babel/core@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.1" - -"@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" - integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== - -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" - integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-classes@^7.0.0": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - -"@babel/plugin-transform-for-of@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-object-super@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-property-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-spread@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.13": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" - integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.22.10", "@babel/types@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== - -"@eslint/eslintrc@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" - integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== - -"@graphql-codegen/add@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-5.0.0.tgz#578ebaf4fa87c1e934c381cd679bcedcf79feaba" - integrity sha512-ynWDOsK2yxtFHwcJTB9shoSkUd7YXd6ZE57f0nk7W5cu/nAgxZZpEsnTPEpZB/Mjf14YRGe2uJHQ7AfElHjqUQ== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - tslib "~2.5.0" - -"@graphql-codegen/cli@5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-5.0.0.tgz#761dcf08cfee88bbdd9cdf8097b2343445ec6f0a" - integrity sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA== - dependencies: - "@babel/generator" "^7.18.13" - "@babel/template" "^7.18.10" - "@babel/types" "^7.18.13" - "@graphql-codegen/core" "^4.0.0" - "@graphql-codegen/plugin-helpers" "^5.0.1" - "@graphql-tools/apollo-engine-loader" "^8.0.0" - "@graphql-tools/code-file-loader" "^8.0.0" - "@graphql-tools/git-loader" "^8.0.0" - "@graphql-tools/github-loader" "^8.0.0" - "@graphql-tools/graphql-file-loader" "^8.0.0" - "@graphql-tools/json-file-loader" "^8.0.0" - "@graphql-tools/load" "^8.0.0" - "@graphql-tools/prisma-loader" "^8.0.0" - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.8.0" - chalk "^4.1.0" - cosmiconfig "^8.1.3" - debounce "^1.2.0" - detect-indent "^6.0.0" - graphql-config "^5.0.2" - inquirer "^8.0.0" - is-glob "^4.0.1" - jiti "^1.17.1" - json-to-pretty-yaml "^1.2.2" - listr2 "^4.0.5" - log-symbols "^4.0.0" - micromatch "^4.0.5" - shell-quote "^1.7.3" - string-env-interpolation "^1.0.1" - ts-log "^2.2.3" - tslib "^2.4.0" - yaml "^2.3.1" - yargs "^17.0.0" - -"@graphql-codegen/client-preset@4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.1.0.tgz#81becd32b78b207b0e966876900537ec172d8df1" - integrity sha512-/3Ymb/fjxIF1+HGmaI1YwSZbWsrZAWMSQjh3dU425eBjctjsVQ6gzGRr+l/gE5F1mtmCf+vlbTAT03heAc/QIw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" - "@graphql-codegen/add" "^5.0.0" - "@graphql-codegen/gql-tag-operations" "4.0.1" - "@graphql-codegen/plugin-helpers" "^5.0.1" - "@graphql-codegen/typed-document-node" "^5.0.1" - "@graphql-codegen/typescript" "^4.0.1" - "@graphql-codegen/typescript-operations" "^4.0.1" - "@graphql-codegen/visitor-plugin-common" "^4.0.1" - "@graphql-tools/documents" "^1.0.0" - "@graphql-tools/utils" "^10.0.0" - "@graphql-typed-document-node/core" "3.2.0" - tslib "~2.5.0" - -"@graphql-codegen/core@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-4.0.0.tgz#b29c911746a532a675e33720acb4eb2119823e01" - integrity sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "~2.5.0" - -"@graphql-codegen/gql-tag-operations@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.1.tgz#36c7d40a135b9889d7f225166be323c3d48cee87" - integrity sha512-qF6wIbBzW8BNT+wiVsBxrYOs2oYcsxQ7mRvCpfEI3HnNZMAST/uX76W8MqFEJvj4mw7NIDv7xYJAcAZIWM5LWw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - "@graphql-tools/utils" "^10.0.0" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/introspection@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/introspection/-/introspection-4.0.0.tgz#1d851d8fb38efbeaf45128456e3010a16e6c9708" - integrity sha512-t9g3AkK99dfHblMWtG4ynUM9+A7JrWq5110zSpNV2wlSnv0+bRKagDW8gozwgXfR5i1IIG8QDjJZ6VgXQVqCZw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "^4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/plugin-helpers@^5.0.0", "@graphql-codegen/plugin-helpers@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.1.tgz#e2429fcfba3f078d5aa18aa062d46c922bbb0d55" - integrity sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww== - dependencies: - "@graphql-tools/utils" "^10.0.0" - change-case-all "1.0.15" - common-tags "1.8.2" - import-from "4.0.0" - lodash "~4.17.0" - tslib "~2.5.0" - -"@graphql-codegen/schema-ast@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.0.tgz#5d60996c87b64f81847da8fcb2d8ef50ede89755" - integrity sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "~2.5.0" - -"@graphql-codegen/typed-document-node@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.1.tgz#ac90cf67c61554f63ec100d6076b47c9f0b18b27" - integrity sha512-VFkhCuJnkgtbbgzoCAwTdJe2G1H6sd3LfCrDqWUrQe53y2ukfSb5Ov1PhAIkCBStKCMQBUY9YgGz9GKR40qQ8g== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - change-case-all "1.0.15" - tslib "~2.5.0" - -"@graphql-codegen/typescript-operations@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.0.1.tgz#930af3e2d2ae8ff06de696291be28fe7046a2fef" - integrity sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/typescript" "^4.0.1" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/typescript@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.1.tgz#7481d68f59bea802dd10e278dce73c8a1552b2a4" - integrity sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/schema-ast" "^4.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/visitor-plugin-common@4.0.1", "@graphql-codegen/visitor-plugin-common@^4.0.0", "@graphql-codegen/visitor-plugin-common@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.0.1.tgz#64e293728b3c186f6767141e41fcdb310e50d367" - integrity sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/optimize" "^2.0.0" - "@graphql-tools/relay-operation-optimizer" "^7.0.0" - "@graphql-tools/utils" "^10.0.0" - auto-bind "~4.0.0" - change-case-all "1.0.15" - dependency-graph "^0.11.0" - graphql-tag "^2.11.0" - parse-filepath "^1.0.2" - tslib "~2.5.0" - -"@graphql-tools/apollo-engine-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489" - integrity sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.9.0" - tslib "^2.4.0" - -"@graphql-tools/batch-execute@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.1.tgz#9269da9fb8c0be50afe0cafef59aa8f6ab2bea72" - integrity sha512-cc96n/JNARtnYjru6KQl3u3MLrQLfFBu8VoDRRG2BQmShodw4QJ8fn7MzFABjkBHFQPydNGN1QOKBCjq6ui/3g== - dependencies: - "@graphql-tools/utils" "^10.0.5" - dataloader "^2.2.2" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/code-file-loader@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.0.2.tgz#224b9ce29d9229c52d8bd7b6d976038f4ea5d3f4" - integrity sha512-AKNpkElUL2cWocYpC4DzNEpo6qJw8Lp+L3bKQ/mIfmbsQxgLz5uve6zHBMhDaFPdlwfIox41N3iUSvi77t9e8A== - dependencies: - "@graphql-tools/graphql-tag-pluck" "8.0.2" - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/delegate@^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.2.tgz#26fdd4b186969799570cc6d2451d05d1d7cb7c90" - integrity sha512-ZU7VnR2xFgHrGnsuw6+nRJkcvSucn7w5ooxb/lTKlVfrNJfTwJevNcNKMnbtPUSajG3+CaFym/nU6v44GXCmNw== - dependencies: - "@graphql-tools/batch-execute" "^9.0.1" - "@graphql-tools/executor" "^1.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.5" - dataloader "^2.2.2" - tslib "^2.5.0" - -"@graphql-tools/documents@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/documents/-/documents-1.0.0.tgz#e3ed97197cc22ec830ca227fd7d17e86d8424bdf" - integrity sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg== - dependencies: - lodash.sortby "^4.7.0" - tslib "^2.4.0" - -"@graphql-tools/executor-graphql-ws@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz#7727159ebaa9df4dc793d0d02e74dd1ca4a7cc60" - integrity sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg== - dependencies: - "@graphql-tools/utils" "^10.0.2" - "@types/ws" "^8.0.0" - graphql-ws "^5.14.0" - isomorphic-ws "^5.0.0" - tslib "^2.4.0" - ws "^8.13.0" - -"@graphql-tools/executor-http@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.2.tgz#d7964a6e5ec883842f9a8e3f104f93c9b8f472be" - integrity sha512-JKTB4E3kdQM2/1NEcyrVPyQ8057ZVthCV5dFJiKktqY9IdmF00M8gupFcW3jlbM/Udn78ickeUBsUzA3EouqpA== - dependencies: - "@graphql-tools/utils" "^10.0.2" - "@repeaterjs/repeater" "^3.0.4" - "@whatwg-node/fetch" "^0.9.0" - extract-files "^11.0.0" - meros "^1.2.1" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/executor-legacy-ws@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.1.tgz#49764812fc93f401cb3f3ef32b2d6db4a9cd8db5" - integrity sha512-PQrTJ+ncHMEQspBARc2lhwiQFfRAX/z/CsOdZTFjIljOHgRWGAA1DAx7pEN0j6PflbLCfZ3NensNq2jCBwF46w== - dependencies: - "@graphql-tools/utils" "^10.0.0" - "@types/ws" "^8.0.0" - isomorphic-ws "5.0.0" - tslib "^2.4.0" - ws "8.13.0" - -"@graphql-tools/executor@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.2.0.tgz#6c45f4add765769d9820c4c4405b76957ba39c79" - integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== - dependencies: - "@graphql-tools/utils" "^10.0.0" - "@graphql-typed-document-node/core" "3.2.0" - "@repeaterjs/repeater" "^3.0.4" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/git-loader@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.2.tgz#d26d87e176ff0cea86e0acfe7c2072f32fd836c3" - integrity sha512-AuCB0nlPvsHh8u42zRZdlD/ZMaWP9A44yAkQUVCZir1E/LG63fsZ9svTWJ+CbusW3Hd0ZP9qpxEhlHxnd4Tlsg== - dependencies: - "@graphql-tools/graphql-tag-pluck" "8.0.2" - "@graphql-tools/utils" "^10.0.0" - is-glob "4.0.3" - micromatch "^4.0.4" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/github-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz#683195800618364701cfea9bc6f88674486f053b" - integrity sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/executor-http" "^1.0.0" - "@graphql-tools/graphql-tag-pluck" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.9.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/graphql-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz#a2026405bce86d974000455647511bf65df4f211" - integrity sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg== - dependencies: - "@graphql-tools/import" "7.0.0" - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/graphql-tag-pluck@8.0.2", "@graphql-tools/graphql-tag-pluck@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.0.2.tgz#c1ce8226c951583a27765dccceea19dc5827a948" - integrity sha512-U6fE4yEHxuk/nqmPixHpw1WhqdS6aYuaV60m1bEmUmGJNbpAhaMBy01JncpvpF15yZR5LZ0UjkHg+A3Lhoc8YQ== - dependencies: - "@babel/core" "^7.22.9" - "@babel/parser" "^7.16.8" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/import@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.0.tgz#a6a91a90a707d5f46bad0fd3fde2f407b548b2be" - integrity sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw== - dependencies: - "@graphql-tools/utils" "^10.0.0" - resolve-from "5.0.0" - tslib "^2.4.0" - -"@graphql-tools/json-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz#9b1b62902f766ef3f1c9cd1c192813ea4f48109c" - integrity sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg== - dependencies: - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/load@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.0.tgz#62e00f48c39b4085167a096f66ba6c21fb3fc796" - integrity sha512-Cy874bQJH0FP2Az7ELPM49iDzOljQmK1PPH6IuxsWzLSTxwTqd8dXA09dcVZrI7/LsN26heTY2R8q2aiiv0GxQ== - dependencies: - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - p-limit "3.1.0" - tslib "^2.4.0" - -"@graphql-tools/merge@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" - integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== - dependencies: - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/optimize@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-2.0.0.tgz#7a9779d180824511248a50c5a241eff6e7a2d906" - integrity sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg== - dependencies: - tslib "^2.4.0" - -"@graphql-tools/prisma-loader@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.1.tgz#0a013c69b04e0779b5be15757173d458cdf94e35" - integrity sha512-bl6e5sAYe35Z6fEbgKXNrqRhXlCJYeWKBkarohgYA338/SD9eEhXtg3Cedj7fut3WyRLoQFpHzfiwxKs7XrgXg== - dependencies: - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@types/js-yaml" "^4.0.0" - "@types/json-stable-stringify" "^1.0.32" - "@whatwg-node/fetch" "^0.9.0" - chalk "^4.1.0" - debug "^4.3.1" - dotenv "^16.0.0" - graphql-request "^6.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - jose "^4.11.4" - js-yaml "^4.0.0" - json-stable-stringify "^1.0.1" - lodash "^4.17.20" - scuid "^1.1.0" - tslib "^2.4.0" - yaml-ast-parser "^0.0.43" - -"@graphql-tools/relay-operation-optimizer@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz#24367666af87bc5a81748de5e8e9b3c523fd4207" - integrity sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw== - dependencies: - "@ardatan/relay-compiler" "12.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/schema@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" - integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== - dependencies: - "@graphql-tools/merge" "^9.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/url-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz#8d952d5ebb7325e587cb914aaebded3dbd078cf6" - integrity sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/delegate" "^10.0.0" - "@graphql-tools/executor-graphql-ws" "^1.0.0" - "@graphql-tools/executor-http" "^1.0.0" - "@graphql-tools/executor-legacy-ws" "^1.0.0" - "@graphql-tools/utils" "^10.0.0" - "@graphql-tools/wrap" "^10.0.0" - "@types/ws" "^8.0.0" - "@whatwg-node/fetch" "^0.9.0" - isomorphic-ws "^5.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.11" - ws "^8.12.0" - -"@graphql-tools/utils@^10.0.0", "@graphql-tools/utils@^10.0.2", "@graphql-tools/utils@^10.0.5": - version "10.0.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.5.tgz#b76c7b5b7fc3f67da734b51cf6e33c52dee09974" - integrity sha512-ZTioQqg9z9eCG3j+KDy54k1gp6wRIsLqkx5yi163KVvXVkfjsrdErCyZjrEug21QnKE9piP4tyxMpMMOT1RuRw== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - dset "^3.1.2" - tslib "^2.4.0" - -"@graphql-tools/wrap@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.0.tgz#573ab111482387d4acf4757d5fb7f9553a504bc1" - integrity sha512-HDOeUUh6UhpiH0WPJUQl44ODt1x5pnMUbOJZ7GjTdGQ7LK0AgVt3ftaAQ9duxLkiAtYJmu5YkULirfZGj4HzDg== - dependencies: - "@graphql-tools/delegate" "^10.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" - integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== - -"@headlessui/react@^1.7.15": - version "1.7.15" - resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz" - integrity sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw== - dependencies: - client-only "^0.0.1" - -"@heroicons/react@^2.0.18": - version "2.0.18" - resolved "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz" - integrity sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw== - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@next/env@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz" - integrity sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ== - -"@next/eslint-plugin-next@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.10.tgz" - integrity sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA== - dependencies: - glob "7.1.7" - -"@next/swc-darwin-arm64@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz#962ac55559970d1725163ff9d62d008bc1c33503" - integrity sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg== - -"@next/swc-darwin-x64@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz" - integrity sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg== - -"@next/swc-linux-arm64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz#8fc25052c345ffc8f6c51f61d1bb6c359b80ab2b" - integrity sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg== - -"@next/swc-linux-arm64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz#25e6b0dbb87c89c44c3e3680227172862bc7072c" - integrity sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q== - -"@next/swc-linux-x64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz#24fa8070ea0855c0aa020832ce7d1b84d3413fc1" - integrity sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ== - -"@next/swc-linux-x64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz#ae55914d50589a4f8b91c8eeebdd713f0c1b1675" - integrity sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg== - -"@next/swc-win32-arm64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz#ab3098b2305f3c0e46dfb2e318a9988bff884047" - integrity sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ== - -"@next/swc-win32-ia32-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz#a1c5980538641ca656012c00d05b08882cf0ec9f" - integrity sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ== - -"@next/swc-win32-x64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz#44dd9eea943ed14a1012edd5011b8e905f5e6fc4" - integrity sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@panva/hkdf@^1.0.2": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" - integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== - -"@peculiar/asn1-schema@^2.3.6": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" - integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== - dependencies: - asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -"@peculiar/json-schema@^1.1.12": - version "1.1.12" - resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" - integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== - dependencies: - tslib "^2.0.0" - -"@peculiar/webcrypto@^1.4.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" - integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - pvtsutils "^1.3.2" - tslib "^2.5.0" - webcrypto-core "^1.7.7" - -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - -"@repeaterjs/repeater@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" - integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== - -"@rushstack/eslint-patch@^1.1.3": - version "1.3.2" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz" - integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== - -"@swc/helpers@0.5.1": - version "0.5.1" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz" - integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== - dependencies: - tslib "^2.4.0" - -"@tailwindcss/forms@^0.5.4": - version "0.5.4" - resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.4.tgz" - integrity sha512-YAm12D3R7/9Mh4jFbYSMnsd6jG++8KxogWgqs7hbdo/86aWjjlIEvL7+QYdVELmAI0InXTpZqFIg5e7aDVWI2Q== - dependencies: - mini-svg-data-uri "^1.2.3" - -"@tailwindcss/typography@^0.5.9": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.9.tgz#027e4b0674929daaf7c921c900beee80dbad93e8" - integrity sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg== - dependencies: - lodash.castarray "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - postcss-selector-parser "6.0.10" - -"@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== - dependencies: - "@types/ms" "*" - -"@types/hast@^2.0.0": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" - integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== - dependencies: - "@types/unist" "^2" - -"@types/js-yaml@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== - -"@types/json-stable-stringify@^1.0.32": - version "1.0.34" - resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" - integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== - dependencies: - "@types/unist" "^2" - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node@*": - version "20.5.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.3.tgz#fa52c147f405d56b2f1dd8780d840aa87ddff629" - integrity sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA== - -"@types/node@20.4.2": - version "20.4.2" - resolved "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz" - integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== - -"@types/parse5@^6.0.0": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-dom@18.2.7": - version "18.2.7" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" - integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== - dependencies: - "@types/react" "*" - -"@types/react-syntax-highlighter@^15.5.7": - version "15.5.7" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz#bd29020ccb118543d88779848f99059b64b02d0f" - integrity sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@18.2.15": - version "18.2.15" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz" - integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@^2": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" - integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== - -"@types/unist@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== - -"@types/ws@^8.0.0": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== - dependencies: - "@types/node" "*" - -"@typescript-eslint/parser@^5.42.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@whatwg-node/events@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" - integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== - -"@whatwg-node/events@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.1.tgz#0ca718508249419587e130da26d40e29d99b5356" - integrity sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w== - -"@whatwg-node/fetch@^0.8.0": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" - integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== - dependencies: - "@peculiar/webcrypto" "^1.4.0" - "@whatwg-node/node-fetch" "^0.3.6" - busboy "^1.6.0" - urlpattern-polyfill "^8.0.0" - web-streams-polyfill "^3.2.1" - -"@whatwg-node/fetch@^0.9.0": - version "0.9.9" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.9.tgz#65e68aaf8353755c20657b803f2fe983dbdabf91" - integrity sha512-OTVoDm039CNyAWSRc2WBimMl/N9J4Fk2le21Xzcf+3OiWPNNSIbMnpWKBUyraPh2d9SAEgoBdQxTfVNihXgiUw== - dependencies: - "@whatwg-node/node-fetch" "^0.4.8" - urlpattern-polyfill "^9.0.0" - -"@whatwg-node/node-fetch@^0.3.6": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" - integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== - dependencies: - "@whatwg-node/events" "^0.0.3" - busboy "^1.6.0" - fast-querystring "^1.1.1" - fast-url-parser "^1.1.3" - tslib "^2.3.1" - -"@whatwg-node/node-fetch@^0.4.8": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.4.14.tgz#b3dbdd92bac227026a39fb882207a7f739ada5bf" - integrity sha512-ii/eZz2PcjLGj9D6WfsmfzlTzZV1Kz6MxYpq2Vc5P21J8vkKfENWC9B2ISsFCKovxElLukIwPg8HTrHFsLNflg== - dependencies: - "@whatwg-node/events" "^0.1.0" - busboy "^1.6.0" - fast-querystring "^1.1.1" - fast-url-parser "^1.1.3" - tslib "^2.3.1" - -"@wry/context@^0.7.0", "@wry/context@^0.7.3": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.3.tgz#240f6dfd4db5ef54f81f6597f6714e58d4f476a1" - integrity sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.6": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.6.tgz#cd4a533c72c3752993ab8cbf682d3d20e3cb601e" - integrity sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" - integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== - dependencies: - tslib "^2.3.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.1.3: - version "5.3.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1js@^3.0.1, asn1js@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" - integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== - dependencies: - pvtsutils "^1.3.2" - pvutils "^1.1.3" - tslib "^2.4.0" - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -auto-bind@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" - integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== - -autoprefixer@10.4.14: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== - -axobject-query@^3.1.1: - version "3.2.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.5: - version "4.21.9" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== - dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -busboy@1.6.0, busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: - version "1.0.30001516" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz" - integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== - -caniuse-lite@^1.0.30001517: - version "1.0.30001522" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz#44b87a406c901269adcdb834713e23582dd71856" - integrity sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg== - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case-all@1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" - integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== - dependencies: - change-case "^4.1.2" - is-lower-case "^2.0.2" - is-upper-case "^2.0.2" - lower-case "^2.0.2" - lower-case-first "^2.0.2" - sponge-case "^1.0.1" - swap-case "^2.0.2" - title-case "^3.0.3" - upper-case "^2.0.2" - upper-case-first "^2.0.2" - -change-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -classnames@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -client-only@0.0.1, client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.16: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-tags@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: - version "8.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dataloader@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" - integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== - -debounce@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dependency-graph@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" - integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== - -dequal@^2.0.0, dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv@^16.0.0: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== - -dset@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" - integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== - -electron-to-chromium@^1.4.431: - version "1.4.463" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz" - integrity sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw== - -electron-to-chromium@^1.4.477: - version "1.4.499" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz#dc36b67f4c8e273524e8d2080c5203a6a76987b6" - integrity sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw== - -embla-carousel-react@^8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.0.0-rc11.tgz#0e2fde5cafa3cae9c30721e18aee648599527994" - integrity sha512-hXOAUMOIa0GF5BtdTTqBuKcjgU+ipul6thTCXOZttqnu2c6VS3SIzUUT+onIIEw+AptzKJcPwGcoAByAGa9eJw== - dependencies: - embla-carousel "8.0.0-rc11" - embla-carousel-reactive-utils "8.0.0-rc11" - -embla-carousel-reactive-utils@8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.0-rc11.tgz#d5493bd2bfeb68b1cbf65d4c836a4d36779a03de" - integrity sha512-pDNVJNCn0dybLkHw93My+cMfkRQ5oLZff6ZCwgmrw+96aPiZUyo5ANywz8Lb70SWWgD/TNBRrtQCquvjHS31Sg== - -embla-carousel@8.0.0-rc11, embla-carousel@^8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.0.0-rc11.tgz#700ab6b3e4825ef9e6ac83238b81e3e1a316c3f4" - integrity sha512-Toeaug98PGYzSY56p/xsa+u4zbQbAXgGymwEDUc2wqT+1XCnnUsH42MClglhABJQbobwDYxOabhJrfXyJKUMig== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.22.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@13.4.10: - version "13.4.10" - resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.10.tgz" - integrity sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g== - dependencies: - "@next/eslint-plugin-next" "13.4.10" - "@rushstack/eslint-patch" "^1.1.3" - "@typescript-eslint/parser" "^5.42.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.26.0" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.31.7" - eslint-plugin-react-hooks "5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-import-resolver-typescript@^3.5.2: - version "3.5.5" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - get-tsconfig "^4.5.0" - globby "^13.1.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - synckit "^0.8.5" - -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.26.0: - version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jsx-a11y@^6.5.1: - version "6.7.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - version "5.0.0-canary-7118f5dd7-20230705" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz" - integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== - -eslint-plugin-react@^7.31.7: - version "7.32.2" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" - -eslint-scope@^7.2.0: - version "7.2.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz" - integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@8.45.0: - version "8.45.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-files@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" - integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== - -fast-decode-uri-component@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" - integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-querystring@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" - integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== - dependencies: - fast-decode-uri-component "^1.0.1" - -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz" - integrity sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7, glob@^7.1.3: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.3, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.3: - version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -graphql-config@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.0.2.tgz#7e962f94ccddcc2ee0aa71d75cf4491ec5092bdb" - integrity sha512-7TPxOrlbiG0JplSZYCyxn2XQtqVhXomEjXUmWJVSS5ET1nPhOJSsIb/WTwqWhcYX6G0RlHXSj9PLtGTKmxLNGg== - dependencies: - "@graphql-tools/graphql-file-loader" "^8.0.0" - "@graphql-tools/json-file-loader" "^8.0.0" - "@graphql-tools/load" "^8.0.0" - "@graphql-tools/merge" "^9.0.0" - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - cosmiconfig "^8.1.0" - jiti "^1.18.2" - minimatch "^4.2.3" - string-env-interpolation "^1.0.1" - tslib "^2.4.0" - -graphql-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" - integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== - dependencies: - "@graphql-typed-document-node/core" "^3.2.0" - cross-fetch "^3.1.5" - -graphql-tag@^2.11.0, graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql-ws@^5.14.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.14.0.tgz#766f249f3974fc2c48fae0d1fb20c2c4c79cd591" - integrity sha512-itrUTQZP/TgswR4GSSYuwWUzrE/w5GhbwM2GX3ic2U7aw33jgEsayfIlvaj7/GcIvZgNMzsPTrE5hqPuFUiE5g== - -graphql@^16.8.0: - version "16.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" - integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-util-from-parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" - integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hastscript "^7.0.0" - property-information "^6.0.0" - vfile "^5.0.0" - vfile-location "^4.0.0" - web-namespaces "^2.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-parse-selector@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" - integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== - dependencies: - "@types/hast" "^2.0.0" - -hast-util-raw@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" - integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== - dependencies: - "@types/hast" "^2.0.0" - "@types/parse5" "^6.0.0" - hast-util-from-parse5 "^7.0.0" - hast-util-to-parse5 "^7.0.0" - html-void-elements "^2.0.0" - parse5 "^6.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-sanitize@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286" - integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw== - dependencies: - "@types/hast" "^2.0.0" - -hast-util-to-html@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" - integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-raw "^7.0.0" - hast-util-whitespace "^2.0.0" - html-void-elements "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.0" - zwitch "^2.0.4" - -hast-util-to-parse5@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" - integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hastscript@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" - integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^3.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" - integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== - -http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -https-proxy-agent@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" - integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -immutable@~3.7.6: - version "3.7.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" - integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" - integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^8.0.0: - version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" - integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^6.0.1" - -internal-slot@^1.0.3, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" - integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== - dependencies: - tslib "^2.0.3" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" - integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== - dependencies: - tslib "^2.0.3" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-ws@5.0.0, isomorphic-ws@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" - integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== - -jiti@^1.17.1: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== - -jiti@^1.18.2: - version "1.19.1" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" - integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== - -jose@^4.11.4, jose@^4.14.4: - version "4.14.4" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca" - integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g== - -jotai-optics@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jotai-optics/-/jotai-optics-0.3.1.tgz#7ff38470551429460cc41d9cd1320193665354e0" - integrity sha512-KibUx9IneM2hGWGIYGs/v0KCxU985lg7W2c6dt5RodJCB2XPbmok8rkkLmdVk9+fKsn2shkPMi+AG8XzHgB3+w== - -jotai@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.4.2.tgz#85610d82d247a7b19de7cce82e8d3ddf007f8d4d" - integrity sha512-90jXVOd9h6gi5JXk558M+wnJfaaVN2WegcNOCfiFbWboNaDl6DkRgiY/K1oeqTfYJmq8yM7XPsL99LAvcOPqhw== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.0.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== - dependencies: - jsonify "^0.0.1" - -json-to-pretty-yaml@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" - integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== - dependencies: - remedial "^1.0.7" - remove-trailing-spaces "^1.0.6" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.4" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz" - integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -jwt-decode@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" - integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== - -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -listr2@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" - integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== - dependencies: - tslib "^2.0.3" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-from-markdown@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-phrasing@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" - integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== - dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" - -mdast-util-to-hast@^12.0.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-markdown@^1.0.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -meros@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" - integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== - -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== - -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mini-svg-data-uri@^1.2.3: - version "1.4.4" - resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" - integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.3.tgz#b4dcece1d674dee104bb0fb833ebb85a78cbbca6" - integrity sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.4, nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-auth@^4.23.1: - version "4.23.1" - resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.23.1.tgz#7a82f5327cf4c7e32819da4eb977f2251a23c3cf" - integrity sha512-mL083z8KgRtlrIV6CDca2H1kduWJuK/3pTS0Fe2og15KOm4v2kkLGdSDfc2g+019aEBrJUT0pPW2Xx42ImN1WA== - dependencies: - "@babel/runtime" "^7.20.13" - "@panva/hkdf" "^1.0.2" - cookie "^0.5.0" - jose "^4.11.4" - oauth "^0.9.15" - openid-client "^5.4.0" - preact "^10.6.3" - preact-render-to-string "^5.1.19" - uuid "^8.3.2" - -next-themes@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" - integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== - -next@13.4.10: - version "13.4.10" - resolved "https://registry.npmjs.org/next/-/next-13.4.10.tgz" - integrity sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A== - dependencies: - "@next/env" "13.4.10" - "@swc/helpers" "0.5.1" - busboy "1.6.0" - caniuse-lite "^1.0.30001406" - postcss "8.4.14" - styled-jsx "5.1.1" - watchpack "2.4.0" - zod "3.21.4" - optionalDependencies: - "@next/swc-darwin-arm64" "13.4.10" - "@next/swc-darwin-x64" "13.4.10" - "@next/swc-linux-arm64-gnu" "13.4.10" - "@next/swc-linux-arm64-musl" "13.4.10" - "@next/swc-linux-x64-gnu" "13.4.10" - "@next/swc-linux-x64-musl" "13.4.10" - "@next/swc-win32-arm64-msvc" "13.4.10" - "@next/swc-win32-ia32-msvc" "13.4.10" - "@next/swc-win32-x64-msvc" "13.4.10" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@^2.6.1, node-fetch@^2.6.12: - version "2.6.13" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.13.tgz#a20acbbec73c2e09f9007de5cda17104122e0010" - integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.12, node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -oauth@^0.9.15: - version "0.9.15" - resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" - integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== - dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -oidc-token-hash@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" - integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -openid-client@^5.4.0: - version "5.4.3" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.4.3.tgz#c75d2f6d07a25d383a72c8ff34605a36b7e2cd73" - integrity sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ== - dependencies: - jose "^4.14.4" - lru-cache "^6.0.0" - object-hash "^2.2.0" - oidc-token-hash "^5.0.3" - -optics-ts@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/optics-ts/-/optics-ts-2.4.1.tgz#de94bda2b0ed7fde5b7631283031b9699459d40d" - integrity sha512-HaYzMHvC80r7U/LqAd4hQyopDezC60PO2qF5GuIwALut2cl5rK1VWHsqTp0oqoJJWjiv6uXKqsO+Q2OO0C3MmQ== - -optimism@^0.17.5: - version "0.17.5" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.17.5.tgz#a4c78b3ad12c58623abedbebb4f2f2c19b8e8816" - integrity sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw== - dependencies: - "@wry/context" "^0.7.0" - "@wry/trie" "^0.4.3" - tslib "^2.3.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@3.1.0, p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-filepath@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== - dependencies: - path-root-regex "^0.1.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.11: - version "6.0.13" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@8.4.26, postcss@^8.4.23: - version "8.4.26" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz" - integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -preact-render-to-string@^5.1.19: - version "5.2.6" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" - integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== - dependencies: - pretty-format "^3.8.0" - -preact@^10.6.3: - version "10.17.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" - integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-format@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" - integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== - -prismjs@^1.27.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -property-information@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pvtsutils@^1.3.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" - integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== - dependencies: - tslib "^2.6.1" - -pvutils@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" - integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-hook-form@^7.45.4: - version "7.45.4" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.45.4.tgz#73d228b704026ae95d7e5f7b207a681b173ec62a" - integrity sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ== - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-syntax-highlighter@^15.5.0: - version "15.5.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" - -react@18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -relay-runtime@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" - integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== - dependencies: - "@babel/runtime" "^7.0.0" - fbjs "^3.0.0" - invariant "^2.2.4" - -remark-html@^15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-15.0.2.tgz#44ff77c876f037658b406662b5ce15e26ed34d80" - integrity sha512-/CIOI7wzHJzsh48AiuIyIe1clxVkUtreul73zcCXLub0FmnevQE0UMFDQm7NUx8/3rl/4zCshlMfqBdWScQthw== - dependencies: - "@types/mdast" "^3.0.0" - hast-util-sanitize "^4.0.0" - hast-util-to-html "^8.0.0" - mdast-util-to-hast "^12.0.0" - unified "^10.0.0" - -remark-parse@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" - integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-stringify@^10.0.0: - version "10.0.3" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.3.tgz#83b43f2445c4ffbb35b606f967d121b2b6d69717" - integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.0.0" - unified "^10.0.0" - -remark@^14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.3.tgz#e477886a7579df612908f387c7753dc93cdaa3fc" - integrity sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew== - dependencies: - "@types/mdast" "^3.0.0" - remark-parse "^10.0.0" - remark-stringify "^10.0.0" - unified "^10.0.0" - -remedial@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" - integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -remove-trailing-spaces@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" - integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -response-iterator@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" - integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -scuid@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" - integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.7: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signedsource@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" - integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -sponge-case@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" - integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== - dependencies: - tslib "^2.0.3" - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-env-interpolation@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" - integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.33.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.33.0.tgz" - integrity sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swap-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" - integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== - dependencies: - tslib "^2.0.3" - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - -tailwindcss@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz" - integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.18.2" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -title-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" - integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== - dependencies: - tslib "^2.0.3" - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-log@^2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" - integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== - -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== - -tslib@~2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typescript@5.1.6: - version "5.1.6" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== - -ua-parser-js@^1.0.35: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== - -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -unixify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" - integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== - dependencies: - normalize-path "^2.1.1" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urlpattern-polyfill@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" - integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== - -urlpattern-polyfill@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz#bc7e386bb12fd7898b58d1509df21d3c29ab3460" - integrity sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -value-or-promise@^1.0.11, value-or-promise@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" - integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== - -vfile-location@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" - integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== - dependencies: - "@types/unist" "^2.0.0" - vfile "^5.0.0" - -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -watchpack@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -web-streams-polyfill@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== - -webcrypto-core@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" - integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - asn1js "^3.0.1" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.13.0, ws@^8.12.0, ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@^0.0.43: - version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^2.1.1, yaml@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.0.0: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - -zod@3.21.4: - version "3.21.4" - resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz" - integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== - -zwitch@^2.0.0, zwitch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/web-client/.eslintrc.json b/web/.eslintrc.json similarity index 100% rename from web-client/.eslintrc.json rename to web/.eslintrc.json diff --git a/web-client/.gitignore b/web/.gitignore similarity index 100% rename from web-client/.gitignore rename to web/.gitignore diff --git a/web-client/Dockerfile b/web/Dockerfile similarity index 100% rename from web-client/Dockerfile rename to web/Dockerfile diff --git a/web-client/app/_components/AdvancedPrompt/index.tsx b/web/app/_components/AdvancedPrompt/index.tsx similarity index 100% rename from web-client/app/_components/AdvancedPrompt/index.tsx rename to web/app/_components/AdvancedPrompt/index.tsx diff --git a/web-client/app/_components/AdvancedPromptGenerationParams/index.tsx b/web/app/_components/AdvancedPromptGenerationParams/index.tsx similarity index 89% rename from web-client/app/_components/AdvancedPromptGenerationParams/index.tsx rename to web/app/_components/AdvancedPromptGenerationParams/index.tsx index 1636361db..f6695c440 100644 --- a/web-client/app/_components/AdvancedPromptGenerationParams/index.tsx +++ b/web/app/_components/AdvancedPromptGenerationParams/index.tsx @@ -6,7 +6,7 @@ const AdvancedPromptGenerationParams = () => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptImageUpload/index.tsx b/web/app/_components/AdvancedPromptImageUpload/index.tsx similarity index 96% rename from web-client/app/_components/AdvancedPromptImageUpload/index.tsx rename to web/app/_components/AdvancedPromptImageUpload/index.tsx index 26e780fba..9db97a42e 100644 --- a/web-client/app/_components/AdvancedPromptImageUpload/index.tsx +++ b/web/app/_components/AdvancedPromptImageUpload/index.tsx @@ -15,7 +15,7 @@ const AdvancedPromptImageUpload: React.FC = ({ register }) => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptResolution/index.tsx b/web/app/_components/AdvancedPromptResolution/index.tsx similarity index 94% rename from web-client/app/_components/AdvancedPromptResolution/index.tsx rename to web/app/_components/AdvancedPromptResolution/index.tsx index 6bfe9218d..92c00e0d7 100644 --- a/web-client/app/_components/AdvancedPromptResolution/index.tsx +++ b/web/app/_components/AdvancedPromptResolution/index.tsx @@ -10,7 +10,7 @@ const AdvancedPromptResolution = () => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptText/index.tsx b/web/app/_components/AdvancedPromptText/index.tsx similarity index 96% rename from web-client/app/_components/AdvancedPromptText/index.tsx rename to web/app/_components/AdvancedPromptText/index.tsx index b5ec36477..8a0669725 100644 --- a/web-client/app/_components/AdvancedPromptText/index.tsx +++ b/web/app/_components/AdvancedPromptText/index.tsx @@ -13,7 +13,7 @@ const AdvancedPromptText: React.FC = ({ register }) => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedTextArea/index.tsx b/web/app/_components/AdvancedTextArea/index.tsx similarity index 100% rename from web-client/app/_components/AdvancedTextArea/index.tsx rename to web/app/_components/AdvancedTextArea/index.tsx diff --git a/web-client/app/_components/AiSearch/index.tsx b/web/app/_components/AiSearch/index.tsx similarity index 90% rename from web-client/app/_components/AiSearch/index.tsx rename to web/app/_components/AiSearch/index.tsx index a8bbc8071..46c00b916 100644 --- a/web-client/app/_components/AiSearch/index.tsx +++ b/web/app/_components/AiSearch/index.tsx @@ -4,7 +4,7 @@ const Search: React.FC = () => { return (
void; +}; + +const AvailableModelCard: React.FC = ({ + product, + isRecommend, + required, + onDownloadClick, +}) => { + const downloadState = useAtomValue(modelDownloadStateAtom); + + let isDownloading = false; + let total = 0; + let transferred = 0; + + if (product.fileName && downloadState[product.fileName]) { + isDownloading = + downloadState[product.fileName].error == null && + downloadState[product.fileName].percent < 1; + + if (isDownloading) { + total = downloadState[product.fileName].size.total; + transferred = downloadState[product.fileName].size.transferred; + } + } + + const handleViewDetails = () => {}; + + const downloadButton = isDownloading ? ( +
+ +
+ ) : ( +
+ onDownloadClick?.(product)} /> +
+ ); + + return ( +
+
+ + {downloadButton} +
+ {/* */} +
+ ); +}; + +export default AvailableModelCard; diff --git a/web-client/app/_components/BasicPromptAccessories/index.tsx b/web/app/_components/BasicPromptAccessories/index.tsx similarity index 90% rename from web-client/app/_components/BasicPromptAccessories/index.tsx rename to web/app/_components/BasicPromptAccessories/index.tsx index 3921e0f2b..332bebbfb 100644 --- a/web-client/app/_components/BasicPromptAccessories/index.tsx +++ b/web/app/_components/BasicPromptAccessories/index.tsx @@ -13,8 +13,8 @@ const BasicPromptAccessories: React.FC = () => { const setShowingAdvancedPrompt = useSetAtom(showingAdvancedPromptAtom); const currentConversation = useAtomValue(currentConversationAtom); - const shouldShowAdvancedPrompt = - currentConversation?.product.type === ProductType.ControlNet; + const shouldShowAdvancedPrompt = false; + // currentConversation?.product.type === ProductType.ControlNet; return (
{ const messages = useAtomValue(currentChatMessagesAtom); + const isTyping = useAtomValue(showingTyping); const [offset, setOffset] = useState(0); const { loading, hasMore } = useChatMessages(offset); const intersectObs = useRef(null); @@ -32,6 +37,7 @@ const ChatBody: React.FC = () => { const content = messages.map((message, index) => { if (messages.length === index + 1) { + // @ts-ignore return ; } return ; @@ -39,6 +45,11 @@ const ChatBody: React.FC = () => { return (
+ {isTyping && ( +
+ +
+ )} {content}
); diff --git a/web-client/app/_components/ChatBody/renderChatMessage.tsx b/web/app/_components/ChatBody/renderChatMessage.tsx similarity index 100% rename from web-client/app/_components/ChatBody/renderChatMessage.tsx rename to web/app/_components/ChatBody/renderChatMessage.tsx diff --git a/web/app/_components/ChatContainer/index.tsx b/web/app/_components/ChatContainer/index.tsx new file mode 100644 index 000000000..46e740f90 --- /dev/null +++ b/web/app/_components/ChatContainer/index.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { useAtomValue } from "jotai"; +import { MainViewState, getMainViewStateAtom } from "@/_helpers/JotaiWrapper"; +import { ReactNode } from "react"; +import ModelManagement from "../ModelManagement"; +import Welcome from "../WelcomeContainer"; +import { Preferences } from "../Preferences"; + +type Props = { + children: ReactNode; +}; + +export default function ChatContainer({ children }: Props) { + const viewState = useAtomValue(getMainViewStateAtom); + + switch (viewState) { + case MainViewState.ExploreModel: + return ; + case MainViewState.Setting: + return ; + case MainViewState.ResourceMonitor: + case MainViewState.MyModel: + case MainViewState.Welcome: + return ; + default: + return
{children}
; + } +} diff --git a/web-client/app/_components/ChatItem/index.tsx b/web/app/_components/ChatItem/index.tsx similarity index 91% rename from web-client/app/_components/ChatItem/index.tsx rename to web/app/_components/ChatItem/index.tsx index 73d7f1721..a8590cf01 100644 --- a/web-client/app/_components/ChatItem/index.tsx +++ b/web/app/_components/ChatItem/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/display-name */ import React, { forwardRef } from "react"; import renderChatMessage from "../ChatBody/renderChatMessage"; import { ChatMessage } from "@/_models/ChatMessage"; diff --git a/web-client/app/_components/CompactHistoryItem/index.tsx b/web/app/_components/CompactHistoryItem/index.tsx similarity index 100% rename from web-client/app/_components/CompactHistoryItem/index.tsx rename to web/app/_components/CompactHistoryItem/index.tsx diff --git a/web-client/app/_components/CompactHistoryList/index.tsx b/web/app/_components/CompactHistoryList/index.tsx similarity index 78% rename from web-client/app/_components/CompactHistoryList/index.tsx rename to web/app/_components/CompactHistoryList/index.tsx index 0d022d2dc..108b732c7 100644 --- a/web-client/app/_components/CompactHistoryList/index.tsx +++ b/web/app/_components/CompactHistoryList/index.tsx @@ -7,11 +7,11 @@ const CompactHistoryList: React.FC = () => { return (
- {conversations.map(({ id, product }) => ( + {conversations.map(({ id, image }) => ( ))}
diff --git a/web-client/app/_components/CompactLogo/index.tsx b/web/app/_components/CompactLogo/index.tsx similarity index 84% rename from web-client/app/_components/CompactLogo/index.tsx rename to web/app/_components/CompactLogo/index.tsx index bb0fb6a00..5c20183d0 100644 --- a/web-client/app/_components/CompactLogo/index.tsx +++ b/web/app/_components/CompactLogo/index.tsx @@ -8,7 +8,7 @@ const CompactLogo: React.FC = () => { return ( ); }; diff --git a/web-client/app/_components/CompactSideBar/index.tsx b/web/app/_components/CompactSideBar/index.tsx similarity index 100% rename from web-client/app/_components/CompactSideBar/index.tsx rename to web/app/_components/CompactSideBar/index.tsx diff --git a/web-client/app/_components/ConfirmDeleteConversationModal/index.tsx b/web/app/_components/ConfirmDeleteConversationModal/index.tsx similarity index 100% rename from web-client/app/_components/ConfirmDeleteConversationModal/index.tsx rename to web/app/_components/ConfirmDeleteConversationModal/index.tsx diff --git a/web/app/_components/ConfirmDeleteModelModal/index.tsx b/web/app/_components/ConfirmDeleteModelModal/index.tsx new file mode 100644 index 000000000..76c862b0f --- /dev/null +++ b/web/app/_components/ConfirmDeleteModelModal/index.tsx @@ -0,0 +1,89 @@ +import React, { Fragment } from "react"; +import { Dialog, Transition } from "@headlessui/react"; +import { QuestionMarkCircleIcon } from "@heroicons/react/24/outline"; +import { showConfirmDeleteModalAtom } from "@/_helpers/JotaiWrapper"; +import { useAtom } from "jotai"; +import useSignOut from "@/_hooks/useSignOut"; + +const ConfirmDeleteModelModal: React.FC = () => { + const [show, setShow] = useAtom(showConfirmDeleteModalAtom); + const { signOut } = useSignOut(); + + const onLogOutClick = () => { + signOut().then(() => setShow(false)); + }; + + return ( + + + +
+ + +
+
+ + +
+
+
+
+ + Log out + +
+

+ Are you sure you want to delete this model? +

+
+
+
+
+ + +
+
+
+
+
+
+
+ ); +}; + +export default React.memo(ConfirmDeleteModelModal); diff --git a/web-client/app/_components/ConfirmSignOutModal/index.tsx b/web/app/_components/ConfirmSignOutModal/index.tsx similarity index 100% rename from web-client/app/_components/ConfirmSignOutModal/index.tsx rename to web/app/_components/ConfirmSignOutModal/index.tsx diff --git a/web-client/app/_components/ConversationalCard/index.tsx b/web/app/_components/ConversationalCard/index.tsx similarity index 89% rename from web-client/app/_components/ConversationalCard/index.tsx rename to web/app/_components/ConversationalCard/index.tsx index d1c0c080f..5be2142cf 100644 --- a/web-client/app/_components/ConversationalCard/index.tsx +++ b/web/app/_components/ConversationalCard/index.tsx @@ -14,9 +14,7 @@ const ConversationalCard: React.FC = ({ product }) => { return ( diff --git a/web-client/app/_components/ConversationalList/index.tsx b/web/app/_components/ConversationalList/index.tsx similarity index 100% rename from web-client/app/_components/ConversationalList/index.tsx rename to web/app/_components/ConversationalList/index.tsx diff --git a/web-client/app/_components/DescriptionPane/index.tsx b/web/app/_components/DescriptionPane/index.tsx similarity index 100% rename from web-client/app/_components/DescriptionPane/index.tsx rename to web/app/_components/DescriptionPane/index.tsx diff --git a/web-client/app/_components/DiscordContainer/index.tsx b/web/app/_components/DiscordContainer/index.tsx similarity index 57% rename from web-client/app/_components/DiscordContainer/index.tsx rename to web/app/_components/DiscordContainer/index.tsx index 1b31ce9e2..1bf062956 100644 --- a/web-client/app/_components/DiscordContainer/index.tsx +++ b/web/app/_components/DiscordContainer/index.tsx @@ -4,25 +4,12 @@ import Image from "next/image"; const DiscordContainer = () => (
- - - Get the app - - + Discord
diff --git a/web/app/_components/DownloadModelContent/index.tsx b/web/app/_components/DownloadModelContent/index.tsx new file mode 100644 index 000000000..8707c8232 --- /dev/null +++ b/web/app/_components/DownloadModelContent/index.tsx @@ -0,0 +1,58 @@ +import DownloadModelTitle from "../DownloadModelTitle"; + +type Props = { + author: string; + description: string; + isRecommend: boolean; + name: string; + type: string; + required?: string; +}; + +const DownloadModelContent: React.FC = ({ + author, + description, + isRecommend, + name, + required, + type, +}) => { + return ( +
+
+

+ {name} +

+ +
+ + {author} + +
+ {required && ( +
+ + Required{" "} + + + {required} + +
+ )} +
+

{description}

+
+
+ + Recommend + +
+
+ ); +}; + +export default DownloadModelContent; diff --git a/web/app/_components/DownloadModelTitle/index.tsx b/web/app/_components/DownloadModelTitle/index.tsx new file mode 100644 index 000000000..1fd45b302 --- /dev/null +++ b/web/app/_components/DownloadModelTitle/index.tsx @@ -0,0 +1,13 @@ +type Props = { + title: string; +}; + +export const DownloadModelTitle: React.FC = ({ title }) => ( +
+ + {title} + +
+); + +export default DownloadModelTitle; diff --git a/web/app/_components/DownloadedModelCard/index.tsx b/web/app/_components/DownloadedModelCard/index.tsx new file mode 100644 index 000000000..5aa7a7625 --- /dev/null +++ b/web/app/_components/DownloadedModelCard/index.tsx @@ -0,0 +1,44 @@ +import { Product } from "@/_models/Product"; +import DownloadModelContent from "../DownloadModelContent"; +import ViewModelDetailButton from "../ViewModelDetailButton"; +import { executeSerial } from "@/_services/pluginService"; +import { InfereceService } from "../../../shared/coreService"; + +type Props = { + product: Product; + isRecommend: boolean; + required?: string; + transferred?: number; + onDeleteClick?: (product: Product) => void; +}; + +const DownloadedModelCard: React.FC = ({ + product, + isRecommend, + required, + onDeleteClick, +}) => { + + const handleViewDetails = () => {}; + + return ( +
+
+ +
+ +
+
+ {/* */} +
+ ); +}; + +export default DownloadedModelCard; diff --git a/web-client/app/_components/DropdownList/index.tsx b/web/app/_components/DropdownList/index.tsx similarity index 94% rename from web-client/app/_components/DropdownList/index.tsx rename to web/app/_components/DropdownList/index.tsx index f103f82f3..b2db63c9e 100644 --- a/web-client/app/_components/DropdownList/index.tsx +++ b/web/app/_components/DropdownList/index.tsx @@ -21,7 +21,7 @@ export const DropdownsList: React.FC = ({ data, title }) => { {checked}
- + Jan
diff --git a/web-client/app/_components/GenerateImageCard/index.tsx b/web/app/_components/GenerateImageCard/index.tsx similarity index 100% rename from web-client/app/_components/GenerateImageCard/index.tsx rename to web/app/_components/GenerateImageCard/index.tsx diff --git a/web-client/app/_components/GenerateImageList/index.tsx b/web/app/_components/GenerateImageList/index.tsx similarity index 100% rename from web-client/app/_components/GenerateImageList/index.tsx rename to web/app/_components/GenerateImageList/index.tsx diff --git a/web-client/app/_components/HamburgerButton/index.tsx b/web/app/_components/HamburgerButton/index.tsx similarity index 100% rename from web-client/app/_components/HamburgerButton/index.tsx rename to web/app/_components/HamburgerButton/index.tsx diff --git a/web/app/_components/Header/index.tsx b/web/app/_components/Header/index.tsx new file mode 100644 index 000000000..d62114085 --- /dev/null +++ b/web/app/_components/Header/index.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import UserProfileDropDown from "../UserProfileDropDown"; +import LoginButton from "../LoginButton"; +import HamburgerButton from "../HamburgerButton"; + +const Header: React.FC = () => { + return ( +
+ +
+ + +
+ ); +}; + +export default Header; diff --git a/web/app/_components/HeaderBackButton/index.tsx b/web/app/_components/HeaderBackButton/index.tsx new file mode 100644 index 000000000..fbcefc737 --- /dev/null +++ b/web/app/_components/HeaderBackButton/index.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import { ArrowLeftIcon } from "@heroicons/react/24/outline"; + +const HeaderBackButton: React.FC = () => { + return ( + + ); +}; + +export default React.memo(HeaderBackButton); diff --git a/web/app/_components/HeaderTitle/index.tsx b/web/app/_components/HeaderTitle/index.tsx new file mode 100644 index 000000000..c61859791 --- /dev/null +++ b/web/app/_components/HeaderTitle/index.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +type Props = { + title: string; +}; + +const HeaderTitle: React.FC = ({ title }) => ( +

+ {title} +

+); + +export default React.memo(HeaderTitle); diff --git a/web/app/_components/HistoryEmpty/index.tsx b/web/app/_components/HistoryEmpty/index.tsx new file mode 100644 index 000000000..a50e0ef86 --- /dev/null +++ b/web/app/_components/HistoryEmpty/index.tsx @@ -0,0 +1,42 @@ +import useCreateConversation from "@/_hooks/useCreateConversation"; +import { executeSerial } from "@/_services/pluginService"; +import Image from "next/image"; +import React from "react"; +import { DataService } from "../../../shared/coreService"; + +const HistoryEmpty: React.FC = () => { + const { requestCreateConvo } = useCreateConversation(); + const startChat = async () => { + const downloadedModels = await executeSerial( + DataService.GET_FINISHED_DOWNLOAD_MODELS + ); + if (!downloadedModels || downloadedModels?.length === 0) { + alert( + "Seems like there is no model downloaded yet. Please download a model first." + ); + } else { + requestCreateConvo(downloadedModels[0]); + } + }; + return ( +
+ +

+ Its empty here +

+ +
+ ); +}; + +export default React.memo(HistoryEmpty); diff --git a/web-client/app/_components/HistoryItem/index.tsx b/web/app/_components/HistoryItem/index.tsx similarity index 59% rename from web-client/app/_components/HistoryItem/index.tsx rename to web/app/_components/HistoryItem/index.tsx index 66ad88782..2402dcaa0 100644 --- a/web-client/app/_components/HistoryItem/index.tsx +++ b/web/app/_components/HistoryItem/index.tsx @@ -1,21 +1,28 @@ import React from "react"; import JanImage from "../JanImage"; -import { displayDate } from "@/_utils/datetime"; import { + MainViewState, + activeModel, conversationStatesAtom, + currentProductAtom, getActiveConvoIdAtom, setActiveConvoIdAtom, + setMainViewStateAtom, } from "@/_helpers/JotaiWrapper"; import { useAtomValue, useSetAtom } from "jotai"; -import { ProductType } from "@/_models/Product"; import Image from "next/image"; import { Conversation } from "@/_models/Conversation"; +import { DataService, InfereceService } from "../../../shared/coreService"; +import { + execute, + executeSerial, +} from "../../../../electron/core/plugin-manager/execution/extension-manager"; type Props = { conversation: Conversation; - avatarUrl: string; + avatarUrl?: string; name: string; - updatedAt?: number; + updatedAt?: string; }; const HistoryItem: React.FC = ({ @@ -24,13 +31,31 @@ const HistoryItem: React.FC = ({ name, updatedAt, }) => { + const setMainViewState = useSetAtom(setMainViewStateAtom); const conversationStates = useAtomValue(conversationStatesAtom); const activeConvoId = useAtomValue(getActiveConvoIdAtom); const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); const isSelected = activeConvoId === conversation.id; - - const onClick = () => { + const setActiveModel = useSetAtom(activeModel); + const setActiveProduct = useSetAtom(currentProductAtom); + const onClick = async () => { + const convoModel = await executeSerial( + DataService.GET_MODEL_BY_ID, + conversation.model_id + ); + if (!convoModel) { + alert( + `Model ${conversation.model_id} not found! Please re-download the model first.` + ); + } else { + setActiveProduct(convoModel) + executeSerial(InfereceService.INIT_MODEL, convoModel) + .then(() => console.info(`Init model success`)) + .catch((err) => console.log(`Init model error ${err}`)); + setActiveModel(convoModel.name); + } if (activeConvoId !== conversation.id) { + setMainViewState(MainViewState.Conversation); setActiveConvoId(conversation.id); } }; @@ -40,15 +65,8 @@ const HistoryItem: React.FC = ({ : "bg-white dark:bg-gray-500"; let rightImageUrl: string | undefined; - if (conversationStates[conversation.id]?.waitingForResponse === true) { - rightImageUrl = "/icons/loading.svg"; - } else if ( - conversation && - conversation.product.type === ProductType.GenerativeArt && - conversation.lastImageUrl && - conversation.lastImageUrl.trim().startsWith("https://") - ) { - rightImageUrl = conversation.lastImageUrl; + if (conversationStates[conversation.id ?? ""]?.waitingForResponse === true) { + rightImageUrl = "icons/loading.svg"; } return ( @@ -59,7 +77,7 @@ const HistoryItem: React.FC = ({ @@ -67,13 +85,18 @@ const HistoryItem: React.FC = ({
{name} - {updatedAt && displayDate(updatedAt)} + {updatedAt && new Date(updatedAt).toDateString()}
- {conversation?.lastTextMessage ||
} + {conversation?.message ?? ( + + No new message +
+
+ )}
<> diff --git a/web-client/app/_components/HistoryItemDate/index.tsx b/web/app/_components/HistoryItemDate/index.tsx similarity index 100% rename from web-client/app/_components/HistoryItemDate/index.tsx rename to web/app/_components/HistoryItemDate/index.tsx diff --git a/web-client/app/_components/HistoryList/index.tsx b/web/app/_components/HistoryList/index.tsx similarity index 51% rename from web-client/app/_components/HistoryList/index.tsx rename to web/app/_components/HistoryList/index.tsx index da3b7b60c..e3f79cbf7 100644 --- a/web-client/app/_components/HistoryList/index.tsx +++ b/web/app/_components/HistoryList/index.tsx @@ -2,11 +2,13 @@ import HistoryItem from "../HistoryItem"; import { useEffect, useState } from "react"; import ExpandableHeader from "../ExpandableHeader"; import { useAtomValue } from "jotai"; -import { userConversationsAtom } from "@/_helpers/JotaiWrapper"; +import { searchAtom, userConversationsAtom } from "@/_helpers/JotaiWrapper"; import useGetUserConversations from "@/_hooks/useGetUserConversations"; +import SidebarEmptyHistory from "../SidebarEmptyHistory"; const HistoryList: React.FC = () => { const conversations = useAtomValue(userConversationsAtom); + const searchText = useAtomValue(searchAtom); const [expand, setExpand] = useState(true); const { getUserConversations } = useGetUserConversations(); @@ -24,15 +26,25 @@ const HistoryList: React.FC = () => {
- {conversations.map((convo) => ( - - ))} + {conversations.length > 0 ? ( + conversations + .filter( + (e) => + searchText.trim() === "" || + e.name?.toLowerCase().includes(searchText.toLowerCase().trim()) + ) + .map((convo) => ( + + )) + ) : ( + + )}
); diff --git a/web-client/app/_components/InputToolbar/index.tsx b/web/app/_components/InputToolbar/index.tsx similarity index 100% rename from web-client/app/_components/InputToolbar/index.tsx rename to web/app/_components/InputToolbar/index.tsx diff --git a/web-client/app/_components/JanImage/index.tsx b/web/app/_components/JanImage/index.tsx similarity index 100% rename from web-client/app/_components/JanImage/index.tsx rename to web/app/_components/JanImage/index.tsx diff --git a/web-client/app/_components/JanLogo/index.tsx b/web/app/_components/JanLogo/index.tsx similarity index 75% rename from web-client/app/_components/JanLogo/index.tsx rename to web/app/_components/JanLogo/index.tsx index a52543d82..93f68bfa9 100644 --- a/web-client/app/_components/JanLogo/index.tsx +++ b/web/app/_components/JanLogo/index.tsx @@ -10,8 +10,8 @@ const JanLogo: React.FC = () => { className="p-3 flex gap-[2px] items-center" onClick={() => setActiveConvoId(undefined)} > - - + + ); }; diff --git a/web-client/app/_components/JanWelcomeTitle/index.tsx b/web/app/_components/JanWelcomeTitle/index.tsx similarity index 85% rename from web-client/app/_components/JanWelcomeTitle/index.tsx rename to web/app/_components/JanWelcomeTitle/index.tsx index 1d634fe47..71f51f50a 100644 --- a/web-client/app/_components/JanWelcomeTitle/index.tsx +++ b/web/app/_components/JanWelcomeTitle/index.tsx @@ -11,7 +11,7 @@ const JanWelcomeTitle: React.FC = ({ title, description }) => (

{title}

Operated by - + {description}
diff --git a/web/app/_components/LeftContainer/index.tsx b/web/app/_components/LeftContainer/index.tsx new file mode 100644 index 000000000..be48a75be --- /dev/null +++ b/web/app/_components/LeftContainer/index.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import SidebarFooter from "../SidebarFooter"; +import SidebarHeader from "../SidebarHeader"; +import SidebarMenu from "../SidebarMenu"; +import HistoryList from "../HistoryList"; + +const LeftContainer: React.FC = () => ( +
+ + + + +
+); + +export default React.memo(LeftContainer); diff --git a/web-client/app/_components/LeftSidebar/index.tsx b/web/app/_components/LeftSidebar/index.tsx similarity index 85% rename from web-client/app/_components/LeftSidebar/index.tsx rename to web/app/_components/LeftSidebar/index.tsx index b54c8260f..04bc47420 100644 --- a/web-client/app/_components/LeftSidebar/index.tsx +++ b/web/app/_components/LeftSidebar/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import SearchBar from "../SearchBar"; -import ShortcutList from "../ShortcutList"; +// import ShortcutList from "../ShortcutList"; import HistoryList from "../HistoryList"; import DiscordContainer from "../DiscordContainer"; import JanLogo from "../JanLogo"; @@ -10,7 +10,7 @@ const LeftSidebar: React.FC = () => (
- + {/* */}
diff --git a/web/app/_components/LoadingIndicator.tsx b/web/app/_components/LoadingIndicator.tsx new file mode 100644 index 000000000..871190279 --- /dev/null +++ b/web/app/_components/LoadingIndicator.tsx @@ -0,0 +1,20 @@ +const LoadingIndicator = () => { + let circleCommonClasses = "h-1.5 w-1.5 bg-current rounded-full"; + + return ( + //
+ //
+ //
+ //
+ //
+
+
+
+
+
+
+
+ ); +}; + +export default LoadingIndicator; diff --git a/web/app/_components/LoginButton/index.tsx b/web/app/_components/LoginButton/index.tsx new file mode 100644 index 000000000..c6f09ef70 --- /dev/null +++ b/web/app/_components/LoginButton/index.tsx @@ -0,0 +1,24 @@ +"use client"; + +const LoginButton: React.FC = () => { + // const { signInWithKeyCloak } = useSignIn(); + // const { user, loading } = useGetCurrentUser(); + + // if (loading || user) { + // return
; + // } + // return ( + //
+ // + //
+ // ); + return
; +}; + +export default LoginButton; diff --git a/web-client/app/_components/MainChat/index.tsx b/web/app/_components/MainChat/index.tsx similarity index 100% rename from web-client/app/_components/MainChat/index.tsx rename to web/app/_components/MainChat/index.tsx diff --git a/web-client/app/_components/MainChatHeader/index.tsx b/web/app/_components/MainChatHeader/index.tsx similarity index 100% rename from web-client/app/_components/MainChatHeader/index.tsx rename to web/app/_components/MainChatHeader/index.tsx diff --git a/web-client/app/_components/MenuAdvancedPrompt/index.tsx b/web/app/_components/MenuAdvancedPrompt/index.tsx similarity index 100% rename from web-client/app/_components/MenuAdvancedPrompt/index.tsx rename to web/app/_components/MenuAdvancedPrompt/index.tsx diff --git a/web/app/_components/MenuHeader/index.tsx b/web/app/_components/MenuHeader/index.tsx new file mode 100644 index 000000000..95e0be017 --- /dev/null +++ b/web/app/_components/MenuHeader/index.tsx @@ -0,0 +1,53 @@ +import Link from "next/link"; +import { Popover, Transition } from "@headlessui/react"; +import { Fragment } from "react"; +// import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; +import { useSetAtom } from "jotai"; +import { showConfirmSignOutModalAtom } from "@/_helpers/JotaiWrapper"; + +export const MenuHeader: React.FC = () => { + const setShowConfirmSignOutModal = useSetAtom(showConfirmSignOutModalAtom); + // const { user } = useGetCurrentUser(); + + return
; + + // return ( + // + // + //
+ //

+ // {user.displayName} + //

+ // + // {user.email} + // + //
+ //
+ // + //
+ //
+ // + // Privacy + // + //
+ // + // Support + // + //
+ // + // + // ); +}; diff --git a/web-client/app/_components/MobileDownload/index.tsx b/web/app/_components/MobileDownload/index.tsx similarity index 93% rename from web-client/app/_components/MobileDownload/index.tsx rename to web/app/_components/MobileDownload/index.tsx index 9219389b6..710039e0b 100644 --- a/web-client/app/_components/MobileDownload/index.tsx +++ b/web/app/_components/MobileDownload/index.tsx @@ -6,7 +6,7 @@ const MobileDownload = () => {
{/** Jan logo */} {""} { >
{""} { >
{""} {
- +

Jan Mobie

Stay up to date and move work forward with Jan on iOS & Android. @@ -15,7 +15,7 @@ const MobileInstallPane: React.FC = () => {

- +
Download on the

AppStore

@@ -23,7 +23,7 @@ const MobileInstallPane: React.FC = () => {
{ className="h-8 w-auto" width={32} height={32} - src="/icons/app_icon.svg" + src="icons/app_icon.svg" alt="" /> diff --git a/web-client/app/_components/MobileShowcase/index.tsx b/web/app/_components/MobileShowcase/index.tsx similarity index 94% rename from web-client/app/_components/MobileShowcase/index.tsx rename to web/app/_components/MobileShowcase/index.tsx index 78bbc8c63..6e49768e6 100644 --- a/web-client/app/_components/MobileShowcase/index.tsx +++ b/web/app/_components/MobileShowcase/index.tsx @@ -6,7 +6,7 @@ const MobileShowcase = () => { return (
mobile { />
{ >
{""} { >
{""} void; +}; + +const ModelDownloadButton: React.FC = ({ callback }) => { + return ( + + ); +}; + +export default ModelDownloadButton; diff --git a/web/app/_components/ModelDownloadingButton/index.tsx b/web/app/_components/ModelDownloadingButton/index.tsx new file mode 100644 index 000000000..ff30e6642 --- /dev/null +++ b/web/app/_components/ModelDownloadingButton/index.tsx @@ -0,0 +1,33 @@ +type Props = { + total: number; + value: number; +}; + +const ModelDownloadingButton: React.FC = ({ total, value }) => { + return ( +
+ +
+ + {toGigabytes(value)} / {toGigabytes(total)} + +
+
+ ); +}; + +const toGigabytes = (input: number) => { + if (input > 1024 ** 3) { + return (input / 1000 ** 3).toFixed(2) + "GB"; + } else if (input > 1024 ** 2) { + return (input / 1000 ** 2).toFixed(2) + "MB"; + } else if (input > 1024) { + return (input / 1000).toFixed(2) + "KB"; + } else { + return input + "B"; + } +}; + +export default ModelDownloadingButton; diff --git a/web-client/app/_components/ModelInfo/index.tsx b/web/app/_components/ModelInfo/index.tsx similarity index 91% rename from web-client/app/_components/ModelInfo/index.tsx rename to web/app/_components/ModelInfo/index.tsx index 3c9130e1f..ceb867204 100644 --- a/web-client/app/_components/ModelInfo/index.tsx +++ b/web/app/_components/ModelInfo/index.tsx @@ -32,7 +32,7 @@ const ModelInfo: React.FC = ({
diff --git a/web-client/app/_components/ModelInfoItem/index.tsx b/web/app/_components/ModelInfoItem/index.tsx similarity index 100% rename from web-client/app/_components/ModelInfoItem/index.tsx rename to web/app/_components/ModelInfoItem/index.tsx diff --git a/web/app/_components/ModelListContainer/index.tsx b/web/app/_components/ModelListContainer/index.tsx new file mode 100644 index 000000000..27b3f0a0f --- /dev/null +++ b/web/app/_components/ModelListContainer/index.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { execute, executeSerial } from "@/_services/pluginService"; +import { + DataService, + ModelManagementService, +} from "../../../shared/coreService"; +import { useAtomValue } from "jotai"; +import { + modelDownloadStateAtom, + searchingModelText, +} from "@/_helpers/JotaiWrapper"; +import { Product } from "@/_models/Product"; +import DownloadedModelCard from "../DownloadedModelCard"; +import AvailableModelCard from "../AvailableModelCard"; + +const ModelListContainer: React.FC = () => { + const [downloadedModels, setDownloadedModels] = useState([]); + const [availableModels, setAvailableModels] = useState([]); + const downloadState = useAtomValue(modelDownloadStateAtom); + const searchText = useAtomValue(searchingModelText); + + useEffect(() => { + const getDownloadedModels = async () => { + const avails = await executeSerial( + ModelManagementService.GET_AVAILABLE_MODELS + ); + + const downloaded: Product[] = await executeSerial( + ModelManagementService.GET_DOWNLOADED_MODELS + ); + + const downloadedSucessfullyModels: Product[] = []; + const availableOrDownloadingModels: Product[] = avails; + + downloaded.forEach((item) => { + if (item.fileName && downloadState[item.fileName] == null) { + downloadedSucessfullyModels.push(item); + } else { + availableOrDownloadingModels.push(item); + } + }); + + setAvailableModels(availableOrDownloadingModels); + setDownloadedModels(downloadedSucessfullyModels); + }; + getDownloadedModels(); + }, [downloadState]); + + const onDeleteClick = async (product: Product) => { + execute(DataService.DELETE_DOWNLOAD_MODEL, product.id); + await executeSerial(ModelManagementService.DELETE_MODEL, product.fileName); + const getDownloadedModels = async () => { + const avails = await executeSerial( + ModelManagementService.GET_AVAILABLE_MODELS + ); + + const downloaded: Product[] = await executeSerial( + ModelManagementService.GET_DOWNLOADED_MODELS + ); + + const downloadedSucessfullyModels: Product[] = []; + const availableOrDownloadingModels: Product[] = avails; + + downloaded.forEach((item) => { + if (item.fileName && downloadState[item.fileName] == null) { + downloadedSucessfullyModels.push(item); + } else { + availableOrDownloadingModels.push(item); + } + }); + + setAvailableModels(availableOrDownloadingModels); + setDownloadedModels(downloadedSucessfullyModels); + }; + getDownloadedModels(); + }; + + const onDownloadClick = async (product: Product) => { + await executeSerial(DataService.STORE_MODEL, product); + await executeSerial(ModelManagementService.DOWNLOAD_MODEL, { + downloadUrl: product.downloadUrl, + fileName: product.fileName, + }); + }; + + return ( +
+
+ + {downloadedModels + ?.filter( + (e) => + searchText.toLowerCase().trim() === "" || + e.name.toLowerCase().includes(searchText.toLowerCase()) + ) + .map((item) => ( + <DownloadedModelCard + key={item.id} + product={item} + onDeleteClick={onDeleteClick} + isRecommend={false} + /> + ))} + </div> + <div className="pb-5 flex flex-col gap-2"> + <Title title="Browse available models" /> + {availableModels + ?.filter( + (e) => + searchText.toLowerCase().trim() === "" || + e.name.toLowerCase().includes(searchText.toLowerCase()) + ) + .map((item) => ( + <AvailableModelCard + key={item.id} + product={item} + onDownloadClick={onDownloadClick} + isRecommend={false} + /> + ))} + </div> + </div> + ); +}; + +type Props = { + title: string; +}; + +const Title: React.FC<Props> = ({ title }) => { + return ( + <div className="flex gap-[10px]"> + <span className="font-semibold text-xl leading-[25px] tracking-[-0.4px]"> + {title} + </span> + </div> + ); +}; + +export default ModelListContainer; diff --git a/web/app/_components/ModelManagement/index.tsx b/web/app/_components/ModelManagement/index.tsx new file mode 100644 index 000000000..de75d8caf --- /dev/null +++ b/web/app/_components/ModelManagement/index.tsx @@ -0,0 +1,15 @@ +import HeaderBackButton from "../HeaderBackButton"; +import HeaderTitle from "../HeaderTitle"; +import ModelListContainer from "../ModelListContainer"; +import ModelSearchBar from "../ModelSearchBar"; + +export default function ModelManagement() { + return ( + <main className="pt-[30px] pr-[89px] pl-[60px] pb-[70px] flex-1"> + {/* <HeaderBackButton /> */} + <HeaderTitle title="Explore Models" /> + <ModelSearchBar /> + <ModelListContainer /> + </main> + ); +} diff --git a/web-client/app/_components/ModelMenu/index.tsx b/web/app/_components/ModelMenu/index.tsx similarity index 63% rename from web-client/app/_components/ModelMenu/index.tsx rename to web/app/_components/ModelMenu/index.tsx index 0737affbc..f8113e001 100644 --- a/web-client/app/_components/ModelMenu/index.tsx +++ b/web/app/_components/ModelMenu/index.tsx @@ -1,26 +1,24 @@ "use client"; -import Image from "next/image"; -import { useAtom, useAtomValue, useSetAtom } from "jotai"; +import { useAtomValue, useSetAtom } from "jotai"; import { currentProductAtom, showConfirmDeleteConversationModalAtom, - showingProductDetailAtom, } from "@/_helpers/JotaiWrapper"; import { PlusIcon, TrashIcon } from "@heroicons/react/24/outline"; import useCreateConversation from "@/_hooks/useCreateConversation"; const ModelMenu: React.FC = () => { const currentProduct = useAtomValue(currentProductAtom); - const [active, setActive] = useAtom(showingProductDetailAtom); const { requestCreateConvo } = useCreateConversation(); const setShowConfirmDeleteConversationModal = useSetAtom( showConfirmDeleteConversationModalAtom ); const onCreateConvoClick = () => { - if (!currentProduct) return; - requestCreateConvo(currentProduct, true); + if (currentProduct) { + requestCreateConvo(currentProduct); + } }; return ( @@ -31,14 +29,6 @@ const ModelMenu: React.FC = () => { <button onClick={() => setShowConfirmDeleteConversationModal(true)}> <TrashIcon width={24} height={24} color="#9CA3AF" /> </button> - <button onClick={() => setActive(!active)}> - <Image - src={active ? "/icons/ic_sidebar_fill.svg" : "/icons/ic_sidebar.svg"} - width={24} - height={24} - alt="" - /> - </button> </div> ); }; diff --git a/web/app/_components/ModelSearchBar/index.tsx b/web/app/_components/ModelSearchBar/index.tsx new file mode 100644 index 000000000..ffa1e3f85 --- /dev/null +++ b/web/app/_components/ModelSearchBar/index.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { searchingModelText } from "@/_helpers/JotaiWrapper"; +import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { useSetAtom } from "jotai"; +import { useEffect, useState } from "react"; + +const ModelSearchBar: React.FC = () => { + const setSearchtext = useSetAtom(searchingModelText); + const [text, setText] = useState(""); + useEffect(() => { + setSearchtext(text); + }, [text, setSearchtext]); + return ( + <div className="py-[27px] flex items-center justify-center"> + <div className="w-[520px] h-[42px] flex items-center"> + <input + className="outline-none bg-gray-300 text-sm h-full rounded-tl-lg rounded-bl-lg leading-[17.5px] border border-gray-300 py-3 px-4 flex-1" + placeholder="Search model" + value={text} + onChange={(text) => setText(text.currentTarget.value)} + /> + <button className="flex items-center justify-center bg-gray-800 border border-gray-800 p-2 w-[42px] rounded-tr-lg rounded-br-lg h-[42px]"> + <MagnifyingGlassIcon width={20} height={20} color="#FFFFFF" /> + </button> + </div> + </div> + ); +}; + +export default ModelSearchBar; diff --git a/web/app/_components/MonitorBar/index.tsx b/web/app/_components/MonitorBar/index.tsx new file mode 100644 index 000000000..5f98f6add --- /dev/null +++ b/web/app/_components/MonitorBar/index.tsx @@ -0,0 +1,89 @@ +import ProgressBar from "../ProgressBar"; +import SystemItem from "../SystemItem"; +import { useAtomValue } from "jotai"; +import { + activeModel, + appDownloadProgress, + getSystemBarVisibilityAtom, +} from "@/_helpers/JotaiWrapper"; +import { useEffect, useState } from "react"; +import { executeSerial } from "../../../../electron/core/plugin-manager/execution/extension-manager"; +import { SystemMonitoringService } from "../../../shared/coreService"; + +const MonitorBar: React.FC = () => { + const show = useAtomValue(getSystemBarVisibilityAtom); + const progress = useAtomValue(appDownloadProgress); + const modelName = useAtomValue(activeModel); + const [ram, setRam] = useState<number>(0); + const [gpu, setGPU] = useState<number>(0); + const [cpu, setCPU] = useState<number>(0); + const [version, setVersion] = useState<string>(""); + + const data = [ + { + name: "CPU", + total: 1400, + used: 750, + }, + { + name: "Ram", + total: 16000, + used: 4500, + }, + { + name: "VRAM", + total: 1400, + used: 1300, + }, + ]; + + useEffect(() => { + const getSystemResources = async () => { + const resourceInfor = await executeSerial( + SystemMonitoringService.GET_RESOURCES_INFORMATION + ); + const currentLoadInfor = await executeSerial( + SystemMonitoringService.GET_CURRENT_LOAD_INFORMATION + ); + const ram = + (resourceInfor?.mem?.used ?? 0) / (resourceInfor?.mem?.total ?? 1); + setRam(Math.round(ram * 100)); + setCPU(Math.round(currentLoadInfor?.currentLoad ?? 0)); + }; + const getAppVersion = () => { + window.electronAPI.appVersion().then((version: string | undefined) => { + setVersion(version ?? ""); + }); + }; + getAppVersion(); + getSystemResources(); + // Fetch interval - every 3s + const intervalId = setInterval(() => { + getSystemResources(); + }, 3000); + return () => clearInterval(intervalId); + }, []); + + if (!show) return null; + + return ( + <div className="flex flex-row items-center justify-between border-t border-gray-200"> + {progress && progress >= 0 ? ( + <ProgressBar total={100} used={progress} /> + ) : ( + <div className="w-full" /> + )} + <div className="flex-1 flex items-center gap-8 px-2"> + <SystemItem name="CPU" value={`${cpu}%`} /> + <SystemItem name="Mem" value={`${ram}%`} /> + + {modelName && modelName.length > 0 && ( + <SystemItem name="Active Models" value={"1"} /> + )} + <span className="text-gray-900 text-sm">v{version}</span> + </div> + </div> + ); +}; + +export default MonitorBar; diff --git a/web-client/app/_components/OverviewPane.tsx b/web/app/_components/OverviewPane.tsx similarity index 95% rename from web-client/app/_components/OverviewPane.tsx rename to web/app/_components/OverviewPane.tsx index ec6c555a8..7e7185fe6 100644 --- a/web-client/app/_components/OverviewPane.tsx +++ b/web/app/_components/OverviewPane.tsx @@ -1,7 +1,6 @@ "use client"; import { useAtomValue } from "jotai"; -import TryItYourself from "./TryItYourself"; import React from "react"; import { currentProductAtom } from "@/_helpers/JotaiWrapper"; @@ -26,7 +25,6 @@ const OverviewPane: React.FC = () => { {product?.modelUrl} </a> </div> - <TryItYourself /> </div> </div> ); diff --git a/web/app/_components/Preferences.tsx b/web/app/_components/Preferences.tsx new file mode 100644 index 000000000..e1634d3e6 --- /dev/null +++ b/web/app/_components/Preferences.tsx @@ -0,0 +1,251 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import { + setup, + plugins, + extensionPoints, + activationPoints, +} from "../../../electron/core/plugin-manager/execution/index"; +import { + ChartPieIcon, + CommandLineIcon, + PlayIcon, +} from "@heroicons/react/24/outline"; + +import { MagnifyingGlassIcon } from "@heroicons/react/20/solid"; +import classNames from "classnames"; + +/* eslint-disable @next/next/no-sync-scripts */ +export const Preferences = () => { + const [search, setSearch] = useState<string>(""); + const [activePlugins, setActivePlugins] = useState<any[]>([]); + const [isTestAvailable, setIsTestAvailable] = useState(false); + const [fileName, setFileName] = useState(""); + + const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { + const file = event.target.files?.[0]; + if (file) { + setFileName(file.name); + } else { + setFileName(""); + } + }; + + const preferenceRef = useRef(null); + useEffect(() => { + async function setupPE() { + // Enable activation point management + setup({ + //@ts-ignore + importer: (plugin) => + import(/* webpackIgnore: true */ plugin).catch((err) => { + console.log(err); + }), + }); + + // Register all active plugins with their activation points + await plugins.registerActive(); + } + + const activePlugins = async () => { + const plgs = await plugins.getActive(); + setActivePlugins(plgs); + // Activate alls + setTimeout(async () => { + await activationPoints.trigger("init"); + if (extensionPoints.get("experimentComponent")) { + const components = await Promise.all( + extensionPoints.execute("experimentComponent") + ); + if (components.length > 0) { + setIsTestAvailable(true); + } + components.forEach((e) => { + if (preferenceRef.current) { + // @ts-ignore + preferenceRef.current.appendChild(e); + } + }); + } + }, 500); + }; + setupPE().then(() => activePlugins()); + }, []); + + // Install a new plugin on clicking the install button + const install = async (e: any) => { + e.preventDefault(); + //@ts-ignore + const pluginFile = new FormData(e.target).get("plugin-file").path; + + // Send the filename of the to be installed plugin + // to the main process for installation + const installed = await plugins.install([pluginFile]); + if (typeof window !== "undefined") { + window.location.reload(); + } + }; + + // Uninstall a plugin on clicking uninstall + const uninstall = async (name: string) => { + //@ts-ignore + + // Send the filename of the to be uninstalled plugin + // to the main process for removal + //@ts-ignore + const res = await plugins.uninstall([name]); + console.log( + res + ? "Plugin successfully uninstalled" + : "Plugin could not be uninstalled" + ); + }; + + // Update all plugins on clicking update plugins + const update = async (plugin: string) => { + if (typeof window !== "undefined") { + // @ts-ignore + await window.pluggableElectronIpc.update([plugin], true); + } + // plugins.update(active.map((plg) => plg.name)); + }; + + return ( + <div className="w-full h-screen overflow-scroll"> + <div className="sticky top-0 z-40 flex h-16 shrink-0 items-center gap-x-4 border-b border-gray-200 bg-white shadow-sm sm:gap-x-6 sm:px-6 px-8"> + {/* Separator */} + <div className="h-6 w-px bg-gray-900/10 hidden" aria-hidden="true" /> + + <div className="flex flex-1 self-stretch gap-x-6"> + <form className="relative flex flex-1" action="#" method="GET"> + <label htmlFor="search-field" className="sr-only"> + Search + </label> + <MagnifyingGlassIcon + className="pointer-events-none absolute inset-y-0 left-0 h-full w-5 text-gray-400" + aria-hidden="true" + /> + <input + defaultValue={search} + onChange={(e) => setSearch(e.target.value)} + id="search-field" + className="block h-full w-full border-0 py-0 pl-8 pr-0 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm" + placeholder="Search..." + type="search" + name="search" + /> + </form> + </div> + </div> + + <main className="py-5"> + <div className="sm:px-6 px-8"> + {/* Content */} + <div className="flex flex-row items-center my-4"> + <ChartPieIcon width={30} /> + Install Plugin + </div> + <form id="plugin-file" onSubmit={install}> + <div className="flex flex-row items-center space-x-10"> + <div className="flex items-center justify-center w-[300px]"> + <label className="h-[120px] flex flex-col items-center justify-center w-full border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:hover:bg-bray-800 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600"> + {!fileName ? ( + <div className="flex flex-col items-center justify-center pt-5 pb-6"> + <p className="mb-2 text-sm text-gray-500 dark:text-gray-400"> + <span className="font-semibold">Click to upload</span>{" "} + or drag and drop + </p> + <p className="text-xs text-gray-500 dark:text-gray-400"> + TGZ (MAX 50MB) + </p> + </div> + ) : ( + <>{fileName}</> + )} + <input + id="dropzone-file" + name="plugin-file" + type="file" + className="hidden" + onChange={handleFileChange} + required + /> + </label> + </div> + <button + type="submit" + className={classNames( + "rounded-md px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600", + fileName + ? "bg-indigo-600 hover:bg-indigo-500" + : "bg-gray-500" + )} + > + Install Plugin + </button> + </div> + </form> + + <div className="flex flex-row items-center my-4"> + <CommandLineIcon width={30} /> + Installed Plugins + </div> + <div className="flex flex-wrap"> + {activePlugins + .filter( + (e) => + search.trim() === "" || + e.name.toLowerCase().includes(search.toLowerCase()) + ) + .map((e) => ( + <div key={e.name} className="mr-2 my-3 w-[400px]"> + <a + href="#" + className="block max-w-sm p-6 bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700" + > + <h5 className="mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white"> + {e.name} + </h5> + <p className="font-normal text-gray-700 dark:text-gray-400"> + Activation: {e.activationPoints} + </p> + <p className="font-normal text-gray-700 dark:text-gray-400 h-[24px] truncate w-full"> + Url: {e.url} + </p> + <div className="flex flex-row space-x-5"> + <button + type="submit" + onClick={() => { + uninstall(e.name); + }} + className="mt-5 rounded-md bg-red-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-red-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600" + > + Uninstall + </button> + <button + type="submit" + onClick={() => { + update(e.name); + }} + className="mt-5 rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" + > + Update + </button> + </div> + </a> + </div> + ))} + </div> + {activePlugins.length > 0 && isTestAvailable && ( + <div className="flex flex-row items-center my-4"> + <PlayIcon width={30} /> + Test Plugins + </div> + )} + <div className="h-full w-full" ref={preferenceRef}></div> + {/* Content */} + </div> + </main> + </div> + ); +}; diff --git a/web-client/app/_components/PrimaryButton/index.tsx b/web/app/_components/PrimaryButton/index.tsx similarity index 100% rename from web-client/app/_components/PrimaryButton/index.tsx rename to web/app/_components/PrimaryButton/index.tsx diff --git a/web/app/_components/ProductOverview/index.tsx b/web/app/_components/ProductOverview/index.tsx new file mode 100644 index 000000000..2ea691b96 --- /dev/null +++ b/web/app/_components/ProductOverview/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import useGetModels from "@/_hooks/useGetModels"; + +const ProductOverview: React.FC = () => { + const { models } = useGetModels(); + + return <div className="bg-gray-100 overflow-y-auto flex-grow scroll"></div>; +}; + +export default ProductOverview; diff --git a/web/app/_components/ProgressBar/index.tsx b/web/app/_components/ProgressBar/index.tsx new file mode 100644 index 000000000..952ed5743 --- /dev/null +++ b/web/app/_components/ProgressBar/index.tsx @@ -0,0 +1,28 @@ +import Image from "next/image"; + +type Props = { + total: number; + used: number; +}; + +const ProgressBar: React.FC<Props> = ({ used, total }) => { + return ( + <div className="flex gap-[10px] items-center p-[10px]"> + <div className="text-xs leading-[18px] gap-0.5 flex items-center"> + <Image src={"icons/app_icon.svg"} width={18} height={18} alt="" /> + Updating + </div> + <div className="w-[150px] relative bg-blue-200 h-1 rounded-md flex"> + <div + className="absolute top-0 left-0 h-full rounded-md bg-blue-600" + style={{ width: `${((used / total) * 100).toFixed(2)}%` }} + ></div> + </div> + <div className="text-xs leading-[18px]"> + {((used / total) * 100).toFixed(0)}% + </div> + </div> + ); +}; + +export default ProgressBar; diff --git a/web-client/app/_components/RightContainer/index.tsx b/web/app/_components/RightContainer/index.tsx similarity index 84% rename from web-client/app/_components/RightContainer/index.tsx rename to web/app/_components/RightContainer/index.tsx index a7b65ea1d..61aa47b6b 100644 --- a/web-client/app/_components/RightContainer/index.tsx +++ b/web/app/_components/RightContainer/index.tsx @@ -1,6 +1,7 @@ import ChatContainer from "../ChatContainer"; import Header from "../Header"; import MainChat from "../MainChat"; +import MonitorBar from "../MonitorBar"; const RightContainer = () => ( <div className="flex flex-col flex-1 h-screen"> @@ -8,6 +9,7 @@ const RightContainer = () => ( <ChatContainer> <MainChat /> </ChatContainer> + <MonitorBar /> </div> ); diff --git a/web-client/app/_components/SampleLlmContainer/index.tsx b/web/app/_components/SampleLlmContainer/index.tsx similarity index 76% rename from web-client/app/_components/SampleLlmContainer/index.tsx rename to web/app/_components/SampleLlmContainer/index.tsx index 66d0c198b..07ade2a43 100644 --- a/web-client/app/_components/SampleLlmContainer/index.tsx +++ b/web/app/_components/SampleLlmContainer/index.tsx @@ -1,6 +1,4 @@ import JanWelcomeTitle from "../JanWelcomeTitle"; -import { useQuery } from "@apollo/client"; -import { GetProductPromptsDocument, GetProductPromptsQuery } from "@/graphql"; import { Product } from "@/_models/Product"; import { useSetAtom } from "jotai"; import { currentPromptAtom } from "@/_helpers/JotaiWrapper"; @@ -11,9 +9,7 @@ type Props = { const SampleLlmContainer: React.FC<Props> = ({ product }) => { const setCurrentPrompt = useSetAtom(currentPromptAtom); - const { data } = useQuery<GetProductPromptsQuery>(GetProductPromptsDocument, { - variables: { productSlug: product.slug }, - }); + const { data } = { data: { prompts: [] } }; return ( <div className="flex flex-col max-w-sm flex-shrink-0 gap-9 items-center pt-6 mx-auto"> @@ -25,7 +21,7 @@ const SampleLlmContainer: React.FC<Props> = ({ product }) => { <h2 className="font-semibold text-xl leading-6 tracking-[-0.4px] mb-5"> Try now </h2> - <div className="flex flex-col"> + {/* <div className="flex flex-col"> {data?.prompts.map((item) => ( <button onClick={() => setCurrentPrompt(item.content ?? "")} @@ -35,7 +31,7 @@ const SampleLlmContainer: React.FC<Props> = ({ product }) => { <span className="line-clamp-3">{item.content}</span> </button> ))} - </div> + </div> */} </div> </div> ); diff --git a/web-client/app/_components/SearchBar/index.tsx b/web/app/_components/SearchBar/index.tsx similarity index 100% rename from web-client/app/_components/SearchBar/index.tsx rename to web/app/_components/SearchBar/index.tsx diff --git a/web-client/app/_components/SecondaryButton/index.tsx b/web/app/_components/SecondaryButton/index.tsx similarity index 100% rename from web-client/app/_components/SecondaryButton/index.tsx rename to web/app/_components/SecondaryButton/index.tsx diff --git a/web-client/app/_components/SendButton/index.tsx b/web/app/_components/SendButton/index.tsx similarity index 85% rename from web-client/app/_components/SendButton/index.tsx rename to web/app/_components/SendButton/index.tsx index f95e4d08d..07c41fdf0 100644 --- a/web-client/app/_components/SendButton/index.tsx +++ b/web/app/_components/SendButton/index.tsx @@ -3,14 +3,14 @@ import { currentPromptAtom, } from "@/_helpers/JotaiWrapper"; import useSendChatMessage from "@/_hooks/useSendChatMessage"; -import { useAtomValue } from "jotai"; +import { useAtom, useAtomValue } from "jotai"; import Image from "next/image"; const SendButton: React.FC = () => { - const currentPrompt = useAtomValue(currentPromptAtom); + const [currentPrompt] = useAtom(currentPromptAtom); const currentConvoState = useAtomValue(currentConvoStateAtom); - const { sendChatMessage } = useSendChatMessage(); + const { sendChatMessage } = useSendChatMessage(); const isWaitingForResponse = currentConvoState?.waitingForResponse ?? false; const disabled = currentPrompt.trim().length === 0 || isWaitingForResponse; @@ -29,7 +29,7 @@ const SendButton: React.FC = () => { type="submit" className="p-2 gap-[10px] inline-flex items-center rounded-[12px] text-sm font-semibold shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" > - <Image src={"/icons/ic_arrowright.svg"} width={24} height={24} alt="" /> + <Image src={"icons/ic_arrowright.svg"} width={24} height={24} alt="" /> </button> ); }; diff --git a/web-client/app/_components/SessionProviderWrapper.tsx b/web/app/_components/SessionProviderWrapper.tsx similarity index 100% rename from web-client/app/_components/SessionProviderWrapper.tsx rename to web/app/_components/SessionProviderWrapper.tsx diff --git a/web-client/app/_components/ShortcutItem/index.tsx b/web/app/_components/ShortcutItem/index.tsx similarity index 88% rename from web-client/app/_components/ShortcutItem/index.tsx rename to web/app/_components/ShortcutItem/index.tsx index 5fdbf0797..432422976 100644 --- a/web-client/app/_components/ShortcutItem/index.tsx +++ b/web/app/_components/ShortcutItem/index.tsx @@ -10,14 +10,10 @@ type Props = { const ShortcutItem: React.FC<Props> = ({ product }) => { const { requestCreateConvo } = useCreateConversation(); - const onClickHandler = () => { - requestCreateConvo(product); - }; - return ( <button className="flex items-center gap-2 mx-1 p-2" - onClick={onClickHandler} + onClick={() => requestCreateConvo(product)} > {product.avatarUrl && ( <Image diff --git a/web-client/app/_components/ShowMoreButton/index.tsx b/web/app/_components/ShowMoreButton/index.tsx similarity index 90% rename from web-client/app/_components/ShowMoreButton/index.tsx rename to web/app/_components/ShowMoreButton/index.tsx index 58b8e4d06..b800eaf51 100644 --- a/web-client/app/_components/ShowMoreButton/index.tsx +++ b/web/app/_components/ShowMoreButton/index.tsx @@ -12,7 +12,7 @@ const ShowMoreButton: React.FC<Props> = ({ onClick }) => ( > Show more <Image - src={"/icons/unicorn_angle-down.svg"} + src={"icons/unicorn_angle-down.svg"} width={16} height={16} alt="" diff --git a/web/app/_components/SidebarButton/index.tsx b/web/app/_components/SidebarButton/index.tsx new file mode 100644 index 000000000..8db7a386b --- /dev/null +++ b/web/app/_components/SidebarButton/index.tsx @@ -0,0 +1,24 @@ +import Image from "next/image"; + +type Props = { + callback?: () => void; + className?: string; + icon: string; + width: number; + height: number; + title: string; +}; + +export const SidebarButton: React.FC<Props> = ({ + callback, + height, + icon, + className, + width, + title, +}) => ( + <button onClick={callback} className={className}> + <Image src={icon} width={width} height={height} alt="" /> + <span>{title}</span> + </button> +); diff --git a/web/app/_components/SidebarEmptyHistory/index.tsx b/web/app/_components/SidebarEmptyHistory/index.tsx new file mode 100644 index 000000000..af1da8998 --- /dev/null +++ b/web/app/_components/SidebarEmptyHistory/index.tsx @@ -0,0 +1,56 @@ +import Image from "next/image"; +import { SidebarButton } from "../SidebarButton"; +import { executeSerial } from "../../../../electron/core/plugin-manager/execution/extension-manager"; +import { DataService } from "../../../shared/coreService"; +import useCreateConversation from "@/_hooks/useCreateConversation"; + +const SidebarEmptyHistory: React.FC = () => { + const { requestCreateConvo } = useCreateConversation(); + const startChat = async () => { + // Host + if (window && !window.electronAPI) { + // requestCreateConvo(); // TODO: get model id from somewhere + } + // Electron + const downloadedModels = await executeSerial( + DataService.GET_FINISHED_DOWNLOAD_MODELS + ); + if (!downloadedModels || downloadedModels?.length === 0) { + alert( + "Seems like there is no model downloaded yet. Please download a model first." + ); + } else { + requestCreateConvo(downloadedModels[0]); + } + }; + return ( + <div className="flex flex-col items-center py-10 gap-3"> + <Image + src={"icons/chat-bubble-oval-left.svg"} + width={32} + height={32} + alt="" + /> + <div className="flex flex-col items-center gap-6"> + <div> + <div className="text-center text-gray-900 text-sm"> + No Chat History + </div> + <div className="text-center text-gray-500 text-sm"> + Get started by creating a new chat. + </div> + </div> + <SidebarButton + callback={startChat} + className="flex items-center border bg-blue-600 rounded-lg py-[9px] pl-[15px] pr-[17px] gap-2 text-white font-medium text-sm" + height={14} + icon="icons/Icon_plus.svg" + title="New chat" + width={14} + /> + </div> + </div> + ); +}; + +export default SidebarEmptyHistory; diff --git a/web/app/_components/SidebarFooter/index.tsx b/web/app/_components/SidebarFooter/index.tsx new file mode 100644 index 000000000..44bcc9f49 --- /dev/null +++ b/web/app/_components/SidebarFooter/index.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import { SidebarButton } from "../SidebarButton"; + +const SidebarFooter: React.FC = () => ( + <div className="flex justify-between items-center gap-2"> + <SidebarButton + className="flex items-center border border-gray-200 rounded-lg p-2 gap-3 flex-1 justify-center text-gray-900 font-medium text-sm" + height={24} + icon="icons/discord.svg" + title="Discord" + width={24} + callback={() => { + window.electronAPI?.openExternalUrl("https://discord.gg/AsJ8krTT3N"); + }} + /> + <SidebarButton + className="flex items-center border border-gray-200 rounded-lg p-2 gap-3 flex-1 justify-center text-gray-900 font-medium text-sm" + height={24} + icon="icons/unicorn_twitter.svg" + title="Twitter" + width={24} + callback={() => { + window.electronAPI?.openExternalUrl("https://twitter.com/jan_dotai"); + }} + /> + </div> +); + +export default React.memo(SidebarFooter); diff --git a/web/app/_components/SidebarHeader/index.tsx b/web/app/_components/SidebarHeader/index.tsx new file mode 100644 index 000000000..d453f6fc2 --- /dev/null +++ b/web/app/_components/SidebarHeader/index.tsx @@ -0,0 +1,11 @@ +import Image from "next/image"; + +const SidebarHeader: React.FC = () => { + return ( + <div className="flex flex-col gap-[10px]"> + <Image src={"icons/Jan_AppIcon.svg"} width={68} height={28} alt="" /> + </div> + ); +}; + +export default SidebarHeader; diff --git a/web/app/_components/SidebarMenu/index.tsx b/web/app/_components/SidebarMenu/index.tsx new file mode 100644 index 000000000..8ea9f9de7 --- /dev/null +++ b/web/app/_components/SidebarMenu/index.tsx @@ -0,0 +1,69 @@ +import { + MainViewState, + getMainViewStateAtom, + setMainViewStateAtom, +} from "@/_helpers/JotaiWrapper"; +import classNames from "classnames"; +import { useAtomValue, useSetAtom } from "jotai"; +import Image from "next/image"; + +const SidebarMenu: React.FC = () => { + const currentState = useAtomValue(getMainViewStateAtom); + const setMainViewState = useSetAtom(setMainViewStateAtom); + + const menu = [ + { + name: "Explore Models", + icon: "Search_gray", + state: MainViewState.ExploreModel, + }, + { + name: "My Models", + icon: "ViewGrid", + state: MainViewState.MyModel, + }, + { + name: "Settings", + icon: "Cog", + state: MainViewState.Setting, + }, + ]; + + const onMenuClick = (state: MainViewState) => { + if (state === currentState) return; + setMainViewState(state); + }; + + return ( + <div className="flex flex-col"> + <div className="text-gray-500 text-xs font-semibold py-2 pl-2 pr-3"> + Your Configurations + </div> + <ul role="list" className="-mx-2 mt-2 space-y-1"> + {menu.map((item) => ( + <li key={item.name}> + <button + onClick={() => onMenuClick(item.state)} + className={classNames( + currentState === item.state + ? "bg-gray-50 text-indigo-600" + : "text-gray-600 hover:text-indigo-600 hover:bg-gray-50", + "group flex gap-x-3 rounded-md text-base py-2 px-3 w-full" + )} + > + <Image + src={`icons/${item.icon}.svg`} + width={24} + height={24} + alt="" + /> + <span className="truncate">{item.name}</span> + </button> + </li> + ))} + </ul> + </div> + ); +}; + +export default SidebarMenu; diff --git a/web-client/app/_components/SimpleControlNetMessage.tsx b/web/app/_components/SimpleControlNetMessage.tsx similarity index 95% rename from web-client/app/_components/SimpleControlNetMessage.tsx rename to web/app/_components/SimpleControlNetMessage.tsx index 7e9e5c426..28a175b4f 100644 --- a/web-client/app/_components/SimpleControlNetMessage.tsx +++ b/web/app/_components/SimpleControlNetMessage.tsx @@ -51,7 +51,7 @@ const SimpleControlNetMessage: React.FC<Props> = ({ target="_blank_" className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" > - <Image src="/icons/download.svg" width={16} height={16} alt="" /> + <Image src="icons/download.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Download </span> diff --git a/web-client/app/_components/SimpleImageMessage/index.tsx b/web/app/_components/SimpleImageMessage/index.tsx similarity index 90% rename from web-client/app/_components/SimpleImageMessage/index.tsx rename to web/app/_components/SimpleImageMessage/index.tsx index bb9500a9b..bfa2eab89 100644 --- a/web-client/app/_components/SimpleImageMessage/index.tsx +++ b/web/app/_components/SimpleImageMessage/index.tsx @@ -48,7 +48,7 @@ const SimpleImageMessage: React.FC<Props> = ({ target="_blank_" className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" > - <Image src="/icons/download.svg" width={16} height={16} alt="" /> + <Image src="icons/download.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Download </span> @@ -57,7 +57,7 @@ const SimpleImageMessage: React.FC<Props> = ({ className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" // onClick={() => sendChatMessage()} > - <Image src="/icons/refresh.svg" width={16} height={16} alt="" /> + <Image src="icons/refresh.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Re-generate </span> diff --git a/web-client/app/_components/SimpleTextMessage/index.tsx b/web/app/_components/SimpleTextMessage/index.tsx similarity index 100% rename from web-client/app/_components/SimpleTextMessage/index.tsx rename to web/app/_components/SimpleTextMessage/index.tsx diff --git a/web-client/app/_components/Slide/index.tsx b/web/app/_components/Slide/index.tsx similarity index 93% rename from web-client/app/_components/Slide/index.tsx rename to web/app/_components/Slide/index.tsx index 9ecc3fdf3..9b02ff7c8 100644 --- a/web-client/app/_components/Slide/index.tsx +++ b/web/app/_components/Slide/index.tsx @@ -10,10 +10,6 @@ const Slide: React.FC<Props> = ({ product }) => { const { name, avatarUrl, description } = product; const { requestCreateConvo } = useCreateConversation(); - const onClick = () => { - requestCreateConvo(product); - }; - return ( <div className="w-full embla__slide h-[435px] relative"> <Image @@ -34,7 +30,7 @@ const Slide: React.FC<Props> = ({ product }) => { </span> </div> <button - onClick={onClick} + onClick={() => requestCreateConvo(product)} className="flex-none flex w-30 h-12 items-center text-sm justify-center gap-2 px-5 py-[10px] rounded-md bg-white leading-[21px] text-gray-800" > Try now diff --git a/web-client/app/_components/Slider/index.tsx b/web/app/_components/Slider/index.tsx similarity index 100% rename from web-client/app/_components/Slider/index.tsx rename to web/app/_components/Slider/index.tsx diff --git a/web-client/app/_components/StreamTextMessage/index.tsx b/web/app/_components/StreamTextMessage/index.tsx similarity index 100% rename from web-client/app/_components/StreamTextMessage/index.tsx rename to web/app/_components/StreamTextMessage/index.tsx diff --git a/web/app/_components/SystemItem/index.tsx b/web/app/_components/SystemItem/index.tsx new file mode 100644 index 000000000..3d87cf962 --- /dev/null +++ b/web/app/_components/SystemItem/index.tsx @@ -0,0 +1,17 @@ +type Props = { + name: string; + value: string; +}; + +const SystemItem: React.FC<Props> = ({ name, value }) => { + return ( + <div className="flex gap-2 pl-4 my-1"> + <div className="flex gap-[10px] w-max font-bold text-gray-900 text-sm"> + {name} + </div> + <span className="text-gray-900 text-sm">{value}</span> + </div> + ); +}; + +export default SystemItem; diff --git a/web-client/app/_components/TabModelDetail/index.tsx b/web/app/_components/TabModelDetail/index.tsx similarity index 87% rename from web-client/app/_components/TabModelDetail/index.tsx rename to web/app/_components/TabModelDetail/index.tsx index 557e3c885..6652dc258 100644 --- a/web-client/app/_components/TabModelDetail/index.tsx +++ b/web/app/_components/TabModelDetail/index.tsx @@ -8,11 +8,11 @@ export const TabModelDetail: React.FC<Props> = ({ onTabClick, tab }) => { const btns = [ { name: "api", - icon: "/icons/unicorn_arrow.svg", + icon: "icons/unicorn_arrow.svg", }, { name: "description", - icon: "/icons/unicorn_exclamation-circle.svg", + icon: "icons/unicorn_exclamation-circle.svg", }, ]; diff --git a/web-client/app/_components/TextCode/index.tsx b/web/app/_components/TextCode/index.tsx similarity index 87% rename from web-client/app/_components/TextCode/index.tsx rename to web/app/_components/TextCode/index.tsx index 9add02861..392b254b9 100644 --- a/web-client/app/_components/TextCode/index.tsx +++ b/web/app/_components/TextCode/index.tsx @@ -1,3 +1,4 @@ +"use client"; import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs"; import Image from "next/image"; @@ -11,13 +12,15 @@ export const TextCode: React.FC<Props> = ({ text }) => ( <div className="text-gray-200 bg-gray-800 flex items-center justify-between px-4 py-2 text-xs capitalize"> <button onClick={() => navigator.clipboard.writeText(text)}> <Image - src={"/icons/unicorn_clipboard-alt.svg"} + src={"icons/unicorn_clipboard-alt.svg"} width={24} height={24} alt="" /> </button> </div> + {/* + // @ts-ignore */} <SyntaxHighlighter className="w-full overflow-x-hidden resize-none" language="jsx" diff --git a/web-client/app/_components/TitleBlankState/index.tsx b/web/app/_components/TitleBlankState/index.tsx similarity index 100% rename from web-client/app/_components/TitleBlankState/index.tsx rename to web/app/_components/TitleBlankState/index.tsx diff --git a/web-client/app/_components/TogglableHeader/index.tsx b/web/app/_components/TogglableHeader/index.tsx similarity index 94% rename from web-client/app/_components/TogglableHeader/index.tsx rename to web/app/_components/TogglableHeader/index.tsx index 23ba6b651..fed06e5e5 100644 --- a/web-client/app/_components/TogglableHeader/index.tsx +++ b/web/app/_components/TogglableHeader/index.tsx @@ -23,7 +23,7 @@ const TogglableHeader: React.FC<Props> = ({ </div> <Image className={`${!expand ? "rotate-180" : "rotate-0"}`} - src={"/icons/unicorn_angle-up.svg"} + src={"icons/unicorn_angle-up.svg"} width={24} height={24} alt="" diff --git a/web-client/app/_components/UploadFileImage/index.tsx b/web/app/_components/UploadFileImage/index.tsx similarity index 94% rename from web-client/app/_components/UploadFileImage/index.tsx rename to web/app/_components/UploadFileImage/index.tsx index a7b74663e..f1f89b22b 100644 --- a/web-client/app/_components/UploadFileImage/index.tsx +++ b/web/app/_components/UploadFileImage/index.tsx @@ -70,7 +70,7 @@ export const UploadFileImage: React.FC<Props> = ({ register }) => { onClick={handleClick} className="flex flex-col justify-center items-center py-5 px-2 gap-2 round-[2px] border border-dashed border-[#C8D0E0] rounded-sm" > - {/* <Image src={"/icons/ic_plus.svg"} width={14} height={14} alt="" /> + {/* <Image src={"icons/ic_plus.svg"} width={14} height={14} alt="" /> <span className="text-gray-700 font-normal text-sm"> Drag an image here, or click to select </span> */} diff --git a/web/app/_components/UserProfileDropDown/index.tsx b/web/app/_components/UserProfileDropDown/index.tsx new file mode 100644 index 000000000..a87053fe6 --- /dev/null +++ b/web/app/_components/UserProfileDropDown/index.tsx @@ -0,0 +1,36 @@ +"use client"; + +import React from "react"; +import { Popover } from "@headlessui/react"; +import { MenuHeader } from "../MenuHeader"; +// import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; + +const UserProfileDropDown: React.FC = () => { + // const { loading, user } = useGetCurrentUser(); + return <div></div>; + // if (loading || !user) { + // return <div></div>; + // } + + // return ( + // <Popover.Group className="hidden lg:flex lg:gap-x-12"> + // <Popover className="relative"> + // <Popover.Button className="flex items-center gap-2 outline-none"> + // <img + // className="rounded-sm w-8 aspect-square" + // src={user.avatarUrl ?? "icons/app_icon.svg"} + // alt="" + // /> + // <div className="flex flex-col justify-start"> + // <h2 className="text-sm leading-5 text-[#111928] dark:text-gray-400"> + // {user.displayName} + // </h2> + // </div> + // </Popover.Button> + // <MenuHeader /> + // </Popover> + // </Popover.Group> + // ); +}; + +export default UserProfileDropDown; diff --git a/web-client/app/_components/UserToolbar/index.tsx b/web/app/_components/UserToolbar/index.tsx similarity index 78% rename from web-client/app/_components/UserToolbar/index.tsx rename to web/app/_components/UserToolbar/index.tsx index 6f2598a2b..7cbf3430d 100644 --- a/web-client/app/_components/UserToolbar/index.tsx +++ b/web/app/_components/UserToolbar/index.tsx @@ -7,14 +7,14 @@ import Image from "next/image"; const UserToolbar: React.FC = () => { const currentConvo = useAtomValue(currentConversationAtom); - const avatarUrl = currentConvo?.product.avatarUrl ?? ""; - const title = currentConvo?.product.name ?? ""; + const avatarUrl = currentConvo?.image; + const title = currentConvo?.name ?? ""; return ( <div className="flex items-center gap-3 p-1"> <Image className="rounded-full aspect-square w-8 h-8" - src={avatarUrl} + src={avatarUrl ?? "icons/app_icon.svg"} alt="" width={36} height={36} diff --git a/web/app/_components/ViewModelDetailButton/index.tsx b/web/app/_components/ViewModelDetailButton/index.tsx new file mode 100644 index 000000000..3314e5778 --- /dev/null +++ b/web/app/_components/ViewModelDetailButton/index.tsx @@ -0,0 +1,21 @@ +import { ChevronDownIcon } from "@heroicons/react/24/outline"; + +type Props = { + callback: () => void; +}; + +const ViewModelDetailButton: React.FC<Props> = ({ callback }) => { + return ( + <div className="px-4 pb-4"> + <button + onClick={callback} + className="bg-gray-100 py-1 px-[10px] w-full flex items-center justify-center gap-1 rounded-lg" + > + <span className="text-xs leading-[18px]">View Details</span> + <ChevronDownIcon width={18} height={18} /> + </button> + </div> + ); +}; + +export default ViewModelDetailButton; diff --git a/web/app/_components/WelcomeContainer/index.tsx b/web/app/_components/WelcomeContainer/index.tsx new file mode 100644 index 000000000..7124a0dfd --- /dev/null +++ b/web/app/_components/WelcomeContainer/index.tsx @@ -0,0 +1,31 @@ +import Image from "next/image"; +import { SidebarButton } from "../SidebarButton"; +import { useSetAtom } from "jotai"; +import { MainViewState, setMainViewStateAtom } from "@/_helpers/JotaiWrapper"; + +const Welcome: React.FC = () => { + const setMainViewState = useSetAtom(setMainViewStateAtom); + + return ( + <div className="flex flex-col h-full"> + <div className="px-[200px] flex-1 flex flex-col gap-5 justify-center items-start"> + <Image src={"icons/Jan_AppIcon.svg"} width={44} height={45} alt="" /> + <span className="font-semibold text-gray-500 text-5xl"> + Welcome, + <br /> + let’s download your first model + </span> + <SidebarButton + callback={() => setMainViewState(MainViewState.ExploreModel)} + className="flex flex-row-reverse items-center rounded-lg gap-2 px-3 py-2 text-xs font-medium border border-gray-200" + icon={"icons/app_icon.svg"} + title="Explore models" + height={16} + width={16} + /> + </div> + </div> + ); +}; + +export default Welcome; diff --git a/web/app/_helpers/EventListenerWrapper.tsx b/web/app/_helpers/EventListenerWrapper.tsx new file mode 100644 index 000000000..74c4b9c8c --- /dev/null +++ b/web/app/_helpers/EventListenerWrapper.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { useAtom, useSetAtom } from "jotai"; +import { ReactNode, useEffect } from "react"; +import { + appDownloadProgress, + setDownloadStateAtom, + setDownloadStateSuccessAtom, +} from "./JotaiWrapper"; +import { DownloadState } from "@/_models/DownloadState"; +import { execute } from "../../../electron/core/plugin-manager/execution/extension-manager"; +import { DataService } from "../../shared/coreService"; + +type Props = { + children: ReactNode; +}; + +export default function EventListenerWrapper({ children }: Props) { + const setDownloadState = useSetAtom(setDownloadStateAtom); + const setDownloadStateSuccess = useSetAtom(setDownloadStateSuccessAtom); + const setProgress = useSetAtom(appDownloadProgress); + + useEffect(() => { + if (window && window.electronAPI) { + window.electronAPI.onFileDownloadUpdate( + (_event: string, state: DownloadState | undefined) => { + if (!state) return; + setDownloadState(state); + } + ); + + window.electronAPI.onFileDownloadError( + (_event: string, callback: any) => { + console.log("Download error", callback); + } + ); + + window.electronAPI.onFileDownloadSuccess( + (_event: string, callback: any) => { + if (callback && callback.fileName) { + setDownloadStateSuccess(callback.fileName); + execute(DataService.UPDATE_FINISHED_DOWNLOAD, callback.fileName); + } + } + ); + + window.electronAPI.onAppUpdateDownloadUpdate( + (_event: string, progress: any) => { + setProgress(progress.percent); + console.log("app update progress:", progress.percent); + } + ); + + window.electronAPI.onAppUpdateDownloadError( + (_event: string, callback: any) => { + console.log("Download error", callback); + setProgress(-1); + } + ); + + window.electronAPI.onAppUpdateDownloadSuccess( + (_event: string, callback: any) => { + setProgress(-1); + } + ); + } + }, []); + + return <div id="eventlistener">{children}</div>; +} diff --git a/web-client/app/_helpers/JotaiWrapper.tsx b/web/app/_helpers/JotaiWrapper.tsx similarity index 70% rename from web-client/app/_helpers/JotaiWrapper.tsx rename to web/app/_helpers/JotaiWrapper.tsx index 76b603c96..f840e59ee 100644 --- a/web-client/app/_helpers/JotaiWrapper.tsx +++ b/web/app/_helpers/JotaiWrapper.tsx @@ -2,6 +2,7 @@ import { ChatMessage, MessageStatus } from "@/_models/ChatMessage"; import { Conversation, ConversationState } from "@/_models/Conversation"; +import { DownloadState } from "@/_models/DownloadState"; import { Product } from "@/_models/Product"; import { Provider, atom } from "jotai"; import { ReactNode } from "react"; @@ -21,6 +22,10 @@ export const getActiveConvoIdAtom = atom((get) => export const setActiveConvoIdAtom = atom( null, (_get, set, convoId: string | undefined) => { + if (convoId) { + console.log(`set active convo id to ${convoId}`); + set(setMainViewStateAtom, MainViewState.Conversation); + } set(activeConversationIdAtom, convoId); } ); @@ -30,6 +35,11 @@ export const currentPromptAtom = atom<string>(""); export const showingAdvancedPromptAtom = atom<boolean>(false); export const showingProductDetailAtom = atom<boolean>(false); export const showingMobilePaneAtom = atom<boolean>(false); +export const showingTyping = atom<boolean>(false); + +export const appDownloadProgress = atom<number>(-1); +export const activeModel = atom<string | undefined>(undefined); +export const searchingModelText = atom<string>(""); /** * Stores all conversations for the current user @@ -41,7 +51,10 @@ export const currentConversationAtom = atom<Conversation | undefined>((get) => export const setConvoUpdatedAtAtom = atom(null, (get, set, convoId: string) => { const convo = get(userConversationsAtom).find((c) => c.id === convoId); if (!convo) return; - const newConvo: Conversation = { ...convo, updatedAt: Date.now() }; + const newConvo: Conversation = { + ...convo, + updated_at: new Date().toISOString(), + }; const newConversations: Conversation[] = get(userConversationsAtom).map((c) => c.id === convoId ? newConvo : c ); @@ -49,14 +62,16 @@ export const setConvoUpdatedAtAtom = atom(null, (get, set, convoId: string) => { set(userConversationsAtom, newConversations); }); -export const currentStreamingMessageAtom = atom<ChatMessage | undefined>(undefined); +export const currentStreamingMessageAtom = atom<ChatMessage | undefined>( + undefined +); export const setConvoLastImageAtom = atom( null, (get, set, convoId: string, lastImageUrl: string) => { const convo = get(userConversationsAtom).find((c) => c.id === convoId); if (!convo) return; - const newConvo: Conversation = { ...convo, lastImageUrl }; + const newConvo: Conversation = { ...convo }; const newConversations: Conversation[] = get(userConversationsAtom).map( (c) => (c.id === convoId ? newConvo : c) ); @@ -153,6 +168,14 @@ export const addNewMessageAtom = atom( } ); +export const deleteConversationMessage = atom(null, (get, set, id: string) => { + const newData: Record<string, ChatMessage[]> = { + ...get(chatMessages), + }; + newData[id] = []; + set(chatMessages, newData); +}); + export const updateMessageAtom = atom( null, (get, set, id: string, conversationId: string, text: string) => { @@ -201,15 +224,77 @@ export const updateLastMessageAsReadyAtom = atom( } ); -export const currentProductAtom = atom<Product | undefined>( - (get) => - get(userConversationsAtom).find( - (c) => c.id === get(activeConversationIdAtom) - )?.product -); +export const currentProductAtom = atom<Product | undefined>(undefined); export const searchAtom = atom<string>(""); // modal atoms export const showConfirmDeleteConversationModalAtom = atom(false); export const showConfirmSignOutModalAtom = atom(false); +export const showConfirmDeleteModalAtom = atom(false); + +export type FileDownloadStates = { + [key: string]: DownloadState; +}; + +// main view state +export enum MainViewState { + Welcome, + ExploreModel, + MyModel, + ResourceMonitor, + Setting, + Conversation, +} + +const systemBarVisibilityAtom = atom<boolean>(true); +export const getSystemBarVisibilityAtom = atom((get) => + get(systemBarVisibilityAtom) +); + +const currentMainViewStateAtom = atom<MainViewState>(MainViewState.Welcome); +export const getMainViewStateAtom = atom((get) => + get(currentMainViewStateAtom) +); + +export const setMainViewStateAtom = atom( + null, + (_get, set, state: MainViewState) => { + if (state !== MainViewState.Conversation) { + set(activeConversationIdAtom, undefined); + } + const showSystemBar = state !== MainViewState.Conversation; + set(systemBarVisibilityAtom, showSystemBar); + set(currentMainViewStateAtom, state); + } +); + +// download states +export const modelDownloadStateAtom = atom<FileDownloadStates>({}); + +export const setDownloadStateAtom = atom( + null, + (get, set, state: DownloadState) => { + const currentState = { ...get(modelDownloadStateAtom) }; + console.debug( + `current download state for ${state.fileName} is ${JSON.stringify(state)}` + ); + currentState[state.fileName] = state; + set(modelDownloadStateAtom, currentState); + } +); + +export const setDownloadStateSuccessAtom = atom( + null, + (get, set, fileName: string) => { + const currentState = { ...get(modelDownloadStateAtom) }; + const state = currentState[fileName]; + if (!state) { + console.error(`Cannot find download state for ${fileName}`); + return; + } + + delete currentState[fileName]; + set(modelDownloadStateAtom, currentState); + } +); diff --git a/web-client/app/_helpers/ModalWrapper.tsx b/web/app/_helpers/ModalWrapper.tsx similarity index 81% rename from web-client/app/_helpers/ModalWrapper.tsx rename to web/app/_helpers/ModalWrapper.tsx index c5633b6fe..44800bb1f 100644 --- a/web-client/app/_helpers/ModalWrapper.tsx +++ b/web/app/_helpers/ModalWrapper.tsx @@ -1,6 +1,7 @@ "use client"; import ConfirmDeleteConversationModal from "@/_components/ConfirmDeleteConversationModal"; +import ConfirmDeleteModelModal from "@/_components/ConfirmDeleteModelModal"; import ConfirmSignOutModal from "@/_components/ConfirmSignOutModal"; import MobileMenuPane from "@/_components/MobileMenuPane"; import { ReactNode } from "react"; @@ -14,6 +15,7 @@ export const ModalWrapper: React.FC<Props> = ({ children }) => ( <MobileMenuPane /> <ConfirmDeleteConversationModal /> <ConfirmSignOutModal /> + <ConfirmDeleteModelModal /> {children} </> ); diff --git a/web-client/app/_helpers/ThemeWrapper.tsx b/web/app/_helpers/ThemeWrapper.tsx similarity index 100% rename from web-client/app/_helpers/ThemeWrapper.tsx rename to web/app/_helpers/ThemeWrapper.tsx diff --git a/web-client/app/_helpers/withAnalytics.tsx b/web/app/_helpers/withAnalytics.tsx similarity index 100% rename from web-client/app/_helpers/withAnalytics.tsx rename to web/app/_helpers/withAnalytics.tsx diff --git a/web/app/_hooks/useChatMessages.ts b/web/app/_hooks/useChatMessages.ts new file mode 100644 index 000000000..8400e6ea3 --- /dev/null +++ b/web/app/_hooks/useChatMessages.ts @@ -0,0 +1,73 @@ +import { + addOldMessagesAtom, + conversationStatesAtom, + currentConversationAtom, + updateConversationHasMoreAtom, +} from "@/_helpers/JotaiWrapper"; +import { ChatMessage, RawMessage, toChatMessage } from "@/_models/ChatMessage"; +import { executeSerial } from "@/_services/pluginService"; +import { useAtomValue, useSetAtom } from "jotai"; +import { useEffect, useState } from "react"; +import { DataService } from "../../shared/coreService"; + +/** + * Custom hooks to get chat messages for current(active) conversation + * + * @param offset for pagination purpose + * @returns + */ +const useChatMessages = (offset = 0) => { + const [loading, setLoading] = useState(true); + const addOldChatMessages = useSetAtom(addOldMessagesAtom); + const currentConvo = useAtomValue(currentConversationAtom); + const convoStates = useAtomValue(conversationStatesAtom); + const updateConvoHasMore = useSetAtom(updateConversationHasMoreAtom); + + useEffect(() => { + if (!currentConvo) { + return; + } + const hasMore = convoStates[currentConvo.id ?? ""]?.hasMore ?? true; + if (!hasMore) return; + + const getMessages = async () => { + executeSerial( + DataService.GET_CONVERSATION_MESSAGES, + currentConvo.id + ).then((data: any) => { + if (!data) { + return; + } + parseMessages(data ?? []).then((newMessages) => { + addOldChatMessages(newMessages); + updateConvoHasMore(currentConvo.id ?? "", false); + setLoading(false); + }); + }); + }; + getMessages(); + }, [ + offset, + currentConvo?.id, + convoStates, + addOldChatMessages, + updateConvoHasMore, + ]); + + return { + loading: loading, + error: undefined, + hasMore: convoStates[currentConvo?.id ?? ""]?.hasMore ?? true, + }; +}; + +async function parseMessages(messages: RawMessage[]): Promise<ChatMessage[]> { + const newMessages: ChatMessage[] = []; + for (const m of messages) { + const chatMessage = await toChatMessage(m); + newMessages.push(chatMessage); + } + return newMessages; +} + +export default useChatMessages; diff --git a/web/app/_hooks/useCreateConversation.ts b/web/app/_hooks/useCreateConversation.ts new file mode 100644 index 000000000..ffe68ba49 --- /dev/null +++ b/web/app/_hooks/useCreateConversation.ts @@ -0,0 +1,58 @@ +// import useGetCurrentUser from "./useGetCurrentUser"; +import { useAtom, useSetAtom } from "jotai"; +import { + activeModel, + addNewConversationStateAtom, + currentProductAtom, + setActiveConvoIdAtom, + userConversationsAtom, +} from "@/_helpers/JotaiWrapper"; +import { Conversation } from "@/_models/Conversation"; +import { executeSerial } from "@/_services/pluginService"; +import { DataService, InfereceService } from "../../shared/coreService"; +import { Product } from "@/_models/Product"; + +const useCreateConversation = () => { + const [userConversations, setUserConversations] = useAtom( + userConversationsAtom + ); + const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); + const addNewConvoState = useSetAtom(addNewConversationStateAtom); + const setActiveModel = useSetAtom(activeModel); + const setActiveProduct = useSetAtom(currentProductAtom); + + const requestCreateConvo = async (model: Product) => { + const conv: Conversation = { + image: undefined, + model_id: model.id, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + name: "Conversation", + }; + const id = await executeSerial(DataService.CREATE_CONVERSATION, conv); + await executeSerial(InfereceService.INIT_MODEL, model); + setActiveProduct(model); + setActiveModel(model.name); + + const mappedConvo: Conversation = { + id, + model_id: model.id, + name: "Conversation", + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }; + + addNewConvoState(id ?? "", { + hasMore: true, + waitingForResponse: false, + }); + setUserConversations([mappedConvo, ...userConversations]); + setActiveConvoId(id); + }; + + return { + requestCreateConvo, + }; +}; + +export default useCreateConversation; diff --git a/web-client/app/_hooks/useDeleteConversation.ts b/web/app/_hooks/useDeleteConversation.ts similarity index 78% rename from web-client/app/_hooks/useDeleteConversation.ts rename to web/app/_hooks/useDeleteConversation.ts index 04f540040..79fdad93c 100644 --- a/web-client/app/_hooks/useDeleteConversation.ts +++ b/web/app/_hooks/useDeleteConversation.ts @@ -1,17 +1,15 @@ import { currentPromptAtom, + deleteConversationMessage, getActiveConvoIdAtom, setActiveConvoIdAtom, showingAdvancedPromptAtom, showingProductDetailAtom, userConversationsAtom, } from "@/_helpers/JotaiWrapper"; -import { - DeleteConversationDocument, - DeleteConversationMutation, -} from "@/graphql"; -import { useMutation } from "@apollo/client"; +import { execute } from "@/_services/pluginService"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; +import { DataService } from "../../shared/coreService"; export default function useDeleteConversation() { const [userConversations, setUserConversations] = useAtom( @@ -22,18 +20,16 @@ export default function useDeleteConversation() { const setShowingAdvancedPrompt = useSetAtom(showingAdvancedPromptAtom); const activeConvoId = useAtomValue(getActiveConvoIdAtom); const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); - - const [deleteConversation] = useMutation<DeleteConversationMutation>( - DeleteConversationDocument - ); + const deleteMessages = useSetAtom(deleteConversationMessage); const deleteConvo = async () => { if (activeConvoId) { try { - await deleteConversation({ variables: { id: activeConvoId } }); + await execute(DataService.DELETE_CONVERSATION, activeConvoId); setUserConversations( userConversations.filter((c) => c.id !== activeConvoId) ); + deleteMessages(activeConvoId); setActiveConvoId(undefined); setCurrentPrompt(""); setShowingProductDetail(false); diff --git a/web-client/app/_hooks/useGetCurrentUser.ts b/web/app/_hooks/useGetCurrentUser.ts similarity index 100% rename from web-client/app/_hooks/useGetCurrentUser.ts rename to web/app/_hooks/useGetCurrentUser.ts diff --git a/web-client/app/_hooks/useGetModelApiInfo.ts b/web/app/_hooks/useGetModelApiInfo.ts similarity index 100% rename from web-client/app/_hooks/useGetModelApiInfo.ts rename to web/app/_hooks/useGetModelApiInfo.ts diff --git a/web/app/_hooks/useGetModels.ts b/web/app/_hooks/useGetModels.ts new file mode 100644 index 000000000..9aa6b0181 --- /dev/null +++ b/web/app/_hooks/useGetModels.ts @@ -0,0 +1,9 @@ +import React, { useState } from "react"; + +export default function useGetModels() { + const [models, setModels] = useState<any[]>() + + return { + models + }; +} diff --git a/web/app/_hooks/useGetUserConversations.ts b/web/app/_hooks/useGetUserConversations.ts new file mode 100644 index 000000000..f315e197a --- /dev/null +++ b/web/app/_hooks/useGetUserConversations.ts @@ -0,0 +1,38 @@ +import { Conversation, ConversationState } from "@/_models/Conversation"; +import { useSetAtom } from "jotai"; +import { + conversationStatesAtom, + userConversationsAtom, +} from "@/_helpers/JotaiWrapper"; +import { executeSerial } from "@/_services/pluginService"; +import { DataService } from "../../shared/coreService"; + +const useGetUserConversations = () => { + const setConversationStates = useSetAtom(conversationStatesAtom); + const setConversations = useSetAtom(userConversationsAtom); + + const getUserConversations = async () => { + try { + const convos: Conversation[] | undefined = await executeSerial( + DataService.GET_CONVERSATIONS + ); + const convoStates: Record<string, ConversationState> = {}; + convos?.forEach((convo) => { + convoStates[convo.id ?? ""] = { + hasMore: true, + waitingForResponse: false, + }; + }); + setConversationStates(convoStates); + setConversations(convos ?? []); + } catch (ex) { + console.log(ex); + } + }; + + return { + getUserConversations, + }; +}; + +export default useGetUserConversations; diff --git a/web/app/_hooks/useSendChatMessage.ts b/web/app/_hooks/useSendChatMessage.ts new file mode 100644 index 000000000..b8371afab --- /dev/null +++ b/web/app/_hooks/useSendChatMessage.ts @@ -0,0 +1,49 @@ +import { + addNewMessageAtom, + currentConversationAtom, + currentPromptAtom, + showingTyping, +} from "@/_helpers/JotaiWrapper"; + +import { useAtom, useAtomValue, useSetAtom } from "jotai"; +import { DataService, InfereceService } from "../../shared/coreService"; +import { RawMessage, toChatMessage } from "@/_models/ChatMessage"; +import { executeSerial } from "@/_services/pluginService"; + +export default function useSendChatMessage() { + const currentConvo = useAtomValue(currentConversationAtom); + + const addNewMessage = useSetAtom(addNewMessageAtom); + const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom); + const [, setIsTyping] = useAtom(showingTyping); + const sendChatMessage = async () => { + setIsTyping(true); + setCurrentPrompt(""); + const prompt = currentPrompt.trim(); + const newMessage: RawMessage = { + conversation_id: parseInt(currentConvo?.id ?? "0") ?? 0, + message: prompt, + user: "user", + created_at: new Date().toISOString(), + }; + const id = await executeSerial(DataService.CREATE_MESSAGE, newMessage); + newMessage.id = id; + + addNewMessage(await toChatMessage(newMessage)); + const resp = await executeSerial(InfereceService.PROMPT, prompt); + + const newResponse: RawMessage = { + conversation_id: parseInt(currentConvo?.id ?? "0") ?? 0, + message: resp, + user: "assistant", + created_at: new Date().toISOString(), + }; + const respId = await executeSerial(DataService.CREATE_MESSAGE, newResponse); + newResponse.id = respId; + addNewMessage(await toChatMessage(newResponse)); + setIsTyping(false); + }; + return { + sendChatMessage, + }; +} diff --git a/web-client/app/_hooks/useSignIn.ts b/web/app/_hooks/useSignIn.ts similarity index 100% rename from web-client/app/_hooks/useSignIn.ts rename to web/app/_hooks/useSignIn.ts diff --git a/web-client/app/_hooks/useSignOut.ts b/web/app/_hooks/useSignOut.ts similarity index 100% rename from web-client/app/_hooks/useSignOut.ts rename to web/app/_hooks/useSignOut.ts diff --git a/web/app/_models/ChatMessage.ts b/web/app/_models/ChatMessage.ts new file mode 100644 index 000000000..40bbbb6ec --- /dev/null +++ b/web/app/_models/ChatMessage.ts @@ -0,0 +1,82 @@ +import { remark } from "remark"; +import html from "remark-html"; + +export enum MessageType { + Text = "Text", + Image = "Image", + ImageWithText = "ImageWithText", + Error = "Error", +} + +export enum MessageSenderType { + Ai = "Ai", + User = "User", +} + +export enum MessageStatus { + Ready = "ready", + Pending = "pending", +} + +export interface ChatMessage { + id: string; + conversationId: string; + messageType: MessageType; + messageSenderType: MessageSenderType; + senderUid: string; + senderName: string; + senderAvatarUrl: string; + text: string | undefined; + imageUrls?: string[] | undefined; + createdAt: number; + status: MessageStatus; +} + +export interface RawMessage { + id?: number; + conversation_id: number; + user?: string; + message?: string; + created_at?: string; + updated_at?: string; +} + +export const toChatMessage = async (m: RawMessage): Promise<ChatMessage> => { + const createdAt = new Date(m.created_at ?? "").getTime(); + const imageUrls: string[] = []; + const imageUrl = undefined; + // m.message_medias.length > 0 ? m.message_medias[0].media_url : null; + if (imageUrl) { + imageUrls.push(imageUrl); + } + + const messageType = MessageType.Text; + // m.message_type ? MessageType[m.message_type as keyof typeof MessageType] : MessageType.Text; + const messageSenderType = + m.user === "user" ? MessageSenderType.User : MessageSenderType.Ai; + // m.message_sender_type + // ? MessageSenderType[m.message_sender_type as keyof typeof MessageSenderType] + // : MessageSenderType.Ai; + + const content = m.message ?? ""; + const processedContent = await remark().use(html).process(content); + const contentHtml = processedContent.toString(); + + return { + id: (m.id ?? 0).toString(), + conversationId: (m.conversation_id ?? 0).toString(), + messageType: messageType, + messageSenderType: messageSenderType, + senderUid: m.user?.toString() || "0", + senderName: m.user === "user" ? "You" : "LLaMA", // m.sender_name ?? "", + senderAvatarUrl: + m.user === "user" + ? "icons/avatar.svg" + : "https://huggingface.co/front/assets/huggingface_logo-noborder.svg", // m.sender_avatar_url ?? "icons/app_icon.svg", + text: contentHtml, + imageUrls: imageUrls, + createdAt: createdAt, + status: MessageStatus.Ready, + // status: m.status as MessageStatus, + }; +}; diff --git a/web/app/_models/Conversation.ts b/web/app/_models/Conversation.ts new file mode 100644 index 000000000..1d435fd89 --- /dev/null +++ b/web/app/_models/Conversation.ts @@ -0,0 +1,17 @@ +export interface Conversation { + id?: string; + model_id?: string; + name?: string; + image?: string; + message?: string; + created_at?: string; + updated_at?: string; +} + +/** + * Store the state of conversation like fetching, waiting for response, etc. + */ +export type ConversationState = { + hasMore: boolean; + waitingForResponse: boolean; +}; diff --git a/web/app/_models/DownloadState.ts b/web/app/_models/DownloadState.ts new file mode 100644 index 000000000..64d7fb5c2 --- /dev/null +++ b/web/app/_models/DownloadState.ts @@ -0,0 +1,22 @@ +/** + * Represent the state of a download + */ +export type DownloadState = { + modelId: string; + time: DownloadTime; + speed: number; + percent: number; + size: DownloadSize; + fileName: string; + error?: string; +}; + +export type DownloadTime = { + elapsed: number; + remaining: number; +}; + +export type DownloadSize = { + total: number; + transferred: number; +}; diff --git a/web/app/_models/Product.ts b/web/app/_models/Product.ts new file mode 100644 index 000000000..1845b6e36 --- /dev/null +++ b/web/app/_models/Product.ts @@ -0,0 +1,30 @@ +import { ProductInput } from "./ProductInput"; +import { ProductOutput } from "./ProductOutput"; + +export enum ProductType { + LLM = "LLM", + GenerativeArt = "GenerativeArt", + ControlNet = "ControlNet", +} + +export interface Product { + id: string; + slug: string; + name: string; + description: string; + avatarUrl: string; + longDescription: string; + technicalDescription: string; + author: string; + version: string; + modelUrl: string; + nsfw: boolean; + greeting: string; + type: ProductType; + inputs?: ProductInput; + outputs?: ProductOutput; + createdAt: number; + updatedAt?: number; + fileName?: string; + downloadUrl?: string; +} diff --git a/web-client/app/_models/ProductInput.ts b/web/app/_models/ProductInput.ts similarity index 100% rename from web-client/app/_models/ProductInput.ts rename to web/app/_models/ProductInput.ts diff --git a/web-client/app/_models/ProductOutput.ts b/web/app/_models/ProductOutput.ts similarity index 100% rename from web-client/app/_models/ProductOutput.ts rename to web/app/_models/ProductOutput.ts diff --git a/web-client/app/_models/User.ts b/web/app/_models/User.ts similarity index 87% rename from web-client/app/_models/User.ts rename to web/app/_models/User.ts index 9f7d0ffd4..b3d9583d5 100644 --- a/web-client/app/_models/User.ts +++ b/web/app/_models/User.ts @@ -8,7 +8,7 @@ export interface User { export const DefaultUser = { id: "0", displayName: "Anonymous", - avatarUrl: "/icons/app_icon.svg", + avatarUrl: "icons/app_icon.svg", email: "", }; diff --git a/web/app/_services/pluginService.ts b/web/app/_services/pluginService.ts new file mode 100644 index 000000000..52ddf2a91 --- /dev/null +++ b/web/app/_services/pluginService.ts @@ -0,0 +1,60 @@ +"use client"; +import { + extensionPoints, + plugins, +} from "../../../electron/core/plugin-manager/execution/index"; +import { + CoreService, + DataService, + InfereceService, + ModelManagementService, +} from "../../shared/coreService"; + +export const isCorePluginInstalled = () => { + if (!extensionPoints.get(DataService.GET_CONVERSATIONS)) { + return false; + } + if (!extensionPoints.get(InfereceService.PROMPT)) { + return false; + } + if (!extensionPoints.get(ModelManagementService.GET_DOWNLOADED_MODELS)) { + return false; + } + return true; +}; +export const setupBasePlugins = async () => { + if ( + typeof window === "undefined" || + typeof window.electronAPI === "undefined" + ) { + return; + } + const basePlugins = await window.electronAPI.basePlugins(); + + if ( + !extensionPoints.get(DataService.GET_CONVERSATIONS) || + !extensionPoints.get(InfereceService.PROMPT) || + !extensionPoints.get(ModelManagementService.GET_DOWNLOADED_MODELS) + ) { + const installed = await plugins.install(basePlugins); + if (installed) { + window.location.reload(); + } + } +}; + +export const execute = (name: CoreService, args?: any) => { + if (!extensionPoints.get(name)) { + alert("Missing extension for function: " + name); + return undefined; + } + return extensionPoints.execute(name, args); +}; + +export const executeSerial = (name: CoreService, args?: any) => { + if (!extensionPoints.get(name)) { + alert("Missing extension for function: " + name); + return Promise.resolve(undefined); + } + return extensionPoints.executeSerial(name, args); +}; diff --git a/web-client/app/_utils/const.ts b/web/app/_utils/const.ts similarity index 100% rename from web-client/app/_utils/const.ts rename to web/app/_utils/const.ts diff --git a/web-client/app/_utils/datetime.ts b/web/app/_utils/datetime.ts similarity index 100% rename from web-client/app/_utils/datetime.ts rename to web/app/_utils/datetime.ts diff --git a/web-client/app/_utils/message.ts b/web/app/_utils/message.ts similarity index 100% rename from web-client/app/_utils/message.ts rename to web/app/_utils/message.ts diff --git a/web-client/app/favicon.ico b/web/app/favicon.ico similarity index 100% rename from web-client/app/favicon.ico rename to web/app/favicon.ico diff --git a/web-client/app/globals.css b/web/app/globals.css similarity index 89% rename from web-client/app/globals.css rename to web/app/globals.css index 88a545677..d66627f8e 100644 --- a/web-client/app/globals.css +++ b/web/app/globals.css @@ -372,3 +372,57 @@ body { line-height: 40px; /* 111.111% */ } } + +/* Typing indicator */ +.typingIndicatorContainer { + display: flex; + flex: none; + align-items: flex-end; + margin: 4 0; +} + +.typingIndicatorBubble { + display: flex; + align-items: center; + justify-content: center; + width: 52px; + height: 34px; + margin: 0px 8px; + background-color: #f0f1f1; + border-radius: 12px; +} + +.typingIndicatorBubbleDot { + width: 4px; + height: 4px; + margin-right: 4px; + background-color: #57585a; + border-radius: 50%; + animation-name: bounce; + animation-duration: 1.3s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + +.typingIndicatorBubbleDot:first-of-type { + margin: 0px 4px; +} + +.typingIndicatorBubbleDot:nth-of-type(2) { + animation-delay: 0.15s; +} + +.typingIndicatorBubbleDot:nth-of-type(3) { + animation-delay: 0.3s; +} + +@keyframes bounce { + 0%, + 60%, + 100% { + transform: translateY(0); + } + 30% { + transform: translateY(-4px); + } +} diff --git a/web/app/layout.tsx b/web/app/layout.tsx new file mode 100644 index 000000000..1855cd0bc --- /dev/null +++ b/web/app/layout.tsx @@ -0,0 +1,26 @@ +import "./globals.css"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Jan", + description: + "Self-hosted, local, AI Inference Platform that scales from personal use to production deployments for a team.", + metadataBase: new URL( + process.env.NEXT_PUBLIC_WEB_URL ?? "https://cloud.jan.ai" + ), + openGraph: { + images: "images/preview.jpg", + }, +}; + +type Props = { + children: React.ReactNode; +}; + +export default function RootLayout({ children }: Props) { + return ( + <html lang="en" suppressHydrationWarning> + <body>{children}</body> + </html> + ); +} diff --git a/web/app/page.tsx b/web/app/page.tsx new file mode 100644 index 000000000..fe99afbcc --- /dev/null +++ b/web/app/page.tsx @@ -0,0 +1,78 @@ +"use client"; + +import { ThemeWrapper } from "./_helpers/ThemeWrapper"; +import JotaiWrapper from "./_helpers/JotaiWrapper"; +import RightContainer from "./_components/RightContainer"; +import { ModalWrapper } from "./_helpers/ModalWrapper"; +import { useEffect, useState } from "react"; +import Image from "next/image"; + +import { + setup, + plugins, + activationPoints, +} from "../../electron/core/plugin-manager/execution/index"; +import { + isCorePluginInstalled, + setupBasePlugins, +} from "./_services/pluginService"; +import LeftContainer from "./_components/LeftContainer"; +import EventListenerWrapper from "./_helpers/EventListenerWrapper"; + +const Page: React.FC = () => { + const [activated, setActivated] = useState(false); + useEffect(() => { + async function setupPE() { + // Enable activation point management + setup({ + importer: (plugin: string) => + import(/* webpackIgnore: true */ plugin).catch((err) => { + console.log(err); + }), + }); + + // Register all active plugins with their activation points + await plugins.registerActive(); + setTimeout(async () => { + // Trigger activation points + await activationPoints.trigger("init"); + if (!isCorePluginInstalled()) { + setupBasePlugins(); + return; + } + setActivated(true); + }, 500); + } + // Electron + if (window && window.electronAPI) { + setupPE(); + } else { + // Host + setActivated(true); + } + }, []); + + return ( + <JotaiWrapper> + <EventListenerWrapper> + <ThemeWrapper> + <ModalWrapper> + {activated && ( + <div className="flex"> + <LeftContainer /> + <RightContainer /> + </div> + )} + {!activated && ( + <div className="bg-white w-screen h-screen items-center justify-center flex"> + <Image width={50} height={50} src="icons/app_icon.svg" alt="" /> + </div> + )} + </ModalWrapper> + </ThemeWrapper> + </EventListenerWrapper> + </JotaiWrapper> + ); +}; + +export default Page; diff --git a/web-client/app/privacy/page.tsx b/web/app/privacy/page.tsx similarity index 94% rename from web-client/app/privacy/page.tsx rename to web/app/privacy/page.tsx index 6d7c66337..b43eb88a9 100644 --- a/web-client/app/privacy/page.tsx +++ b/web/app/privacy/page.tsx @@ -14,8 +14,8 @@ const Page: React.FC = () => { <div className="absolute top-3 left-5"> <Link href="/" className="flex flex-row gap-2"> <div className="flex gap-[2px] items-center"> - <Image src={"/icons/app_icon.svg"} width={28} height={28} alt="" /> - <Image src={"/icons/Jan.svg"} width={27} height={12} alt="" /> + <Image src={"icons/app_icon.svg"} width={28} height={28} alt="" /> + <Image src={"icons/Jan.svg"} width={27} height={12} alt="" /> </div> </Link> </div> diff --git a/web/app/settings/page.tsx b/web/app/settings/page.tsx new file mode 100644 index 000000000..859c174d3 --- /dev/null +++ b/web/app/settings/page.tsx @@ -0,0 +1,11 @@ +import { Preferences } from "@/_components/Preferences"; + +const Settings = () => { + return ( + <div className="flex"> + <Preferences /> + </div> + ); +}; + +export default Settings; diff --git a/web-client/app/support/page.tsx b/web/app/support/page.tsx similarity index 83% rename from web-client/app/support/page.tsx rename to web/app/support/page.tsx index 3279148d6..2ec127221 100644 --- a/web-client/app/support/page.tsx +++ b/web/app/support/page.tsx @@ -14,8 +14,8 @@ const Page: React.FC = () => { <div className="absolute top-3 left-5"> <Link href="/" className="flex flex-row gap-2"> <div className="flex gap-[2px] items-center"> - <Image src={"/icons/app_icon.svg"} width={28} height={28} alt="" /> - <Image src={"/icons/Jan.svg"} width={27} height={12} alt="" /> + <Image src={"icons/app_icon.svg"} width={28} height={28} alt="" /> + <Image src={"icons/Jan.svg"} width={27} height={12} alt="" /> </div> </Link> </div> @@ -27,7 +27,7 @@ const Page: React.FC = () => { href={process.env.NEXT_PUBLIC_DISCORD_INVITATION_URL ?? "#"} target="_blank_" > - <Image src={"/icons/discord.svg"} width={70} height={70} alt="" /> + <Image src={"icons/discord.svg"} width={70} height={70} alt="" /> </Link> <p> If you have any questions or concerns about our privacy policy or diff --git a/web-client/dev.Dockerfile b/web/dev.Dockerfile similarity index 100% rename from web-client/dev.Dockerfile rename to web/dev.Dockerfile diff --git a/web-client/docker-compose.yml b/web/docker-compose.yml similarity index 100% rename from web-client/docker-compose.yml rename to web/docker-compose.yml diff --git a/web-client/env-example b/web/env-example similarity index 100% rename from web-client/env-example rename to web/env-example diff --git a/web/next.config.js b/web/next.config.js new file mode 100644 index 000000000..bcca4cd79 --- /dev/null +++ b/web/next.config.js @@ -0,0 +1,25 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: "export", + assetPrefix: ".", + experimental: { + serverActions: false, + }, + images: { + unoptimized: true, + remotePatterns: [ + { + protocol: "https", + hostname: "**", + }, + ], + }, + webpack: (config, env) => { + // do some stuff here + config.optimization.minimize = false; + config.optimization.minimizer = []; + return config; + }, +}; + +module.exports = nextConfig; diff --git a/web-client/package.json b/web/package.json similarity index 75% rename from web-client/package.json rename to web/package.json index ff93efa00..b9530dc94 100644 --- a/web-client/package.json +++ b/web/package.json @@ -2,21 +2,18 @@ "name": "jan-web", "version": "0.1.0", "private": true, + "homepage": "./", "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint", - "compile": "tsc --noEmit -p . --pretty", - "generate": "graphql-codegen --config codegen.ts", - "watch": "graphql-codegen -w" + "compile": "tsc --noEmit -p . --pretty" }, "dependencies": { - "@apollo/client": "^3.8.1", "@headlessui/react": "^1.7.15", "@heroicons/react": "^2.0.18", "@tailwindcss/typography": "^0.5.9", - "@types/node": "20.4.2", "@types/react": "18.2.15", "@types/react-dom": "18.2.7", "@types/react-syntax-highlighter": "^15.5.7", @@ -26,8 +23,6 @@ "embla-carousel-react": "^8.0.0-rc11", "eslint": "8.45.0", "eslint-config-next": "13.4.10", - "graphql": "^16.8.0", - "graphql-ws": "^5.14.0", "jotai": "^2.4.0", "jotai-optics": "^0.3.1", "jwt-decode": "^3.1.2", @@ -46,10 +41,8 @@ "typescript": "5.1.6" }, "devDependencies": { - "@graphql-codegen/cli": "5.0.0", - "@graphql-codegen/client-preset": "4.1.0", - "@graphql-codegen/introspection": "4.0.0", "@tailwindcss/forms": "^0.5.4", + "@types/node": "20.6.5", "encoding": "^0.1.13" } } diff --git a/web-client/postcss.config.js b/web/postcss.config.js similarity index 100% rename from web-client/postcss.config.js rename to web/postcss.config.js diff --git a/web/public/icons/ClipboardList.svg b/web/public/icons/ClipboardList.svg new file mode 100644 index 000000000..24fad2edc --- /dev/null +++ b/web/public/icons/ClipboardList.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M9 5H7C5.89543 5 5 5.89543 5 7V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V7C19 5.89543 18.1046 5 17 5H15M9 5C9 6.10457 9.89543 7 11 7H13C14.1046 7 15 6.10457 15 5M9 5C9 3.89543 9.89543 3 11 3H13C14.1046 3 15 3.89543 15 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round"/> +</svg> diff --git a/web/public/icons/Cog.svg b/web/public/icons/Cog.svg new file mode 100644 index 000000000..0973cf226 --- /dev/null +++ b/web/public/icons/Cog.svg @@ -0,0 +1,4 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M10.3246 4.31731C10.751 2.5609 13.249 2.5609 13.6754 4.31731C13.9508 5.45193 15.2507 5.99038 16.2478 5.38285C17.7913 4.44239 19.5576 6.2087 18.6172 7.75218C18.0096 8.74925 18.5481 10.0492 19.6827 10.3246C21.4391 10.751 21.4391 13.249 19.6827 13.6754C18.5481 13.9508 18.0096 15.2507 18.6172 16.2478C19.5576 17.7913 17.7913 19.5576 16.2478 18.6172C15.2507 18.0096 13.9508 18.5481 13.6754 19.6827C13.249 21.4391 10.751 21.4391 10.3246 19.6827C10.0492 18.5481 8.74926 18.0096 7.75219 18.6172C6.2087 19.5576 4.44239 17.7913 5.38285 16.2478C5.99038 15.2507 5.45193 13.9508 4.31731 13.6754C2.5609 13.249 2.5609 10.751 4.31731 10.3246C5.45193 10.0492 5.99037 8.74926 5.38285 7.75218C4.44239 6.2087 6.2087 4.44239 7.75219 5.38285C8.74926 5.99037 10.0492 5.45193 10.3246 4.31731Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C13.6569 9 15 10.3431 15 12Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web/public/icons/Icon_plus.svg b/web/public/icons/Icon_plus.svg new file mode 100644 index 000000000..75d7e2f28 --- /dev/null +++ b/web/public/icons/Icon_plus.svg @@ -0,0 +1,3 @@ +<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 0C8.05228 0 8.5 0.447715 8.5 1V6H13.5C14.0523 6 14.5 6.44772 14.5 7C14.5 7.55228 14.0523 8 13.5 8H8.5V13C8.5 13.5523 8.05228 14 7.5 14C6.94772 14 6.5 13.5523 6.5 13V8H1.5C0.947715 8 0.5 7.55228 0.5 7C0.5 6.44771 0.947715 6 1.5 6L6.5 6V1C6.5 0.447715 6.94772 0 7.5 0Z" fill="white"/> +</svg> diff --git a/web-client/public/icons/Jan.svg b/web/public/icons/Jan.svg similarity index 100% rename from web-client/public/icons/Jan.svg rename to web/public/icons/Jan.svg diff --git a/web/public/icons/Jan_AppIcon.svg b/web/public/icons/Jan_AppIcon.svg new file mode 100644 index 000000000..a823ab3ed --- /dev/null +++ b/web/public/icons/Jan_AppIcon.svg @@ -0,0 +1,15 @@ +<svg width="68" height="28" viewBox="0 0 68 28" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M27.0157 6.56975C26.0798 6.41763 25.3942 6.92314 24.8653 7.59949C23.7445 9.02943 23.3865 10.7426 23.1665 12.4978C23.3841 14.0448 22.6143 15.1845 21.6503 16.2657C21.0814 16.87 20.6438 17.5856 20.3651 18.3675C20.0864 19.1493 19.9727 19.9803 20.031 20.8083C20.0677 21.5222 20.1886 22.2292 20.3914 22.9146C20.4345 23.0209 20.4689 23.1304 20.4943 23.2423C20.513 23.3967 20.5973 23.6027 20.4241 23.6916C20.2135 23.7992 20.0802 23.5886 20.0029 23.4576C19.8119 23.133 19.6551 22.7895 19.535 22.4325C18.84 20.1296 18.9359 17.9086 20.4101 15.8936C20.7385 15.4661 21.0916 15.0582 21.4677 14.672C22.1697 13.9277 22.2844 13.3263 21.8024 12.4463C20.5832 10.2253 19.3361 8.01607 18.1006 5.80212C17.2886 4.34409 16.4626 2.89075 15.667 1.4257C15.4029 0.958785 15.0423 0.553496 14.6094 0.236816C13.547 0.637013 13.2873 1.14252 13.6126 2.20503C13.6809 2.44449 13.7653 2.67905 13.8653 2.90713C14.3496 3.98134 14.8457 5.05087 15.3324 6.12508C16.0016 7.60183 16.6849 9.07156 17.2395 10.5951C17.319 10.8151 17.5296 11.0889 17.1623 11.2738C16.7223 11.7629 16.3737 11.7887 15.9221 11.3487C15.2201 10.6677 14.7732 9.80642 14.2678 8.99199C12.9246 6.8108 11.6026 4.62727 10.3016 2.44141C9.988 1.91951 9.50598 1.70186 8.99587 1.49123C8.09967 1.90781 7.861 2.40396 8.11839 3.34243C8.25212 3.78059 8.43502 4.2022 8.6636 4.59919C10.1284 7.32801 11.6845 10.0054 13.2171 12.6944C13.3632 12.8779 13.4373 13.1084 13.4254 13.3427C13.1025 14.1243 12.3584 14.0588 11.9068 13.4971C10.9076 12.245 9.94121 10.9672 8.95375 9.70813C8.14413 8.68072 7.31579 7.66502 6.50384 6.64464C6.1758 6.23383 5.74227 5.91996 5.24963 5.73659C4.49851 6.10636 4.21772 6.71017 4.45171 7.49184C4.57736 7.88129 4.76631 8.24739 5.01096 8.57541C6.55999 10.8689 8.10747 13.1601 9.65339 15.449C9.80081 15.6643 10.0442 15.8772 9.86867 16.1955C9.5247 16.8298 8.87887 16.9561 8.33367 16.4296C7.63169 15.7579 6.99522 15.0464 6.35174 14.3233C5.5819 13.462 4.8378 12.575 4.082 11.6997C3.78483 11.3557 3.38002 11.2059 2.97287 11.0304C2.27089 11.3932 2.09773 11.7723 2.27089 12.4978C2.38042 12.8949 2.56467 13.2674 2.81375 13.5954C3.42682 14.466 4.03754 15.339 4.67166 16.1932C7.0116 19.355 9.35154 22.5121 12.0799 25.3649C13.9355 27.298 16.1701 28.1897 18.8447 27.9627C18.9428 27.9697 19.0413 27.9697 19.1395 27.9627C22.8109 27.628 26.1266 24.7026 26.9292 21.1009C27.223 19.6189 27.3439 18.1079 27.2895 16.5981C27.2684 14.6111 27.2895 12.6195 27.5984 10.6583C27.7796 9.74169 27.9108 8.81589 27.9915 7.88501C28.057 7.12675 27.7622 6.69144 27.0157 6.56975Z" fill="#FEC928"/> +<path d="M23.1712 12.4976C23.3888 14.0446 22.619 15.1843 21.6549 16.2655C21.0852 16.8694 20.6468 17.5849 20.3673 18.3667C20.0878 19.1485 19.9733 19.9798 20.031 20.8081C20.0676 21.522 20.1886 22.229 20.3914 22.9144C20.4345 23.0207 20.4689 23.1302 20.4943 23.242C20.513 23.3965 20.5973 23.6025 20.4241 23.6914C20.2135 23.799 20.0801 23.5884 20.0029 23.4574C19.8119 23.1328 19.6551 22.7892 19.5349 22.4323C18.84 20.1294 18.9359 17.9084 20.4101 15.8934C20.7384 15.4659 21.0916 15.0579 21.4677 14.6718C22.1697 13.9275 22.2844 13.3261 21.8023 12.4461C20.5832 10.2251 19.336 8.01587 18.1029 5.80191C17.2886 4.34389 16.4649 2.89054 15.667 1.4255C15.4029 0.95858 15.0423 0.553291 14.6094 0.236612C15.4962 0.0470449 15.9923 0.573619 16.3854 1.23593C17.2605 2.6963 18.1193 4.16836 18.9874 5.63107C20.2837 7.81538 21.5816 9.99968 22.8811 12.184C22.9583 12.2963 23.0074 12.4461 23.1712 12.4976Z" fill="#EDA703"/> +<path d="M18.8447 27.9625C18.8751 27.6395 19.1652 27.67 19.3618 27.6068C21.0231 27.0849 22.5464 26.3149 23.7749 25.0582C25.3317 23.4844 26.249 21.3886 26.3488 19.1769C26.4448 17.6838 26.3676 16.1953 26.4284 14.7069C26.4927 12.4986 26.9466 10.319 27.7692 8.26864C27.8338 8.1377 27.9081 8.01175 27.9915 7.89185C27.9108 8.82272 27.7796 9.74852 27.5984 10.6651C27.2848 12.6357 27.2684 14.618 27.2895 16.6049C27.3439 18.1147 27.223 19.6257 26.9292 21.1077C26.1266 24.7095 22.8109 27.6349 19.1395 27.9695C19.0412 27.9742 18.9427 27.9719 18.8447 27.9625Z" fill="#EDA807"/> +<path d="M17.1622 11.2502C16.7223 11.7393 16.3737 11.7651 15.9221 11.3251C15.2201 10.6441 14.7732 9.78282 14.2677 8.96838C12.9246 6.8028 11.6026 4.62707 10.3016 2.4412C9.988 1.91931 9.50597 1.70166 8.99586 1.49103C9.51065 1.16806 9.99502 1.29444 10.463 1.59634C10.8488 1.87602 11.1683 2.23716 11.399 2.65417C13.0073 5.19889 14.6133 7.74751 16.2169 10.3C16.4603 10.6745 16.7013 11.0747 17.1622 11.2502Z" fill="#EDA805"/> +<path d="M13.4254 13.3425C13.1025 14.1242 12.3584 14.0587 11.9068 13.497C10.9076 12.2449 9.94121 10.9671 8.95376 9.70801C8.14414 8.68061 7.3158 7.66491 6.50384 6.64452C6.17581 6.23372 5.74228 5.91984 5.24963 5.73647C5.95162 5.46266 6.62552 5.69201 7.25964 6.43857C7.85866 7.15471 8.42961 7.8849 9.03331 8.60572C10.1861 10.0099 11.3413 11.4141 12.4988 12.8183C12.7351 13.1085 12.9667 13.4268 13.4254 13.3425Z" fill="#EDA805"/> +<path d="M5.9984 21.6764C5.33928 21.4779 4.73152 21.1376 4.21771 20.6795C2.87982 19.4981 1.94672 17.9264 1.55018 16.186C1.47998 15.8865 1.57124 15.6875 1.84735 15.6103C2.12347 15.5331 2.21239 15.7437 2.29194 15.9567C3.05476 17.9974 4.28323 19.6731 6.12944 20.8714C6.24436 20.9207 6.33679 21.0111 6.38871 21.1249C6.44062 21.2387 6.44829 21.3677 6.41023 21.4869C6.35174 21.6811 6.18326 21.6881 5.9984 21.6764Z" fill="#B2BFC6"/> +<path d="M0.00582356 17.4405C-0.010556 17.2205 0.0479424 17.0333 0.284276 16.9725C0.586128 16.9069 0.682066 17.1456 0.752264 17.361C1.16328 18.4846 1.7675 19.5277 2.53764 20.4432C3.11893 21.1412 3.80393 21.7458 4.5687 22.2359C4.65483 22.2774 4.73085 22.3373 4.79147 22.4112C4.85209 22.4852 4.89585 22.5715 4.91969 22.6641C4.96415 22.952 4.6857 23.1322 4.33705 23.0058C3.33285 22.6399 2.45156 21.9993 1.79354 21.157C0.985591 20.1689 0.395516 19.0213 0.0619821 17.7892C0.0356685 17.6744 0.0169088 17.5579 0.00582356 17.4405Z" fill="#B2BFC6"/> +<path d="M20.0708 0.00268555C20.4263 0.100761 20.7588 0.268624 21.0489 0.496495C22.6588 1.62219 23.555 3.22298 24.0534 5.0812C24.1165 5.31523 24.154 5.56097 24.1984 5.80202C24.2163 5.85265 24.2232 5.90647 24.2189 5.95998C24.2145 6.01348 24.1989 6.06546 24.173 6.11251C24.1472 6.15956 24.1117 6.20062 24.0689 6.23302C24.0261 6.26542 23.977 6.28842 23.9247 6.30051C23.6579 6.37306 23.5386 6.20924 23.4707 5.97521C23.0923 4.66353 22.4559 3.44061 21.5988 2.37812C21.1094 1.7633 20.536 1.22047 19.8953 0.765633C19.8023 0.711974 19.7292 0.629582 19.687 0.530834C19.6448 0.432085 19.6358 0.32231 19.6613 0.217996C19.7011 0.0190678 19.8649 0.00268555 20.0708 0.00268555Z" fill="#B2BFC6"/> +<path d="M22.5769 7.10317C22.5963 7.20372 22.577 7.30792 22.5227 7.39478C22.4684 7.48163 22.3833 7.54469 22.2844 7.57124C22.0083 7.64613 21.8936 7.45422 21.8304 7.23891C21.5444 6.25071 21.113 5.31055 20.5505 4.44924C19.9752 3.55133 19.239 2.76743 18.379 2.13699C18.3254 2.09942 18.2753 2.05712 18.2293 2.01061C18.0842 1.85849 17.897 1.70169 18.0444 1.46532C18.1918 1.22894 18.4281 1.25469 18.6551 1.35298C19.4671 1.71487 20.1792 2.26815 20.7306 2.96547C21.674 4.12378 22.3041 5.50502 22.5605 6.97679C22.5675 7.0236 22.5745 7.07509 22.5769 7.10317Z" fill="#B2BFC6"/> +<path d="M9.86867 16.1931C9.5247 16.8273 8.87887 16.9537 8.33367 16.4271C7.63169 15.7554 6.99522 15.044 6.35174 14.3208C5.5819 13.4596 4.8378 12.5726 4.082 11.6973C3.78483 11.3533 3.38002 11.2035 2.97287 11.028C3.63039 10.6722 4.1639 10.7588 4.72548 11.3556C5.68252 12.3713 6.62083 13.4034 7.57553 14.4191C8.04104 14.9277 8.54144 15.4031 9.07309 15.842C9.29101 16.0456 9.57144 16.1693 9.86867 16.1931Z" fill="#EDA805"/> +<path d="M42.6705 8.36353H45.1023V16.4772C45.1023 17.2272 44.9337 17.8787 44.5966 18.4317C44.2633 18.9847 43.7992 19.4109 43.2045 19.7101C42.6099 20.0094 41.9186 20.159 41.1307 20.159C40.4299 20.159 39.7936 20.0359 39.2216 19.7897C38.6534 19.5397 38.2027 19.1609 37.8693 18.6533C37.536 18.1419 37.3712 17.4999 37.375 16.7272H39.8239C39.8314 17.034 39.8939 17.2972 40.0114 17.5169C40.1326 17.7328 40.2974 17.8995 40.5057 18.0169C40.7178 18.1306 40.9678 18.1874 41.2557 18.1874C41.5587 18.1874 41.8144 18.123 42.0227 17.9942C42.2349 17.8616 42.3958 17.6685 42.5057 17.4147C42.6155 17.1609 42.6705 16.8484 42.6705 16.4772V8.36353Z" fill="black"/> +<path d="M49.5795 20.1647C49.0227 20.1647 48.5265 20.0681 48.0909 19.8749C47.6553 19.6779 47.3106 19.3881 47.0568 19.0056C46.8068 18.6192 46.6818 18.1381 46.6818 17.5624C46.6818 17.0775 46.7708 16.6703 46.9489 16.3408C47.1269 16.0113 47.3693 15.7461 47.6761 15.5453C47.983 15.3446 48.3314 15.1931 48.7216 15.0908C49.1155 14.9885 49.5284 14.9166 49.9602 14.8749C50.4678 14.8219 50.8769 14.7726 51.1875 14.7272C51.4981 14.6779 51.7235 14.606 51.8636 14.5113C52.0038 14.4166 52.0739 14.2764 52.0739 14.0908V14.0567C52.0739 13.6969 51.9602 13.4184 51.733 13.2215C51.5095 13.0245 51.1913 12.926 50.7784 12.926C50.3428 12.926 49.9962 13.0226 49.7386 13.2158C49.4811 13.4052 49.3106 13.6438 49.2273 13.9317L46.9886 13.7499C47.1023 13.2196 47.3258 12.7613 47.6591 12.3749C47.9924 11.9847 48.4224 11.6855 48.9489 11.4772C49.4792 11.265 50.0928 11.159 50.7898 11.159C51.2746 11.159 51.7386 11.2158 52.1818 11.3294C52.6288 11.4431 53.0246 11.6192 53.3693 11.8578C53.7178 12.0965 53.9924 12.4033 54.1932 12.7783C54.3939 13.1495 54.4943 13.5946 54.4943 14.1135V19.9999H52.1989V18.7897H52.1307C51.9905 19.0624 51.803 19.3029 51.5682 19.5113C51.3333 19.7158 51.0511 19.8768 50.7216 19.9942C50.392 20.1078 50.0114 20.1647 49.5795 20.1647ZM50.2727 18.4942C50.6288 18.4942 50.9432 18.4241 51.2159 18.284C51.4886 18.14 51.7027 17.9469 51.858 17.7044C52.0133 17.462 52.0909 17.1874 52.0909 16.8806V15.9544C52.0152 16.0037 51.911 16.0491 51.7784 16.0908C51.6496 16.1287 51.5038 16.1647 51.3409 16.1988C51.178 16.2291 51.0152 16.2575 50.8523 16.284C50.6894 16.3067 50.5417 16.3275 50.4091 16.3465C50.125 16.3881 49.8769 16.4544 49.6648 16.5453C49.4527 16.6363 49.2879 16.7594 49.1705 16.9147C49.053 17.0662 48.9943 17.2556 48.9943 17.4828C48.9943 17.8124 49.1136 18.0643 49.3523 18.2385C49.5947 18.409 49.9015 18.4942 50.2727 18.4942Z" fill="black"/> +<path d="M58.7926 14.9544V19.9999H56.3722V11.2726H58.679V12.8124H58.7813C58.9744 12.3048 59.2983 11.9033 59.7528 11.6078C60.2074 11.3086 60.7585 11.159 61.4063 11.159C62.0123 11.159 62.5407 11.2916 62.9915 11.5567C63.4422 11.8219 63.7926 12.2006 64.0426 12.6931C64.2926 13.1817 64.4176 13.765 64.4176 14.4431V19.9999H61.9972V14.8749C62.0009 14.3408 61.8646 13.9241 61.5881 13.6249C61.3116 13.3219 60.9309 13.1703 60.446 13.1703C60.1203 13.1703 59.8324 13.2404 59.5824 13.3806C59.3362 13.5207 59.143 13.7253 59.0028 13.9942C58.8665 14.2594 58.7964 14.5794 58.7926 14.9544Z" fill="black"/> +</svg> diff --git a/web/public/icons/Search_gray.svg b/web/public/icons/Search_gray.svg new file mode 100644 index 000000000..6a098b6f2 --- /dev/null +++ b/web/public/icons/Search_gray.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M21 21L15 15M17 10C17 13.866 13.866 17 10 17C6.13401 17 3 13.866 3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web/public/icons/ViewGrid.svg b/web/public/icons/ViewGrid.svg new file mode 100644 index 000000000..2a1fd31b1 --- /dev/null +++ b/web/public/icons/ViewGrid.svg @@ -0,0 +1,6 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 6C4 4.89543 4.89543 4 6 4H8C9.10457 4 10 4.89543 10 6V8C10 9.10457 9.10457 10 8 10H6C4.89543 10 4 9.10457 4 8V6Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M14 6C14 4.89543 14.8954 4 16 4H18C19.1046 4 20 4.89543 20 6V8C20 9.10457 19.1046 10 18 10H16C14.8954 10 14 9.10457 14 8V6Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M4 16C4 14.8954 4.89543 14 6 14H8C9.10457 14 10 14.8954 10 16V18C10 19.1046 9.10457 20 8 20H6C4.89543 20 4 19.1046 4 18V16Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M14 16C14 14.8954 14.8954 14 16 14H18C19.1046 14 20 14.8954 20 16V18C20 19.1046 19.1046 20 18 20H16C14.8954 20 14 19.1046 14 18V16Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web-client/public/icons/app_icon.svg b/web/public/icons/app_icon.svg similarity index 100% rename from web-client/public/icons/app_icon.svg rename to web/public/icons/app_icon.svg diff --git a/web-client/public/icons/apple.svg b/web/public/icons/apple.svg similarity index 100% rename from web-client/public/icons/apple.svg rename to web/public/icons/apple.svg diff --git a/web-client/public/icons/arrow-circle-down.svg b/web/public/icons/arrow-circle-down.svg similarity index 100% rename from web-client/public/icons/arrow-circle-down.svg rename to web/public/icons/arrow-circle-down.svg diff --git a/web-client/public/icons/arrow-gray.svg b/web/public/icons/arrow-gray.svg similarity index 100% rename from web-client/public/icons/arrow-gray.svg rename to web/public/icons/arrow-gray.svg diff --git a/web/public/icons/avatar.svg b/web/public/icons/avatar.svg new file mode 100644 index 000000000..30d300289 --- /dev/null +++ b/web/public/icons/avatar.svg @@ -0,0 +1 @@ +<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" viewBox="0, 0, 100, 100" class="la-all letterAvatar2 li-la2-Landon"><circle cx="50" cy="50" r="49" fill="#a12e9d" stroke="#ffffff" stroke-width="1" class="la2-circle"></circle><text x="50" y="71.5" font-family="Arial" font-size="60" font-weight="700" text-anchor="middle" fill="#ffffff" class="la2-text">U</text></svg> \ No newline at end of file diff --git a/web-client/public/icons/brain.svg b/web/public/icons/brain.svg similarity index 100% rename from web-client/public/icons/brain.svg rename to web/public/icons/brain.svg diff --git a/web/public/icons/chat-bubble-oval-left.svg b/web/public/icons/chat-bubble-oval-left.svg new file mode 100644 index 000000000..062de060a --- /dev/null +++ b/web/public/icons/chat-bubble-oval-left.svg @@ -0,0 +1,3 @@ +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M16 27C22.6274 27 28 22.0751 28 16C28 9.92487 22.6274 5 16 5C9.37258 5 4 9.92487 4 16C4 18.9181 5.2396 21.5709 7.26245 23.5399C7.70761 23.9732 8.00605 24.565 7.88518 25.1744C7.68369 26.1902 7.22576 27.1137 6.58105 27.8746C6.78906 27.9119 7 27.941 7.21289 27.9618C7.47168 27.9871 7.73438 28 8 28C9.70934 28 11.2935 27.4638 12.5936 26.5505C13.6734 26.843 14.8167 27 16 27Z" stroke="#6B7280" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web-client/public/icons/chat.svg b/web/public/icons/chat.svg similarity index 100% rename from web-client/public/icons/chat.svg rename to web/public/icons/chat.svg diff --git a/web-client/public/icons/chats-circle-light.svg b/web/public/icons/chats-circle-light.svg similarity index 100% rename from web-client/public/icons/chats-circle-light.svg rename to web/public/icons/chats-circle-light.svg diff --git a/web-client/public/icons/chevron-left.svg b/web/public/icons/chevron-left.svg similarity index 100% rename from web-client/public/icons/chevron-left.svg rename to web/public/icons/chevron-left.svg diff --git a/web-client/public/icons/chevron-right.svg b/web/public/icons/chevron-right.svg similarity index 100% rename from web-client/public/icons/chevron-right.svg rename to web/public/icons/chevron-right.svg diff --git a/web-client/public/icons/close_modal_btn.png b/web/public/icons/close_modal_btn.png similarity index 100% rename from web-client/public/icons/close_modal_btn.png rename to web/public/icons/close_modal_btn.png diff --git a/web-client/public/icons/code.svg b/web/public/icons/code.svg similarity index 100% rename from web-client/public/icons/code.svg rename to web/public/icons/code.svg diff --git a/web-client/public/icons/copy.svg b/web/public/icons/copy.svg similarity index 100% rename from web-client/public/icons/copy.svg rename to web/public/icons/copy.svg diff --git a/web-client/public/icons/discord-icon.svg b/web/public/icons/discord-icon.svg similarity index 100% rename from web-client/public/icons/discord-icon.svg rename to web/public/icons/discord-icon.svg diff --git a/web-client/public/icons/discord.svg b/web/public/icons/discord.svg similarity index 100% rename from web-client/public/icons/discord.svg rename to web/public/icons/discord.svg diff --git a/web-client/public/icons/download.svg b/web/public/icons/download.svg similarity index 100% rename from web-client/public/icons/download.svg rename to web/public/icons/download.svg diff --git a/web-client/public/icons/edit_text.svg b/web/public/icons/edit_text.svg similarity index 100% rename from web-client/public/icons/edit_text.svg rename to web/public/icons/edit_text.svg diff --git a/web-client/public/icons/google_play_logo.svg b/web/public/icons/google_play_logo.svg similarity index 100% rename from web-client/public/icons/google_play_logo.svg rename to web/public/icons/google_play_logo.svg diff --git a/web-client/public/icons/googleplay.svg b/web/public/icons/googleplay.svg similarity index 100% rename from web-client/public/icons/googleplay.svg rename to web/public/icons/googleplay.svg diff --git a/web-client/public/icons/ic_api.svg b/web/public/icons/ic_api.svg similarity index 100% rename from web-client/public/icons/ic_api.svg rename to web/public/icons/ic_api.svg diff --git a/web-client/public/icons/ic_arrowback.svg b/web/public/icons/ic_arrowback.svg similarity index 100% rename from web-client/public/icons/ic_arrowback.svg rename to web/public/icons/ic_arrowback.svg diff --git a/web-client/public/icons/ic_arrowright.svg b/web/public/icons/ic_arrowright.svg similarity index 100% rename from web-client/public/icons/ic_arrowright.svg rename to web/public/icons/ic_arrowright.svg diff --git a/web-client/public/icons/ic_billing.svg b/web/public/icons/ic_billing.svg similarity index 100% rename from web-client/public/icons/ic_billing.svg rename to web/public/icons/ic_billing.svg diff --git a/web-client/public/icons/ic_conversation_ai.svg b/web/public/icons/ic_conversation_ai.svg similarity index 100% rename from web-client/public/icons/ic_conversation_ai.svg rename to web/public/icons/ic_conversation_ai.svg diff --git a/web-client/public/icons/ic_dashboard.svg b/web/public/icons/ic_dashboard.svg similarity index 100% rename from web-client/public/icons/ic_dashboard.svg rename to web/public/icons/ic_dashboard.svg diff --git a/web-client/public/icons/ic_enhance.svg b/web/public/icons/ic_enhance.svg similarity index 100% rename from web-client/public/icons/ic_enhance.svg rename to web/public/icons/ic_enhance.svg diff --git a/web-client/public/icons/ic_generative_art.svg b/web/public/icons/ic_generative_art.svg similarity index 100% rename from web-client/public/icons/ic_generative_art.svg rename to web/public/icons/ic_generative_art.svg diff --git a/web-client/public/icons/ic_image.svg b/web/public/icons/ic_image.svg similarity index 100% rename from web-client/public/icons/ic_image.svg rename to web/public/icons/ic_image.svg diff --git a/web-client/public/icons/ic_member.svg b/web/public/icons/ic_member.svg similarity index 100% rename from web-client/public/icons/ic_member.svg rename to web/public/icons/ic_member.svg diff --git a/web-client/public/icons/ic_on_device_ai.svg b/web/public/icons/ic_on_device_ai.svg similarity index 100% rename from web-client/public/icons/ic_on_device_ai.svg rename to web/public/icons/ic_on_device_ai.svg diff --git a/web-client/public/icons/ic_plus.svg b/web/public/icons/ic_plus.svg similarity index 100% rename from web-client/public/icons/ic_plus.svg rename to web/public/icons/ic_plus.svg diff --git a/web-client/public/icons/ic_prompt_library.svg b/web/public/icons/ic_prompt_library.svg similarity index 100% rename from web-client/public/icons/ic_prompt_library.svg rename to web/public/icons/ic_prompt_library.svg diff --git a/web-client/public/icons/ic_random.svg b/web/public/icons/ic_random.svg similarity index 100% rename from web-client/public/icons/ic_random.svg rename to web/public/icons/ic_random.svg diff --git a/web-client/public/icons/ic_setting.svg b/web/public/icons/ic_setting.svg similarity index 100% rename from web-client/public/icons/ic_setting.svg rename to web/public/icons/ic_setting.svg diff --git a/web-client/public/icons/ic_sidebar.svg b/web/public/icons/ic_sidebar.svg similarity index 100% rename from web-client/public/icons/ic_sidebar.svg rename to web/public/icons/ic_sidebar.svg diff --git a/web-client/public/icons/ic_sidebar_fill.svg b/web/public/icons/ic_sidebar_fill.svg similarity index 100% rename from web-client/public/icons/ic_sidebar_fill.svg rename to web/public/icons/ic_sidebar_fill.svg diff --git a/web-client/public/icons/ico_Discord.svg b/web/public/icons/ico_Discord.svg similarity index 100% rename from web-client/public/icons/ico_Discord.svg rename to web/public/icons/ico_Discord.svg diff --git a/web-client/public/icons/ico_logo.svg b/web/public/icons/ico_logo.svg similarity index 100% rename from web-client/public/icons/ico_logo.svg rename to web/public/icons/ico_logo.svg diff --git a/web-client/public/icons/ico_mobile-android.svg b/web/public/icons/ico_mobile-android.svg similarity index 100% rename from web-client/public/icons/ico_mobile-android.svg rename to web/public/icons/ico_mobile-android.svg diff --git a/web-client/public/icons/ico_settingblack.svg b/web/public/icons/ico_settingblack.svg similarity index 100% rename from web-client/public/icons/ico_settingblack.svg rename to web/public/icons/ico_settingblack.svg diff --git a/web-client/public/icons/janai_logo.svg b/web/public/icons/janai_logo.svg similarity index 100% rename from web-client/public/icons/janai_logo.svg rename to web/public/icons/janai_logo.svg diff --git a/web-client/public/icons/loading.svg b/web/public/icons/loading.svg similarity index 100% rename from web-client/public/icons/loading.svg rename to web/public/icons/loading.svg diff --git a/web-client/public/icons/magnifyingglass.svg b/web/public/icons/magnifyingglass.svg similarity index 100% rename from web-client/public/icons/magnifyingglass.svg rename to web/public/icons/magnifyingglass.svg diff --git a/web-client/public/icons/messicon.svg b/web/public/icons/messicon.svg similarity index 100% rename from web-client/public/icons/messicon.svg rename to web/public/icons/messicon.svg diff --git a/web-client/public/icons/play.svg b/web/public/icons/play.svg similarity index 100% rename from web-client/public/icons/play.svg rename to web/public/icons/play.svg diff --git a/web-client/public/icons/refresh.svg b/web/public/icons/refresh.svg similarity index 100% rename from web-client/public/icons/refresh.svg rename to web/public/icons/refresh.svg diff --git a/web-client/public/icons/search.svg b/web/public/icons/search.svg similarity index 100% rename from web-client/public/icons/search.svg rename to web/public/icons/search.svg diff --git a/web-client/public/icons/share_with_friend_btn.svg b/web/public/icons/share_with_friend_btn.svg similarity index 100% rename from web-client/public/icons/share_with_friend_btn.svg rename to web/public/icons/share_with_friend_btn.svg diff --git a/web-client/public/icons/social_icon_apple.svg b/web/public/icons/social_icon_apple.svg similarity index 100% rename from web-client/public/icons/social_icon_apple.svg rename to web/public/icons/social_icon_apple.svg diff --git a/web-client/public/icons/social_icon_google.svg b/web/public/icons/social_icon_google.svg similarity index 100% rename from web-client/public/icons/social_icon_google.svg rename to web/public/icons/social_icon_google.svg diff --git a/web-client/public/icons/telegram-icon.svg b/web/public/icons/telegram-icon.svg similarity index 100% rename from web-client/public/icons/telegram-icon.svg rename to web/public/icons/telegram-icon.svg diff --git a/web-client/public/icons/trash_bin.svg b/web/public/icons/trash_bin.svg similarity index 100% rename from web-client/public/icons/trash_bin.svg rename to web/public/icons/trash_bin.svg diff --git a/web-client/public/icons/unicorn_angle-down.svg b/web/public/icons/unicorn_angle-down.svg similarity index 100% rename from web-client/public/icons/unicorn_angle-down.svg rename to web/public/icons/unicorn_angle-down.svg diff --git a/web-client/public/icons/unicorn_angle-up.svg b/web/public/icons/unicorn_angle-up.svg similarity index 100% rename from web-client/public/icons/unicorn_angle-up.svg rename to web/public/icons/unicorn_angle-up.svg diff --git a/web-client/public/icons/unicorn_arrow-random.svg b/web/public/icons/unicorn_arrow-random.svg similarity index 100% rename from web-client/public/icons/unicorn_arrow-random.svg rename to web/public/icons/unicorn_arrow-random.svg diff --git a/web-client/public/icons/unicorn_arrow.svg b/web/public/icons/unicorn_arrow.svg similarity index 100% rename from web-client/public/icons/unicorn_arrow.svg rename to web/public/icons/unicorn_arrow.svg diff --git a/web-client/public/icons/unicorn_chat.svg b/web/public/icons/unicorn_chat.svg similarity index 100% rename from web-client/public/icons/unicorn_chat.svg rename to web/public/icons/unicorn_chat.svg diff --git a/web-client/public/icons/unicorn_clipboard-alt.svg b/web/public/icons/unicorn_clipboard-alt.svg similarity index 100% rename from web-client/public/icons/unicorn_clipboard-alt.svg rename to web/public/icons/unicorn_clipboard-alt.svg diff --git a/web-client/public/icons/unicorn_exclamation-circle.svg b/web/public/icons/unicorn_exclamation-circle.svg similarity index 100% rename from web-client/public/icons/unicorn_exclamation-circle.svg rename to web/public/icons/unicorn_exclamation-circle.svg diff --git a/web-client/public/icons/unicorn_exit.svg b/web/public/icons/unicorn_exit.svg similarity index 100% rename from web-client/public/icons/unicorn_exit.svg rename to web/public/icons/unicorn_exit.svg diff --git a/web-client/public/icons/unicorn_image-v.svg b/web/public/icons/unicorn_image-v.svg similarity index 100% rename from web-client/public/icons/unicorn_image-v.svg rename to web/public/icons/unicorn_image-v.svg diff --git a/web-client/public/icons/unicorn_image-v2.svg b/web/public/icons/unicorn_image-v2.svg similarity index 100% rename from web-client/public/icons/unicorn_image-v2.svg rename to web/public/icons/unicorn_image-v2.svg diff --git a/web-client/public/icons/unicorn_info-circle-fill.svg b/web/public/icons/unicorn_info-circle-fill.svg similarity index 100% rename from web-client/public/icons/unicorn_info-circle-fill.svg rename to web/public/icons/unicorn_info-circle-fill.svg diff --git a/web-client/public/icons/unicorn_info-circle.svg b/web/public/icons/unicorn_info-circle.svg similarity index 100% rename from web-client/public/icons/unicorn_info-circle.svg rename to web/public/icons/unicorn_info-circle.svg diff --git a/web-client/public/icons/unicorn_layers-alt.svg b/web/public/icons/unicorn_layers-alt.svg similarity index 100% rename from web-client/public/icons/unicorn_layers-alt.svg rename to web/public/icons/unicorn_layers-alt.svg diff --git a/web-client/public/icons/unicorn_plus.svg b/web/public/icons/unicorn_plus.svg similarity index 100% rename from web-client/public/icons/unicorn_plus.svg rename to web/public/icons/unicorn_plus.svg diff --git a/web-client/public/icons/unicorn_trash.svg b/web/public/icons/unicorn_trash.svg similarity index 100% rename from web-client/public/icons/unicorn_trash.svg rename to web/public/icons/unicorn_trash.svg diff --git a/web/public/icons/unicorn_twitter.svg b/web/public/icons/unicorn_twitter.svg new file mode 100644 index 000000000..b1bfc9b05 --- /dev/null +++ b/web/public/icons/unicorn_twitter.svg @@ -0,0 +1,3 @@ +<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22.25 5.79997C21.4983 6.12606 20.7034 6.34163 19.89 6.43997C20.7482 5.92729 21.3913 5.12075 21.7 4.16997C20.8936 4.65003 20.0108 4.98826 19.09 5.16997C18.4745 4.50254 17.655 4.05826 16.7598 3.90682C15.8647 3.75537 14.9445 3.90532 14.1438 4.33315C13.343 4.76099 12.7069 5.4425 12.3352 6.2708C11.9635 7.09911 11.8773 8.02736 12.09 8.90997C10.4594 8.82749 8.86444 8.40292 7.40865 7.66383C5.95287 6.92474 4.66885 5.88766 3.64 4.61997C3.27914 5.25013 3.08952 5.96379 3.09 6.68997C3.08872 7.36435 3.25422 8.02858 3.57176 8.62353C3.88929 9.21848 4.34902 9.72568 4.91 10.1C4.25798 10.0822 3.61989 9.90726 3.05 9.58997V9.63997C3.05489 10.5849 3.38599 11.4991 3.98731 12.2279C4.58864 12.9568 5.42326 13.4556 6.35 13.64C5.99326 13.7485 5.62287 13.8058 5.25 13.81C4.99189 13.807 4.73442 13.7835 4.48 13.74C4.74391 14.5528 5.25462 15.2631 5.94107 15.7721C6.62753 16.2811 7.45558 16.5635 8.31 16.58C6.8672 17.7152 5.08588 18.3348 3.25 18.34C2.91574 18.3411 2.58174 18.321 2.25 18.28C4.12443 19.4902 6.30881 20.1327 8.54 20.13C10.0797 20.146 11.6071 19.855 13.0331 19.274C14.4591 18.6931 15.755 17.8338 16.8452 16.7465C17.9354 15.6591 18.798 14.3654 19.3826 12.9409C19.9672 11.5164 20.262 9.98969 20.25 8.44997C20.25 8.27996 20.25 8.09997 20.25 7.91997C21.0347 7.33478 21.7115 6.61739 22.25 5.79997Z" fill="#6B7280"/> +</svg> diff --git a/web-client/public/icons/upload_photo.svg b/web/public/icons/upload_photo.svg similarity index 100% rename from web-client/public/icons/upload_photo.svg rename to web/public/icons/upload_photo.svg diff --git a/web-client/public/icons/whatsapp-icon.svg b/web/public/icons/whatsapp-icon.svg similarity index 100% rename from web-client/public/icons/whatsapp-icon.svg rename to web/public/icons/whatsapp-icon.svg diff --git a/web/public/images/banner.jpg b/web/public/images/banner.jpg new file mode 100644 index 000000000..dddc713a9 Binary files /dev/null and b/web/public/images/banner.jpg differ diff --git a/web-client/public/images/mobile.jpg b/web/public/images/mobile.jpg similarity index 100% rename from web-client/public/images/mobile.jpg rename to web/public/images/mobile.jpg diff --git a/web-client/public/images/preview.jpg b/web/public/images/preview.jpg similarity index 100% rename from web-client/public/images/preview.jpg rename to web/public/images/preview.jpg diff --git a/web-client/public/next.svg b/web/public/next.svg similarity index 100% rename from web-client/public/next.svg rename to web/public/next.svg diff --git a/web-client/public/vercel.svg b/web/public/vercel.svg similarity index 100% rename from web-client/public/vercel.svg rename to web/public/vercel.svg diff --git a/web/shared/coreService.ts b/web/shared/coreService.ts new file mode 100644 index 000000000..149e86b3e --- /dev/null +++ b/web/shared/coreService.ts @@ -0,0 +1,48 @@ +export type CoreService = + | DataService + | ModelService + | InfereceService + | ModelManagementService + | SystemMonitoringService + | PreferenceService; + +export enum DataService { + GET_CONVERSATIONS = "getConversations", + CREATE_CONVERSATION = "createConversation", + DELETE_CONVERSATION = "deleteConversation", + CREATE_MESSAGE = "createMessage", + GET_CONVERSATION_MESSAGES = "getConversationMessages", + + STORE_MODEL = "storeModel", + UPDATE_FINISHED_DOWNLOAD = "updateFinishedDownloadAt", + GET_UNFINISHED_DOWNLOAD_MODELS = "getUnfinishedDownloadModels", + GET_FINISHED_DOWNLOAD_MODELS = "getFinishedDownloadModels", + DELETE_DOWNLOAD_MODEL = "deleteDownloadModel", + + GET_MODEL_BY_ID = "getModelById", +} + +export enum ModelService { + GET_MODELS = "getModels", +} + +export enum InfereceService { + PROMPT = "prompt", + INIT_MODEL = "initModel", +} + +export enum ModelManagementService { + GET_DOWNLOADED_MODELS = "getDownloadedModels", + GET_AVAILABLE_MODELS = "getAvailableModels", + DELETE_MODEL = "deleteModel", + DOWNLOAD_MODEL = "downloadModel", +} + +export enum PreferenceService { + GET_EXPERIMENT_COMPONENT = "experimentComponent", +} + +export enum SystemMonitoringService { + GET_RESOURCES_INFORMATION = "getResourcesInfo", + GET_CURRENT_LOAD_INFORMATION = "getCurrentLoad", +} diff --git a/web-client/tailwind.config.js b/web/tailwind.config.js similarity index 100% rename from web-client/tailwind.config.js rename to web/tailwind.config.js diff --git a/web-client/tsconfig.json b/web/tsconfig.json similarity index 83% rename from web-client/tsconfig.json rename to web/tsconfig.json index 3da4fedfa..3cd0a5dc9 100644 --- a/web-client/tsconfig.json +++ b/web/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], + "typeRoots": ["node_modules/@types"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -20,10 +21,9 @@ } ], "paths": { - "@/*": ["./app/*"], - "@/graphql": ["./graphql/generated/graphql"] + "@/*": ["./app/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "../electron"] } diff --git a/web/types/index.d.ts b/web/types/index.d.ts new file mode 100644 index 000000000..a7ac3c8ac --- /dev/null +++ b/web/types/index.d.ts @@ -0,0 +1,7 @@ +export {}; + +declare global { + interface Window { + electronAPI?: any | undefined; + } +} diff --git a/web/yarn.lock b/web/yarn.lock new file mode 100644 index 000000000..36c1f713e --- /dev/null +++ b/web/yarn.lock @@ -0,0 +1,3512 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + +"@eslint/eslintrc@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + +"@headlessui/react@^1.7.15": + version "1.7.17" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.17.tgz#a0ec23af21b527c030967245fd99776aa7352bc6" + integrity sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow== + dependencies: + client-only "^0.0.1" + +"@heroicons/react@^2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.0.18.tgz#f80301907c243df03c7e9fd76c0286e95361f7c1" + integrity sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.10.tgz#8b17783d2c09be126bbde9ff1164566517131bff" + integrity sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ== + +"@next/eslint-plugin-next@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.10.tgz#ff19867396a7709ff75986645f2223787fbb2d9b" + integrity sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA== + dependencies: + glob "7.1.7" + +"@next/swc-darwin-arm64@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz#962ac55559970d1725163ff9d62d008bc1c33503" + integrity sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg== + +"@next/swc-darwin-x64@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz#90c01fdce5101953df0039eef48e4074055cc5aa" + integrity sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg== + +"@next/swc-linux-arm64-gnu@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz#8fc25052c345ffc8f6c51f61d1bb6c359b80ab2b" + integrity sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg== + +"@next/swc-linux-arm64-musl@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz#25e6b0dbb87c89c44c3e3680227172862bc7072c" + integrity sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q== + +"@next/swc-linux-x64-gnu@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz#24fa8070ea0855c0aa020832ce7d1b84d3413fc1" + integrity sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ== + +"@next/swc-linux-x64-musl@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz#ae55914d50589a4f8b91c8eeebdd713f0c1b1675" + integrity sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg== + +"@next/swc-win32-arm64-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz#ab3098b2305f3c0e46dfb2e318a9988bff884047" + integrity sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ== + +"@next/swc-win32-ia32-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz#a1c5980538641ca656012c00d05b08882cf0ec9f" + integrity sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ== + +"@next/swc-win32-x64-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz#44dd9eea943ed14a1012edd5011b8e905f5e6fc4" + integrity sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@panva/hkdf@^1.0.2": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" + integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== + +"@rushstack/eslint-patch@^1.1.3": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.4.0.tgz#77e948b9760bd22736a5d26e335a690f76fda37b" + integrity sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg== + +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + dependencies: + tslib "^2.4.0" + +"@tailwindcss/forms@^0.5.4": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.6.tgz#29c6c2b032b363e0c5110efed1499867f6d7e868" + integrity sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@tailwindcss/typography@^0.5.9": + version "0.5.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.10.tgz#2abde4c6d5c797ab49cf47610830a301de4c1e0a" + integrity sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" + +"@types/debug@^4.0.0": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== + dependencies: + "@types/ms" "*" + +"@types/hast@^2.0.0": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + dependencies: + "@types/unist" "^2" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mdast@^3.0.0": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" + integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + dependencies: + "@types/unist" "^2" + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@20.6.5": + version "20.6.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.5.tgz#4c6a79adf59a8e8193ac87a0e522605b16587258" + integrity sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w== + +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + +"@types/prop-types@*": + version "15.7.7" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.7.tgz#f9361f7b87fd5d8188b2c998db0a1f47e9fb391a" + integrity sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog== + +"@types/react-dom@18.2.7": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@^15.5.7": + version "15.5.7" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz#bd29020ccb118543d88779848f99059b64b02d0f" + integrity sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.22.tgz#abe778a1c95a07fa70df40a52d7300a40b949ccb" + integrity sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@18.2.15": + version "18.2.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.15.tgz#14792b35df676c20ec3cf595b262f8c615a73066" + integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + +"@typescript-eslint/parser@^5.42.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +autoprefixer@10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== + +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.5: + version "4.21.11" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.11.tgz#35f74a3e51adc4d193dcd76ea13858de7b8fecb8" + integrity sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ== + dependencies: + caniuse-lite "^1.0.30001538" + electron-to-chromium "^1.4.526" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001538: + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +client-only@0.0.1, client-only@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dequal@^2.0.0, dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.4.526: + version "1.4.528" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz#7c900fd73d9d2e8bb0dab0e301f25f0f4776ef2c" + integrity sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA== + +embla-carousel-react@^8.0.0-rc11: + version "8.0.0-rc14" + resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.0.0-rc14.tgz#ed5d9e641134fdc7e060a9188b0ccf13f7677da1" + integrity sha512-2b9vXACEcn0qja4QyaFMfCgFbFhumV3krOCGr9+jlQiuXt5z/EyfiYYziDsm70DhTtxtg/uKEGflIqZSfWRYKg== + dependencies: + embla-carousel "8.0.0-rc14" + embla-carousel-reactive-utils "8.0.0-rc14" + +embla-carousel-reactive-utils@8.0.0-rc14: + version "8.0.0-rc14" + resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.0-rc14.tgz#a8844b3930fb3b1423e07544b3efb125525c454a" + integrity sha512-r153bynAo9eTBuWWggPWLYnE9xqVOYmkkeMbAuGX8pkUisJN8aTLMW9b7CYOzjURRB7z85EmYRbeBg+axQzc9g== + +embla-carousel@8.0.0-rc14, embla-carousel@^8.0.0-rc11: + version "8.0.0-rc14" + resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.0.0-rc14.tgz#039372f97b57e95c9b839c6e27b8ff2f63b23053" + integrity sha512-/NLkMFZ7xKryRVYeUjmhbfV63Vr07saPBDwAX2TPMbcaiWwfQfU5Xsc2AiCMZANtwmzsjRK6gSBa7hOy/VXu6g== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +enhanced-resolve@^5.12.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.11" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@13.4.10: + version "13.4.10" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.10.tgz#59eaa37c805337972351b9920b1c28a79a14173e" + integrity sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g== + dependencies: + "@next/eslint-plugin-next" "13.4.10" + "@rushstack/eslint-patch" "^1.1.3" + "@typescript-eslint/parser" "^5.42.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.26.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.31.7" + eslint-plugin-react-hooks "5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== + dependencies: + array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.8.0" + has "^1.0.3" + is-core-module "^2.13.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" + object.values "^1.1.6" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: + version "5.0.0-canary-7118f5dd7-20230705" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" + integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== + +eslint-plugin-react@^7.31.7: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.0: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@8.45.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + dependencies: + flatted "^3.2.7" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +fraction.js@^4.2.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.22.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-util-from-parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== + dependencies: + "@types/hast" "^2.0.0" + +hast-util-raw@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" + parse5 "^6.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-sanitize@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286" + integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw== + dependencies: + "@types/hast" "^2.0.0" + +hast-util-to-html@^8.0.0: + version "8.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" + integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^7.0.0" + hast-util-whitespace "^2.0.0" + html-void-elements "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jiti@^1.18.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + +jose@^4.11.4, jose@^4.14.4: + version "4.14.6" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.6.tgz#94dca1d04a0ad8c6bff0998cdb51220d473cc3af" + integrity sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ== + +jotai-optics@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jotai-optics/-/jotai-optics-0.3.1.tgz#7ff38470551429460cc41d9cd1320193665354e0" + integrity sha512-KibUx9IneM2hGWGIYGs/v0KCxU985lg7W2c6dt5RodJCB2XPbmok8rkkLmdVk9+fKsn2shkPMi+AG8XzHgB3+w== + +jotai@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.4.2.tgz#85610d82d247a7b19de7cce82e8d3ddf007f8d4d" + integrity sha512-90jXVOd9h6gi5JXk558M+wnJfaaVN2WegcNOCfiFbWboNaDl6DkRgiY/K1oeqTfYJmq8yM7XPsL99LAvcOPqhw== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-from-markdown@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-hast@^12.0.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.4, nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-auth@^4.23.1: + version "4.23.1" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.23.1.tgz#7a82f5327cf4c7e32819da4eb977f2251a23c3cf" + integrity sha512-mL083z8KgRtlrIV6CDca2H1kduWJuK/3pTS0Fe2og15KOm4v2kkLGdSDfc2g+019aEBrJUT0pPW2Xx42ImN1WA== + dependencies: + "@babel/runtime" "^7.20.13" + "@panva/hkdf" "^1.0.2" + cookie "^0.5.0" + jose "^4.11.4" + oauth "^0.9.15" + openid-client "^5.4.0" + preact "^10.6.3" + preact-render-to-string "^5.1.19" + uuid "^8.3.2" + +next-themes@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" + integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== + +next@13.4.10: + version "13.4.10" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.10.tgz#a5b50696759c61663d5a1dd726995fa0576a382e" + integrity sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A== + dependencies: + "@next/env" "13.4.10" + "@swc/helpers" "0.5.1" + busboy "1.6.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + watchpack "2.4.0" + zod "3.21.4" + optionalDependencies: + "@next/swc-darwin-arm64" "13.4.10" + "@next/swc-darwin-x64" "13.4.10" + "@next/swc-linux-arm64-gnu" "13.4.10" + "@next/swc-linux-arm64-musl" "13.4.10" + "@next/swc-linux-x64-gnu" "13.4.10" + "@next/swc-linux-x64-musl" "13.4.10" + "@next/swc-win32-arm64-msvc" "13.4.10" + "@next/swc-win32-ia32-msvc" "13.4.10" + "@next/swc-win32-x64-msvc" "13.4.10" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +oauth@^0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +oidc-token-hash@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" + integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +openid-client@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.5.0.tgz#0c631b33c6a2c3e01197506978d6bff70e75c858" + integrity sha512-Y7Xl8BgsrkzWLHkVDYuroM67hi96xITyEDSkmWaGUiNX6CkcXC3XyQGdv5aWZ6dukVKBFVQCADi9gCavOmU14w== + dependencies: + jose "^4.14.4" + lru-cache "^6.0.0" + object-hash "^2.2.0" + oidc-token-hash "^5.0.3" + +optics-ts@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/optics-ts/-/optics-ts-2.4.1.tgz#de94bda2b0ed7fde5b7631283031b9699459d40d" + integrity sha512-HaYzMHvC80r7U/LqAd4hQyopDezC60PO2qF5GuIwALut2cl5rK1VWHsqTp0oqoJJWjiv6uXKqsO+Q2OO0C3MmQ== + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.4.26: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.23: + version "8.4.30" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" + integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +preact-render-to-string@^5.1.19: + version "5.2.6" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" + integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== + dependencies: + pretty-format "^3.8.0" + +preact@^10.6.3: + version "10.17.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" + integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-hook-form@^7.45.4: + version "7.46.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.46.2.tgz#051e3cb2a73f3e86de739f2198c6042902158c43" + integrity sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-syntax-highlighter@^15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +remark-html@^15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-15.0.2.tgz#44ff77c876f037658b406662b5ce15e26ed34d80" + integrity sha512-/CIOI7wzHJzsh48AiuIyIe1clxVkUtreul73zcCXLub0FmnevQE0UMFDQm7NUx8/3rl/4zCshlMfqBdWScQthw== + dependencies: + "@types/mdast" "^3.0.0" + hast-util-sanitize "^4.0.0" + hast-util-to-html "^8.0.0" + mdast-util-to-hast "^12.0.0" + unified "^10.0.0" + +remark-parse@^10.0.0: + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + +remark-stringify@^10.0.0: + version "10.0.3" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.3.tgz#83b43f2445c4ffbb35b606f967d121b2b6d69717" + integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.0.0" + unified "^10.0.0" + +remark@^14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.3.tgz#e477886a7579df612908f387c7753dc93cdaa3fc" + integrity sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew== + dependencies: + "@types/mdast" "^3.0.0" + remark-parse "^10.0.0" + remark-stringify "^10.0.0" + unified "^10.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== + dependencies: + "@types/unist" "^2.0.0" + vfile "^5.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.1.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +