├── .dockerignore ├── .env.example ├── .eslintrc.json ├── .github └── workflows │ └── main.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── fly.toml ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.cjs ├── prettier.config.cjs ├── public └── favicon.ico ├── screenshot.png ├── src ├── components │ ├── DialogModal.tsx │ ├── SelectStyled.tsx │ ├── explorer │ │ ├── Alert.tsx │ │ ├── CredentialsList.tsx │ │ ├── DBView.tsx │ │ ├── DefineDatabase.tsx │ │ ├── DefineLogin.tsx │ │ ├── DefineNamespace.tsx │ │ ├── DefineScopes.tsx │ │ ├── DefineTable.tsx │ │ ├── Explorer.tsx │ │ ├── NSView.tsx │ │ ├── Table.tsx │ │ ├── TreeStructure.tsx │ │ ├── User.tsx │ │ ├── UserCount.tsx │ │ └── ViewTB.tsx │ ├── footer.tsx │ ├── navbar.tsx │ ├── querycomponent.tsx │ └── signin.tsx ├── env.mjs ├── pages │ ├── _app.tsx │ ├── index.tsx │ └── ns │ │ └── [...slug].tsx ├── state │ └── useAppState.ts ├── styles │ └── globals.css └── surrealdbjs │ ├── index.ts │ ├── surreal_api.ts │ ├── surreal_token.ts │ ├── surreal_zod_info.ts │ └── surrealhelpers.ts ├── tailwind.config.cjs └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | .env 2 | Dockerfile 3 | .dockerignore 4 | node_modules 5 | npm-debug.log 6 | README.md 7 | .next 8 | .git -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Since the ".env" file is gitignored, you can use the ".env.example" file to 2 | # build a new ".env" file when you clone the repo. Keep this file up-to-date 3 | # when you add new variables to `.env`. 4 | 5 | # This file will be committed to version control, so make sure not to have any 6 | # secrets in it. If you are cloning this repo, create a copy of this file named 7 | # ".env" and populate it with your secrets. 8 | 9 | # When adding additional environment variables, the schema in "/env/schema.mjs" 10 | # should be updated accordingly. 11 | 12 | # Example: 13 | # SERVERVAR="foo" 14 | # NEXT_PUBLIC_CLIENTVAR="bar" 15 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "overrides": [ 3 | { 4 | "extends": [ 5 | "plugin:@typescript-eslint/recommended-requiring-type-checking" 6 | ], 7 | "files": ["*.ts", "*.tsx"], 8 | "parserOptions": { 9 | "project": "tsconfig.json" 10 | } 11 | } 12 | ], 13 | "parser": "@typescript-eslint/parser", 14 | "parserOptions": { 15 | "project": "./tsconfig.json" 16 | }, 17 | "plugins": ["@typescript-eslint"], 18 | "extends": ["next/core-web-vitals", "plugin:@typescript-eslint/recommended"], 19 | "rules": { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Fly Deploy 2 | on: [push] 3 | env: 4 | FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} 5 | jobs: 6 | deploy: 7 | name: Deploy app 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: superfly/flyctl-actions/setup-flyctl@master 12 | - run: flyctl deploy --remote-only -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # database 12 | /prisma/db.sqlite 13 | /prisma/db.sqlite-journal 14 | 15 | # next.js 16 | /.next/ 17 | /out/ 18 | next-env.d.ts 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # local env files 34 | # do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables 35 | .env 36 | .env*.local 37 | 38 | # vercel 39 | .vercel 40 | 41 | # typescript 42 | *.tsbuildinfo 43 | history 44 | .devnotes.md -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ##### DEPENDENCIES 2 | 3 | FROM --platform=linux/amd64 node:16-alpine3.17 AS deps 4 | RUN apk add --no-cache libc6-compat openssl1.1-compat 5 | WORKDIR /app 6 | 7 | # Install Prisma Client - remove if not using Prisma 8 | 9 | # COPY prisma ./ 10 | 11 | # Install dependencies based on the preferred package manager 12 | 13 | COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml\* ./ 14 | 15 | RUN \ 16 | if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ 17 | elif [ -f package-lock.json ]; then npm ci; \ 18 | elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \ 19 | else echo "Lockfile not found." && exit 1; \ 20 | fi 21 | 22 | ##### BUILDER 23 | 24 | FROM --platform=linux/amd64 node:16-alpine3.17 AS builder 25 | ARG DATABASE_URL 26 | ARG NEXT_PUBLIC_CLIENTVAR 27 | WORKDIR /app 28 | COPY --from=deps /app/node_modules ./node_modules 29 | COPY . . 30 | 31 | ENV NEXT_TELEMETRY_DISABLED 1 32 | 33 | RUN \ 34 | if [ -f yarn.lock ]; then SKIP_ENV_VALIDATION=1 yarn build; \ 35 | elif [ -f package-lock.json ]; then SKIP_ENV_VALIDATION=1 npm run build; \ 36 | elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && SKIP_ENV_VALIDATION=1 pnpm run build; \ 37 | else echo "Lockfile not found." && exit 1; \ 38 | fi 39 | 40 | ##### RUNNER 41 | 42 | FROM --platform=linux/amd64 node:16-alpine3.17 AS runner 43 | WORKDIR /app 44 | 45 | ENV NODE_ENV production 46 | 47 | ENV NEXT_TELEMETRY_DISABLED 1 48 | 49 | RUN addgroup --system --gid 1001 nodejs 50 | RUN adduser --system --uid 1001 nextjs 51 | 52 | COPY --from=builder /app/next.config.mjs ./ 53 | COPY --from=builder /app/public ./public 54 | COPY --from=builder /app/package.json ./package.json 55 | 56 | COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ 57 | COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static 58 | 59 | USER nextjs 60 | EXPOSE 3000 61 | ENV PORT 3000 62 | 63 | CMD ["node", "server.js"] 64 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Rouan van der Ende 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Surreal React 2 | 3 | [![Fly Deploy](https://github.com/rvdende/surrealreact/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/rvdende/surrealreact/actions/workflows/main.yml) 4 | 5 | SurrealDB explorer.. its a work in progress but have fun :) 6 | 7 | ![screenshot](https://raw.githubusercontent.com/rvdende/surrealreact/main/screenshot.png) 8 | 9 | # Live preview/test 10 | 11 | https://surrealreact.fly.dev/ 12 | 13 | # How to run locally 14 | 15 | ``` 16 | git clone https://github.com/rvdende/surrealreact 17 | cd surrealreact 18 | pnpm i 19 | pnpm dev 20 | ``` 21 | 22 | Open browser at http://localhost:3000/ 23 | 24 | # To connect to a localhost surreal instance: 25 | 26 | ``` 27 | surreal start --log debug --user root --pass root memory 28 | ``` 29 | 30 | url: http://0.0.0.0:8000/rpc 31 | user: root 32 | pass: root 33 | -------------------------------------------------------------------------------- /fly.toml: -------------------------------------------------------------------------------- 1 | # fly.toml file generated for surrealreact on 2022-09-21T18:04:35+02:00 2 | 3 | app = "surrealreact" 4 | kill_signal = "SIGINT" 5 | kill_timeout = 5 6 | processes = [] 7 | 8 | [env] 9 | 10 | [experimental] 11 | allowed_public_ports = [] 12 | auto_rollback = true 13 | 14 | [[services]] 15 | http_checks = [] 16 | internal_port = 3000 17 | processes = ["app"] 18 | protocol = "tcp" 19 | script_checks = [] 20 | [services.concurrency] 21 | hard_limit = 25 22 | soft_limit = 20 23 | type = "connections" 24 | 25 | [[services.ports]] 26 | force_https = false 27 | handlers = ["http"] 28 | port = 80 29 | 30 | [[services.ports]] 31 | handlers = ["tls", "http"] 32 | port = 443 33 | 34 | [[services.ports]] 35 | port = 3000 36 | 37 | [[services.tcp_checks]] 38 | grace_period = "1s" 39 | interval = "15s" 40 | restart_limit = 0 41 | timeout = "2s" 42 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | /** 4 | * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. 5 | * This is especially useful for Docker builds. 6 | */ 7 | !process.env.SKIP_ENV_VALIDATION && (await import("./src/env.mjs")); 8 | 9 | /** @type {import("next").NextConfig} */ 10 | const config = { 11 | reactStrictMode: true, 12 | 13 | /** 14 | * If you have the "experimental: { appDir: true }" setting enabled, then you 15 | * must comment the below `i18n` config out. 16 | * 17 | * @see https://github.com/vercel/next.js/issues/41980 18 | */ 19 | i18n: { 20 | locales: ["en"], 21 | defaultLocale: "en", 22 | }, 23 | output: "standalone", 24 | }; 25 | export default config; 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "surrealreact", 3 | "version": "0.2.1", 4 | "private": true, 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev", 8 | "lint": "next lint", 9 | "start": "next start" 10 | }, 11 | "dependencies": { 12 | "@headlessui/react": "^1.7.10", 13 | "@heroicons/react": "^2.0.15", 14 | "@monaco-editor/react": "^4.4.6", 15 | "@next/font": "^13.1.6", 16 | "@tanstack/react-table": "^8.7.9", 17 | "@types/flat": "^5.0.2", 18 | "clsx": "^1.2.1", 19 | "flat": "^5.0.2", 20 | "moderndash": "^0.14.1", 21 | "monaco-editor": "^0.35.0", 22 | "next": "13.1.6", 23 | "react": "18.2.0", 24 | "react-dom": "18.2.0", 25 | "react-icons": "^4.7.1", 26 | "tailwind-scrollbar": "^2.1.0", 27 | "zod": "^3.20.2", 28 | "zustand": "^4.3.2" 29 | }, 30 | "devDependencies": { 31 | "@types/node": "^18.11.18", 32 | "@types/prettier": "^2.7.2", 33 | "@types/react": "^18.0.26", 34 | "@types/react-dom": "^18.0.10", 35 | "@typescript-eslint/eslint-plugin": "^5.47.1", 36 | "@typescript-eslint/parser": "^5.47.1", 37 | "autoprefixer": "^10.4.7", 38 | "eslint": "^8.30.0", 39 | "eslint-config-next": "13.1.6", 40 | "postcss": "^8.4.14", 41 | "prettier": "^2.8.1", 42 | "prettier-plugin-tailwindcss": "^0.2.1", 43 | "tailwindcss": "^3.2.0", 44 | "typescript": "^4.9.4" 45 | }, 46 | "ct3aMetadata": { 47 | "initVersion": "7.5.1" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@headlessui/react': ^1.7.10 5 | '@heroicons/react': ^2.0.15 6 | '@monaco-editor/react': ^4.4.6 7 | '@next/font': ^13.1.6 8 | '@tanstack/react-table': ^8.7.9 9 | '@types/flat': ^5.0.2 10 | '@types/node': ^18.11.18 11 | '@types/prettier': ^2.7.2 12 | '@types/react': ^18.0.26 13 | '@types/react-dom': ^18.0.10 14 | '@typescript-eslint/eslint-plugin': ^5.47.1 15 | '@typescript-eslint/parser': ^5.47.1 16 | autoprefixer: ^10.4.7 17 | clsx: ^1.2.1 18 | eslint: ^8.30.0 19 | eslint-config-next: 13.1.6 20 | flat: ^5.0.2 21 | moderndash: ^0.14.1 22 | monaco-editor: ^0.35.0 23 | next: 13.1.6 24 | postcss: ^8.4.14 25 | prettier: ^2.8.1 26 | prettier-plugin-tailwindcss: ^0.2.1 27 | react: 18.2.0 28 | react-dom: 18.2.0 29 | react-icons: ^4.7.1 30 | tailwind-scrollbar: ^2.1.0 31 | tailwindcss: ^3.2.0 32 | typescript: ^4.9.4 33 | zod: ^3.20.2 34 | zustand: ^4.3.2 35 | 36 | dependencies: 37 | '@headlessui/react': 1.7.10_biqbaboplfbrettd7655fr4n2y 38 | '@heroicons/react': 2.0.15_react@18.2.0 39 | '@monaco-editor/react': 4.4.6_3vguicescx7w3divwtpzvtv5wy 40 | '@next/font': 13.1.6 41 | '@tanstack/react-table': 8.7.9_biqbaboplfbrettd7655fr4n2y 42 | '@types/flat': 5.0.2 43 | clsx: 1.2.1 44 | flat: 5.0.2 45 | moderndash: 0.14.1 46 | monaco-editor: 0.35.0 47 | next: 13.1.6_biqbaboplfbrettd7655fr4n2y 48 | react: 18.2.0 49 | react-dom: 18.2.0_react@18.2.0 50 | react-icons: 4.7.1_react@18.2.0 51 | tailwind-scrollbar: 2.1.0_tailwindcss@3.2.6 52 | zod: 3.20.6 53 | zustand: 4.3.2_react@18.2.0 54 | 55 | devDependencies: 56 | '@types/node': 18.13.0 57 | '@types/prettier': 2.7.2 58 | '@types/react': 18.0.27 59 | '@types/react-dom': 18.0.10 60 | '@typescript-eslint/eslint-plugin': 5.51.0_b635kmla6dsb4frxfihkw4m47e 61 | '@typescript-eslint/parser': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 62 | autoprefixer: 10.4.13_postcss@8.4.21 63 | eslint: 8.33.0 64 | eslint-config-next: 13.1.6_4vsywjlpuriuw3tl5oq6zy5a64 65 | postcss: 8.4.21 66 | prettier: 2.8.4 67 | prettier-plugin-tailwindcss: 0.2.2_prettier@2.8.4 68 | tailwindcss: 3.2.6_postcss@8.4.21 69 | typescript: 4.9.5 70 | 71 | packages: 72 | 73 | /@babel/runtime/7.20.13: 74 | resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} 75 | engines: {node: '>=6.9.0'} 76 | dependencies: 77 | regenerator-runtime: 0.13.11 78 | dev: true 79 | 80 | /@eslint/eslintrc/1.4.1: 81 | resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} 82 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 83 | dependencies: 84 | ajv: 6.12.6 85 | debug: 4.3.4 86 | espree: 9.4.1 87 | globals: 13.20.0 88 | ignore: 5.2.4 89 | import-fresh: 3.3.0 90 | js-yaml: 4.1.0 91 | minimatch: 3.1.2 92 | strip-json-comments: 3.1.1 93 | transitivePeerDependencies: 94 | - supports-color 95 | dev: true 96 | 97 | /@headlessui/react/1.7.10_biqbaboplfbrettd7655fr4n2y: 98 | resolution: {integrity: sha512-1m66h/5eayTEZVT2PI13/2PG3EVC7a9XalmUtVSC8X76pcyKYMuyX1XAL2RUtCr8WhoMa/KrDEyoeU5v+kSQOw==} 99 | engines: {node: '>=10'} 100 | peerDependencies: 101 | react: ^16 || ^17 || ^18 102 | react-dom: ^16 || ^17 || ^18 103 | dependencies: 104 | client-only: 0.0.1 105 | react: 18.2.0 106 | react-dom: 18.2.0_react@18.2.0 107 | dev: false 108 | 109 | /@heroicons/react/2.0.15_react@18.2.0: 110 | resolution: {integrity: sha512-CZ2dGWgWG3/z5LEoD5D3MEr1syn45JM/OB2aDpw531Ryecgkz2V7TWQ808P0lva7zP003PVW6WlwbofsYyga3A==} 111 | peerDependencies: 112 | react: '>= 16' 113 | dependencies: 114 | react: 18.2.0 115 | dev: false 116 | 117 | /@humanwhocodes/config-array/0.11.8: 118 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 119 | engines: {node: '>=10.10.0'} 120 | dependencies: 121 | '@humanwhocodes/object-schema': 1.2.1 122 | debug: 4.3.4 123 | minimatch: 3.1.2 124 | transitivePeerDependencies: 125 | - supports-color 126 | dev: true 127 | 128 | /@humanwhocodes/module-importer/1.0.1: 129 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 130 | engines: {node: '>=12.22'} 131 | dev: true 132 | 133 | /@humanwhocodes/object-schema/1.2.1: 134 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 135 | dev: true 136 | 137 | /@monaco-editor/loader/1.3.2_monaco-editor@0.35.0: 138 | resolution: {integrity: sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==} 139 | peerDependencies: 140 | monaco-editor: '>= 0.21.0 < 1' 141 | dependencies: 142 | monaco-editor: 0.35.0 143 | state-local: 1.0.7 144 | dev: false 145 | 146 | /@monaco-editor/react/4.4.6_3vguicescx7w3divwtpzvtv5wy: 147 | resolution: {integrity: sha512-Gr3uz3LYf33wlFE3eRnta4RxP5FSNxiIV9ENn2D2/rN8KgGAD8ecvcITRtsbbyuOuNkwbuHYxfeaz2Vr+CtyFA==} 148 | peerDependencies: 149 | monaco-editor: '>= 0.25.0 < 1' 150 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 151 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 152 | dependencies: 153 | '@monaco-editor/loader': 1.3.2_monaco-editor@0.35.0 154 | monaco-editor: 0.35.0 155 | prop-types: 15.8.1 156 | react: 18.2.0 157 | react-dom: 18.2.0_react@18.2.0 158 | dev: false 159 | 160 | /@next/env/13.1.6: 161 | resolution: {integrity: sha512-s+W9Fdqh5MFk6ECrbnVmmAOwxKQuhGMT7xXHrkYIBMBcTiOqNWhv5KbJIboKR5STXxNXl32hllnvKaffzFaWQg==} 162 | dev: false 163 | 164 | /@next/eslint-plugin-next/13.1.6: 165 | resolution: {integrity: sha512-o7cauUYsXjzSJkay8wKjpKJf2uLzlggCsGUkPu3lP09Pv97jYlekTC20KJrjQKmSv5DXV0R/uks2ZXhqjNkqAw==} 166 | dependencies: 167 | glob: 7.1.7 168 | dev: true 169 | 170 | /@next/font/13.1.6: 171 | resolution: {integrity: sha512-AITjmeb1RgX1HKMCiA39ztx2mxeAyxl4ljv2UoSBUGAbFFMg8MO7YAvjHCgFhD39hL7YTbFjol04e/BPBH5RzQ==} 172 | dev: false 173 | 174 | /@next/swc-android-arm-eabi/13.1.6: 175 | resolution: {integrity: sha512-F3/6Z8LH/pGlPzR1AcjPFxx35mPqjE5xZcf+IL+KgbW9tMkp7CYi1y7qKrEWU7W4AumxX/8OINnDQWLiwLasLQ==} 176 | engines: {node: '>= 10'} 177 | cpu: [arm] 178 | os: [android] 179 | requiresBuild: true 180 | dev: false 181 | optional: true 182 | 183 | /@next/swc-android-arm64/13.1.6: 184 | resolution: {integrity: sha512-cMwQjnB8vrYkWyK/H0Rf2c2pKIH4RGjpKUDvbjVAit6SbwPDpmaijLio0LWFV3/tOnY6kvzbL62lndVA0mkYpw==} 185 | engines: {node: '>= 10'} 186 | cpu: [arm64] 187 | os: [android] 188 | requiresBuild: true 189 | dev: false 190 | optional: true 191 | 192 | /@next/swc-darwin-arm64/13.1.6: 193 | resolution: {integrity: sha512-KKRQH4DDE4kONXCvFMNBZGDb499Hs+xcFAwvj+rfSUssIDrZOlyfJNy55rH5t2Qxed1e4K80KEJgsxKQN1/fyw==} 194 | engines: {node: '>= 10'} 195 | cpu: [arm64] 196 | os: [darwin] 197 | requiresBuild: true 198 | dev: false 199 | optional: true 200 | 201 | /@next/swc-darwin-x64/13.1.6: 202 | resolution: {integrity: sha512-/uOky5PaZDoaU99ohjtNcDTJ6ks/gZ5ykTQDvNZDjIoCxFe3+t06bxsTPY6tAO6uEAw5f6vVFX5H5KLwhrkZCA==} 203 | engines: {node: '>= 10'} 204 | cpu: [x64] 205 | os: [darwin] 206 | requiresBuild: true 207 | dev: false 208 | optional: true 209 | 210 | /@next/swc-freebsd-x64/13.1.6: 211 | resolution: {integrity: sha512-qaEALZeV7to6weSXk3Br80wtFQ7cFTpos/q+m9XVRFggu+8Ib895XhMWdJBzew6aaOcMvYR6KQ6JmHA2/eMzWw==} 212 | engines: {node: '>= 10'} 213 | cpu: [x64] 214 | os: [freebsd] 215 | requiresBuild: true 216 | dev: false 217 | optional: true 218 | 219 | /@next/swc-linux-arm-gnueabihf/13.1.6: 220 | resolution: {integrity: sha512-OybkbC58A1wJ+JrJSOjGDvZzrVEQA4sprJejGqMwiZyLqhr9Eo8FXF0y6HL+m1CPCpPhXEHz/2xKoYsl16kNqw==} 221 | engines: {node: '>= 10'} 222 | cpu: [arm] 223 | os: [linux] 224 | requiresBuild: true 225 | dev: false 226 | optional: true 227 | 228 | /@next/swc-linux-arm64-gnu/13.1.6: 229 | resolution: {integrity: sha512-yCH+yDr7/4FDuWv6+GiYrPI9kcTAO3y48UmaIbrKy8ZJpi7RehJe3vIBRUmLrLaNDH3rY1rwoHi471NvR5J5NQ==} 230 | engines: {node: '>= 10'} 231 | cpu: [arm64] 232 | os: [linux] 233 | requiresBuild: true 234 | dev: false 235 | optional: true 236 | 237 | /@next/swc-linux-arm64-musl/13.1.6: 238 | resolution: {integrity: sha512-ECagB8LGX25P9Mrmlc7Q/TQBb9rGScxHbv/kLqqIWs2fIXy6Y/EiBBiM72NTwuXUFCNrWR4sjUPSooVBJJ3ESQ==} 239 | engines: {node: '>= 10'} 240 | cpu: [arm64] 241 | os: [linux] 242 | requiresBuild: true 243 | dev: false 244 | optional: true 245 | 246 | /@next/swc-linux-x64-gnu/13.1.6: 247 | resolution: {integrity: sha512-GT5w2mruk90V/I5g6ScuueE7fqj/d8Bui2qxdw6lFxmuTgMeol5rnzAv4uAoVQgClOUO/MULilzlODg9Ib3Y4Q==} 248 | engines: {node: '>= 10'} 249 | cpu: [x64] 250 | os: [linux] 251 | requiresBuild: true 252 | dev: false 253 | optional: true 254 | 255 | /@next/swc-linux-x64-musl/13.1.6: 256 | resolution: {integrity: sha512-keFD6KvwOPzmat4TCnlnuxJCQepPN+8j3Nw876FtULxo8005Y9Ghcl7ACcR8GoiKoddAq8gxNBrpjoxjQRHeAQ==} 257 | engines: {node: '>= 10'} 258 | cpu: [x64] 259 | os: [linux] 260 | requiresBuild: true 261 | dev: false 262 | optional: true 263 | 264 | /@next/swc-win32-arm64-msvc/13.1.6: 265 | resolution: {integrity: sha512-OwertslIiGQluFvHyRDzBCIB07qJjqabAmINlXUYt7/sY7Q7QPE8xVi5beBxX/rxTGPIbtyIe3faBE6Z2KywhQ==} 266 | engines: {node: '>= 10'} 267 | cpu: [arm64] 268 | os: [win32] 269 | requiresBuild: true 270 | dev: false 271 | optional: true 272 | 273 | /@next/swc-win32-ia32-msvc/13.1.6: 274 | resolution: {integrity: sha512-g8zowiuP8FxUR9zslPmlju7qYbs2XBtTLVSxVikPtUDQedhcls39uKYLvOOd1JZg0ehyhopobRoH1q+MHlIN/w==} 275 | engines: {node: '>= 10'} 276 | cpu: [ia32] 277 | os: [win32] 278 | requiresBuild: true 279 | dev: false 280 | optional: true 281 | 282 | /@next/swc-win32-x64-msvc/13.1.6: 283 | resolution: {integrity: sha512-Ls2OL9hi3YlJKGNdKv8k3X/lLgc3VmLG3a/DeTkAd+lAituJp8ZHmRmm9f9SL84fT3CotlzcgbdaCDfFwFA6bA==} 284 | engines: {node: '>= 10'} 285 | cpu: [x64] 286 | os: [win32] 287 | requiresBuild: true 288 | dev: false 289 | optional: true 290 | 291 | /@nodelib/fs.scandir/2.1.5: 292 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 293 | engines: {node: '>= 8'} 294 | dependencies: 295 | '@nodelib/fs.stat': 2.0.5 296 | run-parallel: 1.2.0 297 | 298 | /@nodelib/fs.stat/2.0.5: 299 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 300 | engines: {node: '>= 8'} 301 | 302 | /@nodelib/fs.walk/1.2.8: 303 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 304 | engines: {node: '>= 8'} 305 | dependencies: 306 | '@nodelib/fs.scandir': 2.1.5 307 | fastq: 1.15.0 308 | 309 | /@pkgr/utils/2.3.1: 310 | resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} 311 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 312 | dependencies: 313 | cross-spawn: 7.0.3 314 | is-glob: 4.0.3 315 | open: 8.4.1 316 | picocolors: 1.0.0 317 | tiny-glob: 0.2.9 318 | tslib: 2.5.0 319 | dev: true 320 | 321 | /@rushstack/eslint-patch/1.2.0: 322 | resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} 323 | dev: true 324 | 325 | /@swc/helpers/0.4.14: 326 | resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} 327 | dependencies: 328 | tslib: 2.5.0 329 | dev: false 330 | 331 | /@tanstack/react-table/8.7.9_biqbaboplfbrettd7655fr4n2y: 332 | resolution: {integrity: sha512-6MbbQn5AupSOkek1+6IYu+1yZNthAKTRZw9tW92Vi6++iRrD1GbI3lKTjJalf8lEEKOqapPzQPE20nywu0PjCA==} 333 | engines: {node: '>=12'} 334 | peerDependencies: 335 | react: '>=16' 336 | react-dom: '>=16' 337 | dependencies: 338 | '@tanstack/table-core': 8.7.9 339 | react: 18.2.0 340 | react-dom: 18.2.0_react@18.2.0 341 | dev: false 342 | 343 | /@tanstack/table-core/8.7.9: 344 | resolution: {integrity: sha512-4RkayPMV1oS2SKDXfQbFoct1w5k+pvGpmX18tCXMofK/VDRdA2hhxfsQlMvsJ4oTX8b0CI4Y3GDKn5T425jBCw==} 345 | engines: {node: '>=12'} 346 | dev: false 347 | 348 | /@types/flat/5.0.2: 349 | resolution: {integrity: sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ==} 350 | dev: false 351 | 352 | /@types/json-schema/7.0.11: 353 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 354 | dev: true 355 | 356 | /@types/json5/0.0.29: 357 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 358 | dev: true 359 | 360 | /@types/node/18.13.0: 361 | resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} 362 | dev: true 363 | 364 | /@types/prettier/2.7.2: 365 | resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} 366 | dev: true 367 | 368 | /@types/prop-types/15.7.5: 369 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 370 | dev: true 371 | 372 | /@types/react-dom/18.0.10: 373 | resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} 374 | dependencies: 375 | '@types/react': 18.0.27 376 | dev: true 377 | 378 | /@types/react/18.0.27: 379 | resolution: {integrity: sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==} 380 | dependencies: 381 | '@types/prop-types': 15.7.5 382 | '@types/scheduler': 0.16.2 383 | csstype: 3.1.1 384 | dev: true 385 | 386 | /@types/scheduler/0.16.2: 387 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 388 | dev: true 389 | 390 | /@types/semver/7.3.13: 391 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 392 | dev: true 393 | 394 | /@typescript-eslint/eslint-plugin/5.51.0_b635kmla6dsb4frxfihkw4m47e: 395 | resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==} 396 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 397 | peerDependencies: 398 | '@typescript-eslint/parser': ^5.0.0 399 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 400 | typescript: '*' 401 | peerDependenciesMeta: 402 | typescript: 403 | optional: true 404 | dependencies: 405 | '@typescript-eslint/parser': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 406 | '@typescript-eslint/scope-manager': 5.51.0 407 | '@typescript-eslint/type-utils': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 408 | '@typescript-eslint/utils': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 409 | debug: 4.3.4 410 | eslint: 8.33.0 411 | grapheme-splitter: 1.0.4 412 | ignore: 5.2.4 413 | natural-compare-lite: 1.4.0 414 | regexpp: 3.2.0 415 | semver: 7.3.8 416 | tsutils: 3.21.0_typescript@4.9.5 417 | typescript: 4.9.5 418 | transitivePeerDependencies: 419 | - supports-color 420 | dev: true 421 | 422 | /@typescript-eslint/parser/5.51.0_4vsywjlpuriuw3tl5oq6zy5a64: 423 | resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==} 424 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 425 | peerDependencies: 426 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 427 | typescript: '*' 428 | peerDependenciesMeta: 429 | typescript: 430 | optional: true 431 | dependencies: 432 | '@typescript-eslint/scope-manager': 5.51.0 433 | '@typescript-eslint/types': 5.51.0 434 | '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 435 | debug: 4.3.4 436 | eslint: 8.33.0 437 | typescript: 4.9.5 438 | transitivePeerDependencies: 439 | - supports-color 440 | dev: true 441 | 442 | /@typescript-eslint/scope-manager/5.51.0: 443 | resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==} 444 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 445 | dependencies: 446 | '@typescript-eslint/types': 5.51.0 447 | '@typescript-eslint/visitor-keys': 5.51.0 448 | dev: true 449 | 450 | /@typescript-eslint/type-utils/5.51.0_4vsywjlpuriuw3tl5oq6zy5a64: 451 | resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==} 452 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 453 | peerDependencies: 454 | eslint: '*' 455 | typescript: '*' 456 | peerDependenciesMeta: 457 | typescript: 458 | optional: true 459 | dependencies: 460 | '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 461 | '@typescript-eslint/utils': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 462 | debug: 4.3.4 463 | eslint: 8.33.0 464 | tsutils: 3.21.0_typescript@4.9.5 465 | typescript: 4.9.5 466 | transitivePeerDependencies: 467 | - supports-color 468 | dev: true 469 | 470 | /@typescript-eslint/types/5.51.0: 471 | resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==} 472 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 473 | dev: true 474 | 475 | /@typescript-eslint/typescript-estree/5.51.0_typescript@4.9.5: 476 | resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==} 477 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 478 | peerDependencies: 479 | typescript: '*' 480 | peerDependenciesMeta: 481 | typescript: 482 | optional: true 483 | dependencies: 484 | '@typescript-eslint/types': 5.51.0 485 | '@typescript-eslint/visitor-keys': 5.51.0 486 | debug: 4.3.4 487 | globby: 11.1.0 488 | is-glob: 4.0.3 489 | semver: 7.3.8 490 | tsutils: 3.21.0_typescript@4.9.5 491 | typescript: 4.9.5 492 | transitivePeerDependencies: 493 | - supports-color 494 | dev: true 495 | 496 | /@typescript-eslint/utils/5.51.0_4vsywjlpuriuw3tl5oq6zy5a64: 497 | resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==} 498 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 499 | peerDependencies: 500 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 501 | dependencies: 502 | '@types/json-schema': 7.0.11 503 | '@types/semver': 7.3.13 504 | '@typescript-eslint/scope-manager': 5.51.0 505 | '@typescript-eslint/types': 5.51.0 506 | '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 507 | eslint: 8.33.0 508 | eslint-scope: 5.1.1 509 | eslint-utils: 3.0.0_eslint@8.33.0 510 | semver: 7.3.8 511 | transitivePeerDependencies: 512 | - supports-color 513 | - typescript 514 | dev: true 515 | 516 | /@typescript-eslint/visitor-keys/5.51.0: 517 | resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==} 518 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 519 | dependencies: 520 | '@typescript-eslint/types': 5.51.0 521 | eslint-visitor-keys: 3.3.0 522 | dev: true 523 | 524 | /acorn-jsx/5.3.2_acorn@8.8.2: 525 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 526 | peerDependencies: 527 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 528 | dependencies: 529 | acorn: 8.8.2 530 | dev: true 531 | 532 | /acorn-node/1.8.2: 533 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 534 | dependencies: 535 | acorn: 7.4.1 536 | acorn-walk: 7.2.0 537 | xtend: 4.0.2 538 | 539 | /acorn-walk/7.2.0: 540 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 541 | engines: {node: '>=0.4.0'} 542 | 543 | /acorn/7.4.1: 544 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 545 | engines: {node: '>=0.4.0'} 546 | hasBin: true 547 | 548 | /acorn/8.8.2: 549 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 550 | engines: {node: '>=0.4.0'} 551 | hasBin: true 552 | dev: true 553 | 554 | /ajv/6.12.6: 555 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 556 | dependencies: 557 | fast-deep-equal: 3.1.3 558 | fast-json-stable-stringify: 2.1.0 559 | json-schema-traverse: 0.4.1 560 | uri-js: 4.4.1 561 | dev: true 562 | 563 | /ansi-regex/5.0.1: 564 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 565 | engines: {node: '>=8'} 566 | dev: true 567 | 568 | /ansi-styles/4.3.0: 569 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 570 | engines: {node: '>=8'} 571 | dependencies: 572 | color-convert: 2.0.1 573 | dev: true 574 | 575 | /anymatch/3.1.3: 576 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 577 | engines: {node: '>= 8'} 578 | dependencies: 579 | normalize-path: 3.0.0 580 | picomatch: 2.3.1 581 | 582 | /arg/5.0.2: 583 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 584 | 585 | /argparse/2.0.1: 586 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 587 | dev: true 588 | 589 | /aria-query/5.1.3: 590 | resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} 591 | dependencies: 592 | deep-equal: 2.2.0 593 | dev: true 594 | 595 | /array-includes/3.1.6: 596 | resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} 597 | engines: {node: '>= 0.4'} 598 | dependencies: 599 | call-bind: 1.0.2 600 | define-properties: 1.1.4 601 | es-abstract: 1.21.1 602 | get-intrinsic: 1.2.0 603 | is-string: 1.0.7 604 | dev: true 605 | 606 | /array-union/2.1.0: 607 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 608 | engines: {node: '>=8'} 609 | dev: true 610 | 611 | /array.prototype.flat/1.3.1: 612 | resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} 613 | engines: {node: '>= 0.4'} 614 | dependencies: 615 | call-bind: 1.0.2 616 | define-properties: 1.1.4 617 | es-abstract: 1.21.1 618 | es-shim-unscopables: 1.0.0 619 | dev: true 620 | 621 | /array.prototype.flatmap/1.3.1: 622 | resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} 623 | engines: {node: '>= 0.4'} 624 | dependencies: 625 | call-bind: 1.0.2 626 | define-properties: 1.1.4 627 | es-abstract: 1.21.1 628 | es-shim-unscopables: 1.0.0 629 | dev: true 630 | 631 | /array.prototype.tosorted/1.1.1: 632 | resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} 633 | dependencies: 634 | call-bind: 1.0.2 635 | define-properties: 1.1.4 636 | es-abstract: 1.21.1 637 | es-shim-unscopables: 1.0.0 638 | get-intrinsic: 1.2.0 639 | dev: true 640 | 641 | /ast-types-flow/0.0.7: 642 | resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} 643 | dev: true 644 | 645 | /autoprefixer/10.4.13_postcss@8.4.21: 646 | resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} 647 | engines: {node: ^10 || ^12 || >=14} 648 | hasBin: true 649 | peerDependencies: 650 | postcss: ^8.1.0 651 | dependencies: 652 | browserslist: 4.21.5 653 | caniuse-lite: 1.0.30001451 654 | fraction.js: 4.2.0 655 | normalize-range: 0.1.2 656 | picocolors: 1.0.0 657 | postcss: 8.4.21 658 | postcss-value-parser: 4.2.0 659 | dev: true 660 | 661 | /available-typed-arrays/1.0.5: 662 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 663 | engines: {node: '>= 0.4'} 664 | dev: true 665 | 666 | /axe-core/4.6.3: 667 | resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} 668 | engines: {node: '>=4'} 669 | dev: true 670 | 671 | /axobject-query/3.1.1: 672 | resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} 673 | dependencies: 674 | deep-equal: 2.2.0 675 | dev: true 676 | 677 | /balanced-match/1.0.2: 678 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 679 | dev: true 680 | 681 | /binary-extensions/2.2.0: 682 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 683 | engines: {node: '>=8'} 684 | 685 | /brace-expansion/1.1.11: 686 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 687 | dependencies: 688 | balanced-match: 1.0.2 689 | concat-map: 0.0.1 690 | dev: true 691 | 692 | /braces/3.0.2: 693 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 694 | engines: {node: '>=8'} 695 | dependencies: 696 | fill-range: 7.0.1 697 | 698 | /browserslist/4.21.5: 699 | resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} 700 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 701 | hasBin: true 702 | dependencies: 703 | caniuse-lite: 1.0.30001451 704 | electron-to-chromium: 1.4.294 705 | node-releases: 2.0.10 706 | update-browserslist-db: 1.0.10_browserslist@4.21.5 707 | dev: true 708 | 709 | /call-bind/1.0.2: 710 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 711 | dependencies: 712 | function-bind: 1.1.1 713 | get-intrinsic: 1.2.0 714 | dev: true 715 | 716 | /callsites/3.1.0: 717 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 718 | engines: {node: '>=6'} 719 | dev: true 720 | 721 | /camelcase-css/2.0.1: 722 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 723 | engines: {node: '>= 6'} 724 | 725 | /caniuse-lite/1.0.30001451: 726 | resolution: {integrity: sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==} 727 | 728 | /chalk/4.1.2: 729 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 730 | engines: {node: '>=10'} 731 | dependencies: 732 | ansi-styles: 4.3.0 733 | supports-color: 7.2.0 734 | dev: true 735 | 736 | /chokidar/3.5.3: 737 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 738 | engines: {node: '>= 8.10.0'} 739 | dependencies: 740 | anymatch: 3.1.3 741 | braces: 3.0.2 742 | glob-parent: 5.1.2 743 | is-binary-path: 2.1.0 744 | is-glob: 4.0.3 745 | normalize-path: 3.0.0 746 | readdirp: 3.6.0 747 | optionalDependencies: 748 | fsevents: 2.3.2 749 | 750 | /client-only/0.0.1: 751 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 752 | dev: false 753 | 754 | /clsx/1.2.1: 755 | resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} 756 | engines: {node: '>=6'} 757 | dev: false 758 | 759 | /color-convert/2.0.1: 760 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 761 | engines: {node: '>=7.0.0'} 762 | dependencies: 763 | color-name: 1.1.4 764 | dev: true 765 | 766 | /color-name/1.1.4: 767 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 768 | 769 | /concat-map/0.0.1: 770 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 771 | dev: true 772 | 773 | /cross-spawn/7.0.3: 774 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 775 | engines: {node: '>= 8'} 776 | dependencies: 777 | path-key: 3.1.1 778 | shebang-command: 2.0.0 779 | which: 2.0.2 780 | dev: true 781 | 782 | /cssesc/3.0.0: 783 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 784 | engines: {node: '>=4'} 785 | hasBin: true 786 | 787 | /csstype/3.1.1: 788 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 789 | dev: true 790 | 791 | /damerau-levenshtein/1.0.8: 792 | resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 793 | dev: true 794 | 795 | /debug/3.2.7: 796 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 797 | peerDependencies: 798 | supports-color: '*' 799 | peerDependenciesMeta: 800 | supports-color: 801 | optional: true 802 | dependencies: 803 | ms: 2.1.3 804 | dev: true 805 | 806 | /debug/4.3.4: 807 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 808 | engines: {node: '>=6.0'} 809 | peerDependencies: 810 | supports-color: '*' 811 | peerDependenciesMeta: 812 | supports-color: 813 | optional: true 814 | dependencies: 815 | ms: 2.1.2 816 | dev: true 817 | 818 | /deep-equal/2.2.0: 819 | resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} 820 | dependencies: 821 | call-bind: 1.0.2 822 | es-get-iterator: 1.1.3 823 | get-intrinsic: 1.2.0 824 | is-arguments: 1.1.1 825 | is-array-buffer: 3.0.1 826 | is-date-object: 1.0.5 827 | is-regex: 1.1.4 828 | is-shared-array-buffer: 1.0.2 829 | isarray: 2.0.5 830 | object-is: 1.1.5 831 | object-keys: 1.1.1 832 | object.assign: 4.1.4 833 | regexp.prototype.flags: 1.4.3 834 | side-channel: 1.0.4 835 | which-boxed-primitive: 1.0.2 836 | which-collection: 1.0.1 837 | which-typed-array: 1.1.9 838 | dev: true 839 | 840 | /deep-is/0.1.4: 841 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 842 | dev: true 843 | 844 | /define-lazy-prop/2.0.0: 845 | resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} 846 | engines: {node: '>=8'} 847 | dev: true 848 | 849 | /define-properties/1.1.4: 850 | resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} 851 | engines: {node: '>= 0.4'} 852 | dependencies: 853 | has-property-descriptors: 1.0.0 854 | object-keys: 1.1.1 855 | dev: true 856 | 857 | /defined/1.0.1: 858 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} 859 | 860 | /detective/5.2.1: 861 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} 862 | engines: {node: '>=0.8.0'} 863 | hasBin: true 864 | dependencies: 865 | acorn-node: 1.8.2 866 | defined: 1.0.1 867 | minimist: 1.2.8 868 | 869 | /didyoumean/1.2.2: 870 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 871 | 872 | /dir-glob/3.0.1: 873 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 874 | engines: {node: '>=8'} 875 | dependencies: 876 | path-type: 4.0.0 877 | dev: true 878 | 879 | /dlv/1.1.3: 880 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 881 | 882 | /doctrine/2.1.0: 883 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 884 | engines: {node: '>=0.10.0'} 885 | dependencies: 886 | esutils: 2.0.3 887 | dev: true 888 | 889 | /doctrine/3.0.0: 890 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 891 | engines: {node: '>=6.0.0'} 892 | dependencies: 893 | esutils: 2.0.3 894 | dev: true 895 | 896 | /electron-to-chromium/1.4.294: 897 | resolution: {integrity: sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==} 898 | dev: true 899 | 900 | /emoji-regex/9.2.2: 901 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 902 | dev: true 903 | 904 | /enhanced-resolve/5.12.0: 905 | resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} 906 | engines: {node: '>=10.13.0'} 907 | dependencies: 908 | graceful-fs: 4.2.10 909 | tapable: 2.2.1 910 | dev: true 911 | 912 | /es-abstract/1.21.1: 913 | resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} 914 | engines: {node: '>= 0.4'} 915 | dependencies: 916 | available-typed-arrays: 1.0.5 917 | call-bind: 1.0.2 918 | es-set-tostringtag: 2.0.1 919 | es-to-primitive: 1.2.1 920 | function-bind: 1.1.1 921 | function.prototype.name: 1.1.5 922 | get-intrinsic: 1.2.0 923 | get-symbol-description: 1.0.0 924 | globalthis: 1.0.3 925 | gopd: 1.0.1 926 | has: 1.0.3 927 | has-property-descriptors: 1.0.0 928 | has-proto: 1.0.1 929 | has-symbols: 1.0.3 930 | internal-slot: 1.0.5 931 | is-array-buffer: 3.0.1 932 | is-callable: 1.2.7 933 | is-negative-zero: 2.0.2 934 | is-regex: 1.1.4 935 | is-shared-array-buffer: 1.0.2 936 | is-string: 1.0.7 937 | is-typed-array: 1.1.10 938 | is-weakref: 1.0.2 939 | object-inspect: 1.12.3 940 | object-keys: 1.1.1 941 | object.assign: 4.1.4 942 | regexp.prototype.flags: 1.4.3 943 | safe-regex-test: 1.0.0 944 | string.prototype.trimend: 1.0.6 945 | string.prototype.trimstart: 1.0.6 946 | typed-array-length: 1.0.4 947 | unbox-primitive: 1.0.2 948 | which-typed-array: 1.1.9 949 | dev: true 950 | 951 | /es-get-iterator/1.1.3: 952 | resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} 953 | dependencies: 954 | call-bind: 1.0.2 955 | get-intrinsic: 1.2.0 956 | has-symbols: 1.0.3 957 | is-arguments: 1.1.1 958 | is-map: 2.0.2 959 | is-set: 2.0.2 960 | is-string: 1.0.7 961 | isarray: 2.0.5 962 | stop-iteration-iterator: 1.0.0 963 | dev: true 964 | 965 | /es-set-tostringtag/2.0.1: 966 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 967 | engines: {node: '>= 0.4'} 968 | dependencies: 969 | get-intrinsic: 1.2.0 970 | has: 1.0.3 971 | has-tostringtag: 1.0.0 972 | dev: true 973 | 974 | /es-shim-unscopables/1.0.0: 975 | resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} 976 | dependencies: 977 | has: 1.0.3 978 | dev: true 979 | 980 | /es-to-primitive/1.2.1: 981 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 982 | engines: {node: '>= 0.4'} 983 | dependencies: 984 | is-callable: 1.2.7 985 | is-date-object: 1.0.5 986 | is-symbol: 1.0.4 987 | dev: true 988 | 989 | /escalade/3.1.1: 990 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 991 | engines: {node: '>=6'} 992 | dev: true 993 | 994 | /escape-string-regexp/4.0.0: 995 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 996 | engines: {node: '>=10'} 997 | dev: true 998 | 999 | /eslint-config-next/13.1.6_4vsywjlpuriuw3tl5oq6zy5a64: 1000 | resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==} 1001 | peerDependencies: 1002 | eslint: ^7.23.0 || ^8.0.0 1003 | typescript: '>=3.3.1' 1004 | peerDependenciesMeta: 1005 | typescript: 1006 | optional: true 1007 | dependencies: 1008 | '@next/eslint-plugin-next': 13.1.6 1009 | '@rushstack/eslint-patch': 1.2.0 1010 | '@typescript-eslint/parser': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 1011 | eslint: 8.33.0 1012 | eslint-import-resolver-node: 0.3.7 1013 | eslint-import-resolver-typescript: 3.5.3_ohdts44xlqyeyrlje4qnefqeay 1014 | eslint-plugin-import: 2.27.5_kuqv7qxblf6fgldep4hddd7xwa 1015 | eslint-plugin-jsx-a11y: 6.7.1_eslint@8.33.0 1016 | eslint-plugin-react: 7.32.2_eslint@8.33.0 1017 | eslint-plugin-react-hooks: 4.6.0_eslint@8.33.0 1018 | typescript: 4.9.5 1019 | transitivePeerDependencies: 1020 | - eslint-import-resolver-webpack 1021 | - supports-color 1022 | dev: true 1023 | 1024 | /eslint-import-resolver-node/0.3.7: 1025 | resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} 1026 | dependencies: 1027 | debug: 3.2.7 1028 | is-core-module: 2.11.0 1029 | resolve: 1.22.1 1030 | transitivePeerDependencies: 1031 | - supports-color 1032 | dev: true 1033 | 1034 | /eslint-import-resolver-typescript/3.5.3_ohdts44xlqyeyrlje4qnefqeay: 1035 | resolution: {integrity: sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==} 1036 | engines: {node: ^14.18.0 || >=16.0.0} 1037 | peerDependencies: 1038 | eslint: '*' 1039 | eslint-plugin-import: '*' 1040 | dependencies: 1041 | debug: 4.3.4 1042 | enhanced-resolve: 5.12.0 1043 | eslint: 8.33.0 1044 | eslint-plugin-import: 2.27.5_kuqv7qxblf6fgldep4hddd7xwa 1045 | get-tsconfig: 4.4.0 1046 | globby: 13.1.3 1047 | is-core-module: 2.11.0 1048 | is-glob: 4.0.3 1049 | synckit: 0.8.5 1050 | transitivePeerDependencies: 1051 | - supports-color 1052 | dev: true 1053 | 1054 | /eslint-module-utils/2.7.4_wj7ubv6viehxm3sdjw6f37lxha: 1055 | resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} 1056 | engines: {node: '>=4'} 1057 | peerDependencies: 1058 | '@typescript-eslint/parser': '*' 1059 | eslint: '*' 1060 | eslint-import-resolver-node: '*' 1061 | eslint-import-resolver-typescript: '*' 1062 | eslint-import-resolver-webpack: '*' 1063 | peerDependenciesMeta: 1064 | '@typescript-eslint/parser': 1065 | optional: true 1066 | eslint: 1067 | optional: true 1068 | eslint-import-resolver-node: 1069 | optional: true 1070 | eslint-import-resolver-typescript: 1071 | optional: true 1072 | eslint-import-resolver-webpack: 1073 | optional: true 1074 | dependencies: 1075 | '@typescript-eslint/parser': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 1076 | debug: 3.2.7 1077 | eslint: 8.33.0 1078 | eslint-import-resolver-node: 0.3.7 1079 | eslint-import-resolver-typescript: 3.5.3_ohdts44xlqyeyrlje4qnefqeay 1080 | transitivePeerDependencies: 1081 | - supports-color 1082 | dev: true 1083 | 1084 | /eslint-plugin-import/2.27.5_kuqv7qxblf6fgldep4hddd7xwa: 1085 | resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} 1086 | engines: {node: '>=4'} 1087 | peerDependencies: 1088 | '@typescript-eslint/parser': '*' 1089 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 1090 | peerDependenciesMeta: 1091 | '@typescript-eslint/parser': 1092 | optional: true 1093 | dependencies: 1094 | '@typescript-eslint/parser': 5.51.0_4vsywjlpuriuw3tl5oq6zy5a64 1095 | array-includes: 3.1.6 1096 | array.prototype.flat: 1.3.1 1097 | array.prototype.flatmap: 1.3.1 1098 | debug: 3.2.7 1099 | doctrine: 2.1.0 1100 | eslint: 8.33.0 1101 | eslint-import-resolver-node: 0.3.7 1102 | eslint-module-utils: 2.7.4_wj7ubv6viehxm3sdjw6f37lxha 1103 | has: 1.0.3 1104 | is-core-module: 2.11.0 1105 | is-glob: 4.0.3 1106 | minimatch: 3.1.2 1107 | object.values: 1.1.6 1108 | resolve: 1.22.1 1109 | semver: 6.3.0 1110 | tsconfig-paths: 3.14.1 1111 | transitivePeerDependencies: 1112 | - eslint-import-resolver-typescript 1113 | - eslint-import-resolver-webpack 1114 | - supports-color 1115 | dev: true 1116 | 1117 | /eslint-plugin-jsx-a11y/6.7.1_eslint@8.33.0: 1118 | resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} 1119 | engines: {node: '>=4.0'} 1120 | peerDependencies: 1121 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1122 | dependencies: 1123 | '@babel/runtime': 7.20.13 1124 | aria-query: 5.1.3 1125 | array-includes: 3.1.6 1126 | array.prototype.flatmap: 1.3.1 1127 | ast-types-flow: 0.0.7 1128 | axe-core: 4.6.3 1129 | axobject-query: 3.1.1 1130 | damerau-levenshtein: 1.0.8 1131 | emoji-regex: 9.2.2 1132 | eslint: 8.33.0 1133 | has: 1.0.3 1134 | jsx-ast-utils: 3.3.3 1135 | language-tags: 1.0.5 1136 | minimatch: 3.1.2 1137 | object.entries: 1.1.6 1138 | object.fromentries: 2.0.6 1139 | semver: 6.3.0 1140 | dev: true 1141 | 1142 | /eslint-plugin-react-hooks/4.6.0_eslint@8.33.0: 1143 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1144 | engines: {node: '>=10'} 1145 | peerDependencies: 1146 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1147 | dependencies: 1148 | eslint: 8.33.0 1149 | dev: true 1150 | 1151 | /eslint-plugin-react/7.32.2_eslint@8.33.0: 1152 | resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} 1153 | engines: {node: '>=4'} 1154 | peerDependencies: 1155 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1156 | dependencies: 1157 | array-includes: 3.1.6 1158 | array.prototype.flatmap: 1.3.1 1159 | array.prototype.tosorted: 1.1.1 1160 | doctrine: 2.1.0 1161 | eslint: 8.33.0 1162 | estraverse: 5.3.0 1163 | jsx-ast-utils: 3.3.3 1164 | minimatch: 3.1.2 1165 | object.entries: 1.1.6 1166 | object.fromentries: 2.0.6 1167 | object.hasown: 1.1.2 1168 | object.values: 1.1.6 1169 | prop-types: 15.8.1 1170 | resolve: 2.0.0-next.4 1171 | semver: 6.3.0 1172 | string.prototype.matchall: 4.0.8 1173 | dev: true 1174 | 1175 | /eslint-scope/5.1.1: 1176 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1177 | engines: {node: '>=8.0.0'} 1178 | dependencies: 1179 | esrecurse: 4.3.0 1180 | estraverse: 4.3.0 1181 | dev: true 1182 | 1183 | /eslint-scope/7.1.1: 1184 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1185 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1186 | dependencies: 1187 | esrecurse: 4.3.0 1188 | estraverse: 5.3.0 1189 | dev: true 1190 | 1191 | /eslint-utils/3.0.0_eslint@8.33.0: 1192 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1193 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1194 | peerDependencies: 1195 | eslint: '>=5' 1196 | dependencies: 1197 | eslint: 8.33.0 1198 | eslint-visitor-keys: 2.1.0 1199 | dev: true 1200 | 1201 | /eslint-visitor-keys/2.1.0: 1202 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1203 | engines: {node: '>=10'} 1204 | dev: true 1205 | 1206 | /eslint-visitor-keys/3.3.0: 1207 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1208 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1209 | dev: true 1210 | 1211 | /eslint/8.33.0: 1212 | resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} 1213 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1214 | hasBin: true 1215 | dependencies: 1216 | '@eslint/eslintrc': 1.4.1 1217 | '@humanwhocodes/config-array': 0.11.8 1218 | '@humanwhocodes/module-importer': 1.0.1 1219 | '@nodelib/fs.walk': 1.2.8 1220 | ajv: 6.12.6 1221 | chalk: 4.1.2 1222 | cross-spawn: 7.0.3 1223 | debug: 4.3.4 1224 | doctrine: 3.0.0 1225 | escape-string-regexp: 4.0.0 1226 | eslint-scope: 7.1.1 1227 | eslint-utils: 3.0.0_eslint@8.33.0 1228 | eslint-visitor-keys: 3.3.0 1229 | espree: 9.4.1 1230 | esquery: 1.4.0 1231 | esutils: 2.0.3 1232 | fast-deep-equal: 3.1.3 1233 | file-entry-cache: 6.0.1 1234 | find-up: 5.0.0 1235 | glob-parent: 6.0.2 1236 | globals: 13.20.0 1237 | grapheme-splitter: 1.0.4 1238 | ignore: 5.2.4 1239 | import-fresh: 3.3.0 1240 | imurmurhash: 0.1.4 1241 | is-glob: 4.0.3 1242 | is-path-inside: 3.0.3 1243 | js-sdsl: 4.3.0 1244 | js-yaml: 4.1.0 1245 | json-stable-stringify-without-jsonify: 1.0.1 1246 | levn: 0.4.1 1247 | lodash.merge: 4.6.2 1248 | minimatch: 3.1.2 1249 | natural-compare: 1.4.0 1250 | optionator: 0.9.1 1251 | regexpp: 3.2.0 1252 | strip-ansi: 6.0.1 1253 | strip-json-comments: 3.1.1 1254 | text-table: 0.2.0 1255 | transitivePeerDependencies: 1256 | - supports-color 1257 | dev: true 1258 | 1259 | /espree/9.4.1: 1260 | resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} 1261 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1262 | dependencies: 1263 | acorn: 8.8.2 1264 | acorn-jsx: 5.3.2_acorn@8.8.2 1265 | eslint-visitor-keys: 3.3.0 1266 | dev: true 1267 | 1268 | /esquery/1.4.0: 1269 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1270 | engines: {node: '>=0.10'} 1271 | dependencies: 1272 | estraverse: 5.3.0 1273 | dev: true 1274 | 1275 | /esrecurse/4.3.0: 1276 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1277 | engines: {node: '>=4.0'} 1278 | dependencies: 1279 | estraverse: 5.3.0 1280 | dev: true 1281 | 1282 | /estraverse/4.3.0: 1283 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1284 | engines: {node: '>=4.0'} 1285 | dev: true 1286 | 1287 | /estraverse/5.3.0: 1288 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1289 | engines: {node: '>=4.0'} 1290 | dev: true 1291 | 1292 | /esutils/2.0.3: 1293 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1294 | engines: {node: '>=0.10.0'} 1295 | dev: true 1296 | 1297 | /fast-deep-equal/3.1.3: 1298 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1299 | dev: true 1300 | 1301 | /fast-glob/3.2.12: 1302 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1303 | engines: {node: '>=8.6.0'} 1304 | dependencies: 1305 | '@nodelib/fs.stat': 2.0.5 1306 | '@nodelib/fs.walk': 1.2.8 1307 | glob-parent: 5.1.2 1308 | merge2: 1.4.1 1309 | micromatch: 4.0.5 1310 | 1311 | /fast-json-stable-stringify/2.1.0: 1312 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1313 | dev: true 1314 | 1315 | /fast-levenshtein/2.0.6: 1316 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1317 | dev: true 1318 | 1319 | /fastq/1.15.0: 1320 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1321 | dependencies: 1322 | reusify: 1.0.4 1323 | 1324 | /file-entry-cache/6.0.1: 1325 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1326 | engines: {node: ^10.12.0 || >=12.0.0} 1327 | dependencies: 1328 | flat-cache: 3.0.4 1329 | dev: true 1330 | 1331 | /fill-range/7.0.1: 1332 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1333 | engines: {node: '>=8'} 1334 | dependencies: 1335 | to-regex-range: 5.0.1 1336 | 1337 | /find-up/5.0.0: 1338 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1339 | engines: {node: '>=10'} 1340 | dependencies: 1341 | locate-path: 6.0.0 1342 | path-exists: 4.0.0 1343 | dev: true 1344 | 1345 | /flat-cache/3.0.4: 1346 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1347 | engines: {node: ^10.12.0 || >=12.0.0} 1348 | dependencies: 1349 | flatted: 3.2.7 1350 | rimraf: 3.0.2 1351 | dev: true 1352 | 1353 | /flat/5.0.2: 1354 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 1355 | hasBin: true 1356 | dev: false 1357 | 1358 | /flatted/3.2.7: 1359 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1360 | dev: true 1361 | 1362 | /for-each/0.3.3: 1363 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1364 | dependencies: 1365 | is-callable: 1.2.7 1366 | dev: true 1367 | 1368 | /fraction.js/4.2.0: 1369 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1370 | dev: true 1371 | 1372 | /fs.realpath/1.0.0: 1373 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1374 | dev: true 1375 | 1376 | /fsevents/2.3.2: 1377 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1378 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1379 | os: [darwin] 1380 | requiresBuild: true 1381 | optional: true 1382 | 1383 | /function-bind/1.1.1: 1384 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1385 | 1386 | /function.prototype.name/1.1.5: 1387 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 1388 | engines: {node: '>= 0.4'} 1389 | dependencies: 1390 | call-bind: 1.0.2 1391 | define-properties: 1.1.4 1392 | es-abstract: 1.21.1 1393 | functions-have-names: 1.2.3 1394 | dev: true 1395 | 1396 | /functions-have-names/1.2.3: 1397 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1398 | dev: true 1399 | 1400 | /get-intrinsic/1.2.0: 1401 | resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} 1402 | dependencies: 1403 | function-bind: 1.1.1 1404 | has: 1.0.3 1405 | has-symbols: 1.0.3 1406 | dev: true 1407 | 1408 | /get-symbol-description/1.0.0: 1409 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 1410 | engines: {node: '>= 0.4'} 1411 | dependencies: 1412 | call-bind: 1.0.2 1413 | get-intrinsic: 1.2.0 1414 | dev: true 1415 | 1416 | /get-tsconfig/4.4.0: 1417 | resolution: {integrity: sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==} 1418 | dev: true 1419 | 1420 | /glob-parent/5.1.2: 1421 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1422 | engines: {node: '>= 6'} 1423 | dependencies: 1424 | is-glob: 4.0.3 1425 | 1426 | /glob-parent/6.0.2: 1427 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1428 | engines: {node: '>=10.13.0'} 1429 | dependencies: 1430 | is-glob: 4.0.3 1431 | 1432 | /glob/7.1.7: 1433 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 1434 | dependencies: 1435 | fs.realpath: 1.0.0 1436 | inflight: 1.0.6 1437 | inherits: 2.0.4 1438 | minimatch: 3.1.2 1439 | once: 1.4.0 1440 | path-is-absolute: 1.0.1 1441 | dev: true 1442 | 1443 | /glob/7.2.3: 1444 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1445 | dependencies: 1446 | fs.realpath: 1.0.0 1447 | inflight: 1.0.6 1448 | inherits: 2.0.4 1449 | minimatch: 3.1.2 1450 | once: 1.4.0 1451 | path-is-absolute: 1.0.1 1452 | dev: true 1453 | 1454 | /globals/13.20.0: 1455 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1456 | engines: {node: '>=8'} 1457 | dependencies: 1458 | type-fest: 0.20.2 1459 | dev: true 1460 | 1461 | /globalthis/1.0.3: 1462 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1463 | engines: {node: '>= 0.4'} 1464 | dependencies: 1465 | define-properties: 1.1.4 1466 | dev: true 1467 | 1468 | /globalyzer/0.1.0: 1469 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1470 | dev: true 1471 | 1472 | /globby/11.1.0: 1473 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1474 | engines: {node: '>=10'} 1475 | dependencies: 1476 | array-union: 2.1.0 1477 | dir-glob: 3.0.1 1478 | fast-glob: 3.2.12 1479 | ignore: 5.2.4 1480 | merge2: 1.4.1 1481 | slash: 3.0.0 1482 | dev: true 1483 | 1484 | /globby/13.1.3: 1485 | resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} 1486 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1487 | dependencies: 1488 | dir-glob: 3.0.1 1489 | fast-glob: 3.2.12 1490 | ignore: 5.2.4 1491 | merge2: 1.4.1 1492 | slash: 4.0.0 1493 | dev: true 1494 | 1495 | /globrex/0.1.2: 1496 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1497 | dev: true 1498 | 1499 | /gopd/1.0.1: 1500 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1501 | dependencies: 1502 | get-intrinsic: 1.2.0 1503 | dev: true 1504 | 1505 | /graceful-fs/4.2.10: 1506 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1507 | dev: true 1508 | 1509 | /grapheme-splitter/1.0.4: 1510 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1511 | dev: true 1512 | 1513 | /has-bigints/1.0.2: 1514 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1515 | dev: true 1516 | 1517 | /has-flag/4.0.0: 1518 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1519 | engines: {node: '>=8'} 1520 | dev: true 1521 | 1522 | /has-property-descriptors/1.0.0: 1523 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 1524 | dependencies: 1525 | get-intrinsic: 1.2.0 1526 | dev: true 1527 | 1528 | /has-proto/1.0.1: 1529 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1530 | engines: {node: '>= 0.4'} 1531 | dev: true 1532 | 1533 | /has-symbols/1.0.3: 1534 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1535 | engines: {node: '>= 0.4'} 1536 | dev: true 1537 | 1538 | /has-tostringtag/1.0.0: 1539 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1540 | engines: {node: '>= 0.4'} 1541 | dependencies: 1542 | has-symbols: 1.0.3 1543 | dev: true 1544 | 1545 | /has/1.0.3: 1546 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1547 | engines: {node: '>= 0.4.0'} 1548 | dependencies: 1549 | function-bind: 1.1.1 1550 | 1551 | /ignore/5.2.4: 1552 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1553 | engines: {node: '>= 4'} 1554 | dev: true 1555 | 1556 | /import-fresh/3.3.0: 1557 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1558 | engines: {node: '>=6'} 1559 | dependencies: 1560 | parent-module: 1.0.1 1561 | resolve-from: 4.0.0 1562 | dev: true 1563 | 1564 | /imurmurhash/0.1.4: 1565 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1566 | engines: {node: '>=0.8.19'} 1567 | dev: true 1568 | 1569 | /inflight/1.0.6: 1570 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1571 | dependencies: 1572 | once: 1.4.0 1573 | wrappy: 1.0.2 1574 | dev: true 1575 | 1576 | /inherits/2.0.4: 1577 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1578 | dev: true 1579 | 1580 | /internal-slot/1.0.5: 1581 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 1582 | engines: {node: '>= 0.4'} 1583 | dependencies: 1584 | get-intrinsic: 1.2.0 1585 | has: 1.0.3 1586 | side-channel: 1.0.4 1587 | dev: true 1588 | 1589 | /is-arguments/1.1.1: 1590 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 1591 | engines: {node: '>= 0.4'} 1592 | dependencies: 1593 | call-bind: 1.0.2 1594 | has-tostringtag: 1.0.0 1595 | dev: true 1596 | 1597 | /is-array-buffer/3.0.1: 1598 | resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} 1599 | dependencies: 1600 | call-bind: 1.0.2 1601 | get-intrinsic: 1.2.0 1602 | is-typed-array: 1.1.10 1603 | dev: true 1604 | 1605 | /is-bigint/1.0.4: 1606 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1607 | dependencies: 1608 | has-bigints: 1.0.2 1609 | dev: true 1610 | 1611 | /is-binary-path/2.1.0: 1612 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1613 | engines: {node: '>=8'} 1614 | dependencies: 1615 | binary-extensions: 2.2.0 1616 | 1617 | /is-boolean-object/1.1.2: 1618 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1619 | engines: {node: '>= 0.4'} 1620 | dependencies: 1621 | call-bind: 1.0.2 1622 | has-tostringtag: 1.0.0 1623 | dev: true 1624 | 1625 | /is-callable/1.2.7: 1626 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1627 | engines: {node: '>= 0.4'} 1628 | dev: true 1629 | 1630 | /is-core-module/2.11.0: 1631 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1632 | dependencies: 1633 | has: 1.0.3 1634 | 1635 | /is-date-object/1.0.5: 1636 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1637 | engines: {node: '>= 0.4'} 1638 | dependencies: 1639 | has-tostringtag: 1.0.0 1640 | dev: true 1641 | 1642 | /is-docker/2.2.1: 1643 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 1644 | engines: {node: '>=8'} 1645 | hasBin: true 1646 | dev: true 1647 | 1648 | /is-extglob/2.1.1: 1649 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1650 | engines: {node: '>=0.10.0'} 1651 | 1652 | /is-glob/4.0.3: 1653 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1654 | engines: {node: '>=0.10.0'} 1655 | dependencies: 1656 | is-extglob: 2.1.1 1657 | 1658 | /is-map/2.0.2: 1659 | resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} 1660 | dev: true 1661 | 1662 | /is-negative-zero/2.0.2: 1663 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1664 | engines: {node: '>= 0.4'} 1665 | dev: true 1666 | 1667 | /is-number-object/1.0.7: 1668 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1669 | engines: {node: '>= 0.4'} 1670 | dependencies: 1671 | has-tostringtag: 1.0.0 1672 | dev: true 1673 | 1674 | /is-number/7.0.0: 1675 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1676 | engines: {node: '>=0.12.0'} 1677 | 1678 | /is-path-inside/3.0.3: 1679 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1680 | engines: {node: '>=8'} 1681 | dev: true 1682 | 1683 | /is-regex/1.1.4: 1684 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1685 | engines: {node: '>= 0.4'} 1686 | dependencies: 1687 | call-bind: 1.0.2 1688 | has-tostringtag: 1.0.0 1689 | dev: true 1690 | 1691 | /is-set/2.0.2: 1692 | resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} 1693 | dev: true 1694 | 1695 | /is-shared-array-buffer/1.0.2: 1696 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1697 | dependencies: 1698 | call-bind: 1.0.2 1699 | dev: true 1700 | 1701 | /is-string/1.0.7: 1702 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1703 | engines: {node: '>= 0.4'} 1704 | dependencies: 1705 | has-tostringtag: 1.0.0 1706 | dev: true 1707 | 1708 | /is-symbol/1.0.4: 1709 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1710 | engines: {node: '>= 0.4'} 1711 | dependencies: 1712 | has-symbols: 1.0.3 1713 | dev: true 1714 | 1715 | /is-typed-array/1.1.10: 1716 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} 1717 | engines: {node: '>= 0.4'} 1718 | dependencies: 1719 | available-typed-arrays: 1.0.5 1720 | call-bind: 1.0.2 1721 | for-each: 0.3.3 1722 | gopd: 1.0.1 1723 | has-tostringtag: 1.0.0 1724 | dev: true 1725 | 1726 | /is-weakmap/2.0.1: 1727 | resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} 1728 | dev: true 1729 | 1730 | /is-weakref/1.0.2: 1731 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1732 | dependencies: 1733 | call-bind: 1.0.2 1734 | dev: true 1735 | 1736 | /is-weakset/2.0.2: 1737 | resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} 1738 | dependencies: 1739 | call-bind: 1.0.2 1740 | get-intrinsic: 1.2.0 1741 | dev: true 1742 | 1743 | /is-wsl/2.2.0: 1744 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 1745 | engines: {node: '>=8'} 1746 | dependencies: 1747 | is-docker: 2.2.1 1748 | dev: true 1749 | 1750 | /isarray/2.0.5: 1751 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1752 | dev: true 1753 | 1754 | /isexe/2.0.0: 1755 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1756 | dev: true 1757 | 1758 | /js-sdsl/4.3.0: 1759 | resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} 1760 | dev: true 1761 | 1762 | /js-tokens/4.0.0: 1763 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1764 | 1765 | /js-yaml/4.1.0: 1766 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1767 | hasBin: true 1768 | dependencies: 1769 | argparse: 2.0.1 1770 | dev: true 1771 | 1772 | /json-schema-traverse/0.4.1: 1773 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1774 | dev: true 1775 | 1776 | /json-stable-stringify-without-jsonify/1.0.1: 1777 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1778 | dev: true 1779 | 1780 | /json5/1.0.2: 1781 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1782 | hasBin: true 1783 | dependencies: 1784 | minimist: 1.2.8 1785 | dev: true 1786 | 1787 | /jsx-ast-utils/3.3.3: 1788 | resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} 1789 | engines: {node: '>=4.0'} 1790 | dependencies: 1791 | array-includes: 3.1.6 1792 | object.assign: 4.1.4 1793 | dev: true 1794 | 1795 | /language-subtag-registry/0.3.22: 1796 | resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} 1797 | dev: true 1798 | 1799 | /language-tags/1.0.5: 1800 | resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} 1801 | dependencies: 1802 | language-subtag-registry: 0.3.22 1803 | dev: true 1804 | 1805 | /levn/0.4.1: 1806 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1807 | engines: {node: '>= 0.8.0'} 1808 | dependencies: 1809 | prelude-ls: 1.2.1 1810 | type-check: 0.4.0 1811 | dev: true 1812 | 1813 | /lilconfig/2.0.6: 1814 | resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} 1815 | engines: {node: '>=10'} 1816 | 1817 | /locate-path/6.0.0: 1818 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1819 | engines: {node: '>=10'} 1820 | dependencies: 1821 | p-locate: 5.0.0 1822 | dev: true 1823 | 1824 | /lodash.merge/4.6.2: 1825 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1826 | dev: true 1827 | 1828 | /loose-envify/1.4.0: 1829 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1830 | hasBin: true 1831 | dependencies: 1832 | js-tokens: 4.0.0 1833 | 1834 | /lru-cache/6.0.0: 1835 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1836 | engines: {node: '>=10'} 1837 | dependencies: 1838 | yallist: 4.0.0 1839 | dev: true 1840 | 1841 | /merge2/1.4.1: 1842 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1843 | engines: {node: '>= 8'} 1844 | 1845 | /micromatch/4.0.5: 1846 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1847 | engines: {node: '>=8.6'} 1848 | dependencies: 1849 | braces: 3.0.2 1850 | picomatch: 2.3.1 1851 | 1852 | /minimatch/3.1.2: 1853 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1854 | dependencies: 1855 | brace-expansion: 1.1.11 1856 | dev: true 1857 | 1858 | /minimist/1.2.8: 1859 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1860 | 1861 | /moderndash/0.14.1: 1862 | resolution: {integrity: sha512-7ZqM4bNQpaCS8KtEs0nq9QjrSAyXtUFoaK9CI5+Mhys6pI+Qw6IDRUyRsBsN158pULykcvrRCVo/JurBY4JkYA==} 1863 | engines: {node: '>=19.x.x', npm: '>=8.x.x'} 1864 | dev: false 1865 | 1866 | /monaco-editor/0.35.0: 1867 | resolution: {integrity: sha512-BJfkAZ0EJ7JgrgWzqjfBNP9hPSS8NlfECEDMEIIiozV2UaPq22yeuOjgbd3TwMh3anH0krWZirXZfn8KUSxiOA==} 1868 | dev: false 1869 | 1870 | /ms/2.1.2: 1871 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1872 | dev: true 1873 | 1874 | /ms/2.1.3: 1875 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1876 | dev: true 1877 | 1878 | /nanoid/3.3.4: 1879 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1880 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1881 | hasBin: true 1882 | 1883 | /natural-compare-lite/1.4.0: 1884 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1885 | dev: true 1886 | 1887 | /natural-compare/1.4.0: 1888 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1889 | dev: true 1890 | 1891 | /next/13.1.6_biqbaboplfbrettd7655fr4n2y: 1892 | resolution: {integrity: sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw==} 1893 | engines: {node: '>=14.6.0'} 1894 | hasBin: true 1895 | peerDependencies: 1896 | fibers: '>= 3.1.0' 1897 | node-sass: ^6.0.0 || ^7.0.0 1898 | react: ^18.2.0 1899 | react-dom: ^18.2.0 1900 | sass: ^1.3.0 1901 | peerDependenciesMeta: 1902 | fibers: 1903 | optional: true 1904 | node-sass: 1905 | optional: true 1906 | sass: 1907 | optional: true 1908 | dependencies: 1909 | '@next/env': 13.1.6 1910 | '@swc/helpers': 0.4.14 1911 | caniuse-lite: 1.0.30001451 1912 | postcss: 8.4.14 1913 | react: 18.2.0 1914 | react-dom: 18.2.0_react@18.2.0 1915 | styled-jsx: 5.1.1_react@18.2.0 1916 | optionalDependencies: 1917 | '@next/swc-android-arm-eabi': 13.1.6 1918 | '@next/swc-android-arm64': 13.1.6 1919 | '@next/swc-darwin-arm64': 13.1.6 1920 | '@next/swc-darwin-x64': 13.1.6 1921 | '@next/swc-freebsd-x64': 13.1.6 1922 | '@next/swc-linux-arm-gnueabihf': 13.1.6 1923 | '@next/swc-linux-arm64-gnu': 13.1.6 1924 | '@next/swc-linux-arm64-musl': 13.1.6 1925 | '@next/swc-linux-x64-gnu': 13.1.6 1926 | '@next/swc-linux-x64-musl': 13.1.6 1927 | '@next/swc-win32-arm64-msvc': 13.1.6 1928 | '@next/swc-win32-ia32-msvc': 13.1.6 1929 | '@next/swc-win32-x64-msvc': 13.1.6 1930 | transitivePeerDependencies: 1931 | - '@babel/core' 1932 | - babel-plugin-macros 1933 | dev: false 1934 | 1935 | /node-releases/2.0.10: 1936 | resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} 1937 | dev: true 1938 | 1939 | /normalize-path/3.0.0: 1940 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1941 | engines: {node: '>=0.10.0'} 1942 | 1943 | /normalize-range/0.1.2: 1944 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1945 | engines: {node: '>=0.10.0'} 1946 | dev: true 1947 | 1948 | /object-assign/4.1.1: 1949 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1950 | engines: {node: '>=0.10.0'} 1951 | 1952 | /object-hash/3.0.0: 1953 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1954 | engines: {node: '>= 6'} 1955 | 1956 | /object-inspect/1.12.3: 1957 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1958 | dev: true 1959 | 1960 | /object-is/1.1.5: 1961 | resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} 1962 | engines: {node: '>= 0.4'} 1963 | dependencies: 1964 | call-bind: 1.0.2 1965 | define-properties: 1.1.4 1966 | dev: true 1967 | 1968 | /object-keys/1.1.1: 1969 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1970 | engines: {node: '>= 0.4'} 1971 | dev: true 1972 | 1973 | /object.assign/4.1.4: 1974 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1975 | engines: {node: '>= 0.4'} 1976 | dependencies: 1977 | call-bind: 1.0.2 1978 | define-properties: 1.1.4 1979 | has-symbols: 1.0.3 1980 | object-keys: 1.1.1 1981 | dev: true 1982 | 1983 | /object.entries/1.1.6: 1984 | resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} 1985 | engines: {node: '>= 0.4'} 1986 | dependencies: 1987 | call-bind: 1.0.2 1988 | define-properties: 1.1.4 1989 | es-abstract: 1.21.1 1990 | dev: true 1991 | 1992 | /object.fromentries/2.0.6: 1993 | resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} 1994 | engines: {node: '>= 0.4'} 1995 | dependencies: 1996 | call-bind: 1.0.2 1997 | define-properties: 1.1.4 1998 | es-abstract: 1.21.1 1999 | dev: true 2000 | 2001 | /object.hasown/1.1.2: 2002 | resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} 2003 | dependencies: 2004 | define-properties: 1.1.4 2005 | es-abstract: 1.21.1 2006 | dev: true 2007 | 2008 | /object.values/1.1.6: 2009 | resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} 2010 | engines: {node: '>= 0.4'} 2011 | dependencies: 2012 | call-bind: 1.0.2 2013 | define-properties: 1.1.4 2014 | es-abstract: 1.21.1 2015 | dev: true 2016 | 2017 | /once/1.4.0: 2018 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2019 | dependencies: 2020 | wrappy: 1.0.2 2021 | dev: true 2022 | 2023 | /open/8.4.1: 2024 | resolution: {integrity: sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==} 2025 | engines: {node: '>=12'} 2026 | dependencies: 2027 | define-lazy-prop: 2.0.0 2028 | is-docker: 2.2.1 2029 | is-wsl: 2.2.0 2030 | dev: true 2031 | 2032 | /optionator/0.9.1: 2033 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2034 | engines: {node: '>= 0.8.0'} 2035 | dependencies: 2036 | deep-is: 0.1.4 2037 | fast-levenshtein: 2.0.6 2038 | levn: 0.4.1 2039 | prelude-ls: 1.2.1 2040 | type-check: 0.4.0 2041 | word-wrap: 1.2.3 2042 | dev: true 2043 | 2044 | /p-limit/3.1.0: 2045 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2046 | engines: {node: '>=10'} 2047 | dependencies: 2048 | yocto-queue: 0.1.0 2049 | dev: true 2050 | 2051 | /p-locate/5.0.0: 2052 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2053 | engines: {node: '>=10'} 2054 | dependencies: 2055 | p-limit: 3.1.0 2056 | dev: true 2057 | 2058 | /parent-module/1.0.1: 2059 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2060 | engines: {node: '>=6'} 2061 | dependencies: 2062 | callsites: 3.1.0 2063 | dev: true 2064 | 2065 | /path-exists/4.0.0: 2066 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2067 | engines: {node: '>=8'} 2068 | dev: true 2069 | 2070 | /path-is-absolute/1.0.1: 2071 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2072 | engines: {node: '>=0.10.0'} 2073 | dev: true 2074 | 2075 | /path-key/3.1.1: 2076 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2077 | engines: {node: '>=8'} 2078 | dev: true 2079 | 2080 | /path-parse/1.0.7: 2081 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2082 | 2083 | /path-type/4.0.0: 2084 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2085 | engines: {node: '>=8'} 2086 | dev: true 2087 | 2088 | /picocolors/1.0.0: 2089 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2090 | 2091 | /picomatch/2.3.1: 2092 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2093 | engines: {node: '>=8.6'} 2094 | 2095 | /pify/2.3.0: 2096 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2097 | engines: {node: '>=0.10.0'} 2098 | 2099 | /postcss-import/14.1.0_postcss@8.4.21: 2100 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 2101 | engines: {node: '>=10.0.0'} 2102 | peerDependencies: 2103 | postcss: ^8.0.0 2104 | dependencies: 2105 | postcss: 8.4.21 2106 | postcss-value-parser: 4.2.0 2107 | read-cache: 1.0.0 2108 | resolve: 1.22.1 2109 | 2110 | /postcss-js/4.0.1_postcss@8.4.21: 2111 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 2112 | engines: {node: ^12 || ^14 || >= 16} 2113 | peerDependencies: 2114 | postcss: ^8.4.21 2115 | dependencies: 2116 | camelcase-css: 2.0.1 2117 | postcss: 8.4.21 2118 | 2119 | /postcss-load-config/3.1.4_postcss@8.4.21: 2120 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 2121 | engines: {node: '>= 10'} 2122 | peerDependencies: 2123 | postcss: '>=8.0.9' 2124 | ts-node: '>=9.0.0' 2125 | peerDependenciesMeta: 2126 | postcss: 2127 | optional: true 2128 | ts-node: 2129 | optional: true 2130 | dependencies: 2131 | lilconfig: 2.0.6 2132 | postcss: 8.4.21 2133 | yaml: 1.10.2 2134 | 2135 | /postcss-nested/6.0.0_postcss@8.4.21: 2136 | resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} 2137 | engines: {node: '>=12.0'} 2138 | peerDependencies: 2139 | postcss: ^8.2.14 2140 | dependencies: 2141 | postcss: 8.4.21 2142 | postcss-selector-parser: 6.0.11 2143 | 2144 | /postcss-selector-parser/6.0.11: 2145 | resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} 2146 | engines: {node: '>=4'} 2147 | dependencies: 2148 | cssesc: 3.0.0 2149 | util-deprecate: 1.0.2 2150 | 2151 | /postcss-value-parser/4.2.0: 2152 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2153 | 2154 | /postcss/8.4.14: 2155 | resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 2156 | engines: {node: ^10 || ^12 || >=14} 2157 | dependencies: 2158 | nanoid: 3.3.4 2159 | picocolors: 1.0.0 2160 | source-map-js: 1.0.2 2161 | dev: false 2162 | 2163 | /postcss/8.4.21: 2164 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 2165 | engines: {node: ^10 || ^12 || >=14} 2166 | dependencies: 2167 | nanoid: 3.3.4 2168 | picocolors: 1.0.0 2169 | source-map-js: 1.0.2 2170 | 2171 | /prelude-ls/1.2.1: 2172 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2173 | engines: {node: '>= 0.8.0'} 2174 | dev: true 2175 | 2176 | /prettier-plugin-tailwindcss/0.2.2_prettier@2.8.4: 2177 | resolution: {integrity: sha512-5RjUbWRe305pUpc48MosoIp6uxZvZxrM6GyOgsbGLTce+ehePKNm7ziW2dLG2air9aXbGuXlHVSQQw4Lbosq3w==} 2178 | engines: {node: '>=12.17.0'} 2179 | peerDependencies: 2180 | '@prettier/plugin-php': '*' 2181 | '@prettier/plugin-pug': '*' 2182 | '@shopify/prettier-plugin-liquid': '*' 2183 | '@shufo/prettier-plugin-blade': '*' 2184 | '@trivago/prettier-plugin-sort-imports': '*' 2185 | prettier: '>=2.2.0' 2186 | prettier-plugin-astro: '*' 2187 | prettier-plugin-css-order: '*' 2188 | prettier-plugin-import-sort: '*' 2189 | prettier-plugin-jsdoc: '*' 2190 | prettier-plugin-organize-attributes: '*' 2191 | prettier-plugin-organize-imports: '*' 2192 | prettier-plugin-style-order: '*' 2193 | prettier-plugin-svelte: '*' 2194 | prettier-plugin-twig-melody: '*' 2195 | peerDependenciesMeta: 2196 | '@prettier/plugin-php': 2197 | optional: true 2198 | '@prettier/plugin-pug': 2199 | optional: true 2200 | '@shopify/prettier-plugin-liquid': 2201 | optional: true 2202 | '@shufo/prettier-plugin-blade': 2203 | optional: true 2204 | '@trivago/prettier-plugin-sort-imports': 2205 | optional: true 2206 | prettier-plugin-astro: 2207 | optional: true 2208 | prettier-plugin-css-order: 2209 | optional: true 2210 | prettier-plugin-import-sort: 2211 | optional: true 2212 | prettier-plugin-jsdoc: 2213 | optional: true 2214 | prettier-plugin-organize-attributes: 2215 | optional: true 2216 | prettier-plugin-organize-imports: 2217 | optional: true 2218 | prettier-plugin-style-order: 2219 | optional: true 2220 | prettier-plugin-svelte: 2221 | optional: true 2222 | prettier-plugin-twig-melody: 2223 | optional: true 2224 | dependencies: 2225 | prettier: 2.8.4 2226 | dev: true 2227 | 2228 | /prettier/2.8.4: 2229 | resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} 2230 | engines: {node: '>=10.13.0'} 2231 | hasBin: true 2232 | dev: true 2233 | 2234 | /prop-types/15.8.1: 2235 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 2236 | dependencies: 2237 | loose-envify: 1.4.0 2238 | object-assign: 4.1.1 2239 | react-is: 16.13.1 2240 | 2241 | /punycode/2.3.0: 2242 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2243 | engines: {node: '>=6'} 2244 | dev: true 2245 | 2246 | /queue-microtask/1.2.3: 2247 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2248 | 2249 | /quick-lru/5.1.1: 2250 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 2251 | engines: {node: '>=10'} 2252 | 2253 | /react-dom/18.2.0_react@18.2.0: 2254 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2255 | peerDependencies: 2256 | react: ^18.2.0 2257 | dependencies: 2258 | loose-envify: 1.4.0 2259 | react: 18.2.0 2260 | scheduler: 0.23.0 2261 | dev: false 2262 | 2263 | /react-icons/4.7.1_react@18.2.0: 2264 | resolution: {integrity: sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw==} 2265 | peerDependencies: 2266 | react: '*' 2267 | dependencies: 2268 | react: 18.2.0 2269 | dev: false 2270 | 2271 | /react-is/16.13.1: 2272 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 2273 | 2274 | /react/18.2.0: 2275 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2276 | engines: {node: '>=0.10.0'} 2277 | dependencies: 2278 | loose-envify: 1.4.0 2279 | dev: false 2280 | 2281 | /read-cache/1.0.0: 2282 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2283 | dependencies: 2284 | pify: 2.3.0 2285 | 2286 | /readdirp/3.6.0: 2287 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2288 | engines: {node: '>=8.10.0'} 2289 | dependencies: 2290 | picomatch: 2.3.1 2291 | 2292 | /regenerator-runtime/0.13.11: 2293 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} 2294 | dev: true 2295 | 2296 | /regexp.prototype.flags/1.4.3: 2297 | resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} 2298 | engines: {node: '>= 0.4'} 2299 | dependencies: 2300 | call-bind: 1.0.2 2301 | define-properties: 1.1.4 2302 | functions-have-names: 1.2.3 2303 | dev: true 2304 | 2305 | /regexpp/3.2.0: 2306 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2307 | engines: {node: '>=8'} 2308 | dev: true 2309 | 2310 | /resolve-from/4.0.0: 2311 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2312 | engines: {node: '>=4'} 2313 | dev: true 2314 | 2315 | /resolve/1.22.1: 2316 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 2317 | hasBin: true 2318 | dependencies: 2319 | is-core-module: 2.11.0 2320 | path-parse: 1.0.7 2321 | supports-preserve-symlinks-flag: 1.0.0 2322 | 2323 | /resolve/2.0.0-next.4: 2324 | resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} 2325 | hasBin: true 2326 | dependencies: 2327 | is-core-module: 2.11.0 2328 | path-parse: 1.0.7 2329 | supports-preserve-symlinks-flag: 1.0.0 2330 | dev: true 2331 | 2332 | /reusify/1.0.4: 2333 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2334 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2335 | 2336 | /rimraf/3.0.2: 2337 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2338 | hasBin: true 2339 | dependencies: 2340 | glob: 7.2.3 2341 | dev: true 2342 | 2343 | /run-parallel/1.2.0: 2344 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2345 | dependencies: 2346 | queue-microtask: 1.2.3 2347 | 2348 | /safe-regex-test/1.0.0: 2349 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 2350 | dependencies: 2351 | call-bind: 1.0.2 2352 | get-intrinsic: 1.2.0 2353 | is-regex: 1.1.4 2354 | dev: true 2355 | 2356 | /scheduler/0.23.0: 2357 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2358 | dependencies: 2359 | loose-envify: 1.4.0 2360 | dev: false 2361 | 2362 | /semver/6.3.0: 2363 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 2364 | hasBin: true 2365 | dev: true 2366 | 2367 | /semver/7.3.8: 2368 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 2369 | engines: {node: '>=10'} 2370 | hasBin: true 2371 | dependencies: 2372 | lru-cache: 6.0.0 2373 | dev: true 2374 | 2375 | /shebang-command/2.0.0: 2376 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2377 | engines: {node: '>=8'} 2378 | dependencies: 2379 | shebang-regex: 3.0.0 2380 | dev: true 2381 | 2382 | /shebang-regex/3.0.0: 2383 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2384 | engines: {node: '>=8'} 2385 | dev: true 2386 | 2387 | /side-channel/1.0.4: 2388 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2389 | dependencies: 2390 | call-bind: 1.0.2 2391 | get-intrinsic: 1.2.0 2392 | object-inspect: 1.12.3 2393 | dev: true 2394 | 2395 | /slash/3.0.0: 2396 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2397 | engines: {node: '>=8'} 2398 | dev: true 2399 | 2400 | /slash/4.0.0: 2401 | resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} 2402 | engines: {node: '>=12'} 2403 | dev: true 2404 | 2405 | /source-map-js/1.0.2: 2406 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2407 | engines: {node: '>=0.10.0'} 2408 | 2409 | /state-local/1.0.7: 2410 | resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} 2411 | dev: false 2412 | 2413 | /stop-iteration-iterator/1.0.0: 2414 | resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} 2415 | engines: {node: '>= 0.4'} 2416 | dependencies: 2417 | internal-slot: 1.0.5 2418 | dev: true 2419 | 2420 | /string.prototype.matchall/4.0.8: 2421 | resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} 2422 | dependencies: 2423 | call-bind: 1.0.2 2424 | define-properties: 1.1.4 2425 | es-abstract: 1.21.1 2426 | get-intrinsic: 1.2.0 2427 | has-symbols: 1.0.3 2428 | internal-slot: 1.0.5 2429 | regexp.prototype.flags: 1.4.3 2430 | side-channel: 1.0.4 2431 | dev: true 2432 | 2433 | /string.prototype.trimend/1.0.6: 2434 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 2435 | dependencies: 2436 | call-bind: 1.0.2 2437 | define-properties: 1.1.4 2438 | es-abstract: 1.21.1 2439 | dev: true 2440 | 2441 | /string.prototype.trimstart/1.0.6: 2442 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 2443 | dependencies: 2444 | call-bind: 1.0.2 2445 | define-properties: 1.1.4 2446 | es-abstract: 1.21.1 2447 | dev: true 2448 | 2449 | /strip-ansi/6.0.1: 2450 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2451 | engines: {node: '>=8'} 2452 | dependencies: 2453 | ansi-regex: 5.0.1 2454 | dev: true 2455 | 2456 | /strip-bom/3.0.0: 2457 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2458 | engines: {node: '>=4'} 2459 | dev: true 2460 | 2461 | /strip-json-comments/3.1.1: 2462 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2463 | engines: {node: '>=8'} 2464 | dev: true 2465 | 2466 | /styled-jsx/5.1.1_react@18.2.0: 2467 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 2468 | engines: {node: '>= 12.0.0'} 2469 | peerDependencies: 2470 | '@babel/core': '*' 2471 | babel-plugin-macros: '*' 2472 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 2473 | peerDependenciesMeta: 2474 | '@babel/core': 2475 | optional: true 2476 | babel-plugin-macros: 2477 | optional: true 2478 | dependencies: 2479 | client-only: 0.0.1 2480 | react: 18.2.0 2481 | dev: false 2482 | 2483 | /supports-color/7.2.0: 2484 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2485 | engines: {node: '>=8'} 2486 | dependencies: 2487 | has-flag: 4.0.0 2488 | dev: true 2489 | 2490 | /supports-preserve-symlinks-flag/1.0.0: 2491 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2492 | engines: {node: '>= 0.4'} 2493 | 2494 | /synckit/0.8.5: 2495 | resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} 2496 | engines: {node: ^14.18.0 || >=16.0.0} 2497 | dependencies: 2498 | '@pkgr/utils': 2.3.1 2499 | tslib: 2.5.0 2500 | dev: true 2501 | 2502 | /tailwind-scrollbar/2.1.0_tailwindcss@3.2.6: 2503 | resolution: {integrity: sha512-zpvY5mDs0130YzYjZKBiDaw32rygxk5RyJ4KmeHjGnwkvbjm/PszON1m4Bbt2DkMRIXlXsfNevykAESgURN4KA==} 2504 | engines: {node: '>=12.13.0'} 2505 | peerDependencies: 2506 | tailwindcss: 3.x 2507 | dependencies: 2508 | tailwindcss: 3.2.6_postcss@8.4.21 2509 | dev: false 2510 | 2511 | /tailwindcss/3.2.6_postcss@8.4.21: 2512 | resolution: {integrity: sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==} 2513 | engines: {node: '>=12.13.0'} 2514 | hasBin: true 2515 | peerDependencies: 2516 | postcss: ^8.0.9 2517 | dependencies: 2518 | arg: 5.0.2 2519 | chokidar: 3.5.3 2520 | color-name: 1.1.4 2521 | detective: 5.2.1 2522 | didyoumean: 1.2.2 2523 | dlv: 1.1.3 2524 | fast-glob: 3.2.12 2525 | glob-parent: 6.0.2 2526 | is-glob: 4.0.3 2527 | lilconfig: 2.0.6 2528 | micromatch: 4.0.5 2529 | normalize-path: 3.0.0 2530 | object-hash: 3.0.0 2531 | picocolors: 1.0.0 2532 | postcss: 8.4.21 2533 | postcss-import: 14.1.0_postcss@8.4.21 2534 | postcss-js: 4.0.1_postcss@8.4.21 2535 | postcss-load-config: 3.1.4_postcss@8.4.21 2536 | postcss-nested: 6.0.0_postcss@8.4.21 2537 | postcss-selector-parser: 6.0.11 2538 | postcss-value-parser: 4.2.0 2539 | quick-lru: 5.1.1 2540 | resolve: 1.22.1 2541 | transitivePeerDependencies: 2542 | - ts-node 2543 | 2544 | /tapable/2.2.1: 2545 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 2546 | engines: {node: '>=6'} 2547 | dev: true 2548 | 2549 | /text-table/0.2.0: 2550 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2551 | dev: true 2552 | 2553 | /tiny-glob/0.2.9: 2554 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 2555 | dependencies: 2556 | globalyzer: 0.1.0 2557 | globrex: 0.1.2 2558 | dev: true 2559 | 2560 | /to-regex-range/5.0.1: 2561 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2562 | engines: {node: '>=8.0'} 2563 | dependencies: 2564 | is-number: 7.0.0 2565 | 2566 | /tsconfig-paths/3.14.1: 2567 | resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} 2568 | dependencies: 2569 | '@types/json5': 0.0.29 2570 | json5: 1.0.2 2571 | minimist: 1.2.8 2572 | strip-bom: 3.0.0 2573 | dev: true 2574 | 2575 | /tslib/1.14.1: 2576 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2577 | dev: true 2578 | 2579 | /tslib/2.5.0: 2580 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 2581 | 2582 | /tsutils/3.21.0_typescript@4.9.5: 2583 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2584 | engines: {node: '>= 6'} 2585 | peerDependencies: 2586 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2587 | dependencies: 2588 | tslib: 1.14.1 2589 | typescript: 4.9.5 2590 | dev: true 2591 | 2592 | /type-check/0.4.0: 2593 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2594 | engines: {node: '>= 0.8.0'} 2595 | dependencies: 2596 | prelude-ls: 1.2.1 2597 | dev: true 2598 | 2599 | /type-fest/0.20.2: 2600 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2601 | engines: {node: '>=10'} 2602 | dev: true 2603 | 2604 | /typed-array-length/1.0.4: 2605 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 2606 | dependencies: 2607 | call-bind: 1.0.2 2608 | for-each: 0.3.3 2609 | is-typed-array: 1.1.10 2610 | dev: true 2611 | 2612 | /typescript/4.9.5: 2613 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 2614 | engines: {node: '>=4.2.0'} 2615 | hasBin: true 2616 | dev: true 2617 | 2618 | /unbox-primitive/1.0.2: 2619 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2620 | dependencies: 2621 | call-bind: 1.0.2 2622 | has-bigints: 1.0.2 2623 | has-symbols: 1.0.3 2624 | which-boxed-primitive: 1.0.2 2625 | dev: true 2626 | 2627 | /update-browserslist-db/1.0.10_browserslist@4.21.5: 2628 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 2629 | hasBin: true 2630 | peerDependencies: 2631 | browserslist: '>= 4.21.0' 2632 | dependencies: 2633 | browserslist: 4.21.5 2634 | escalade: 3.1.1 2635 | picocolors: 1.0.0 2636 | dev: true 2637 | 2638 | /uri-js/4.4.1: 2639 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2640 | dependencies: 2641 | punycode: 2.3.0 2642 | dev: true 2643 | 2644 | /use-sync-external-store/1.2.0_react@18.2.0: 2645 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 2646 | peerDependencies: 2647 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2648 | dependencies: 2649 | react: 18.2.0 2650 | dev: false 2651 | 2652 | /util-deprecate/1.0.2: 2653 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2654 | 2655 | /which-boxed-primitive/1.0.2: 2656 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2657 | dependencies: 2658 | is-bigint: 1.0.4 2659 | is-boolean-object: 1.1.2 2660 | is-number-object: 1.0.7 2661 | is-string: 1.0.7 2662 | is-symbol: 1.0.4 2663 | dev: true 2664 | 2665 | /which-collection/1.0.1: 2666 | resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} 2667 | dependencies: 2668 | is-map: 2.0.2 2669 | is-set: 2.0.2 2670 | is-weakmap: 2.0.1 2671 | is-weakset: 2.0.2 2672 | dev: true 2673 | 2674 | /which-typed-array/1.1.9: 2675 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} 2676 | engines: {node: '>= 0.4'} 2677 | dependencies: 2678 | available-typed-arrays: 1.0.5 2679 | call-bind: 1.0.2 2680 | for-each: 0.3.3 2681 | gopd: 1.0.1 2682 | has-tostringtag: 1.0.0 2683 | is-typed-array: 1.1.10 2684 | dev: true 2685 | 2686 | /which/2.0.2: 2687 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2688 | engines: {node: '>= 8'} 2689 | hasBin: true 2690 | dependencies: 2691 | isexe: 2.0.0 2692 | dev: true 2693 | 2694 | /word-wrap/1.2.3: 2695 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2696 | engines: {node: '>=0.10.0'} 2697 | dev: true 2698 | 2699 | /wrappy/1.0.2: 2700 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2701 | dev: true 2702 | 2703 | /xtend/4.0.2: 2704 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2705 | engines: {node: '>=0.4'} 2706 | 2707 | /yallist/4.0.0: 2708 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2709 | dev: true 2710 | 2711 | /yaml/1.10.2: 2712 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2713 | engines: {node: '>= 6'} 2714 | 2715 | /yocto-queue/0.1.0: 2716 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2717 | engines: {node: '>=10'} 2718 | dev: true 2719 | 2720 | /zod/3.20.6: 2721 | resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==} 2722 | dev: false 2723 | 2724 | /zustand/4.3.2_react@18.2.0: 2725 | resolution: {integrity: sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==} 2726 | engines: {node: '>=12.7.0'} 2727 | peerDependencies: 2728 | immer: '>=9.0' 2729 | react: '>=16.8' 2730 | peerDependenciesMeta: 2731 | immer: 2732 | optional: true 2733 | react: 2734 | optional: true 2735 | dependencies: 2736 | react: 18.2.0 2737 | use-sync-external-store: 1.2.0_react@18.2.0 2738 | dev: false 2739 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /prettier.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import("prettier").Config} */ 2 | module.exports = { 3 | plugins: [require.resolve("prettier-plugin-tailwindcss")], 4 | }; 5 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rvdende/surrealreact/c5ec72ec4e53dd49b597803d6cec8578406104ae/public/favicon.ico -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rvdende/surrealreact/c5ec72ec4e53dd49b597803d6cec8578406104ae/screenshot.png -------------------------------------------------------------------------------- /src/components/DialogModal.tsx: -------------------------------------------------------------------------------- 1 | import { Dialog, Transition } from "@headlessui/react"; 2 | import { Fragment, ReactNode, useState } from "react"; 3 | import { ExclamationTriangleIcon } from "@heroicons/react/20/solid"; 4 | import { HiXMark } from "react-icons/hi2"; 5 | 6 | export default function DialogModal({ 7 | buttonContents, 8 | children, 9 | }: { 10 | buttonContents: ReactNode; 11 | children: ReactNode; 12 | }) { 13 | const [isOpen, setIsOpen] = useState(false); 14 | 15 | function closeModal() { 16 | setIsOpen(false); 17 | } 18 | 19 | function openModal() { 20 | setIsOpen(true); 21 | } 22 | 23 | return ( 24 | <> 25 |
26 | 29 |
30 | 31 | 32 | 33 | 42 |
43 | 44 | 45 |
46 |
47 | 56 | 57 | 61 | 62 | Delete Item !! 63 | 70 | 71 | 72 | {children} 73 | 74 | 75 |
76 |
77 |
78 |
79 | 80 | ); 81 | } 82 | -------------------------------------------------------------------------------- /src/components/SelectStyled.tsx: -------------------------------------------------------------------------------- 1 | import { Listbox, Transition } from "@headlessui/react"; 2 | import { Fragment } from "react"; 3 | import { HiChevronUpDown, HiXMark } from "react-icons/hi2"; 4 | 5 | export function SelectStyled({ 6 | value, 7 | options, 8 | onChange, 9 | onDelete, 10 | }: { 11 | value: { name: string }; 12 | options: { name: string }[]; 13 | onChange: (value: { name: string }) => void; 14 | onDelete?: (value: { name: string }) => void; 15 | }) { 16 | // const [selectedPerson, setSelectedPerson] = useState(people[0]); 17 | // const [selected, setSelected] = useState(people[0]); 18 | 19 | return ( 20 |
21 | { 24 | onChange(data); 25 | }} 26 | > 27 |
28 | 29 | {value?.name ?? " "} 30 | 31 | 36 | 37 | 43 | 44 | {options.map((item, index) => ( 45 | 48 | `relative cursor-default select-none py-2 px-4 font-bold ${ 49 | active 50 | ? "text-pink-300 hover:bg-purple-400/20" 51 | : "text-zinc-300" 52 | }` 53 | } 54 | value={item} 55 | > 56 | {({ selected }) => ( 57 | <> 58 | 63 | {item.name} 64 | 65 |
66 | {onDelete && ( 67 | 76 | )} 77 | 78 | 79 | )} 80 | 81 | ))} 82 | 83 | 84 |
85 | 86 |
87 | ); 88 | } 89 | -------------------------------------------------------------------------------- /src/components/explorer/Alert.tsx: -------------------------------------------------------------------------------- 1 | export function Alert({ message }: { message: string | null }) { 2 | if (!message) return null; 3 | return ( 4 |
{message}
5 | ); 6 | } 7 | -------------------------------------------------------------------------------- /src/components/explorer/CredentialsList.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | disconnectSurreal, 3 | getSurreal, 4 | useAppState, 5 | } from "../../state/useAppState"; 6 | import { unique } from "moderndash"; 7 | import { SelectStyled } from "../SelectStyled"; 8 | 9 | export function CredentialsList() { 10 | const appstate = useAppState(); 11 | 12 | const options = unique( 13 | appstate.credentialsList.map((c) => ({ name: c.hostname })), 14 | (a, b) => a.name === b.name 15 | ); 16 | 17 | let current = { name: "" }; 18 | 19 | if ( 20 | appstate.credentialsList.filter( 21 | (i) => i.hostname === appstate.credentials.hostname 22 | ).length > 0 23 | ) { 24 | current = { name: appstate.credentials.hostname }; 25 | } 26 | 27 | if (options.length === 0) return null; 28 | 29 | return ( 30 | { 34 | const credentials = appstate.credentialsList.find( 35 | (i) => i.hostname === data.name 36 | ); 37 | console.log(credentials); 38 | appstate.set({ 39 | credentials, 40 | info_kv: null, 41 | info_db: [], 42 | info_ns: [], 43 | info_tb: [], 44 | }); 45 | disconnectSurreal({ silent: true }); 46 | getSurreal(); 47 | appstate.update().catch(console.error); 48 | }} 49 | onDelete={(data) => { 50 | console.log(data); 51 | const credentialsList = structuredClone( 52 | appstate.credentialsList 53 | ).filter((i) => i.hostname !== data.name); 54 | appstate.set({ credentialsList }); 55 | console.log(credentialsList); 56 | }} 57 | /> 58 | ); 59 | } 60 | 61 | // const people = [ 62 | // { name: "Wade Cooper" }, 63 | // { name: "Arlene Mccoy" }, 64 | // { name: "Devon Webb" }, 65 | // { name: "Tom Cook" }, 66 | // { name: "Tanya Fox" }, 67 | // { name: "Hellen Schmidt" }, 68 | // ]; 69 | -------------------------------------------------------------------------------- /src/components/explorer/DBView.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { useRouter } from "next/router"; 3 | import { HiXMark } from "react-icons/hi2"; 4 | import { getSurreal, useAppState } from "../../state/useAppState"; 5 | 6 | import DialogModal from "../DialogModal"; 7 | import { DefineLogin } from "./DefineLogin"; 8 | import { DefineScopes } from "./DefineScopes"; 9 | import { DefineTable } from "./DefineTable"; 10 | import { dbSlugs, TreeItemContent } from "./TreeStructure"; 11 | import { User } from "./User"; 12 | 13 | export function DBView() { 14 | const appstate = useAppState(); 15 | const router = useRouter(); 16 | const slugs = dbSlugs(router.query.slug); 17 | 18 | // const nsinfo = appstate.info_ns.find((i) => i.ns === slugs.ns)?.nsinfo; 19 | 20 | if (!slugs.ns || !slugs.db) return null; 21 | 22 | const dbinfo = appstate.info_db.find( 23 | (i) => i.ns === slugs.ns && i.db === slugs.db 24 | )?.dbinfo; 25 | 26 | return ( 27 |
28 |
29 | 30 | 37 | 38 | 39 |
40 | 41 | 44 | 45 | Delete 46 | 47 | } 48 | > 49 |
50 | Are you sure you want to delete this Data Base 51 |
52 | 73 |
74 |
75 | 76 | 77 | 78 | 79 | 80 |
81 |

Users

82 | 83 |
84 | {dbinfo && 85 | Object.entries(dbinfo.dl).map(([username]) => { 86 | if (!slugs.ns || !slugs.db) return; 87 | return ( 88 | 95 | ); 96 | })} 97 |
98 |
99 | 100 |
101 |
{JSON.stringify(dbinfo, null, 2)}
102 |
103 |
104 | ); 105 | } 106 | -------------------------------------------------------------------------------- /src/components/explorer/DefineDatabase.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { useState } from "react"; 3 | import { getSurreal, useAppState } from "../../state/useAppState"; 4 | 5 | export function DefineDatabase({ ns }: { ns: string }) { 6 | const appstate = useAppState(); 7 | const router = useRouter(); 8 | 9 | const [dbname, setDbname] = useState(""); 10 | 11 | return ( 12 |
13 | 14 |
15 | setDbname(e.target.value)} 19 | /> 20 | 21 | 36 |
37 |
38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /src/components/explorer/DefineLogin.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { getSurreal, useAppState } from "../../state/useAppState"; 3 | import { Alert } from "./Alert"; 4 | 5 | export function DefineLogin({ ns, db }: { ns: string; db?: string }) { 6 | const appstate = useAppState(); 7 | const [name, setname] = useState(""); 8 | const [password, setpassword] = useState(""); 9 | const on = db ? `DATABASE` : "NAMESPACE"; 10 | 11 | const [errormessage, seterrormessage] = useState(null); 12 | 13 | return ( 14 |
15 |
16 |
17 | setname(e.target.value)} 22 | /> 23 |
24 | 25 |
26 | setpassword(e.target.value)} 31 | /> 32 |
33 | 34 |
35 | 54 |
55 |
56 | 57 |
58 | ); 59 | } 60 | -------------------------------------------------------------------------------- /src/components/explorer/DefineNamespace.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { useState } from "react"; 3 | import { getSurreal, useAppState } from "../../state/useAppState"; 4 | 5 | export function DefineNamespace() { 6 | const appstate = useAppState(); 7 | const router = useRouter(); 8 | 9 | const [ns, set_ns] = useState(""); 10 | 11 | return ( 12 |
13 | 14 |
15 | set_ns(e.target.value)} 19 | /> 20 | 21 | 36 |
37 |
38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /src/components/explorer/DefineScopes.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { TypeOf, z } from "zod"; 3 | import { getSurreal, useAppState } from "../../state/useAppState"; 4 | import { buildScopeScript, Duration, durations } from "../../surrealdbjs"; 5 | import { SelectStyled } from "../SelectStyled"; 6 | 7 | export function DefineScopes({ ns, db }: { ns: string; db: string }) { 8 | const appstate = useAppState(); 9 | const [scopeName, setname] = useState("account"); 10 | const [durationNum, setDurationNum] = useState(1); 11 | const [duration, durationSet] = useState(durations[4]); 12 | 13 | const [scriptSignup, setScriptSignup] = useState( 14 | `CREATE scopeusers SET email = $email, pass = crypto::argon2::generate($pass)` 15 | ); 16 | const [scriptSignin, setScriptSignin] = useState( 17 | `SELECT * FROM scopeusers WHERE email = $email AND crypto::argon2::compare(pass, $pass)` 18 | ); 19 | 20 | const generated_script = buildScopeScript({ 21 | ns, 22 | db, 23 | scopeName, 24 | duration, 25 | durationNum, 26 | scriptSignup, 27 | scriptSignin, 28 | }); 29 | 30 | return ( 31 |
32 |

Define Scopes

33 | 34 |
35 |
36 | 37 | 38 | setname(e.target.value)} 42 | /> 43 |
44 | 45 |
46 | 47 |
48 | setDurationNum(e.target.valueAsNumber)} 52 | /> 53 | 54 | ({ name: i.name }))} 57 | onChange={(value) => { 58 | const d = durations.find((i) => i.name === value.name); 59 | if (d) durationSet(d); 60 | }} 61 | /> 62 |
63 |
64 |
65 | 66 | 67 | setScriptSignup(e.target.value)} 71 | /> 72 | 73 | 74 | setScriptSignin(e.target.value)} 78 | /> 79 | 80 | 94 | 95 |
{generated_script}
96 |
97 | ); 98 | } 99 | -------------------------------------------------------------------------------- /src/components/explorer/DefineTable.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { useState } from "react"; 3 | import { getSurreal, useAppState } from "../../state/useAppState"; 4 | 5 | export function DefineTable({ ns, db }: { ns: string; db: string }) { 6 | const appstate = useAppState(); 7 | const router = useRouter(); 8 | const [name, setname] = useState(""); 9 | 10 | return ( 11 |
12 |

Define Table

13 | 14 | 15 |
16 | setname(e.target.value)} 20 | /> 21 | 22 | 37 |
38 |
39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /src/components/explorer/Explorer.tsx: -------------------------------------------------------------------------------- 1 | import clsx from "clsx"; 2 | import { useRouter } from "next/router"; 3 | import { useAppState } from "../../state/useAppState"; 4 | import { DBView } from "./DBView"; 5 | import { DefineNamespace } from "./DefineNamespace"; 6 | import { NSView } from "./NSView"; 7 | import { Table } from "./Table"; 8 | import { TreeStructure } from "./TreeStructure"; 9 | import { ViewTB } from "./ViewTB"; 10 | 11 | export function Explorer() { 12 | const router = useRouter(); 13 | 14 | const appstate = useAppState(); 15 | 16 | // const [hideTree, setHideTree] = useState(false); 17 | 18 | const [ns, db, tb] = Array.isArray(router.query.slug) 19 | ? router.query.slug 20 | : []; 21 | 22 | const showTable = ns && db && tb; 23 | const showNS = ns && !db && !tb; 24 | const showDB = ns && db && !tb; 25 | 26 | const onLandingPage = router.pathname === "/"; 27 | 28 | return ( 29 | <> 30 |
31 | {!appstate.treeHidden && ( 32 |
69 | 70 | ); 71 | } 72 | -------------------------------------------------------------------------------- /src/components/explorer/NSView.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { 3 | authtype_calc, 4 | getSurreal, 5 | useAppState, 6 | } from "../../state/useAppState"; 7 | import { DefineDatabase } from "./DefineDatabase"; 8 | import { DefineLogin } from "./DefineLogin"; 9 | import { dbSlugs, TreeItemContent } from "./TreeStructure"; 10 | import { User } from "./User"; 11 | import DialogModal from "../DialogModal"; 12 | import { HiXMark } from "react-icons/hi2"; 13 | 14 | export function NSView() { 15 | const appstate = useAppState(); 16 | const router = useRouter(); 17 | const slugs = dbSlugs(router.query.slug); 18 | const nsinfo = appstate.info_ns.find((i) => i.ns === slugs.ns)?.nsinfo; 19 | if (!slugs.ns) return ns error; 20 | 21 | return ( 22 |
23 |
24 | 25 | 26 |
27 | 28 | 31 | 32 | Delete 33 | 34 | } 35 | > 36 |
37 | Are you sure you want to delete this Name Space 38 |
39 | 59 |
60 |
61 | 62 |
63 | 64 |
65 | {authtype_calc(appstate.credentials) === "root" && ( 66 | 67 | )} 68 | 69 |
70 | {nsinfo && 71 | Object.entries(nsinfo.nl).map(([username, definition]) => { 72 | if (!slugs.ns) return; 73 | return ( 74 | 80 | ); 81 | })} 82 |
83 |
84 | 85 |
86 | 87 | 88 | 89 |
90 |
{JSON.stringify(nsinfo, null, 2)}
91 |
92 |
93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /src/components/explorer/Table.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { dbSlugs } from "./TreeStructure"; 3 | 4 | import { 5 | createColumnHelper, 6 | flexRender, 7 | getCoreRowModel, 8 | useReactTable, 9 | PaginationState, 10 | } from "@tanstack/react-table"; 11 | import { useState, useEffect, useMemo } from "react"; 12 | import clsx from "clsx"; 13 | import { getSurreal, useAppState } from "../../state/useAppState"; 14 | import flatten from "flat"; 15 | import { SurrealResult } from "../../surrealdbjs"; 16 | import { 17 | BsChevronDoubleLeft, 18 | BsChevronDoubleRight, 19 | BsChevronLeft, 20 | BsChevronRight, 21 | } from "react-icons/bs"; 22 | import { HiXMark } from "react-icons/hi2"; 23 | 24 | // type UnknownRow = { id: string } & { [index: string]: unknown }; 25 | 26 | function deriveColumnsFromRows< 27 | T extends R[], 28 | R extends { [index: string]: unknown } 29 | >(rows: unknown[]) { 30 | const columnHelper = createColumnHelper(); 31 | const keys: string[] = ["id"]; 32 | 33 | rows.forEach((r) => { 34 | Object.keys(flatten(r)).forEach((k) => { 35 | if (keys.includes(k)) return; 36 | keys.push(k); 37 | }); 38 | }); 39 | 40 | const columns = keys.map((k: keyof R) => { 41 | return columnHelper.accessor( 42 | (row: T) => { 43 | const temp: R = flatten(row); 44 | return temp[k] as unknown; 45 | }, 46 | { 47 | id: k as string, 48 | } 49 | ); 50 | // return { 51 | // field: k, 52 | // flex: 1, 53 | // valueGetter: (props) => { 54 | // return objectByString(props.row, k); 55 | // }, 56 | // }; 57 | }); 58 | 59 | return columns; 60 | } 61 | 62 | export function Table() { 63 | const appstate = useAppState(); 64 | 65 | const slugs = dbSlugs(useRouter().query.slug); 66 | const [rows, setRows] = useState(); 67 | // const [count, setCount] = useState(0); 68 | const [pageCount, setPageCount] = useState(-1); 69 | const [{ pageIndex, pageSize }, setPagination] = useState({ 70 | pageIndex: 0, 71 | pageSize: 10, 72 | }); 73 | 74 | // const fetchDataOptions = { 75 | // pageIndex, 76 | // pageSize, 77 | // }; 78 | 79 | // const defaultData = useMemo(() => [], []); 80 | 81 | const pagination = useMemo( 82 | () => ({ 83 | pageIndex, 84 | pageSize, 85 | }), 86 | [pageIndex, pageSize] 87 | ); 88 | 89 | const columns = useMemo(() => deriveColumnsFromRows(rows ?? []), [rows]); 90 | 91 | const table = useReactTable({ 92 | data: rows ?? [], 93 | columns: columns, 94 | pageCount, 95 | getCoreRowModel: getCoreRowModel(), 96 | manualPagination: true, 97 | state: { pagination }, 98 | onPaginationChange: (p) => { 99 | console.log(p); 100 | setPagination(p); 101 | }, 102 | }); 103 | 104 | useEffect(() => { 105 | if (!slugs.ns) return; 106 | if (!slugs.db) return; 107 | if (!slugs.tb) return; 108 | 109 | getSurreal() 110 | .use(slugs.ns, slugs.db) 111 | .query<[SurrealResult<[{ count: number }]>]>( 112 | `SELECT count() as count FROM ${slugs.tb} GROUP BY count; ` 113 | ) 114 | .then((r) => { 115 | const data_count = r[0]?.result[0]?.count ?? 0; 116 | const data_pagecount = Math.ceil(data_count / pageSize); 117 | if (data_pagecount != pageCount) setPageCount(data_pagecount); 118 | }) 119 | .catch(console.error); 120 | 121 | getSurreal() 122 | .use(slugs.ns, slugs.db) 123 | .query<[SurrealResult]>( 124 | `SELECT * FROM ${slugs.tb} ORDER BY id LIMIT ${pageSize} START AT ${ 125 | pageSize * pageIndex 126 | };` 127 | ) 128 | .then((r) => { 129 | const data_rows = r[0]?.result; 130 | if (JSON.stringify(rows) !== JSON.stringify(data_rows)) 131 | setRows(data_rows); 132 | }) 133 | .catch(console.error); 134 | }, [ 135 | slugs.ns, 136 | slugs.db, 137 | slugs.tb, 138 | pageSize, 139 | pageIndex, 140 | pageCount, 141 | rows, 142 | appstate.latestData, 143 | ]); 144 | 145 | if (!rows) return
loading...
; 146 | 147 | return ( 148 |
149 |
155 | 161 | 167 | 173 | 179 | 180 |
Page
181 | 182 | {table.getState().pagination.pageIndex + 1} of{" "} 183 | {table.getPageCount()} 184 | 185 |
186 | {} 187 | 188 | | Go to page: 189 | { 193 | const page = e.target.value ? Number(e.target.value) - 1 : 0; 194 | table.setPageIndex(page); 195 | }} 196 | className="w-16 rounded border p-1" 197 | /> 198 | 199 | 212 |
213 | 214 |
215 | 216 | 217 | {table.getHeaderGroups().map((headerGroup) => ( 218 | 219 | 220 | {headerGroup.headers.map((header) => ( 221 | 229 | ))} 230 | 231 | ))} 232 | 233 | 234 | {table.getRowModel().rows.map((row) => ( 235 | { 239 | if (!slugs.ns) return; 240 | if (!slugs.db) return; 241 | if (!slugs.tb) return; 242 | 243 | appstate.set({ 244 | activeRow: { 245 | ns: slugs.ns, 246 | db: slugs.db, 247 | tb: slugs.tb, 248 | row: JSON.stringify(row.original, null, 2), 249 | }, 250 | }); 251 | }} 252 | > 253 | 277 | {row.getVisibleCells().map((cell) => ( 278 | 281 | ))} 282 | 283 | ))} 284 | 285 |
222 | {header.isPlaceholder 223 | ? null 224 | : flexRender( 225 | header.column.columnDef.header, 226 | header.getContext() 227 | )} 228 |
254 | 276 | 279 | {flexRender(cell.column.columnDef.cell, cell.getContext())} 280 |
286 |
287 |
288 | ); 289 | } 290 | -------------------------------------------------------------------------------- /src/components/explorer/TreeStructure.tsx: -------------------------------------------------------------------------------- 1 | import { useAppState } from "../../state/useAppState"; 2 | import { 3 | BiChevronDown, 4 | BiChevronUp, 5 | BiData, 6 | BiServer, 7 | BiShield, 8 | BiTable, 9 | } from "react-icons/bi"; 10 | import clsx from "clsx"; 11 | import Link from "next/link"; 12 | import { useRouter } from "next/router"; 13 | import { UserCount } from "./UserCount"; 14 | import { ReactNode } from "react"; 15 | import { SurrealType } from "../../surrealdbjs/surreal_zod_info"; 16 | 17 | export function TreeStructure({ className }: { className: string }) { 18 | const appstate = useAppState(); 19 | const slug = useRouter().query.slug; 20 | 21 | return ( 22 |
23 | {appstate.info_kv?.ns && 24 | Object.keys(appstate.info_kv.ns).map((ns, v) => { 25 | const nsinfo = appstate.info_ns.find((i) => i.ns === ns)?.nsinfo; 26 | if (!nsinfo) return null; 27 | 28 | const ns_href = `/ns/${ns}`; 29 | const ns_expanded = appstate.treeUIdata[ns_href]?.collapsed ?? true; 30 | 31 | return ( 32 |
33 | 39 | 40 | 41 | 42 | {ns_expanded && 43 | Object.keys(nsinfo.db).map((db, i) => { 44 | const dbinfo = appstate.info_db.find( 45 | (i) => i.ns === ns && i.db === db 46 | )?.dbinfo; 47 | 48 | if (!dbinfo) return null; 49 | 50 | const db_href = `/ns/${ns}/${db}`; 51 | const db_expanded = 52 | appstate.treeUIdata[db_href]?.collapsed ?? true; 53 | 54 | return ( 55 |
56 | 63 | 64 | 65 | 66 | {db_expanded && 67 | dbinfo && 68 | Object.keys(dbinfo.sc).map((sc, x) => ( 69 | 76 | ))} 77 | 78 | {db_expanded && 79 | dbinfo && 80 | Object.keys(dbinfo.tb).map((tb, y) => ( 81 | 88 | ))} 89 |
90 | ); 91 | })} 92 |
93 | ); 94 | })} 95 |
96 | ); 97 | } 98 | 99 | function TreeItem({ 100 | href, 101 | text, 102 | active, 103 | children, 104 | type, 105 | }: { 106 | href: string; 107 | text: string; 108 | active: boolean; 109 | children?: ReactNode; 110 | type: SurrealType; 111 | }) { 112 | // const [expanded, setExpanded] = useState(false); 113 | const appstate = useAppState(); 114 | 115 | const expanded = appstate.treeUIdata[href]?.collapsed ?? false; 116 | 117 | const pl = { 118 | ns: "pl-0", 119 | db: "pl-3", 120 | tb: "pl-6", 121 | sc: "pl-6", 122 | }[type]; 123 | 124 | const showTreeCollapseButton = { 125 | ns: true, 126 | db: true, 127 | tb: false, 128 | sc: false, 129 | }[type]; 130 | 131 | return ( 132 | 133 | 152 | 153 | ); 154 | } 155 | 156 | export function TreeItemContent({ 157 | text, 158 | children, 159 | type, 160 | className, 161 | }: { 162 | text: string; 163 | children?: ReactNode; 164 | className?: string; 165 | type: SurrealType; 166 | }) { 167 | const icon = { 168 | ns: , 169 | db: , 170 | tb: , 171 | sc: , 172 | }[type]; 173 | 174 | const color = { 175 | ns: "text-green-400 hover:text-green-400", 176 | db: "text-sky-400 hover:text-sky-300", 177 | tb: "text-pink-600 hover:text-pink-500", 178 | sc: "text-amber-500 hover:text-amber-400", 179 | }[type]; 180 | 181 | return ( 182 |
183 | {icon} 184 |
{text}
185 | {children} 186 |
187 | ); 188 | } 189 | 190 | ///////////////// 191 | 192 | export function dbSlugs(query: string | string[] | undefined) { 193 | const [slug_ns, slug_db, slug_tb] = Array.isArray(query) ? query : []; 194 | return { ns: slug_ns, db: slug_db, tb: slug_tb }; 195 | } 196 | 197 | export function isActive( 198 | query: string | string[] | undefined, 199 | ns?: string, 200 | db?: string, 201 | tb?: string 202 | ) { 203 | // const [slug_ns, slug_db, slug_tb] = Array.isArray(query) ? query : []; 204 | const slugs = dbSlugs(query); 205 | 206 | return slugs.ns === ns && slugs.db === db && slugs.tb === tb; 207 | } 208 | 209 | function TreeCollapseButton({ 210 | value, 211 | onChange, 212 | }: { 213 | value: boolean; 214 | onChange: (value: boolean) => void; 215 | }) { 216 | return ( 217 |
{ 220 | if (value === true) e.preventDefault(); 221 | onChange(!value); 222 | }} 223 | > 224 | {value ? ( 225 | 226 | ) : ( 227 | 228 | )} 229 |
230 | ); 231 | } 232 | -------------------------------------------------------------------------------- /src/components/explorer/User.tsx: -------------------------------------------------------------------------------- 1 | import clsx from "clsx"; 2 | import { HiXMark } from "react-icons/hi2"; 3 | import { RiUser3Line } from "react-icons/ri"; 4 | import { getSurreal, useAppState } from "../../state/useAppState"; 5 | 6 | export function User({ 7 | username, 8 | className, 9 | ns, 10 | db, 11 | }: { 12 | username: string; 13 | className: string; 14 | ns: string; 15 | db?: string; 16 | }) { 17 | const appstate = useAppState(); 18 | return ( 19 |
20 | 25 | 41 |
42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /src/components/explorer/UserCount.tsx: -------------------------------------------------------------------------------- 1 | import { RiUser3Line } from "react-icons/ri"; 2 | 3 | export function UserCount({ count }: { count: number }) { 4 | if (count === 0) return null; 5 | return ( 6 |
7 | 8 | {count} 9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /src/components/explorer/ViewTB.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { useRouter } from "next/router"; 3 | import { HiXMark } from "react-icons/hi2"; 4 | import { useAppState, getSurreal } from "../../state/useAppState"; 5 | import { Table } from "./Table"; 6 | import { dbSlugs, TreeItemContent } from "./TreeStructure"; 7 | import { editor } from "monaco-editor"; 8 | import Editor from "@monaco-editor/react"; 9 | import { useState } from "react"; 10 | import DialogModal from "../DialogModal"; 11 | 12 | export function ViewTB() { 13 | const appstate = useAppState(); 14 | const router = useRouter(); 15 | const slugs = dbSlugs(router.query.slug); 16 | 17 | // const nsinfo = appstate.info_ns.find((i) => i.ns === slugs.ns)?.nsinfo; 18 | 19 | if (!slugs.ns || !slugs.db || !slugs.tb) return null; 20 | 21 | // const dbinfo = appstate.info_db.find( 22 | // (i) => i.ns === slugs.ns && i.db === slugs.db 23 | // )?.dbinfo; 24 | 25 | return ( 26 |
27 |
28 | 29 | 36 | 37 | 38 | 45 | 46 | 47 |
48 | 51 | 52 | Delete 53 | 54 | } 55 | > 56 |
57 | Are you sure you want to delete this Table 58 |
59 | 80 |
81 |
82 | 83 | 84 | 85 | {appstate.activeRow && 86 | appstate.activeRow.ns === slugs.ns && 87 | appstate.activeRow.db === slugs.db && 88 | appstate.activeRow.tb === slugs.tb && ( 89 |
90 | { 94 | if (!e) return; 95 | if (!appstate.activeRow) return; 96 | const updated = structuredClone(appstate.activeRow); 97 | updated.row = e; 98 | appstate.set({ 99 | activeRow: updated, 100 | }); 101 | }} 102 | options={{ 103 | // readOnly: true, 104 | minimap: { enabled: false }, 105 | lineNumbers: "off", 106 | }} 107 | language="json" 108 | /> 109 | 135 |
136 | )} 137 | 138 | ); 139 | } 140 | -------------------------------------------------------------------------------- /src/components/footer.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { FaGithub } from "react-icons/fa"; 3 | import packageJson from "../../package.json"; 4 | 5 | export function Footer() { 6 | return ( 7 |
8 | 9 |
10 | ); 11 | } 12 | 13 | export function SourceLink() { 14 | return ( 15 | 20 | 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/components/navbar.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { HiBookOpen, HiOutlineHome } from "react-icons/hi2"; 3 | import { IoMdLogOut, IoMdRefresh } from "react-icons/io"; 4 | import { authtype_calc, useAppState } from "../state/useAppState"; 5 | import { QueryComponent } from "./querycomponent"; 6 | 7 | import { BiBookHeart } from "react-icons/bi"; 8 | import { SourceLink } from "./footer"; 9 | import clsx from "clsx"; 10 | import { CredentialsList } from "./explorer/CredentialsList"; 11 | 12 | import { unique } from "moderndash"; 13 | import { BsBook } from "react-icons/bs"; 14 | import { FaBook, FaGithub } from "react-icons/fa"; 15 | 16 | export function Navbar() { 17 | const appstate = useAppState(); 18 | 19 | const authtype = authtype_calc(appstate.credentials); 20 | 21 | return ( 22 |
23 |
24 | 25 | 28 | 29 | 30 | 35 | 38 | 39 | 40 | 41 | 44 | 45 | 46 |
47 | 48 | 77 |
78 | 79 |
80 | 87 | 88 | 89 |
90 | 91 |
92 | 93 |
94 |
95 | ); 96 | } 97 | -------------------------------------------------------------------------------- /src/components/querycomponent.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { BsPlayFill } from "react-icons/bs"; 3 | import { FaChevronUp } from "react-icons/fa"; 4 | import { getSurreal, useAppState } from "../state/useAppState"; 5 | 6 | export function QueryComponent() { 7 | const appstate = useAppState(); 8 | 9 | const [queryResult, setQueryResult] = useState(null); 10 | 11 | return ( 12 |
13 |
14 |
15 | appstate.set({ querytext: e.target.value })} 19 | /> 20 | 21 | {!!queryResult && ( 22 |
23 | 31 |
{JSON.stringify(queryResult, null, 2)}
32 |
33 | )} 34 |
35 | 36 | 52 |
53 |
54 | ); 55 | } 56 | -------------------------------------------------------------------------------- /src/components/signin.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import { 3 | authtype_calc, 4 | disconnectSurreal, 5 | getSurreal, 6 | getSurrealSignup, 7 | getSurrealToken, 8 | useAppState, 9 | } from "../state/useAppState"; 10 | import { Footer } from "./footer"; 11 | import { Tab } from "@headlessui/react"; 12 | import { CredentialsList } from "./explorer/CredentialsList"; 13 | import { unique } from "moderndash"; 14 | import { useState } from "react"; 15 | 16 | function curlSignUp(host: string, data: unknown) { 17 | return `curl --request POST --url ${host}/signup --header 'content-type: application/json' --header 'Accept: application/json' --data '${JSON.stringify( 18 | data 19 | )}'`; 20 | } 21 | 22 | export function SigninRoot() { 23 | const appstate = useAppState(); 24 | 25 | const [errormessage, setErrormessage] = useState(); 26 | 27 | return ( 28 |
29 | 30 | 33 | appstate.set({ 34 | credentials: { 35 | ...appstate.credentials, 36 | username: e.target.value, 37 | }, 38 | }) 39 | } 40 | /> 41 | 42 | 43 | 47 | appstate.set({ 48 | credentials: { 49 | ...appstate.credentials, 50 | password: e.target.value, 51 | }, 52 | }) 53 | } 54 | /> 55 | 56 | 57 | 60 | appstate.set({ 61 | credentials: { 62 | ...appstate.credentials, 63 | ns: e.target.value, 64 | }, 65 | }) 66 | } 67 | /> 68 | 69 | 70 | 73 | appstate.set({ 74 | credentials: { 75 | ...appstate.credentials, 76 | db: e.target.value, 77 | }, 78 | }) 79 | } 80 | /> 81 | 82 | 83 | 86 | appstate.set({ 87 | credentials: { 88 | ...appstate.credentials, 89 | sc: e.target.value, 90 | }, 91 | }) 92 | } 93 | /> 94 | 95 |
 96 |         authtype: {authtype_calc(appstate.credentials)}
 97 |       
98 | 99 | 127 | 128 | {errormessage && ( 129 |
133 | {errormessage} 134 |
135 | )} 136 |
137 | ); 138 | } 139 | 140 | export function SigninScope() { 141 | const appstate = useAppState(); 142 | return ( 143 |
144 | 145 | 148 | appstate.set({ 149 | credentials: { 150 | ...appstate.credentials, 151 | scope_email: e.target.value, 152 | }, 153 | }) 154 | } 155 | /> 156 | 157 | 158 | 162 | appstate.set({ 163 | credentials: { 164 | ...appstate.credentials, 165 | scope_pass: e.target.value, 166 | }, 167 | }) 168 | } 169 | /> 170 | 171 | 172 | 175 | appstate.set({ 176 | credentials: { 177 | ...appstate.credentials, 178 | ns: e.target.value, 179 | }, 180 | }) 181 | } 182 | /> 183 | 184 | 185 | 188 | appstate.set({ 189 | credentials: { 190 | ...appstate.credentials, 191 | db: e.target.value, 192 | }, 193 | }) 194 | } 195 | /> 196 | 197 | 198 | 201 | appstate.set({ 202 | credentials: { 203 | ...appstate.credentials, 204 | sc: e.target.value, 205 | }, 206 | }) 207 | } 208 | /> 209 | 210 |
211 | 230 | 241 |
242 |

243 | If you get a CORS permission error you can run this command locally to 244 | get the authorization token instead, or use  245 | 246 | https://github.com/Rob--W/cors-anywhere 247 | {" "} 248 | to run a local dev proxy that allows cross origin requests. And then use 249 | a host url like: http://localhost:8080/http://localhost:8000 250 |

251 | 252 | 253 |
254 |         {curlSignUp(appstate.credentials.hostname, {
255 |           ns: appstate.credentials.ns,
256 |           db: appstate.credentials.db,
257 |           sc: appstate.credentials.sc,
258 |           email: appstate.credentials.scope_email,
259 |           pass: appstate.credentials.scope_pass,
260 |         })}
261 |       
262 | 263 | 264 | { 267 | appstate.set({ 268 | credentials: { 269 | ...appstate.credentials, 270 | token: e.target.value, 271 | }, 272 | }); 273 | }} 274 | /> 275 | 293 |
294 | ); 295 | } 296 | 297 | export function Signin() { 298 | const appstate = useAppState(); 299 | 300 | const className = `flex-1 rounded-b-none bg-black/20 data-[headlessui-state="selected"]:bg-white/5 data-[headlessui-state="selected"]:pt-4 data-[headlessui-state="selected"]:mt-0 pt-2 mt-2 outline-none`; 301 | 302 | return ( 303 |
304 |

305 | 306 | Surreal 307 | DB 308 | 309 |   Explorer 310 |

311 | 312 | 313 | 314 |
315 | 316 | { 318 | appstate.set({ connection_screen_tab }); 319 | }} 320 | selectedIndex={appstate.connection_screen_tab} 321 | > 322 | 323 | Admin 324 | Scoped 325 | 326 | 327 |
328 | 329 | 333 | appstate.set({ 334 | credentials: { 335 | ...appstate.credentials, 336 | hostname: e.target.value, 337 | }, 338 | }) 339 | } 340 | /> 341 | 342 | 343 | Need http or{" "} 344 | https? 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 |
356 |
357 | 358 |

359 | This is a browser only app, so your login credentials are safe and at no 360 | point sent to our servers. Feel free to look at the code or clone the 361 | github repo and run the explorer on your own if you prefer. 362 |

363 | 364 |
365 |
366 | ); 367 | } 368 | -------------------------------------------------------------------------------- /src/env.mjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/ban-ts-comment */ 2 | import { z } from "zod"; 3 | 4 | /** 5 | * Specify your server-side environment variables schema here. 6 | * This way you can ensure the app isn't built with invalid env vars. 7 | */ 8 | const server = z.object({ 9 | NODE_ENV: z.enum(["development", "test", "production"]), 10 | }); 11 | 12 | /** 13 | * Specify your client-side environment variables schema here. 14 | * This way you can ensure the app isn't built with invalid env vars. 15 | * To expose them to the client, prefix them with `NEXT_PUBLIC_`. 16 | */ 17 | const client = z.object({ 18 | // NEXT_PUBLIC_CLIENTVAR: z.string().min(1), 19 | }); 20 | 21 | /** 22 | * You can't destruct `process.env` as a regular object in the Next.js 23 | * edge runtimes (e.g. middlewares) or client-side so we need to destruct manually. 24 | * @type {Record | keyof z.infer, string | undefined>} 25 | */ 26 | const processEnv = { 27 | NODE_ENV: process.env.NODE_ENV, 28 | // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, 29 | }; 30 | 31 | // Don't touch the part below 32 | // -------------------------- 33 | 34 | const merged = server.merge(client); 35 | /** @type z.infer 36 | * @ts-ignore - can't type this properly in jsdoc */ 37 | let env = process.env; 38 | 39 | if (!!process.env.SKIP_ENV_VALIDATION == false) { 40 | const isServer = typeof window === "undefined"; 41 | 42 | const parsed = isServer 43 | ? merged.safeParse(processEnv) // on server we can validate all env vars 44 | : client.safeParse(processEnv); // on client we can only validate the ones that are exposed 45 | 46 | if (parsed.success === false) { 47 | console.error( 48 | "❌ Invalid environment variables:", 49 | parsed.error.flatten().fieldErrors, 50 | ); 51 | throw new Error("Invalid environment variables"); 52 | } 53 | 54 | /** @type z.infer 55 | * @ts-ignore - can't type this properly in jsdoc */ 56 | env = new Proxy(parsed.data, { 57 | get(target, prop) { 58 | if (typeof prop !== "string") return undefined; 59 | // Throw a descriptive error if a server-side env var is accessed on the client 60 | // Otherwise it would just be returning `undefined` and be annoying to debug 61 | if (!isServer && !prop.startsWith("NEXT_PUBLIC_")) 62 | throw new Error( 63 | process.env.NODE_ENV === "production" 64 | ? "❌ Attempted to access a server-side environment variable on the client" 65 | : `❌ Attempted to access server-side environment variable '${prop}' on the client`, 66 | ); 67 | /* @ts-ignore - can't type this properly in jsdoc */ 68 | return target[prop]; 69 | }, 70 | }); 71 | } 72 | 73 | export { env }; 74 | -------------------------------------------------------------------------------- /src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { type AppType } from "next/dist/shared/lib/utils"; 2 | import { Roboto } from "@next/font/google"; 3 | import "../styles/globals.css"; 4 | import { useEffect, useState } from "react"; 5 | import { useRouter } from "next/router"; 6 | import { useAppState } from "../state/useAppState"; 7 | 8 | const roboto = Roboto({ weight: "400", subsets: ["latin"] }); 9 | 10 | const MyApp: AppType = ({ Component, pageProps }) => { 11 | const [loaded, loaded_set] = useState(false); 12 | const connected = useAppState((s) => s.connected); 13 | const router = useRouter(); 14 | 15 | useEffect(() => { 16 | if (!loaded) loaded_set(true); 17 | if (connected === false) { 18 | if (router.pathname === "/") return; 19 | void router.push("/"); 20 | } 21 | }, [loaded, connected, router]); 22 | 23 | return ( 24 |
25 | {loaded && } 26 |
27 | ); 28 | }; 29 | 30 | export default MyApp; 31 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { type NextPage } from "next"; 2 | import Head from "next/head"; 3 | import { Explorer } from "../components/explorer/Explorer"; 4 | import { Navbar } from "../components/navbar"; 5 | import { Signin } from "../components/signin"; 6 | import { useAppState } from "../state/useAppState"; 7 | 8 | const Home: NextPage = () => { 9 | const appstate = useAppState(); 10 | return ( 11 | <> 12 | 13 | SurrealReact 14 | 15 | 16 | 17 |
18 | {appstate.connected ? ( 19 | <> 20 | 21 | 22 | 23 | ) : ( 24 | 25 | )} 26 |
27 | 28 | ); 29 | }; 30 | 31 | export default Home; 32 | -------------------------------------------------------------------------------- /src/pages/ns/[...slug].tsx: -------------------------------------------------------------------------------- 1 | import { Explorer } from "../../components/explorer/Explorer"; 2 | import { Navbar } from "../../components/navbar"; 3 | 4 | export default function Explore() { 5 | return ( 6 | <> 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /src/state/useAppState.ts: -------------------------------------------------------------------------------- 1 | import { create } from "zustand"; 2 | import { devtools, persist } from "zustand/middleware"; 3 | import { AuthType, SurrealClient, TBInfo } from "../surrealdbjs"; 4 | import { DBInfo, KVInfo, NSInfo } from "../surrealdbjs/surreal_zod_info"; 5 | 6 | type Credentials = { 7 | hostname: string; 8 | username: string; 9 | password: string; 10 | scope_email: string; 11 | scope_pass: string; 12 | ns: string; 13 | db: string; 14 | sc: string; 15 | token: string; 16 | }; 17 | 18 | type Provider = { 19 | connection_screen_tab: number; 20 | credentials: Credentials; 21 | credentialsList: Credentials[]; 22 | connected: boolean; 23 | treeHidden: boolean; 24 | /** store stuff like collapse/expanded state */ 25 | treeUIdata: { [index: string]: { collapsed: boolean } }; 26 | querytext: string; 27 | queryResult: string; 28 | set: (prop: Partial) => void; 29 | info_kv: KVInfo | null; 30 | info_ns: { ns: string; nsinfo: NSInfo }[]; 31 | info_db: { ns: string; db: string; dbinfo: DBInfo }[]; 32 | info_tb: { ns: string; db: string; tb: string; tbinfo: TBInfo }[]; 33 | update: () => Promise; 34 | /** Keep track of table row clicks used for editor maybe other stuff in future */ 35 | activeRow: { 36 | ns: string; 37 | db: string; 38 | tb: string; 39 | row: string; 40 | } | null; 41 | /** we're going to use this to force an update on the table, could be useful elsewhere... */ 42 | latestData: Date; 43 | }; 44 | 45 | export const useAppState = create()( 46 | devtools( 47 | persist( 48 | (set, get) => ({ 49 | connection_screen_tab: 0, 50 | credentials: { 51 | hostname: "http://yourserver:8000", 52 | username: "root", 53 | password: "root", 54 | scope_email: "testuser", 55 | scope_pass: "testpass", 56 | ns: "test", 57 | db: "test", 58 | sc: "account", 59 | token: "", 60 | }, 61 | credentialsList: [], 62 | connected: false, 63 | treeHidden: false, 64 | treeUIdata: {}, 65 | /// default query in the navbar 66 | querytext: `USE NS test DB cool; CREATE somedata CONTENT ${JSON.stringify( 67 | { 68 | foo: Math.random(), 69 | } 70 | )};`, 71 | queryResult: "", 72 | /// 73 | set: (props) => { 74 | // check if there is a difference 75 | let diff = false; 76 | for (const key in props) { 77 | const existing = get()[key as keyof Provider]; 78 | if ( 79 | JSON.stringify(existing) !== 80 | JSON.stringify(props[key as keyof Provider]) 81 | ) { 82 | diff = true; 83 | } 84 | } 85 | 86 | if (diff) set(props); 87 | }, 88 | info_kv: null, 89 | info_ns: [], 90 | info_db: [], 91 | info_tb: [], 92 | update: async () => { 93 | const result = await getSurreal().getFullInfo(); 94 | set({ 95 | info_kv: result.kvinfo, 96 | info_ns: result.nsinfos, 97 | info_db: result.dbinfos, 98 | info_tb: result.tbinfos, 99 | latestData: new Date(), 100 | }); 101 | }, 102 | // new stuff 103 | activeRow: null, 104 | /////////// 105 | latestData: new Date(), 106 | }), 107 | { 108 | name: "surrealreact", 109 | } 110 | ) 111 | ) 112 | ); 113 | 114 | // singleton connection 115 | let surreal: SurrealClient | undefined; 116 | 117 | export function disconnectSurreal(options?: { silent: boolean }) { 118 | surreal = undefined; 119 | 120 | if (!options) 121 | useAppState 122 | .getState() 123 | .set({ connected: false, info_kv: null, info_db: [] }); 124 | } 125 | 126 | export function authtype_calc(props: { 127 | ns?: string; 128 | db?: string; 129 | sc?: string; 130 | }) { 131 | let authtype: AuthType = "root"; 132 | 133 | if (props.ns) authtype = "ns"; 134 | if (props.db) authtype = "db"; 135 | if (props.sc) authtype = "sc"; 136 | 137 | return authtype; 138 | } 139 | 140 | export function getSurreal() { 141 | if (surreal) return surreal; 142 | 143 | const authtype: AuthType = authtype_calc(useAppState.getState().credentials); 144 | 145 | console.log({ authtype }); 146 | 147 | surreal = new SurrealClient({ 148 | Authorization: `Basic ${Buffer.from( 149 | `${useAppState.getState().credentials.username}:${ 150 | useAppState.getState().credentials.password 151 | }`, 152 | "ascii" 153 | ).toString("base64")}`, 154 | host: useAppState.getState().credentials.hostname, 155 | ns: useAppState.getState().credentials.ns, 156 | db: useAppState.getState().credentials.db, 157 | authtype, 158 | }); 159 | 160 | return surreal; 161 | } 162 | 163 | export async function getSurrealSignup(props: { 164 | host: string; 165 | email?: string; 166 | pass?: string; 167 | NS: string; 168 | DB: string; 169 | SC: string; 170 | }) { 171 | console.log("signin up", props); 172 | useAppState.getState().set({ treeHidden: false, querytext: undefined }); 173 | 174 | const newsurrealconnection = new SurrealClient(); 175 | const result = await newsurrealconnection.signup(props); 176 | console.log(result); 177 | surreal = newsurrealconnection; 178 | return result; 179 | } 180 | 181 | export async function getSurrealToken(props: { 182 | host: string; 183 | token: string; 184 | ns: string; 185 | db: string; 186 | sc: string; 187 | }) { 188 | console.log("connect with token to scope", props); 189 | useAppState.getState().set({ treeHidden: false, querytext: undefined }); 190 | 191 | const newsurrealconnection = new SurrealClient({ 192 | Authorization: `Bearer ${props.token}`, 193 | host: props.host, 194 | ns: props.ns, 195 | db: props.db, 196 | sc: props.sc, 197 | }); 198 | 199 | const result = await newsurrealconnection.query( 200 | `INFO FOR SCOPE ${props.sc};` 201 | ); 202 | console.log(result); 203 | return newsurrealconnection; 204 | } 205 | -------------------------------------------------------------------------------- /src/styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | html { 7 | @apply bg-zinc-800 font-sans leading-tight text-zinc-300; 8 | } 9 | 10 | h2 { 11 | @apply text-3xl font-medium text-zinc-300; 12 | } 13 | 14 | h3 { 15 | @apply mb-4 text-2xl font-medium text-zinc-300; 16 | } 17 | 18 | input, 19 | input[type="number"] { 20 | @apply input; 21 | } 22 | 23 | select { 24 | @apply input; 25 | } 26 | 27 | a { 28 | @apply text-pink-600 hover:text-pink-500; 29 | } 30 | 31 | a.decorated { 32 | @apply hover:underline hover:decoration-dotted; 33 | } 34 | 35 | label { 36 | @apply mb-2 text-zinc-400; 37 | } 38 | 39 | p { 40 | @apply mb-1 text-sm text-zinc-400; 41 | } 42 | 43 | button { 44 | @apply button; 45 | } 46 | 47 | button.primary { 48 | @apply bg-pink-700 py-2 px-4 uppercase tracking-wider text-white hover:bg-pink-600 active:bg-pink-500; 49 | } 50 | 51 | button.delete { 52 | @apply text-white hover:bg-rose-600; 53 | } 54 | 55 | button.active { 56 | @apply bg-pink-700/30 hover:bg-pink-600/50; 57 | } 58 | 59 | div { 60 | @apply border-zinc-500; 61 | } 62 | 63 | td { 64 | @apply border-t border-zinc-700/30 text-left; 65 | } 66 | 67 | td { 68 | @apply border-t border-r border-zinc-900 py-2 px-2 text-zinc-300 odd:bg-zinc-500/10 even:bg-zinc-600/10; 69 | } 70 | 71 | th { 72 | @apply m-1 justify-start gap-4 p-[0.85rem] px-2.5 font-bold text-zinc-100 first:rounded-tl last:rounded-tr hover:text-green-300; 73 | } 74 | 75 | table { 76 | @apply mt-4 bg-white/5 text-left text-xs; 77 | } 78 | 79 | tr { 80 | @apply hover:bg-zinc-700/50; 81 | } 82 | 83 | pre { 84 | @apply scrollbot overflow-x-auto rounded bg-black/30 p-2 text-xs text-zinc-300; 85 | } 86 | 87 | hr { 88 | @apply m-0 border-zinc-600 p-0; 89 | } 90 | } 91 | 92 | @layer components { 93 | .button { 94 | @apply flex flex-row justify-center gap-4 whitespace-nowrap rounded border-zinc-800 bg-white/10 p-2 px-2.5 font-bold tracking-wide text-zinc-200 transition hover:bg-purple-400/20 hover:text-pink-300 active:bg-zinc-500; 95 | } 96 | 97 | .input { 98 | @apply rounded bg-white/10 p-2 text-zinc-200 outline-none focus:border-none focus:outline-none focus:ring-2 focus:ring-pink-500 focus:ring-opacity-50 hover:border-pink-500/60 hover:bg-white/5 active:border-none active:outline-none active:ring-0; 99 | } 100 | .paper { 101 | @apply flex flex-col rounded border border-zinc-700 bg-white/5 p-3 text-zinc-300 shadow-xl; 102 | } 103 | 104 | .icon { 105 | @apply h-5 w-5 self-center; 106 | } 107 | 108 | .panel { 109 | @apply m-2 flex flex-row gap-4 rounded p-4; 110 | } 111 | .tablewrap { 112 | @apply scrollbot col-span-full overflow-x-scroll pb-2 scrollbar-thin; 113 | } 114 | 115 | .scrollbot { 116 | @apply scrollbar-thin scrollbar-track-zinc-700/30 scrollbar-thumb-pink-600; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/surrealdbjs/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./surrealhelpers"; 2 | export * from "./surreal_api"; 3 | 4 | // const surreal = new SurrealClient({ 5 | // Authorization: `Basic ${Buffer.from( 6 | // `${SURREALDB_USER}:${SURREALDB_PASS}`, 7 | // "ascii" 8 | // ).toString("base64")}`, 9 | // host: SURREALDB_HOST, 10 | // ns: "next", 11 | // db: "next", 12 | // }) 13 | -------------------------------------------------------------------------------- /src/surrealdbjs/surreal_api.ts: -------------------------------------------------------------------------------- 1 | import type { Duration, SurrealResult } from "./surrealhelpers"; 2 | import { 3 | surreal_zod_info_for_db, 4 | surreal_zod_info_for_sc, 5 | surreal_zod_info_for_tb, 6 | TBInfo, 7 | } from "./surreal_zod_info"; 8 | import type { NSInfo, KVInfo, DBInfo, SCInfo } from "./surreal_zod_info"; 9 | 10 | type WithID = { id: string }; 11 | export type AuthType = "root" | "ns" | "db" | "sc"; 12 | export class SurrealClient { 13 | host = ""; 14 | Authorization = ""; 15 | ns: string | undefined; 16 | db: string | undefined; 17 | sc: string | undefined; 18 | authtype: AuthType = "root"; 19 | 20 | constructor(props?: { 21 | host: string; 22 | Authorization: string; 23 | ns?: string; 24 | db?: string; 25 | sc?: string; 26 | authtype?: AuthType; 27 | }) { 28 | if (props) { 29 | this.host = props.host; 30 | this.Authorization = props.Authorization; 31 | this.ns = props.ns; 32 | this.db = props.db; 33 | this.sc = props.sc; 34 | if (props.authtype) this.authtype = props.authtype; 35 | } 36 | } 37 | 38 | // info_for_db = async () => { 39 | // const result = await fetch(`${this.host}/sql`, { 40 | // method: "post", 41 | // headers: { 42 | // Accept: "application/json", 43 | // NS: this.ns, 44 | // DB: this.db, 45 | // Authorization: "Basic " + btoa("root:pass"), 46 | // }, 47 | // body: "INFO FOR DB;", 48 | // }).then((r) => r.json()); 49 | 50 | // return { test: "foo3", this: this, result }; 51 | // }; 52 | 53 | use = (ns: string, db?: string) => { 54 | return new SurrealClient({ 55 | host: this.host, 56 | Authorization: this.Authorization, 57 | ns, 58 | db: db || this.db, 59 | }); 60 | }; 61 | 62 | create = async ( 63 | table: string, 64 | query: { data: T } 65 | ): Promise => { 66 | const surresult = await this.query<[SurrealResult<(T & WithID)[]>]>( 67 | `CREATE ${table} CONTENT ${JSON.stringify(query.data)};` 68 | ); 69 | 70 | // fetch(`${this.host}/sql`, { 71 | // method: "post", 72 | // headers: { 73 | // Accept: "application/json", 74 | // NS: this.ns, 75 | // DB: this.db, 76 | // Authorization: this.Authorization, 77 | // }, 78 | // body: `CREATE ${table} CONTENT ${JSON.stringify(query.data)};`, 79 | // }).then((r) => r.json()); 80 | 81 | const oneWrap = surresult[0]; 82 | const one = oneWrap.result[0]; 83 | return one as WithID & T; 84 | }; 85 | 86 | findUnique = async >( 87 | table: string, 88 | query: { where: Partial } 89 | ): Promise => { 90 | const sql = `SELECT * FROM ${generateTarget(table, query)}${generateWhere( 91 | query 92 | )};`; 93 | 94 | const surresult = await this.query<[SurrealResult]>(sql); 95 | 96 | console.log(sql); 97 | console.log("select where", surresult); 98 | 99 | const oneWrap = surresult[0]; 100 | const one = oneWrap.result[0]; 101 | return one as T & WithID; 102 | }; 103 | 104 | findMany = async >( 105 | table: string, 106 | query: { where: Partial } 107 | ): Promise<(T & WithID)[]> => { 108 | const sql = `SELECT * FROM ${generateTarget(table, query)}${generateWhere( 109 | query 110 | )};`; 111 | 112 | const surresult = await this.query<[SurrealResult<(T & WithID)[]>]>(sql); 113 | 114 | console.log(sql); 115 | console.log("select where", surresult); 116 | 117 | const oneWrap = surresult[0]; 118 | 119 | console.log("============================"); 120 | console.log(oneWrap); 121 | 122 | const many = oneWrap.result; 123 | return many; 124 | }; 125 | 126 | update = async >( 127 | table: string, 128 | query: { where: Partial; data: Partial } 129 | ): Promise => { 130 | // const target = query.where.id ? `${table}:${query.where.id}` : table; 131 | const sql = `UPDATE ${generateTarget(table, query)}${generateSet( 132 | query 133 | )}${generateWhere(query)};`; 134 | 135 | const surresult = await this.query<[SurrealResult<(T & WithID)[]>]>(sql); 136 | 137 | console.log(sql); 138 | console.log("select where", surresult); 139 | 140 | const oneWrap = surresult[0]; 141 | const one = oneWrap.result[0]; 142 | 143 | return one as T & WithID; 144 | }; 145 | 146 | delete = async >( 147 | table: string, 148 | query: { where: Partial } 149 | ): Promise => { 150 | const sql = `DELETE ${generateTarget(table, query)}${generateWhere( 151 | query 152 | )};`; 153 | 154 | const surresult = await this.query<[SurrealResult<(T & WithID)[]>]>(sql); 155 | 156 | console.log(sql); 157 | console.log("delete where", surresult); 158 | 159 | const oneWrap = surresult[0]; 160 | const one = oneWrap.result[0]; 161 | 162 | return one as T & WithID; 163 | }; 164 | 165 | // replaced by query 166 | // sql = async >(sql: string): Promise => { 167 | // const surresult = await fetch(`${this.host}/sql`, { 168 | // method: "post", 169 | // headers: { 170 | // Accept: "application/json", 171 | // NS: this.ns, 172 | // DB: this.db, 173 | // Authorization: this.Authorization, 174 | // }, 175 | // body: sql, 176 | // }).then((r) => r.json()); 177 | 178 | // return surresult; 179 | // }; 180 | 181 | INFO_FOR_KV = async () => { 182 | const surresult = await this.query<[SurrealResult]>("INFO FOR KV;"); 183 | if (!surresult || !surresult[0]) throw new Error("INTERNAL_SERVER_ERROR"); 184 | if (surresult[0].status !== "OK") throw Error("could not get kv"); 185 | return surresult[0].result; 186 | }; 187 | 188 | INFO_FOR_NS = async () => { 189 | const surresult = await this.query<[SurrealResult]>("INFO FOR NS;"); 190 | if (!surresult || !surresult[0]) throw new Error("INTERNAL_SERVER_ERROR"); 191 | if (surresult[0].status !== "OK") throw Error("could not get ns"); 192 | return surresult[0].result; 193 | }; 194 | 195 | INFO_FOR_DB = async () => { 196 | const surresult = await this.query<[SurrealResult]>("INFO FOR DB;"); 197 | if (!surresult[0]) throw new Error("INTERNAL_SERVER_ERROR"); 198 | const info_for_db = surreal_zod_info_for_db.parse(surresult[0].result); 199 | return info_for_db; 200 | }; 201 | 202 | INFO_FOR_SCOPE = async (scope: string) => { 203 | const res = await this.query<[SurrealResult]>( 204 | `INFO FOR SCOPE ${scope};` 205 | ); 206 | if (!res[0]) throw new Error("INTERNAL_SERVER_ERROR"); 207 | const info_for_sc = surreal_zod_info_for_sc.parse(res[0].result); 208 | return info_for_sc; //todo typed zod 209 | }; 210 | 211 | INFO_FOR_TABLE = async (table: string) => { 212 | const res = await this.query<[SurrealResult]>( 213 | `INFO FOR TABLE ${table};` 214 | ); 215 | if (!res[0]) throw new Error("INTERNAL_SERVER_ERROR"); 216 | const info_for_tb = surreal_zod_info_for_tb.parse(res[0].result); 217 | return info_for_tb; 218 | }; 219 | 220 | getFullInfo = async () => { 221 | const kvinfo: KVInfo = 222 | this.authtype === "root" 223 | ? await this.INFO_FOR_KV() 224 | : { 225 | ns: { [this.ns ?? "err"]: `DEFINE NAMESPACE ${this.ns ?? "err"}` }, 226 | }; 227 | 228 | const nsinfos = await Promise.all( 229 | Object.keys(kvinfo.ns).map(async (ns) => { 230 | return { 231 | ns, 232 | nsinfo: await this.use(ns).INFO_FOR_NS(), 233 | }; 234 | }) 235 | ); 236 | 237 | // dbinfos 238 | const dbinfosTemp: { ns: string; db: string }[] = []; 239 | nsinfos.forEach((nsinfo) => { 240 | Object.keys(nsinfo.nsinfo.db).map((db) => { 241 | dbinfosTemp.push({ ns: nsinfo.ns, db }); 242 | }); 243 | }); 244 | 245 | const dbinfos = await Promise.all( 246 | dbinfosTemp.map(async (dbi) => { 247 | return { 248 | ns: dbi.ns, 249 | db: dbi.db, 250 | dbinfo: await this.use(dbi.ns, dbi.db).INFO_FOR_DB(), 251 | }; 252 | }) 253 | ); 254 | 255 | // tbinfos 256 | const tbinfosTemp: { ns: string; db: string; tb: string }[] = []; 257 | dbinfos.forEach((dbinfo) => { 258 | Object.keys(dbinfo.dbinfo.tb).map((tb) => { 259 | tbinfosTemp.push({ ns: dbinfo.ns, db: dbinfo.db, tb }); 260 | }); 261 | }); 262 | 263 | const tbinfos = await Promise.all( 264 | tbinfosTemp.map(async (tbi) => { 265 | return { 266 | ns: tbi.ns, 267 | db: tbi.db, 268 | tb: tbi.tb, 269 | tbinfo: await this.use(tbi.ns, tbi.db).INFO_FOR_TABLE(tbi.tb), 270 | }; 271 | }) 272 | ); 273 | 274 | const output = { 275 | kvinfo, 276 | nsinfos, 277 | dbinfos, 278 | tbinfos, 279 | }; 280 | 281 | // TBS 282 | 283 | // console.log(JSON.stringify(output, null, 2)); 284 | 285 | return output; 286 | }; 287 | 288 | getHeaders = () => { 289 | const headers: { 290 | Accept: string; 291 | Authorization: string; 292 | NS?: string; 293 | DB?: string; 294 | SC?: string; 295 | } = { 296 | Accept: "application/json", 297 | Authorization: this.Authorization, 298 | }; 299 | 300 | if (this.db) headers.DB = this.db; 301 | if (this.ns) headers.NS = this.ns; 302 | if (this.sc) headers.SC = this.sc; 303 | return headers; 304 | }; 305 | 306 | /** does a sql fetch */ 307 | query = async (sql: string): Promise => { 308 | const result = (await fetch(`${this.host}/sql`, { 309 | method: "post", 310 | headers: this.getHeaders(), 311 | body: sql, 312 | }).then((r) => r.json())) as Promise; 313 | return result; 314 | }; 315 | 316 | /** does a sql fetch */ 317 | queryBatch = async (sql: string): Promise[]> => 318 | fetch(`${this.host}/sql`, { 319 | method: "post", 320 | headers: this.getHeaders(), 321 | body: sql, 322 | }).then((r) => r.json()) as Promise[]>; 323 | 324 | /** does a sql fetch */ 325 | querySimple = async (sql: string) => 326 | fetch(`${this.host}/sql`, { 327 | method: "post", 328 | headers: this.getHeaders(), 329 | body: sql, 330 | }) 331 | .then((r) => r.json()) 332 | .then((r) => { 333 | const response = r as SurrealResult[]; 334 | 335 | if (response.length > 1) 336 | throw new Error("too many results. Use .queryBatch() instead."); 337 | 338 | if (!response[0]) throw new Error("INTERNAL_SERVER_ERROR"); 339 | 340 | if (response[0].status !== "OK") throw Error(response[0]?.detail); 341 | 342 | return response[0].result; 343 | }); 344 | 345 | /** creates an account and recieves a token */ 346 | signup = async (props: { 347 | host: string; 348 | email?: string; 349 | pass?: string; 350 | NS: string; 351 | DB: string; 352 | SC: string; 353 | }): Promise[]> => { 354 | this.host = props.host; 355 | this.ns = props.NS; 356 | this.db = props.DB; 357 | this.sc = props.SC; 358 | 359 | const result = (await fetch(`${props.host}/signup`, { 360 | method: "post", 361 | headers: { 362 | Accept: "application/json", 363 | NS: props.NS, 364 | DB: props.DB, 365 | SC: props.SC, 366 | }, 367 | body: JSON.stringify(props), 368 | }).then((r) => r.json())) as Promise[]>; 369 | 370 | return result; 371 | }; 372 | } 373 | 374 | ////////////////// 375 | 376 | /** tablename or table:idstring */ 377 | function generateTarget>( 378 | table: string, 379 | query: { where: Partial } 380 | ): string { 381 | return query.where.id ? `${query.where.id}` : table; 382 | } 383 | 384 | /** "" or " WHERE (...conditions)" */ 385 | function generateWhere({ where }: { where: Partial }): string { 386 | const output = Object.entries(where) 387 | .filter((i) => i[0] != "id") 388 | .filter((i) => i[1] !== undefined) 389 | .map((k) => { 390 | return `${k[0]} = ${JSON.stringify(k[1])}`; 391 | }); 392 | 393 | if (output.length > 0) return ` WHERE (${output.join(" AND ")})`; 394 | return ""; 395 | } 396 | 397 | function generateSet({ data }: { data: Partial }): string { 398 | const output = Object.entries(data) 399 | .filter((i) => i[0] != "id") 400 | .filter((i) => i[1] !== undefined) 401 | .map((k) => { 402 | return `${k[0]} = ${JSON.stringify(k[1])}`; 403 | }); 404 | 405 | if (output.length > 0) return ` SET ${output.join(", ")}`; 406 | return ""; 407 | } 408 | 409 | // USE NS devns DB devdb; SELECT * FROM user WHERE (marketing = true AND name.first = "Tobie"); 410 | // USE NS devns DB devdb; UPDATE user:s92z7ty3m9ooweqqykv6 SET altered = 1, cool = "foo" WHERE (marketing = true AND name.first = "Tobie"); 411 | -------------------------------------------------------------------------------- /src/surrealdbjs/surreal_token.ts: -------------------------------------------------------------------------------- 1 | export const unused = true; 2 | // import { z } from "zod"; 3 | 4 | // /** used to signup to a db scope */ 5 | // export async function surreal_signup({ 6 | // ns, 7 | // db, 8 | // sc, 9 | // email, 10 | // pass, 11 | // }: { 12 | // ns: string; 13 | // db: string; 14 | // sc: string; 15 | // email: string; 16 | // pass: string; 17 | // }) { 18 | // await console.log("test"); 19 | // throw new Error("not implemented"); 20 | // // const body = { 21 | // // NS: ns, 22 | // // DB: db, 23 | // // SC: sc, 24 | // // email, 25 | // // pass, 26 | // // }; 27 | 28 | // // const response = await fetch("http://localhost:8000/signup", { 29 | // // method: "POST", 30 | // // headers: { 31 | // // Accept: "application/json", 32 | // // "Content-Type": "application/json", 33 | // // }, 34 | // // body: JSON.stringify(body), 35 | // // }).then((r) => r.json()); 36 | 37 | // // return z 38 | // // .object({ 39 | // // code: z.number(), 40 | // // details: z.string(), 41 | // // token: z.string(), 42 | // // }) 43 | // // .parse(response); 44 | // } 45 | -------------------------------------------------------------------------------- /src/surrealdbjs/surreal_zod_info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | const types = [ 4 | "ns", 5 | "db", 6 | "tb", 7 | // "fd", 8 | // "ix", 9 | // "ev", 10 | // "nl", 11 | // "nt", 12 | // "dl", 13 | // "dt", 14 | "sc", 15 | ] as const; 16 | 17 | export type SurrealType = (typeof types)[number]; 18 | 19 | export const surreal_zod_info_for_kv = z.object({ 20 | ns: z.record(z.string()), 21 | }); 22 | 23 | export const surreal_zod_info_for_ns = z.object({ 24 | db: z.record(z.string()), 25 | nl: z.record(z.string()), 26 | nt: z.record(z.string()), 27 | }); 28 | 29 | export const surreal_zod_info_for_db = z.object({ 30 | dl: z.record(z.string()), 31 | dt: z.record(z.string()), 32 | sc: z.object({ 33 | account: z.string().optional(), 34 | }), 35 | tb: z.record(z.string()), 36 | }); 37 | 38 | export const surreal_zod_info_for_tb = z.object({ 39 | ev: z.record(z.string()), 40 | fd: z.record(z.string()), 41 | ft: z.record(z.string()), 42 | ix: z.record(z.string()), 43 | }); 44 | 45 | export const surreal_zod_info_for_sc = z.object({ 46 | st: z.record(z.string()), 47 | }); 48 | 49 | export type KVInfo = z.infer; 50 | export type NSInfo = z.infer; 51 | export type DBInfo = z.infer; 52 | export type TBInfo = z.infer; 53 | export type SCInfo = z.infer; 54 | -------------------------------------------------------------------------------- /src/surrealdbjs/surrealhelpers.ts: -------------------------------------------------------------------------------- 1 | // import Surreal from "../surrealdbjs"; 2 | 3 | import { DBInfo } from "./surreal_zod_info"; 4 | 5 | // export const InfoForKV = async () => { 6 | // let result = await Surreal.Instance.query[]>("INFO FOR KV;") 7 | // let r = result[0].result.ns; 8 | // return Object.keys(result[0].result.ns).map(ns => ({ ns, definition: r[ns] } as NamespaceListItem)) 9 | // } 10 | 11 | // export const GetNamespace = async (ns: string) => { 12 | // let r = await InfoForKV(); 13 | // return r.filter(i => i.ns === ns)[0] 14 | // } 15 | 16 | // export const InfoForNS = async (ns: string) => { 17 | // let r = await Surreal.Instance.query<[SurrealResult, SurrealResult]>(`USE NS ${ns}; INFO FOR NS;`) 18 | // return r[1].result; 19 | // } 20 | 21 | // export const InfoForDB = async (ns: string, db: string) => { 22 | // let r = await Surreal.Instance.query(`USE NS ${ns} DB ${db}; INFO FOR DB;`); 23 | // const output = r[1].result as DBInfo; 24 | // return output; 25 | // } 26 | 27 | // export const InfoForTable = async (ns: string, db: string, tb: string) => { 28 | // let r = await Surreal.Instance.query(`USE NS ${ns} DB ${db}; INFO FOR TABLE ${tb};`); 29 | // const output = r[1].result as TBInfo; 30 | // return output; 31 | // } 32 | 33 | // export interface DBInfo { 34 | // dl: { [index: string]: string }; 35 | // dt: { [index: string]: string }; 36 | // sc: { [index: string]: string }; 37 | // tb: { [index: string]: string }; // todo array ? 38 | // } 39 | 40 | export interface TBInfo { 41 | ev: { [index: string]: string }; 42 | fd: { [index: string]: string }; 43 | ft: { [index: string]: string }; 44 | ix: { [index: string]: string }; 45 | } 46 | 47 | // export const GetStructure = async () => { 48 | // let kv = await InfoForKV(); 49 | 50 | // let queries = kv.map(GetStructureForNS); 51 | 52 | // let result = await Promise.all(queries); 53 | 54 | // return result; 55 | // } 56 | 57 | // export const GetStructureForNS = async (n: NamespaceListItem) => { 58 | // let nsinfo = await InfoForNS(n.ns); 59 | // let dbnames = Object.keys(nsinfo.db) 60 | 61 | // let db: IDatabase[] = await Promise.all(dbnames.map(async dbname => { 62 | // let dbinfo = await InfoForDB(n.ns, dbname); 63 | // let o: IDatabase = { dbname, dbinfo } 64 | // return o 65 | // })) 66 | 67 | // let output: INamespace = { ns: n.ns, define: n.definition, db } 68 | // return output 69 | // } 70 | 71 | export interface INamespace { 72 | /** namespace */ 73 | ns: string; 74 | define: string; 75 | db: IDatabase[]; 76 | } 77 | 78 | export interface IDatabase { 79 | dbname: string; 80 | dbinfo: DBInfo; 81 | } 82 | 83 | // export interface NSInfo { 84 | // db: { [index: string]: string }; 85 | // nl: { [index: string]: string }; 86 | // nt: { [index: string]: string }; 87 | // } 88 | 89 | export interface NamespaceListItem { 90 | ns: string; 91 | definition: string; 92 | } 93 | 94 | export interface SurrealResult { 95 | result: T; 96 | status: "OK" | string; 97 | time: string; 98 | detail?: string; 99 | } 100 | 101 | export interface NamespaceResponse { 102 | ns: { 103 | /** "DEFINE NAMESPACE namespace" */ 104 | [index: string]: string; 105 | }; 106 | } 107 | 108 | // export interface KVInfo { 109 | // ns: { [index: string]: string }; 110 | // } 111 | 112 | export type Await = T extends PromiseLike ? U : T; 113 | 114 | // export async function SelectAllFromDb(params: { 115 | // ns: string, 116 | // db: string, 117 | // tb: string, 118 | // limit?: number, 119 | // start?: number, 120 | // sort?: GridSortModel 121 | // }) { 122 | 123 | // let q = `USE NS ${params.ns} DB ${params.db}; SELECT * FROM ${params.tb}`; 124 | 125 | // if (params.sort && params.sort[0]) { 126 | // q += ` ORDER BY ${params.sort[0].field} ${params.sort[0].sort?.toUpperCase()}` 127 | // } 128 | 129 | // if (params.limit !== undefined) q += ` LIMIT ${params.limit}`; 130 | // if (params.start) q += ` START ${params.start}`; 131 | // q += '; '; 132 | // q += `SELECT count(id) FROM ${params.tb} GROUP BY NONE;` 133 | 134 | // const o = await Surreal.Instance.query(q); 135 | // const rows = o[1].result as T[]; 136 | // const rowCount = o[2].result.length > 0 ? o[2].result[0].count as number : 0; 137 | 138 | // let result: RowPagination = { 139 | // rows, 140 | // rowCount 141 | // } 142 | 143 | // return result; 144 | // } 145 | 146 | export interface RowPagination { 147 | rows: T[]; 148 | rowCount: number; 149 | } 150 | 151 | export interface IScope { 152 | scopeName: string; 153 | definition: string; 154 | } 155 | 156 | export const durations = [ 157 | { value: "s", name: "seconds" }, 158 | { value: "m", name: "minutes" }, 159 | { value: "h", name: "hours" }, 160 | { value: "w", name: "weeks" }, 161 | { value: "y", name: "years" }, 162 | ] as const; 163 | 164 | export type Duration = (typeof durations)[number]; 165 | 166 | export function buildScopeScript({ 167 | ns, 168 | db, 169 | scopeName, 170 | durationNum, 171 | duration, 172 | scriptSignup, 173 | scriptSignin, 174 | }: { 175 | ns: string; 176 | db: string; 177 | scopeName: string; 178 | durationNum: number; 179 | duration: Duration; 180 | /** ```sql 181 | * CREATE user SET email = $email, pass = crypto::argon2::generate($pass) 182 | * ``` 183 | * */ 184 | scriptSignup: string; 185 | /**```sql 186 | * SELECT * FROM user WHERE email = $email AND crypto::argon2::compare(pass, $pass) 187 | * ``` 188 | */ 189 | scriptSignin: string; 190 | }) { 191 | return `USE NS ${ns} DB ${db}; 192 | DEFINE SCOPE ${scopeName} 193 | SESSION ${durationNum}${duration.value} 194 | SIGNUP ( ${scriptSignup} ) 195 | SIGNIN ( ${scriptSignin} ) 196 | ;`; 197 | } 198 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./src/**/*.{js,ts,jsx,tsx}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [require("tailwind-scrollbar")], 8 | }; 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "checkJs": true, 7 | "skipLibCheck": true, 8 | "strict": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "noEmit": true, 11 | "esModuleInterop": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "jsx": "preserve", 17 | "incremental": true, 18 | "noUncheckedIndexedAccess": true 19 | }, 20 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.cjs", "**/*.mjs"], 21 | "exclude": ["node_modules"] 22 | } 23 | --------------------------------------------------------------------------------