diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9937034e..5b6b2cb3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,9 +24,9 @@ jobs: node-version: "24" - name: Install pnpm - run: | - npm install -g pnpm@latest - pnpm --version + uses: pnpm/action-setup@v4 + with: + version: 11.9.0 - name: Install dependencies run: pnpm install --frozen-lockfile @@ -46,9 +46,9 @@ jobs: - name: Build production image and verify it boots env: PR_NUMBER: ${{ github.event.pull_request.number }} - # The database is external; CI only verifies the app builds and the - # (DB-independent) health endpoint responds. Dummy values keep - # NextAuth and the MySQL client from erroring at startup. + # The CI Compose overlay supplies a disposable MySQL service and + # overrides these values. Dummy auth values keep the app from + # erroring at startup. NEXTAUTH_SECRET: ci-dummy-secret JWT_SECRET: ci-dummy-secret MYSQL_HOST: localhost @@ -57,7 +57,7 @@ jobs: MYSQL_PASSWORD: ci run: | # Build overlay, so the PR runs an image built from this branch. - docker compose -f ./docker-compose.yml -f ./docker-compose.build.yml -p "va-stats-pr-${PR_NUMBER}" up --build -d + docker compose -f ./docker-compose.yml -f ./docker-compose.ci.yml -f ./docker-compose.build.yml -p "va-stats-pr-${PR_NUMBER}" up --build -d echo "Waiting for the app to become healthy..." for i in {1..60}; do @@ -76,11 +76,21 @@ jobs: sleep 2 done + docker compose -p "va-stats-pr-${PR_NUMBER}" logs va-stats-app | grep -q "Migrations applied" || { + echo "Migrations did not complete" + docker compose -p "va-stats-pr-${PR_NUMBER}" logs va-stats-app + exit 1 + } + - name: Clean up if: always() env: PR_NUMBER: ${{ github.event.pull_request.number }} run: | - docker compose -p "va-stats-pr-${PR_NUMBER}" -f ./docker-compose.yml down --volumes --remove-orphans || true + docker compose -p "va-stats-pr-${PR_NUMBER}" \ + -f ./docker-compose.yml \ + -f ./docker-compose.ci.yml \ + -f ./docker-compose.build.yml \ + down --volumes --remove-orphans || true docker ps -a --filter "name=va-stats-pr-${PR_NUMBER}" -q | xargs -r docker rm -f || true docker network ls --filter "name=va-stats-pr-${PR_NUMBER}" -q | xargs -r docker network rm || true diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 941386fb..d79c1bba 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -53,8 +53,8 @@ jobs: - name: Smoke test the published image env: IMAGE_TAG: ${{ github.sha }} - # External database; /api/health is DB-independent, so this checks the - # published image boots and serves, not that it can reach MySQL. + # The CI Compose overlay supplies a disposable MySQL service, so the + # smoke test exercises migrations as well as the published image. MYSQL_HOST: localhost MYSQL_DATABASE: smoke MYSQL_USER: smoke @@ -64,7 +64,7 @@ jobs: GOOGLE_CLIENT_ID: "" GOOGLE_CLIENT_SECRET: "" run: | - docker compose -f docker-compose.yml -p smoke up -d --pull always + docker compose -f docker-compose.yml -f docker-compose.ci.yml -p smoke up -d --pull always app=$(docker compose -p smoke ps -q --all va-stats-app) @@ -81,12 +81,18 @@ jobs: exit 1 fi + docker compose -p smoke logs va-stats-app | grep -q "Migrations applied" || { + echo "::error::published image did not apply Prisma migrations" + docker compose -p smoke logs va-stats-app + exit 1 + } + docker exec "$app" wget -qO- http://localhost:3000/api/health - echo "OK — pulled image served" + echo "OK — pulled image migrated and served" - name: Stop smoke test stack if: always() - run: docker compose -f docker-compose.yml -p smoke down --volumes --remove-orphans || true + run: docker compose -f docker-compose.yml -f docker-compose.ci.yml -p smoke down --volumes --remove-orphans || true - name: Summary run: | diff --git a/.gitignore b/.gitignore index 7a7e4ac6..66ca24f4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ !data/.gitkeep !sql/ !/sql/*.sql + +# Prisma migrations are source-controlled SQL, unlike ad hoc SQL scripts. +!prisma/migrations/ +!prisma/migrations/**/*.sql # dependencies /node_modules /.pnp diff --git a/Dockerfile b/Dockerfile index c4e0ce7a..7e17563b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ # Base image with Node.js FROM node:24-alpine AS base -# Enable corepack and prepare pnpm -RUN corepack enable && corepack prepare pnpm@latest --activate +# Enable corepack and prepare the version pinned in package.json +RUN corepack enable && corepack prepare pnpm@11.9.0 --activate # Rebuild the source code only when needed FROM base AS builder -RUN apk add --no-cache libc6-compat +RUN apk add --no-cache libc6-compat openssl WORKDIR /app # NEXT_PUBLIC_BASE_URL deliberately unset: Next.js only inlines NEXT_PUBLIC_* vars @@ -14,6 +14,8 @@ WORKDIR /app # Copy package files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY prisma ./prisma +COPY prisma.config.ts ./prisma.config.ts # Install dependencies (ignore-scripts skips husky's prepare hook; # native packages such as sharp ship prebuilt binaries so no build step is needed) @@ -26,7 +28,7 @@ COPY . . # Build the Next.js application (produces the standalone server output) RUN pnpm run build -# Production image, copy only what is needed and run next +# Production image, copy only what is needed and run migrations before Next.js FROM base AS runner WORKDIR /app @@ -35,13 +37,26 @@ ENV NODE_ENV=production RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -# Install wget for the container healthcheck -RUN apk add --no-cache wget +# Install the Prisma runtime requirements and wget for the container healthcheck +RUN apk add --no-cache openssl wget # Copy the standalone build output with correct ownership COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma +COPY --from=builder --chown=nextjs:nodejs /app/prisma.config.ts ./prisma.config.ts + +# The runtime image is intentionally minimal, so provide the Prisma CLI and +# dotenv used by prisma.config.ts without copying the full pnpm dependency tree. +RUN npm install -g --allow-scripts=prisma,@prisma/engines prisma@7.10.0 dotenv@16.6.1 \ + && mkdir -p /app/node_modules \ + && rm -f /app/node_modules/dotenv \ + && cp -RL /usr/local/lib/node_modules/dotenv /app/node_modules/dotenv \ + && rm -f /app/node_modules/prisma \ + && cp -RL /usr/local/lib/node_modules/prisma /app/node_modules/prisma + +ENV NODE_PATH=/usr/local/lib/node_modules USER nextjs @@ -50,5 +65,9 @@ EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" -# Start the application +# Apply pending migrations before starting the application. +COPY --chown=nextjs:nodejs docker-entrypoint.sh ./docker-entrypoint.sh +RUN chmod +x ./docker-entrypoint.sh + +ENTRYPOINT ["./docker-entrypoint.sh"] CMD ["node", "server.js"] diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml new file mode 100644 index 00000000..a6009a12 --- /dev/null +++ b/docker-compose.ci.yml @@ -0,0 +1,28 @@ +services: + # Disposable MySQL used only by CI and the published-image smoke test. + db: + image: mysql:8.4 + cap_add: + - SYS_NICE + environment: + MYSQL_DATABASE: ci + MYSQL_USER: ci + MYSQL_PASSWORD: ci + MYSQL_ROOT_PASSWORD: root + healthcheck: + test: ["CMD-SHELL", "mysqladmin ping -h localhost -uci -pci --silent"] + interval: 5s + timeout: 5s + retries: 20 + start_period: 20s + + va-stats-app: + environment: + MYSQL_HOST: db + MYSQL_PORT: 3306 + MYSQL_DATABASE: ci + MYSQL_USER: ci + MYSQL_PASSWORD: ci + depends_on: + db: + condition: service_healthy diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 00000000..1227b6c8 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# Apply committed Prisma migrations before starting the application. +set -eu + +ATTEMPTS=30 + +log() { + echo "[entrypoint] $*" +} + +i=1 +while [ "$i" -le "$ATTEMPTS" ]; do + log "Applying Prisma migrations (attempt $i/$ATTEMPTS)..." + if output=$(prisma migrate deploy 2>&1); then + echo "$output" + log "Migrations applied. Starting server..." + exec "$@" + fi + + echo "$output" + case "$output" in + *P1001*|*reach*database*|*ECONNREFUSED*) + log "Database is not reachable yet; retrying in 2s..." + i=$((i + 1)) + sleep 2 + ;; + *) + log "Migration failed with a non-connection error; aborting." + exit 1 + ;; + esac +done + +log "Database never became reachable after $ATTEMPTS attempts; aborting." +exit 1 diff --git a/package.json b/package.json index 75e9325b..a8ffb66a 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", "@mui/styled-engine-sc": "7.3.2", + "@prisma/client": "7.10.0", "@swc/helpers": "0.5.17", "ag-grid-react": "32.2.2", "better-auth": "^1.7.1", @@ -52,6 +53,7 @@ "@types/react": "18.3.24", "@types/react-dom": "18.3.7", "autoprefixer": "10.4.16", + "dotenv": "16.6.1", "eslint": "8.57.0", "eslint-config-next": "14.2.13", "husky": "^9.1.7", @@ -60,6 +62,7 @@ "lint-staged": "^15.5.2", "prettier": "^3.4.2", "prettier-plugin-tailwindcss": "^0.6.9", + "prisma": "7.10.0", "tailwindcss": "3.4.1", "typescript": "5.9.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2a56b89..a9feb2e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: dependencies: "@better-auth/passkey": specifier: ^1.7.1 - version: 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.1(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) + version: 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.1(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) "@emotion/react": specifier: 11.14.0 version: 11.14.0(@types/react@18.3.24)(react@18.2.0) @@ -28,6 +28,9 @@ importers: "@mui/styled-engine-sc": specifier: 7.3.2 version: 7.3.2(@types/react@18.3.24)(styled-components@6.1.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + "@prisma/client": + specifier: 7.10.0 + version: 7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2) "@swc/helpers": specifier: 0.5.17 version: 0.5.17 @@ -36,7 +39,7 @@ importers: version: 32.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) better-auth: specifier: ^1.7.1 - version: 1.7.1(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.7.1(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) date-fns: specifier: 4.1.0 version: 4.1.0 @@ -101,6 +104,9 @@ importers: autoprefixer: specifier: 10.4.16 version: 10.4.16(postcss@8.5.6) + dotenv: + specifier: 16.6.1 + version: 16.6.1 eslint: specifier: 8.57.0 version: 8.57.0 @@ -125,6 +131,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.6.9 version: 0.6.9(prettier@3.4.2) + prisma: + specifier: 7.10.0 + version: 7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2) tailwindcss: specifier: 3.4.1 version: 3.4.1 @@ -979,6 +988,23 @@ packages: { integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== } engines: { node: ">=18" } + "@electric-sql/pglite-socket@0.1.3": + resolution: + { integrity: sha512-LAciWM0M1dCL8hlsxu2venbVZcdxema0BtDfpWYVqr+Y468UADw0pFWidhKw1M8sfJ8rdLT71tjMmnirf/IZRQ== } + hasBin: true + peerDependencies: + "@electric-sql/pglite": 0.4.3 + + "@electric-sql/pglite-tools@0.3.3": + resolution: + { integrity: sha512-AlzLJTRJ8+UFgK8CmxIpyIpJ0+YaFw02IiOSdYrqxwPXdSyeIShz8aa9Tq+tYFXdPwcaMp/Fc80mQZ1dkOQ/wg== } + peerDependencies: + "@electric-sql/pglite": 0.4.3 + + "@electric-sql/pglite@0.4.3": + resolution: + { integrity: sha512-ichuWTgtd4mOM1G4SpyGJa5trT03lWbMypDV0fUXUCXg5hiHqVAz/bZyV68NqmkLB7WcYmj1RMJVSp8HV/v/ZQ== } + "@emnapi/core@1.9.1": resolution: { integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA== } @@ -1690,6 +1716,159 @@ packages: resolution: { integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== } + "@prisma/client-runtime-utils@7.10.0": + resolution: + { integrity: sha512-cnCy7lUV8/CctgKVEmqAbSLAmwqJdE/qAlqTBk/0NDk59zEb2cZ0M0M0E4vVPnqbSEYudRroQDvOWfUZH6RIfw== } + + "@prisma/client@7.10.0": + resolution: + { integrity: sha512-Ubw/QS9JGIBSBUsyxAUQuK/Jcu0Tsva7le7QbLd91Kix9yJvYDdj5QkwgEbbZniH80dd+sziQcALPc+HnvQC8Q== } + engines: { node: ^20.19 || ^22.12 || >=24.0 } + peerDependencies: + prisma: "*" + typescript: ">=5.4.0" + peerDependenciesMeta: + prisma: + optional: true + typescript: + optional: true + + "@prisma/config@7.10.0": + resolution: + { integrity: sha512-Rcg828gIRE3HOQ3pOATFjV5d/P0U9OIobxhd/IMxlfWjA4vru0eGwb0AIwFw0rmcLMVShohZYWPixVxkBHsxUA== } + + "@prisma/debug@7.10.0": + resolution: + { integrity: sha512-caygJKtltmRIgdJ3jRpkOr7yM4DW6zxo5uOmojKWFb3asnxWoRkQOwZmXBgD8FZp4htrX+nMpcWqDwzlQ1+Y4g== } + + "@prisma/debug@7.2.0": + resolution: + { integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw== } + + "@prisma/dev@0.24.17": + resolution: + { integrity: sha512-UvdZzmpFwknnfreh6Jije84ekkYGPYEJhXG1tFzCsCfQyzJifrOo38eZc0qajzvaC6OLUOrN9ML5XfCnEZL9DA== } + + "@prisma/engines-version@7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3": + resolution: + { integrity: sha512-8OJ6RuZTZ06eFUOtBwxVmv8XMmOW6HWN5F+uxUbZkGxR0Bfab1dfAdXaHPmR5mb59E+fmUo8IOzXlbLY1SClbw== } + + "@prisma/engines@7.10.0": + resolution: + { integrity: sha512-KNumN6NHFwybvfdYzTee9pqwx5PvknpWAaHn6L5NsbrKdl+SQrsVZs9opKs6U6SAsvB26HDt3WybRjOhgoWOYQ== } + + "@prisma/fetch-engine@7.10.0": + resolution: + { integrity: sha512-Zqyu8DY14t6W/xwmAxUYWCXtHrvQnSvT644EAZSsdM8NSmCS74vJJbBKdVsK3ucFpnUWkEpbO1a0CxJXrg130g== } + + "@prisma/get-platform@7.10.0": + resolution: + { integrity: sha512-0bra1LFYi8xNw0yqV62bHJNQk4BKleOngZiqPWIQc7a3+9q6rqsnqJ15BuepP8943PFMvtmgnP52juZsyYkA6w== } + + "@prisma/get-platform@7.2.0": + resolution: + { integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA== } + + "@prisma/query-plan-executor@7.2.0": + resolution: + { integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ== } + + "@prisma/streams-local@0.1.11": + resolution: + { integrity: sha512-0TcebL559MByKqTJ+SsrFIEg228iw8UCVRFckzgfRSiJqczhs+MuAgWOF9lnOIV/IVqvu+KMnFTH0eDeTQMpUg== } + engines: { bun: ">=1.2.0", node: ">=22.0.0" } + + "@prisma/studio-core@0.33.0": + resolution: + { integrity: sha512-V2fX/nKEymNTrHXwfP26PGjoLStO35Ogu+ex7CFJbLrMYEcZxxZpiSNOs7px23Hk5mzLWvM5RsqG6Ka+rha+wg== } + engines: { node: ^20.19 || ^22.12 || >=24.0, pnpm: "8" } + peerDependencies: + "@types/react": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + "@radix-ui/primitive@1.1.3": + resolution: + { integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== } + + "@radix-ui/react-compose-refs@1.1.2": + resolution: + { integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-primitive@2.1.3": + resolution: + { integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-slot@1.2.3": + resolution: + { integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-toggle@1.1.10": + resolution: + { integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ== } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-use-controllable-state@1.2.2": + resolution: + { integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-effect-event@0.0.2": + resolution: + { integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-layout-effect@1.1.1": + resolution: + { integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@react-native/normalize-color@2.1.0": resolution: { integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== } @@ -1852,18 +2031,42 @@ packages: resolution: { integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== } + "@types/d3-array@3.0.3": + resolution: + { integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ== } + "@types/d3-array@3.2.2": resolution: { integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw== } + "@types/d3-color@3.1.0": + resolution: + { integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== } + "@types/d3-color@3.1.3": resolution: { integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== } + "@types/d3-delaunay@6.0.1": + resolution: + { integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ== } + "@types/d3-ease@3.0.2": resolution: { integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== } + "@types/d3-format@3.0.1": + resolution: + { integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== } + + "@types/d3-geo@3.1.0": + resolution: + { integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== } + + "@types/d3-interpolate@3.0.1": + resolution: + { integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== } + "@types/d3-interpolate@3.0.4": resolution: { integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== } @@ -1872,14 +2075,30 @@ packages: resolution: { integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== } + "@types/d3-scale@4.0.2": + resolution: + { integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA== } + "@types/d3-scale@4.0.9": resolution: { integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== } + "@types/d3-shape@3.1.7": + resolution: + { integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== } + "@types/d3-shape@3.1.8": resolution: { integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w== } + "@types/d3-time-format@2.1.0": + resolution: + { integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA== } + + "@types/d3-time@3.0.0": + resolution: + { integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== } + "@types/d3-time@3.0.4": resolution: { integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== } @@ -1904,6 +2123,10 @@ packages: resolution: { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } + "@types/geojson@7946.0.16": + resolution: + { integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== } + "@types/glob@7.2.0": resolution: { integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== } @@ -1938,6 +2161,10 @@ packages: resolution: { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + "@types/lodash@4.17.25": + resolution: + { integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ== } + "@types/minimatch@5.1.2": resolution: { integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== } @@ -2198,6 +2425,50 @@ packages: cpu: [x64] os: [win32] + "@visx/curve@4.0.1-alpha.0": + resolution: + { integrity: sha512-jRu61Uz274pV1zyioXmboyrLutYbnKsgjj4njSGCnhdXj5GkZvZbg+ThDb6oOzoAnJOBRLz4rzPlWvNJOzuVMg== } + + "@visx/event@4.0.1-alpha.0": + resolution: + { integrity: sha512-EQqCMSv/s8NbFjo+hz3FKsvvYfP+2QslsFJ/24/O5l/W+7UC6J6aAvO0ujVwrTwdYbuQ+vhxKi1xdPdKR/qj1g== } + + "@visx/grid@4.0.1-alpha.0": + resolution: + { integrity: sha512-rycutGmTHO+znNdPumheWMglm7YfpffvRwUkVy5zy4WoORIuKTMkDxwnOzHG2xMxU3EE/YCd37xFV5AxA30yeg== } + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + "@visx/group@4.0.1-alpha.0": + resolution: + { integrity: sha512-V19l7iQ7jccBv8kao/EByuI6o4xtxzzLV9nqVI1hRvmdzTVsuLpqlwzYCZUXJaTVvUWf8s4D2SQFjGkj/Nw+0w== } + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + "@visx/point@4.0.1-alpha.0": + resolution: + { integrity: sha512-ijTfr/Nx09f03vIj9nyTr3z4Xth4Y75427UaogJh6dnIRLMEFHQOwNu791sbfiNj0a+ZXuaE32h0vKrFe4/8Qg== } + + "@visx/responsive@4.0.1-alpha.0": + resolution: + { integrity: sha512-o+1zGywQZY0+yOx3Iw87wc4bbPJRr/HnIukTwfOz4UVyj9pB1OQNVHB7OORO1+LBHJceWpB31co/ZV9KHncKrA== } + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + "@visx/scale@4.0.1-alpha.0": + resolution: + { integrity: sha512-nzjeE87vFSAXGWFiiNfBpNLAf0Q8Qmf6syvKLjqNi4kGZkdhbUll3E/59YsgWXmjM8+llPLWzGsP+JPvo5eq1A== } + + "@visx/shape@4.0.1-alpha.0": + resolution: + { integrity: sha512-62QeiVNmPlterQGwhkEDcbq7M0MqY0lBsK5QKXtM9ZoPZWkuGV3aykA3+Xu20B2FAvyJq4LqJzBc7Sxr+EAdbA== } + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + "@visx/vendor@4.0.0-alpha.0": + resolution: + { integrity: sha512-6I+MuqXBcv9jnlcVowHoHKSdk9gXTWkHLKyqBwRWg7LY6A3Ei8SHfubpqGV5rBUSppxMq2RszPJUS6w+H0YgmQ== } + "@webassemblyjs/ast@1.14.1": resolution: { integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== } @@ -2494,6 +2765,11 @@ packages: { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } engines: { node: ">= 0.4" } + aws-ssl-profiles@1.1.2: + resolution: + { integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== } + engines: { node: ">= 6.0.0" } + axe-core@4.10.3: resolution: { integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg== } @@ -2646,6 +2922,10 @@ packages: zod: optional: true + better-result@2.10.0: + resolution: + { integrity: sha512-oQhh0y1qo2/ZKdAAEvHZAqKKiHOFU5k/bW96fE2ScgQOVkJRiHwB+nOS1SgFsYqRlxMDWvefXi9Q3px7QvgNDw== } + big.js@5.2.2: resolution: { integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== } @@ -2692,6 +2972,15 @@ packages: { integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== } engines: { node: ">=10.16.0" } + c12@3.3.4: + resolution: + { integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA== } + peerDependencies: + magicast: "*" + peerDependenciesMeta: + magicast: + optional: true + call-bind-apply-helpers@1.0.2: resolution: { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } @@ -2755,6 +3044,11 @@ packages: { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== } engines: { node: ">= 8.10.0" } + chokidar@5.0.0: + resolution: + { integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== } + engines: { node: ">= 20.19.0" } + chrome-trace-event@1.0.4: resolution: { integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== } @@ -2769,6 +3063,10 @@ packages: resolution: { integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA== } + classnames@2.5.1: + resolution: + { integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== } + clean-webpack-plugin@4.0.0: resolution: { integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w== } @@ -2858,6 +3156,14 @@ packages: resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + confbox@0.2.4: + resolution: + { integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== } + + confbox@0.3.1: + resolution: + { integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA== } + convert-source-map@1.9.0: resolution: { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== } @@ -2921,6 +3227,11 @@ packages: resolution: { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } + d3-array@3.2.1: + resolution: + { integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ== } + engines: { node: ">=12" } + d3-array@3.2.4: resolution: { integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== } @@ -2931,16 +3242,31 @@ packages: { integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== } engines: { node: ">=12" } + d3-delaunay@6.0.2: + resolution: + { integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== } + engines: { node: ">=12" } + d3-ease@3.0.1: resolution: { integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== } engines: { node: ">=12" } + d3-format@3.1.0: + resolution: + { integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== } + engines: { node: ">=12" } + d3-format@3.1.2: resolution: { integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== } engines: { node: ">=12" } + d3-geo@3.1.0: + resolution: + { integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== } + engines: { node: ">=12" } + d3-interpolate@3.0.1: resolution: { integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== } @@ -3044,6 +3370,11 @@ packages: resolution: { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + deepmerge-ts@7.1.5: + resolution: + { integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw== } + engines: { node: ">=16.0.0" } + deepmerge@4.3.1: resolution: { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } @@ -3068,6 +3399,10 @@ packages: { integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== } engines: { node: ">=6" } + delaunator@5.1.0: + resolution: + { integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ== } + denque@2.1.0: resolution: { integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== } @@ -3078,6 +3413,10 @@ packages: { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } engines: { node: ">=6" } + destr@2.0.5: + resolution: + { integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== } + detect-libc@2.1.1: resolution: { integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw== } @@ -3123,6 +3462,16 @@ packages: resolution: { integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== } + dotenv@16.6.1: + resolution: + { integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== } + engines: { node: ">=12" } + + dotenv@17.4.2: + resolution: + { integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== } + engines: { node: ">=12" } + dunder-proto@1.0.1: resolution: { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } @@ -3132,6 +3481,10 @@ packages: resolution: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + effect@3.20.0: + resolution: + { integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw== } + ejs@3.1.10: resolution: { integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== } @@ -3142,6 +3495,10 @@ packages: resolution: { integrity: sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA== } + elkjs@0.11.1: + resolution: + { integrity: sha512-zxxR9k+rx5ktMwT/FwyLdPCrq7xN6e4VGGHH8hA01vVYKjTFik7nHOxBnAYtrgYUB1RpAiLvA1/U2YraWxyKKg== } + emittery@0.13.1: resolution: { integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== } @@ -3164,6 +3521,11 @@ packages: { integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== } engines: { node: ">= 4" } + empathic@2.0.0: + resolution: + { integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== } + engines: { node: ">=14" } + enhanced-resolve@5.18.3: resolution: { integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== } @@ -3174,6 +3536,11 @@ packages: { integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== } engines: { node: ">=0.12" } + env-paths@3.0.0: + resolution: + { integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + environment@1.1.0: resolution: { integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== } @@ -3424,6 +3791,19 @@ packages: { integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== } engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + exsolve@1.1.1: + resolution: + { integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g== } + + fast-check@3.23.2: + resolution: + { integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A== } + engines: { node: ">=8.0.0" } + + fast-decode-uri-component@1.0.1: + resolution: + { integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== } + fast-deep-equal@3.1.3: resolution: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } @@ -3445,6 +3825,10 @@ packages: resolution: { integrity: sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg== } + fast-querystring@1.1.2: + resolution: + { integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== } + fast-sha256@1.3.0: resolution: { integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== } @@ -3498,6 +3882,11 @@ packages: { integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== } engines: { node: ">=8" } + find-my-way@9.7.0: + resolution: + { integrity: sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ== } + engines: { node: ">=20" } + find-root@1.1.0: resolution: { integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== } @@ -3596,6 +3985,10 @@ packages: { integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== } engines: { node: ">=8.0.0" } + get-port-please@3.2.0: + resolution: + { integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A== } + get-proto@1.0.1: resolution: { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } @@ -3620,6 +4013,11 @@ packages: resolution: { integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== } + giget@3.3.1: + resolution: + { integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg== } + hasBin: true + glob-parent@5.1.2: resolution: { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } @@ -3675,10 +4073,18 @@ packages: resolution: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + grammex@3.1.13: + resolution: + { integrity: sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg== } + graphemer@1.4.0: resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + graphmatch@1.1.1: + resolution: + { integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg== } + has-bigints@1.1.0: resolution: { integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== } @@ -3761,6 +4167,11 @@ packages: { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } engines: { node: ">=0.10.0" } + iconv-lite@0.7.3: + resolution: + { integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ== } + engines: { node: ">=0.10.0" } + idb@7.1.1: resolution: { integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== } @@ -4268,6 +4679,11 @@ packages: { integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== } hasBin: true + jiti@2.7.0: + resolution: + { integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== } + hasBin: true + jose@6.2.9: resolution: { integrity: sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA== } @@ -4472,6 +4888,11 @@ packages: { integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA== } engines: { node: ">=16.14" } + lru.min@1.1.5: + resolution: + { integrity: sha512-5J9ysMYUpYIg9RF2vJpy9SinEmSviFSe0GyPpCQ4L5QSkLAgeLXlTAOu2ZwWUU5m+0SBl6gUU1R1ZQB3aKypfA== } + engines: { bun: ">=1.0.0", deno: ">=1.30.0", node: ">=8.0.0" } + lz-string@1.5.0: resolution: { integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== } @@ -4583,6 +5004,11 @@ packages: resolution: { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + mysql2@3.15.3: + resolution: + { integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg== } + engines: { node: ">= 8.0" } + mysql2@3.9.8: resolution: { integrity: sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA== } @@ -4739,6 +5165,10 @@ packages: { integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== } engines: { node: ">= 0.4" } + ohash@2.0.12: + resolution: + { integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw== } + once@1.4.0: resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } @@ -4850,6 +5280,14 @@ packages: { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } engines: { node: ">=8" } + pathe@2.0.3: + resolution: + { integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== } + + perfect-debounce@2.1.0: + resolution: + { integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== } + picocolors@1.1.1: resolution: { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } @@ -4900,6 +5338,10 @@ packages: { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } engines: { node: ">=8" } + pkg-types@2.3.3: + resolution: + { integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w== } + possible-typed-array-names@1.1.0: resolution: { integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== } @@ -4967,6 +5409,11 @@ packages: { integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== } engines: { node: ^10 || ^12 || >=14 } + postgres@3.4.7: + resolution: + { integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw== } + engines: { node: ">=12" } + prelude-ls@1.2.1: resolution: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } @@ -5049,6 +5496,20 @@ packages: { integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== } engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + prisma@7.10.0: + resolution: + { integrity: sha512-o0ornyJOWgygVAzGCpr8PdXV8EJLHyVGDDUr/voBQt8Azzw8cYTByzzPGcA/m4tCkPcnJA8raEOv2CslsKhPEw== } + engines: { node: ^20.19 || ^22.12 || >=24.0 } + hasBin: true + peerDependencies: + better-sqlite3: ">=9.0.0" + typescript: ">=5.4.0" + peerDependenciesMeta: + better-sqlite3: + optional: true + typescript: + optional: true + promise@7.3.1: resolution: { integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== } @@ -5057,11 +5518,19 @@ packages: resolution: { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } + proper-lockfile@4.1.2: + resolution: + { integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== } + punycode@2.3.1: resolution: { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } engines: { node: ">=6" } + pure-rand@6.1.0: + resolution: + { integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== } + pure-rand@7.0.1: resolution: { integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== } @@ -5083,6 +5552,10 @@ packages: resolution: { integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== } + rc9@3.1.0: + resolution: + { integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q== } + react-dom@18.2.0: resolution: { integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== } @@ -5153,6 +5626,11 @@ packages: { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } engines: { node: ">=8.10.0" } + readdirp@5.1.1: + resolution: + { integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA== } + engines: { node: ">= 20.19.0" } + recharts@3.8.0: resolution: { integrity: sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ== } @@ -5214,6 +5692,10 @@ packages: { integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== } hasBin: true + remeda@2.33.4: + resolution: + { integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ== } + require-directory@2.1.1: resolution: { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } @@ -5273,6 +5755,16 @@ packages: { integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== } engines: { node: ">=18" } + ret@0.5.0: + resolution: + { integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw== } + engines: { node: ">=10" } + + retry@0.12.0: + resolution: + { integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== } + engines: { node: ">= 4" } + reusify@1.1.0: resolution: { integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== } @@ -5294,6 +5786,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@3.0.3: + resolution: + { integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA== } + rollup-plugin-terser@7.0.2: resolution: { integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== } @@ -5338,6 +5834,11 @@ packages: { integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== } engines: { node: ">= 0.4" } + safe-regex2@5.1.1: + resolution: + { integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA== } + hasBin: true + safer-buffer@2.1.2: resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } @@ -5534,6 +6035,10 @@ packages: resolution: { integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg== } + std-env@3.10.0: + resolution: + { integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== } + stop-iteration-iterator@1.1.0: resolution: { integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== } @@ -5981,6 +6486,15 @@ packages: { integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== } engines: { node: ">=10.12.0" } + valibot@1.4.2: + resolution: + { integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg== } + peerDependencies: + typescript: ">=5" + peerDependenciesMeta: + typescript: + optional: true + victory-vendor@37.3.6: resolution: { integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ== } @@ -6242,6 +6756,10 @@ packages: { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } engines: { node: ">=10" } + zeptomatch@2.1.0: + resolution: + { integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA== } + zod@4.4.3: resolution: { integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== } @@ -7036,22 +7554,25 @@ snapshots: "@better-auth/core": 1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) "@better-auth/utils": 0.4.2 - "@better-auth/passkey@1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.1(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1)": + "@better-auth/passkey@1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.1(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1)": dependencies: "@better-auth/core": 1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) "@better-auth/utils": 0.4.2 "@better-fetch/fetch": 1.3.1 "@simplewebauthn/browser": 13.3.0 "@simplewebauthn/server": 13.3.2 - better-auth: 1.7.1(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + better-auth: 1.7.1(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) better-call: 1.4.0(zod@4.4.3) nanostores: 1.5.1 zod: 4.4.3 - "@better-auth/prisma-adapter@1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)": + "@better-auth/prisma-adapter@1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))": dependencies: "@better-auth/core": 1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) "@better-auth/utils": 0.4.2 + optionalDependencies: + "@prisma/client": 7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2) + prisma: 7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2) "@better-auth/telemetry@1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)": dependencies: @@ -7089,6 +7610,16 @@ snapshots: "@csstools/css-tokenizer@3.0.4": {} + "@electric-sql/pglite-socket@0.1.3(@electric-sql/pglite@0.4.3)": + dependencies: + "@electric-sql/pglite": 0.4.3 + + "@electric-sql/pglite-tools@0.3.3(@electric-sql/pglite@0.4.3)": + dependencies: + "@electric-sql/pglite": 0.4.3 + + "@electric-sql/pglite@0.4.3": {} + "@emnapi/core@1.9.1": dependencies: "@emnapi/wasi-threads": 1.2.0 @@ -7806,6 +8337,155 @@ snapshots: "@popperjs/core@2.11.8": {} + "@prisma/client-runtime-utils@7.10.0": {} + + "@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2)": + dependencies: + "@prisma/client-runtime-utils": 7.10.0 + optionalDependencies: + prisma: 7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2) + typescript: 5.9.2 + + "@prisma/config@7.10.0": + dependencies: + c12: 3.3.4 + deepmerge-ts: 7.1.5 + effect: 3.20.0 + empathic: 2.0.0 + transitivePeerDependencies: + - magicast + + "@prisma/debug@7.10.0": {} + + "@prisma/debug@7.2.0": {} + + "@prisma/dev@0.24.17(typescript@5.9.2)": + dependencies: + "@electric-sql/pglite": 0.4.3 + "@electric-sql/pglite-socket": 0.1.3(@electric-sql/pglite@0.4.3) + "@electric-sql/pglite-tools": 0.3.3(@electric-sql/pglite@0.4.3) + "@prisma/get-platform": 7.2.0 + "@prisma/query-plan-executor": 7.2.0 + "@prisma/streams-local": 0.1.11 + find-my-way: 9.7.0 + foreground-child: 3.3.1 + get-port-please: 3.2.0 + pathe: 2.0.3 + proper-lockfile: 4.1.2 + remeda: 2.33.4 + std-env: 3.10.0 + valibot: 1.4.2(typescript@5.9.2) + zeptomatch: 2.1.0 + transitivePeerDependencies: + - typescript + + "@prisma/engines-version@7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3": {} + + "@prisma/engines@7.10.0": + dependencies: + "@prisma/debug": 7.10.0 + "@prisma/engines-version": 7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3 + "@prisma/fetch-engine": 7.10.0 + "@prisma/get-platform": 7.10.0 + + "@prisma/fetch-engine@7.10.0": + dependencies: + "@prisma/debug": 7.10.0 + "@prisma/engines-version": 7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3 + "@prisma/get-platform": 7.10.0 + + "@prisma/get-platform@7.10.0": + dependencies: + "@prisma/debug": 7.10.0 + + "@prisma/get-platform@7.2.0": + dependencies: + "@prisma/debug": 7.2.0 + + "@prisma/query-plan-executor@7.2.0": {} + + "@prisma/streams-local@0.1.11": + dependencies: + ajv: 8.17.1 + better-result: 2.10.0 + env-paths: 3.0.0 + proper-lockfile: 4.1.2 + + "@prisma/studio-core@0.33.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)": + dependencies: + "@radix-ui/react-toggle": 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + "@types/react": 18.3.24 + "@visx/curve": 4.0.1-alpha.0 + "@visx/event": 4.0.1-alpha.0 + "@visx/grid": 4.0.1-alpha.0(react@18.2.0) + "@visx/group": 4.0.1-alpha.0(react@18.2.0) + "@visx/responsive": 4.0.1-alpha.0(react@18.2.0) + "@visx/scale": 4.0.1-alpha.0 + "@visx/shape": 4.0.1-alpha.0(react@18.2.0) + d3-array: 3.2.4 + d3-shape: 3.2.0 + elkjs: 0.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - "@types/react-dom" + + "@radix-ui/primitive@1.1.3": {} + + "@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.24)(react@18.2.0)": + dependencies: + react: 18.2.0 + optionalDependencies: + "@types/react": 18.3.24 + + "@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)": + dependencies: + "@radix-ui/react-slot": 1.2.3(@types/react@18.3.24)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + "@types/react": 18.3.24 + "@types/react-dom": 18.3.7(@types/react@18.3.24) + + "@radix-ui/react-slot@1.2.3(@types/react@18.3.24)(react@18.2.0)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.24)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + "@types/react": 18.3.24 + + "@radix-ui/react-toggle@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)": + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.24)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + "@types/react": 18.3.24 + "@types/react-dom": 18.3.7(@types/react@18.3.24) + + "@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.24)(react@18.2.0)": + dependencies: + "@radix-ui/react-use-effect-event": 0.0.2(@types/react@18.3.24)(react@18.2.0) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.24)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + "@types/react": 18.3.24 + + "@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.24)(react@18.2.0)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.24)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + "@types/react": 18.3.24 + + "@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.24)(react@18.2.0)": + dependencies: + react: 18.2.0 + optionalDependencies: + "@types/react": 18.3.24 + "@react-native/normalize-color@2.1.0": {} "@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.24)(react@18.2.0)(redux@5.0.1))(react@18.2.0)": @@ -7967,26 +8647,54 @@ snapshots: dependencies: "@babel/types": 7.28.4 + "@types/d3-array@3.0.3": {} + "@types/d3-array@3.2.2": {} + "@types/d3-color@3.1.0": {} + "@types/d3-color@3.1.3": {} + "@types/d3-delaunay@6.0.1": {} + "@types/d3-ease@3.0.2": {} + "@types/d3-format@3.0.1": {} + + "@types/d3-geo@3.1.0": + dependencies: + "@types/geojson": 7946.0.16 + + "@types/d3-interpolate@3.0.1": + dependencies: + "@types/d3-color": 3.1.3 + "@types/d3-interpolate@3.0.4": dependencies: "@types/d3-color": 3.1.3 "@types/d3-path@3.1.1": {} + "@types/d3-scale@4.0.2": + dependencies: + "@types/d3-time": 3.0.4 + "@types/d3-scale@4.0.9": dependencies: "@types/d3-time": 3.0.4 + "@types/d3-shape@3.1.7": + dependencies: + "@types/d3-path": 3.1.1 + "@types/d3-shape@3.1.8": dependencies: "@types/d3-path": 3.1.1 + "@types/d3-time-format@2.1.0": {} + + "@types/d3-time@3.0.0": {} + "@types/d3-time@3.0.4": {} "@types/d3-timer@3.0.2": {} @@ -8005,6 +8713,8 @@ snapshots: "@types/estree@1.0.8": {} + "@types/geojson@7946.0.16": {} + "@types/glob@7.2.0": dependencies: "@types/minimatch": 5.1.2 @@ -8035,6 +8745,8 @@ snapshots: "@types/json5@0.0.29": {} + "@types/lodash@4.17.25": {} + "@types/minimatch@5.1.2": {} "@types/node@24.3.1": @@ -8232,6 +8944,83 @@ snapshots: "@unrs/resolver-binding-win32-x64-msvc@1.11.1": optional: true + "@visx/curve@4.0.1-alpha.0": + dependencies: + "@visx/vendor": 4.0.0-alpha.0 + + "@visx/event@4.0.1-alpha.0": + dependencies: + "@types/react": 18.3.24 + "@visx/point": 4.0.1-alpha.0 + + "@visx/grid@4.0.1-alpha.0(react@18.2.0)": + dependencies: + "@types/react": 18.3.24 + "@visx/curve": 4.0.1-alpha.0 + "@visx/group": 4.0.1-alpha.0(react@18.2.0) + "@visx/point": 4.0.1-alpha.0 + "@visx/scale": 4.0.1-alpha.0 + "@visx/shape": 4.0.1-alpha.0(react@18.2.0) + classnames: 2.5.1 + react: 18.2.0 + + "@visx/group@4.0.1-alpha.0(react@18.2.0)": + dependencies: + "@types/react": 18.3.24 + classnames: 2.5.1 + react: 18.2.0 + + "@visx/point@4.0.1-alpha.0": {} + + "@visx/responsive@4.0.1-alpha.0(react@18.2.0)": + dependencies: + "@types/lodash": 4.17.25 + "@types/react": 18.3.24 + lodash: 4.17.21 + react: 18.2.0 + + "@visx/scale@4.0.1-alpha.0": + dependencies: + "@visx/vendor": 4.0.0-alpha.0 + + "@visx/shape@4.0.1-alpha.0(react@18.2.0)": + dependencies: + "@types/lodash": 4.17.25 + "@types/react": 18.3.24 + "@visx/curve": 4.0.1-alpha.0 + "@visx/group": 4.0.1-alpha.0(react@18.2.0) + "@visx/scale": 4.0.1-alpha.0 + "@visx/vendor": 4.0.0-alpha.0 + classnames: 2.5.1 + lodash: 4.17.21 + react: 18.2.0 + + "@visx/vendor@4.0.0-alpha.0": + dependencies: + "@types/d3-array": 3.0.3 + "@types/d3-color": 3.1.0 + "@types/d3-delaunay": 6.0.1 + "@types/d3-format": 3.0.1 + "@types/d3-geo": 3.1.0 + "@types/d3-interpolate": 3.0.1 + "@types/d3-path": 3.1.1 + "@types/d3-scale": 4.0.2 + "@types/d3-shape": 3.1.7 + "@types/d3-time": 3.0.0 + "@types/d3-time-format": 2.1.0 + d3-array: 3.2.1 + d3-color: 3.1.0 + d3-delaunay: 6.0.2 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + internmap: 2.0.3 + "@webassemblyjs/ast@1.14.1": dependencies: "@webassemblyjs/helper-numbers": 1.13.2 @@ -8510,6 +9299,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + aws-ssl-profiles@1.1.2: {} + axe-core@4.10.3: {} axobject-query@4.1.0: {} @@ -8609,14 +9400,14 @@ snapshots: baseline-browser-mapping@2.9.15: {} - better-auth@1.7.1(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + better-auth@1.7.1(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.9.8)(next@14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: "@better-auth/core": 1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) "@better-auth/drizzle-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) "@better-auth/kysely-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5) "@better-auth/memory-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) "@better-auth/mongo-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) - "@better-auth/prisma-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) + "@better-auth/prisma-adapter": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@prisma/client@7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2))(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2)) "@better-auth/telemetry": 1.7.1(@better-auth/core@1.7.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) "@better-auth/utils": 0.4.2 "@better-fetch/fetch": 1.3.1 @@ -8629,8 +9420,10 @@ snapshots: nanostores: 1.5.1 zod: 4.4.3 optionalDependencies: + "@prisma/client": 7.10.0(prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2))(typescript@5.9.2) mysql2: 3.9.8 next: 14.2.33(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + prisma: 7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -8646,6 +9439,8 @@ snapshots: optionalDependencies: zod: 4.4.3 + better-result@2.10.0: {} + big.js@5.2.2: {} binary-extensions@2.3.0: {} @@ -8683,6 +9478,21 @@ snapshots: dependencies: streamsearch: 1.1.0 + c12@3.3.4: + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.12 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.3 + rc9: 3.1.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -8733,12 +9543,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + chrome-trace-event@1.0.4: {} ci-info@4.3.1: {} cjs-module-lexer@2.1.0: {} + classnames@2.5.1: {} + clean-webpack-plugin@4.0.0(webpack@5.101.3): dependencies: del: 4.1.1 @@ -8797,6 +9613,10 @@ snapshots: concat-map@0.0.1: {} + confbox@0.2.4: {} + + confbox@0.3.1: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -8850,16 +9670,30 @@ snapshots: csstype@3.1.3: {} + d3-array@3.2.1: + dependencies: + internmap: 2.0.3 + d3-array@3.2.4: dependencies: internmap: 2.0.3 d3-color@3.1.0: {} + d3-delaunay@6.0.2: + dependencies: + delaunator: 5.1.0 + d3-ease@3.0.1: {} + d3-format@3.1.0: {} + d3-format@3.1.2: {} + d3-geo@3.1.0: + dependencies: + d3-array: 3.2.4 + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 @@ -8933,6 +9767,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -8959,10 +9795,16 @@ snapshots: pify: 4.0.1 rimraf: 2.7.1 + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + denque@2.1.0: {} dequal@2.0.3: {} + destr@2.0.5: {} + detect-libc@2.1.1: {} detect-newline@3.1.0: {} @@ -8992,6 +9834,10 @@ snapshots: "@babel/runtime": 7.28.4 csstype: 3.1.3 + dotenv@16.6.1: {} + + dotenv@17.4.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9000,12 +9846,19 @@ snapshots: eastasianwidth@0.2.0: {} + effect@3.20.0: + dependencies: + "@standard-schema/spec": 1.1.0 + fast-check: 3.23.2 + ejs@3.1.10: dependencies: jake: 10.9.4 electron-to-chromium@1.5.227: {} + elkjs@0.11.1: {} + emittery@0.13.1: {} emoji-regex@10.5.0: {} @@ -9016,6 +9869,8 @@ snapshots: emojis-list@3.0.0: {} + empathic@2.0.0: {} + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -9023,6 +9878,8 @@ snapshots: entities@6.0.1: {} + env-paths@3.0.0: {} + environment@1.1.0: {} error-ex@1.3.4: @@ -9388,6 +10245,14 @@ snapshots: jest-mock: 30.2.0 jest-util: 30.2.0 + exsolve@1.1.1: {} + + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -9404,6 +10269,10 @@ snapshots: fast-loops@1.1.4: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + fast-sha256@1.3.0: {} fast-uri@3.1.0: {} @@ -9452,6 +10321,12 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-my-way@9.7.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.1.1 + find-root@1.1.0: {} find-up@4.1.0: @@ -9535,6 +10410,8 @@ snapshots: get-package-type@0.1.0: {} + get-port-please@3.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -9554,6 +10431,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@3.3.1: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -9611,8 +10490,12 @@ snapshots: graceful-fs@4.2.11: {} + grammex@3.1.13: {} + graphemer@1.4.0: {} + graphmatch@1.1.1: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -9671,6 +10554,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + idb@7.1.1: {} ignore@5.3.2: {} @@ -10263,6 +11150,8 @@ snapshots: jiti@1.21.7: {} + jiti@2.7.0: {} + jose@6.2.9: {} js-tokens@4.0.0: {} @@ -10435,6 +11324,8 @@ snapshots: lru-cache@8.0.5: {} + lru.min@1.1.5: {} + lz-string@1.5.0: {} magic-string@0.25.9: @@ -10504,6 +11395,18 @@ snapshots: ms@2.1.3: {} + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.3 + long: 5.3.2 + lru.min: 1.1.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + mysql2@3.9.8: dependencies: denque: 2.1.0 @@ -10646,6 +11549,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + ohash@2.0.12: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -10731,6 +11636,10 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + + perfect-debounce@2.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -10755,6 +11664,12 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@2.3.3: + dependencies: + confbox: 0.3.1 + exsolve: 1.1.1 + pathe: 2.0.3 + possible-typed-array-names@1.1.0: {} postal-mime@2.7.5: {} @@ -10808,6 +11723,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres@3.4.7: {} + prelude-ls@1.2.1: {} prettier-plugin-tailwindcss@0.6.9(prettier@3.4.2): @@ -10830,6 +11747,23 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + prisma@7.10.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.9.2): + dependencies: + "@prisma/config": 7.10.0 + "@prisma/dev": 0.24.17(typescript@5.9.2) + "@prisma/engines": 7.10.0 + "@prisma/studio-core": 0.33.0(@types/react-dom@18.3.7(@types/react@18.3.24))(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + mysql2: 3.15.3 + postgres: 3.4.7 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - "@types/react" + - "@types/react-dom" + - magicast + - react + - react-dom + promise@7.3.1: dependencies: asap: 2.0.6 @@ -10840,8 +11774,16 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + punycode@2.3.1: {} + pure-rand@6.1.0: {} + pure-rand@7.0.1: {} pvtsutils@1.3.6: @@ -10856,6 +11798,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + rc9@3.1.0: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 @@ -10919,6 +11866,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@5.1.1: {} + recharts@3.8.0(@types/react@18.3.24)(react-dom@18.2.0(react@18.2.0))(react-is@19.1.1)(react@18.2.0)(redux@5.0.1): dependencies: "@reduxjs/toolkit": 2.11.2(react-redux@9.2.0(@types/react@18.3.24)(react@18.2.0)(redux@5.0.1))(react@18.2.0) @@ -10993,6 +11942,8 @@ snapshots: dependencies: jsesc: 3.1.0 + remeda@2.33.4: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -11031,6 +11982,10 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + ret@0.5.0: {} + + retry@0.12.0: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -11043,6 +11998,8 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@3.0.3: {} + rollup-plugin-terser@7.0.2(rollup@2.79.2): dependencies: "@babel/code-frame": 7.27.1 @@ -11084,6 +12041,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex2@5.1.1: + dependencies: + ret: 0.5.0 + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -11268,6 +12229,8 @@ snapshots: "@stablelib/base64": 1.0.1 fast-sha256: 1.3.0 + std-env@3.10.0: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -11683,6 +12646,10 @@ snapshots: "@types/istanbul-lib-coverage": 2.0.6 convert-source-map: 2.0.0 + valibot@1.4.2(typescript@5.9.2): + optionalDependencies: + typescript: 5.9.2 + victory-vendor@37.3.6: dependencies: "@types/d3-array": 3.2.2 @@ -12005,4 +12972,9 @@ snapshots: yocto-queue@0.1.0: {} + zeptomatch@2.1.0: + dependencies: + grammex: 3.1.13 + graphmatch: 1.1.1 + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a9d4b7a6..902d125d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,6 @@ allowBuilds: + "@prisma/engines": true + prisma: true sharp: true unrs-resolver: true onlyBuiltDependencies: diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 00000000..fea2f031 --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,21 @@ +import "dotenv/config"; +import { defineConfig } from "prisma/config"; + +const { DATABASE_URL, MYSQL_DATABASE, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_PORT, MYSQL_USER } = process.env; + +const databaseUrl = + DATABASE_URL ?? + (MYSQL_HOST && MYSQL_DATABASE && MYSQL_USER && MYSQL_PASSWORD + ? `mysql://${encodeURIComponent(MYSQL_USER)}:${encodeURIComponent(MYSQL_PASSWORD)}@${MYSQL_HOST}:${MYSQL_PORT ?? "3306"}/${encodeURIComponent(MYSQL_DATABASE)}` + : undefined); + +if (!databaseUrl) { + throw new Error("Set DATABASE_URL or MYSQL_HOST, MYSQL_DATABASE, MYSQL_USER, and MYSQL_PASSWORD."); +} + +export default defineConfig({ + schema: "prisma", + datasource: { + url: databaseUrl, + }, +}); diff --git a/prisma/enums/vabatches_currency.prisma b/prisma/enums/vabatches_currency.prisma new file mode 100644 index 00000000..d5d933c3 --- /dev/null +++ b/prisma/enums/vabatches_currency.prisma @@ -0,0 +1,5 @@ +enum vabatches_currency { + INR + USD + NA +} diff --git a/prisma/enums/vabatches_status.prisma b/prisma/enums/vabatches_status.prisma new file mode 100644 index 00000000..e8f96490 --- /dev/null +++ b/prisma/enums/vabatches_status.prisma @@ -0,0 +1,5 @@ +enum vabatches_status { + UNSTARTED + ONGOING + COMPLETE +} diff --git a/prisma/enums/vabatches_trainingmode.prisma b/prisma/enums/vabatches_trainingmode.prisma new file mode 100644 index 00000000..e535556b --- /dev/null +++ b/prisma/enums/vabatches_trainingmode.prisma @@ -0,0 +1,5 @@ +enum vabatches_trainingmode { + VIRTUAL + IN_PERSON @map("IN-PERSON") + SELF_PACED @map("SELF-PACED") +} diff --git a/prisma/enums/vacourses_duration_type.prisma b/prisma/enums/vacourses_duration_type.prisma new file mode 100644 index 00000000..da48f21c --- /dev/null +++ b/prisma/enums/vacourses_duration_type.prisma @@ -0,0 +1,5 @@ +enum vacourses_duration_type { + Weeks + Months + Days +} diff --git a/prisma/enums/vastudent_to_batch_placement_status.prisma b/prisma/enums/vastudent_to_batch_placement_status.prisma new file mode 100644 index 00000000..ab6e9fd4 --- /dev/null +++ b/prisma/enums/vastudent_to_batch_placement_status.prisma @@ -0,0 +1,6 @@ +enum vastudent_to_batch_placement_status { + No_Change @map("No Change") + During_Training @map("During Training") + After_Training @map("After Training") + Supported_by_Vision_Aid @map("Supported by Vision Aid") +} diff --git a/prisma/enums/vastudents_enrollment_status.prisma b/prisma/enums/vastudents_enrollment_status.prisma new file mode 100644 index 00000000..78dffa00 --- /dev/null +++ b/prisma/enums/vastudents_enrollment_status.prisma @@ -0,0 +1,10 @@ +enum vastudents_enrollment_status { + ENROLLED + NO_RESPONSE_SW_OFF + FOLLOW_UP + WRONG_NUMBER + DROPOUT + PROSPECT + COUNSELLED_BY_PM + AVAILABLE +} diff --git a/prisma/enums/vastudents_risk_factor.prisma b/prisma/enums/vastudents_risk_factor.prisma new file mode 100644 index 00000000..28de2245 --- /dev/null +++ b/prisma/enums/vastudents_risk_factor.prisma @@ -0,0 +1,5 @@ +enum vastudents_risk_factor { + EMPTY_ENUM_VALUE @map("") + Medium + High +} diff --git a/prisma/enums/vausers_isactive.prisma b/prisma/enums/vausers_isactive.prisma new file mode 100644 index 00000000..70038414 --- /dev/null +++ b/prisma/enums/vausers_isactive.prisma @@ -0,0 +1,4 @@ +enum vausers_isactive { + A + I +} diff --git a/prisma/enums/yes-no.prisma b/prisma/enums/yes-no.prisma new file mode 100644 index 00000000..61cef6f2 --- /dev/null +++ b/prisma/enums/yes-no.prisma @@ -0,0 +1,4 @@ +enum YesNo { + Yes + No +} diff --git a/prisma/migrations/0_init/migration.sql b/prisma/migrations/0_init/migration.sql new file mode 100644 index 00000000..e1d18a8d --- /dev/null +++ b/prisma/migrations/0_init/migration.sql @@ -0,0 +1,391 @@ +-- CreateTable +CREATE TABLE `account` ( + `id` VARCHAR(36) NOT NULL, + `issuer` VARCHAR(255) NOT NULL, + `accountId` VARCHAR(255) NOT NULL, + `providerId` VARCHAR(255) NOT NULL, + `userId` VARCHAR(36) NOT NULL, + `accessToken` TEXT NULL, + `refreshToken` TEXT NULL, + `idToken` TEXT NULL, + `accessTokenExpiresAt` DATETIME(3) NULL, + `refreshTokenExpiresAt` DATETIME(3) NULL, + `scope` TEXT NULL, + `password` TEXT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `account_userId_idx`(`userId`), + UNIQUE INDEX `account_issuer_accountId_unique`(`issuer`, `accountId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `passkey` ( + `id` VARCHAR(36) NOT NULL, + `name` VARCHAR(255) NULL, + `publicKey` TEXT NOT NULL, + `userId` VARCHAR(36) NOT NULL, + `credentialID` VARCHAR(255) NOT NULL, + `counter` BIGINT NOT NULL, + `deviceType` VARCHAR(255) NOT NULL, + `backedUp` BOOLEAN NOT NULL, + `transports` VARCHAR(255) NULL, + `createdAt` DATETIME(3) NULL, + `aaguid` VARCHAR(255) NULL, + + INDEX `passkey_credentialID_idx`(`credentialID`), + INDEX `passkey_userId_idx`(`userId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `session` ( + `id` VARCHAR(36) NOT NULL, + `expiresAt` DATETIME(3) NOT NULL, + `token` VARCHAR(255) NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `ipAddress` VARCHAR(255) NULL, + `userAgent` TEXT NULL, + `userId` VARCHAR(36) NOT NULL, + + UNIQUE INDEX `session_token_unique`(`token`), + INDEX `session_userId_idx`(`userId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `telecaller_remarks` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `student_id` INTEGER NULL, + `user_id` INTEGER NOT NULL, + `remark` TEXT NOT NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_created_at`(`created_at`), + INDEX `idx_student_id`(`student_id`), + INDEX `idx_user_id`(`user_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `user` ( + `id` VARCHAR(36) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `emailVerified` BOOLEAN NOT NULL DEFAULT false, + `image` TEXT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `user_email_unique`(`email`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_app_settings` ( + `setting_key` VARCHAR(100) NOT NULL, + `setting_value` LONGTEXT NOT NULL, + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + PRIMARY KEY (`setting_key`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_assignments` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `batch_id` INTEGER NOT NULL, + `assignment_name` VARCHAR(80) NOT NULL, + `assignment_type` TINYINT NOT NULL, + `weight` TINYINT NOT NULL, + `student_url` VARCHAR(200) NOT NULL, + + INDEX `fk_va_assignments_batch_id`(`batch_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_attendance` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `batch_id` INTEGER NOT NULL, + `student_id` INTEGER NULL, + `date` DATE NOT NULL, + `is_present` TINYINT NOT NULL DEFAULT 100, + + INDEX `fk_va_attendance_batch_id`(`batch_id`), + INDEX `fk_va_attendance_student_id`(`student_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_audit_logs` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `action_type` VARCHAR(255) NOT NULL, + `performed_by` VARCHAR(255) NOT NULL, + `performed_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `details` JSON NULL, + `resource_type` VARCHAR(255) NULL, + `resource_id` VARCHAR(255) NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_dropdown_values` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `dropdown_key` VARCHAR(100) NOT NULL, + `value` VARCHAR(255) NOT NULL, + `label` VARCHAR(255) NOT NULL, + `sort_order` INTEGER NOT NULL DEFAULT 0, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `uniq_dropdown_value`(`dropdown_key`, `value`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_fees` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `batch_id` INTEGER NOT NULL, + `student_id` INTEGER NULL, + `fee_paid` VARCHAR(35) NOT NULL DEFAULT 'NA', + `amount_1` INTEGER NOT NULL, + `amount_2` INTEGER NOT NULL, + `amount_3` INTEGER NOT NULL, + `nature_of_fee` VARCHAR(35) NOT NULL, + + INDEX `fk_va_fees_batch_id`(`batch_id`), + INDEX `fk_va_fees_student_id`(`student_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_grades` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `student_id` INTEGER NULL, + `batch_id` INTEGER NOT NULL, + `assignment_name` VARCHAR(50) NOT NULL, + `assignment_type` VARCHAR(35) NOT NULL, + `assignment_weight` INTEGER NOT NULL, + `grade` INTEGER NOT NULL, + `max_marks` INTEGER NOT NULL, + + INDEX `fk_va_grades_batch_id`(`batch_id`), + INDEX `fk_va_grades_student_id`(`student_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `va_remarks` ( + `id` SMALLINT NOT NULL AUTO_INCREMENT, + `vastudent_to_batch_id` SMALLINT NOT NULL, + `remarks` VARCHAR(250) NOT NULL, + `user_id` INTEGER NOT NULL, + + INDEX `user_id`(`user_id`), + INDEX `vastudent_to_batch_id`(`vastudent_to_batch_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vabatches` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `coursename` VARCHAR(50) NOT NULL, + `batch` VARCHAR(15) NOT NULL, + `coursestart` VARCHAR(50) NOT NULL, + `courseend` VARCHAR(50) NOT NULL, + `coursedays` VARCHAR(20) NOT NULL, + `coursetimes` VARCHAR(50) NOT NULL, + `instructor` VARCHAR(50) NOT NULL, + `PM` VARCHAR(50) NOT NULL, + `TA` VARCHAR(50) NOT NULL, + `dataentry` VARCHAR(50) NOT NULL, + `cost` INTEGER NULL, + `currency` ENUM('INR', 'USD', 'NA') NULL, + `strength` INTEGER NOT NULL, + `trainingmode` ENUM('VIRTUAL', 'IN-PERSON', 'SELF-PACED') NOT NULL, + `status` ENUM('UNSTARTED', 'ONGOING', 'COMPLETE') NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vacourses` ( + `id` SMALLINT NOT NULL AUTO_INCREMENT, + `course` TEXT NOT NULL, + `description` TEXT NULL, + `duration` TEXT NOT NULL, + `duration_type` ENUM('Weeks', 'Months', 'Days') NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vastudent_to_batch` ( + `id` SMALLINT NOT NULL AUTO_INCREMENT, + `student_id` INTEGER NULL, + `batch_id` INTEGER NULL, + `grade` VARCHAR(55) NULL, + `attendance` VARCHAR(55) NULL, + `completion_status` VARCHAR(255) NULL, + `certification_eligibility` VARCHAR(255) NULL, + `reason_for_status` VARCHAR(255) NULL, + `next_program` VARCHAR(255) NULL, + `counseling_status` ENUM('Yes', 'No') NULL DEFAULT 'No', + `placement_status` ENUM('No Change', 'During Training', 'After Training', 'Supported by Vision Aid') NULL DEFAULT 'No Change', + `placement_remarks` TEXT NULL, + + INDEX `fk_vastudent_to_batch_batch_id`(`batch_id`), + INDEX `fk_vastudent_to_batch_student_id`(`student_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vastudents` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `Quarter` INTEGER NULL, + `SNo` INTEGER NULL, + `Batch_ID` VARCHAR(55) NULL, + `Program_Name` VARCHAR(55) NULL, + `Trainee_ID` VARCHAR(55) NULL, + `name` VARCHAR(35) NULL, + `edu_qualifications` VARCHAR(300) NULL, + `phone_number` BIGINT NULL, + `alt_ph_num` BIGINT NULL, + `CityDistrict_State` VARCHAR(55) NULL, + `email` VARCHAR(35) NULL, + `gender` VARCHAR(30) NULL, + `age` DATE NULL, + `visual_acuity` VARCHAR(50) NULL, + `percent_loss` INTEGER NULL, + `employment_status` VARCHAR(50) NULL, + `Designation` VARCHAR(55) NULL, + `Languages_Known` VARCHAR(55) NULL, + `Program_ManagerCoordinator` VARCHAR(55) NULL, + `country` VARCHAR(55) NULL, + `state` VARCHAR(50) NULL, + `city` VARCHAR(50) NULL, + `disability` VARCHAR(50) NOT NULL, + `edu_details` VARCHAR(50) NOT NULL, + `objectives` VARCHAR(300) NULL, + `first_choice` VARCHAR(50) NULL, + `second_choice` VARCHAR(50) NULL, + `third_choice` VARCHAR(50) NULL, + `first_recommendation` VARCHAR(55) NULL, + `second_recommendation` VARCHAR(55) NULL, + `third_recommendation` VARCHAR(55) NULL, + `impairment_history` VARCHAR(300) NULL, + `source` VARCHAR(80) NULL, + `registration_date` DATE NULL, + `id_proof` ENUM('Yes', 'No') NOT NULL DEFAULT 'Yes', + `disability_cert` ENUM('Yes', 'No') NOT NULL DEFAULT 'Yes', + `photo` ENUM('Yes', 'No') NOT NULL DEFAULT 'Yes', + `bank_details` ENUM('Yes', 'No') NOT NULL DEFAULT 'No', + `completion_status` TEXT NULL, + `reason_for_status` VARCHAR(150) NULL, + `certification_eligibility` TEXT NULL, + `risk_factor` ENUM('', 'Medium', 'High') NULL, + `remarks` VARCHAR(250) NULL, + `commenter` VARCHAR(55) NULL, + `last_edited` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `enrollment_status` ENUM('ENROLLED', 'NO_RESPONSE_SW_OFF', 'FOLLOW_UP', 'WRONG_NUMBER', 'DROPOUT', 'PROSPECT', 'COUNSELLED_BY_PM', 'AVAILABLE') NULL, + + UNIQUE INDEX `id`(`id`), + UNIQUE INDEX `unique_gender_phone_age`(`gender`, `phone_number`, `age`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vausers` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `employeeId` VARCHAR(50) NULL, + `email` VARCHAR(50) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `designation` VARCHAR(35) NOT NULL, + `joindate` DATE NULL, + `mobilenumber` VARCHAR(20) NULL, + `workbase` VARCHAR(35) NOT NULL, + `supervisor` VARCHAR(35) NOT NULL, + `natureofjob` VARCHAR(35) NOT NULL, + `visualacuity` VARCHAR(50) NULL, + `role` VARCHAR(35) NOT NULL, + `isactive` ENUM('A', 'I') NOT NULL DEFAULT 'A', + `action` VARCHAR(35) NOT NULL, + `gender` VARCHAR(20) NULL, + `date_of_birth` DATE NULL, + `contract_duration_months` INTEGER NULL, + `program_project` VARCHAR(255) NULL, + `lastlogin` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `trainingprogram1` VARCHAR(255) NULL DEFAULT '', + `trainingprogram2` VARCHAR(255) NULL DEFAULT '', + `trainingprogram3` VARCHAR(255) NULL DEFAULT '', + + UNIQUE INDEX `employee_number`(`employeeId`), + UNIQUE INDEX `email`(`email`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `verification` ( + `id` VARCHAR(36) NOT NULL, + `identifier` VARCHAR(255) NOT NULL, + `value` TEXT NOT NULL, + `expiresAt` DATETIME(3) NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `verification_identifier_idx`(`identifier`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `account` ADD CONSTRAINT `account_userId_fk` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `passkey` ADD CONSTRAINT `passkey_userId_fk` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `session` ADD CONSTRAINT `session_userId_fk` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `telecaller_remarks` ADD CONSTRAINT `fk_telecaller_remarks_student_id` FOREIGN KEY (`student_id`) REFERENCES `vastudents`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `telecaller_remarks` ADD CONSTRAINT `fk_telecaller_remarks_user_id` FOREIGN KEY (`user_id`) REFERENCES `vausers`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_assignments` ADD CONSTRAINT `fk_va_assignments_batch_id` FOREIGN KEY (`batch_id`) REFERENCES `vabatches`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_attendance` ADD CONSTRAINT `fk_va_attendance_batch_id` FOREIGN KEY (`batch_id`) REFERENCES `vabatches`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_attendance` ADD CONSTRAINT `fk_va_attendance_student_id` FOREIGN KEY (`student_id`) REFERENCES `vastudents`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_fees` ADD CONSTRAINT `fk_va_fees_batch_id` FOREIGN KEY (`batch_id`) REFERENCES `vabatches`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_fees` ADD CONSTRAINT `fk_va_fees_student_id` FOREIGN KEY (`student_id`) REFERENCES `vastudents`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_grades` ADD CONSTRAINT `fk_va_grades_batch_id` FOREIGN KEY (`batch_id`) REFERENCES `vabatches`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_grades` ADD CONSTRAINT `fk_va_grades_student_id` FOREIGN KEY (`student_id`) REFERENCES `vastudents`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_remarks` ADD CONSTRAINT `fk_va_remarks_vastudent_to_batch_id` FOREIGN KEY (`vastudent_to_batch_id`) REFERENCES `vastudent_to_batch`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `va_remarks` ADD CONSTRAINT `va_remarks_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `vausers`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `vastudent_to_batch` ADD CONSTRAINT `fk_vastudent_to_batch_batch_id` FOREIGN KEY (`batch_id`) REFERENCES `vabatches`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `vastudent_to_batch` ADD CONSTRAINT `fk_vastudent_to_batch_student_id` FOREIGN KEY (`student_id`) REFERENCES `vastudents`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/models/account.prisma b/prisma/models/account.prisma new file mode 100644 index 00000000..edcba713 --- /dev/null +++ b/prisma/models/account.prisma @@ -0,0 +1,20 @@ +model account { + id String @id @db.VarChar(36) + issuer String @db.VarChar(255) + accountId String @db.VarChar(255) + providerId String @db.VarChar(255) + userId String @db.VarChar(36) + accessToken String? @db.Text + refreshToken String? @db.Text + idToken String? @db.Text + accessTokenExpiresAt DateTime? + refreshTokenExpiresAt DateTime? + scope String? @db.Text + password String? @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + user user @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "account_userId_fk") + + @@unique([issuer, accountId], map: "account_issuer_accountId_unique") + @@index([userId]) +} diff --git a/prisma/models/passkey.prisma b/prisma/models/passkey.prisma new file mode 100644 index 00000000..3c9d141d --- /dev/null +++ b/prisma/models/passkey.prisma @@ -0,0 +1,17 @@ +model passkey { + id String @id @db.VarChar(36) + name String? @db.VarChar(255) + publicKey String @db.Text + userId String @db.VarChar(36) + credentialID String @db.VarChar(255) + counter BigInt + deviceType String @db.VarChar(255) + backedUp Boolean + transports String? @db.VarChar(255) + createdAt DateTime? + aaguid String? @db.VarChar(255) + user user @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "passkey_userId_fk") + + @@index([credentialID]) + @@index([userId]) +} diff --git a/prisma/models/session.prisma b/prisma/models/session.prisma new file mode 100644 index 00000000..3d16a7ec --- /dev/null +++ b/prisma/models/session.prisma @@ -0,0 +1,13 @@ +model session { + id String @id @db.VarChar(36) + expiresAt DateTime + token String @unique(map: "session_token_unique") @db.VarChar(255) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + ipAddress String? @db.VarChar(255) + userAgent String? @db.Text + userId String @db.VarChar(36) + user user @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "session_userId_fk") + + @@index([userId]) +} diff --git a/prisma/models/telecaller_remarks.prisma b/prisma/models/telecaller_remarks.prisma new file mode 100644 index 00000000..c385db76 --- /dev/null +++ b/prisma/models/telecaller_remarks.prisma @@ -0,0 +1,15 @@ +/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments +model telecaller_remarks { + id Int @id @default(autoincrement()) + student_id Int? + user_id Int + remark String @db.Text + created_at DateTime? @default(now()) @db.Timestamp(0) + updated_at DateTime? @default(now()) @db.Timestamp(0) + vastudents vastudents? @relation(fields: [student_id], references: [id], onDelete: Cascade, map: "fk_telecaller_remarks_student_id") + vausers vausers @relation(fields: [user_id], references: [id], onDelete: Cascade, map: "fk_telecaller_remarks_user_id") + + @@index([created_at], map: "idx_created_at") + @@index([student_id], map: "idx_student_id") + @@index([user_id], map: "idx_user_id") +} diff --git a/prisma/models/user.prisma b/prisma/models/user.prisma new file mode 100644 index 00000000..fa499f9e --- /dev/null +++ b/prisma/models/user.prisma @@ -0,0 +1,12 @@ +model user { + id String @id @db.VarChar(36) + name String @db.VarChar(255) + email String @unique(map: "user_email_unique") @db.VarChar(255) + emailVerified Boolean @default(false) + image String? @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + account account[] + passkey passkey[] + session session[] +} diff --git a/prisma/models/va_app_settings.prisma b/prisma/models/va_app_settings.prisma new file mode 100644 index 00000000..c56c5cd0 --- /dev/null +++ b/prisma/models/va_app_settings.prisma @@ -0,0 +1,5 @@ +model va_app_settings { + setting_key String @id @db.VarChar(100) + setting_value String @db.LongText + updated_at DateTime? @default(now()) @db.Timestamp(0) +} diff --git a/prisma/models/va_assignments.prisma b/prisma/models/va_assignments.prisma new file mode 100644 index 00000000..3e50086f --- /dev/null +++ b/prisma/models/va_assignments.prisma @@ -0,0 +1,11 @@ +model va_assignments { + id Int @id @default(autoincrement()) + batch_id Int + assignment_name String @db.VarChar(80) + assignment_type Int @db.TinyInt + weight Int @db.TinyInt + student_url String @db.VarChar(200) + vabatches vabatches @relation(fields: [batch_id], references: [id], onDelete: Cascade, map: "fk_va_assignments_batch_id") + + @@index([batch_id], map: "fk_va_assignments_batch_id") +} diff --git a/prisma/models/va_attendance.prisma b/prisma/models/va_attendance.prisma new file mode 100644 index 00000000..037ab3ac --- /dev/null +++ b/prisma/models/va_attendance.prisma @@ -0,0 +1,12 @@ +model va_attendance { + id Int @id @default(autoincrement()) + batch_id Int + student_id Int? + date DateTime @db.Date + is_present Int @default(100) @db.TinyInt + vabatches vabatches @relation(fields: [batch_id], references: [id], onDelete: Cascade, map: "fk_va_attendance_batch_id") + vastudents vastudents? @relation(fields: [student_id], references: [id], onDelete: Cascade, map: "fk_va_attendance_student_id") + + @@index([batch_id], map: "fk_va_attendance_batch_id") + @@index([student_id], map: "fk_va_attendance_student_id") +} diff --git a/prisma/models/va_audit_logs.prisma b/prisma/models/va_audit_logs.prisma new file mode 100644 index 00000000..11e17cbe --- /dev/null +++ b/prisma/models/va_audit_logs.prisma @@ -0,0 +1,11 @@ +model va_audit_logs { + id BigInt @id @default(autoincrement()) + action_type String @db.VarChar(255) + performed_by String @db.VarChar(255) + performed_at DateTime? @default(now()) @db.Timestamp(0) + details Json? + resource_type String? @db.VarChar(255) + resource_id String? @db.VarChar(255) + created_at DateTime? @default(now()) @db.Timestamp(0) + updated_at DateTime? @default(now()) @db.Timestamp(0) +} diff --git a/prisma/models/va_dropdown_values.prisma b/prisma/models/va_dropdown_values.prisma new file mode 100644 index 00000000..8c816f75 --- /dev/null +++ b/prisma/models/va_dropdown_values.prisma @@ -0,0 +1,10 @@ +model va_dropdown_values { + id Int @id @default(autoincrement()) + dropdown_key String @db.VarChar(100) + value String @db.VarChar(255) + label String @db.VarChar(255) + sort_order Int @default(0) + created_at DateTime? @default(now()) @db.Timestamp(0) + + @@unique([dropdown_key, value], map: "uniq_dropdown_value") +} diff --git a/prisma/models/va_fees.prisma b/prisma/models/va_fees.prisma new file mode 100644 index 00000000..22678180 --- /dev/null +++ b/prisma/models/va_fees.prisma @@ -0,0 +1,15 @@ +model va_fees { + id Int @id @default(autoincrement()) + batch_id Int + student_id Int? + fee_paid String @default("NA") @db.VarChar(35) + amount_1 Int + amount_2 Int + amount_3 Int + nature_of_fee String @db.VarChar(35) + vabatches vabatches @relation(fields: [batch_id], references: [id], onDelete: Cascade, map: "fk_va_fees_batch_id") + vastudents vastudents? @relation(fields: [student_id], references: [id], onDelete: Cascade, map: "fk_va_fees_student_id") + + @@index([batch_id], map: "fk_va_fees_batch_id") + @@index([student_id], map: "fk_va_fees_student_id") +} diff --git a/prisma/models/va_grades.prisma b/prisma/models/va_grades.prisma new file mode 100644 index 00000000..a00a4912 --- /dev/null +++ b/prisma/models/va_grades.prisma @@ -0,0 +1,15 @@ +model va_grades { + id Int @id @default(autoincrement()) + student_id Int? + batch_id Int + assignment_name String @db.VarChar(50) + assignment_type String @db.VarChar(35) + assignment_weight Int + grade Int + max_marks Int + vabatches vabatches @relation(fields: [batch_id], references: [id], onDelete: Cascade, map: "fk_va_grades_batch_id") + vastudents vastudents? @relation(fields: [student_id], references: [id], onDelete: Cascade, map: "fk_va_grades_student_id") + + @@index([batch_id], map: "fk_va_grades_batch_id") + @@index([student_id], map: "fk_va_grades_student_id") +} diff --git a/prisma/models/va_remarks.prisma b/prisma/models/va_remarks.prisma new file mode 100644 index 00000000..daa030fd --- /dev/null +++ b/prisma/models/va_remarks.prisma @@ -0,0 +1,11 @@ +model va_remarks { + id Int @id @default(autoincrement()) @db.SmallInt + vastudent_to_batch_id Int @db.SmallInt + remarks String @db.VarChar(250) + user_id Int + vastudent_to_batch vastudent_to_batch @relation(fields: [vastudent_to_batch_id], references: [id], onDelete: Cascade, map: "fk_va_remarks_vastudent_to_batch_id") + vausers vausers @relation(fields: [user_id], references: [id], onDelete: Cascade, map: "va_remarks_ibfk_2") + + @@index([user_id], map: "user_id") + @@index([vastudent_to_batch_id], map: "vastudent_to_batch_id") +} diff --git a/prisma/models/vabatches.prisma b/prisma/models/vabatches.prisma new file mode 100644 index 00000000..15dd0a30 --- /dev/null +++ b/prisma/models/vabatches.prisma @@ -0,0 +1,23 @@ +model vabatches { + id Int @id @default(autoincrement()) + coursename String @db.VarChar(50) + batch String @db.VarChar(15) + coursestart String @db.VarChar(50) + courseend String @db.VarChar(50) + coursedays String @db.VarChar(20) + coursetimes String @db.VarChar(50) + instructor String @db.VarChar(50) + PM String @db.VarChar(50) + TA String @db.VarChar(50) + dataentry String @db.VarChar(50) + cost Int? + currency vabatches_currency? + strength Int + trainingmode vabatches_trainingmode + status vabatches_status + va_assignments va_assignments[] + va_attendance va_attendance[] + va_fees va_fees[] + va_grades va_grades[] + vastudent_to_batch vastudent_to_batch[] +} diff --git a/prisma/models/vacourses.prisma b/prisma/models/vacourses.prisma new file mode 100644 index 00000000..3a30c284 --- /dev/null +++ b/prisma/models/vacourses.prisma @@ -0,0 +1,7 @@ +model vacourses { + id Int @id @default(autoincrement()) @db.SmallInt + course String @db.Text + description String? @db.Text + duration String @db.Text + duration_type vacourses_duration_type +} diff --git a/prisma/models/vastudent_to_batch.prisma b/prisma/models/vastudent_to_batch.prisma new file mode 100644 index 00000000..ac7243ee --- /dev/null +++ b/prisma/models/vastudent_to_batch.prisma @@ -0,0 +1,20 @@ +model vastudent_to_batch { + id Int @id @default(autoincrement()) @db.SmallInt + student_id Int? + batch_id Int? + grade String? @db.VarChar(55) + attendance String? @db.VarChar(55) + completion_status String? @db.VarChar(255) + certification_eligibility String? @db.VarChar(255) + reason_for_status String? @db.VarChar(255) + next_program String? @db.VarChar(255) + counseling_status YesNo? @default(No) + placement_status vastudent_to_batch_placement_status? @default(No_Change) + placement_remarks String? @db.Text + va_remarks va_remarks[] + vabatches vabatches? @relation(fields: [batch_id], references: [id], onDelete: Cascade, map: "fk_vastudent_to_batch_batch_id") + vastudents vastudents? @relation(fields: [student_id], references: [id], onDelete: Cascade, map: "fk_vastudent_to_batch_student_id") + + @@index([batch_id], map: "fk_vastudent_to_batch_batch_id") + @@index([student_id], map: "fk_vastudent_to_batch_student_id") +} diff --git a/prisma/models/vastudents.prisma b/prisma/models/vastudents.prisma new file mode 100644 index 00000000..3d9ad411 --- /dev/null +++ b/prisma/models/vastudents.prisma @@ -0,0 +1,56 @@ +model vastudents { + id Int @id @unique(map: "id") @default(autoincrement()) + Quarter Int? + SNo Int? + Batch_ID String? @db.VarChar(55) + Program_Name String? @db.VarChar(55) + Trainee_ID String? @db.VarChar(55) + name String? @db.VarChar(35) + edu_qualifications String? @db.VarChar(300) + phone_number BigInt? + alt_ph_num BigInt? + CityDistrict_State String? @db.VarChar(55) + email String? @db.VarChar(35) + gender String? @db.VarChar(30) + age DateTime? @db.Date + visual_acuity String? @db.VarChar(50) + percent_loss Int? + employment_status String? @db.VarChar(50) + Designation String? @db.VarChar(55) + Languages_Known String? @db.VarChar(55) + Program_ManagerCoordinator String? @db.VarChar(55) + country String? @db.VarChar(55) + state String? @db.VarChar(50) + city String? @db.VarChar(50) + disability String @db.VarChar(50) + edu_details String @db.VarChar(50) + objectives String? @db.VarChar(300) + first_choice String? @db.VarChar(50) + second_choice String? @db.VarChar(50) + third_choice String? @db.VarChar(50) + first_recommendation String? @db.VarChar(55) + second_recommendation String? @db.VarChar(55) + third_recommendation String? @db.VarChar(55) + impairment_history String? @db.VarChar(300) + source String? @db.VarChar(80) + registration_date DateTime? @db.Date + id_proof YesNo @default(Yes) + disability_cert YesNo @default(Yes) + photo YesNo @default(Yes) + bank_details YesNo @default(No) + completion_status String? @db.Text + reason_for_status String? @db.VarChar(150) + certification_eligibility String? @db.Text + risk_factor vastudents_risk_factor? + remarks String? @db.VarChar(250) + commenter String? @db.VarChar(55) + last_edited DateTime? @default(now()) @db.DateTime(0) + enrollment_status vastudents_enrollment_status? + telecaller_remarks telecaller_remarks[] + va_attendance va_attendance[] + va_fees va_fees[] + va_grades va_grades[] + vastudent_to_batch vastudent_to_batch[] + + @@unique([gender, phone_number, age], map: "unique_gender_phone_age") +} diff --git a/prisma/models/vausers.prisma b/prisma/models/vausers.prisma new file mode 100644 index 00000000..851ac5df --- /dev/null +++ b/prisma/models/vausers.prisma @@ -0,0 +1,26 @@ +model vausers { + id Int @id @default(autoincrement()) + employeeId String? @unique(map: "employee_number") @db.VarChar(50) + email String @unique(map: "email") @db.VarChar(50) + name String @db.VarChar(255) + designation String @db.VarChar(35) + joindate DateTime? @db.Date + mobilenumber String? @db.VarChar(20) + workbase String @db.VarChar(35) + supervisor String @db.VarChar(35) + natureofjob String @db.VarChar(35) + visualacuity String? @db.VarChar(50) + role String @db.VarChar(35) + isactive vausers_isactive @default(A) + action String @db.VarChar(35) + gender String? @db.VarChar(20) + date_of_birth DateTime? @db.Date + contract_duration_months Int? + program_project String? @db.VarChar(255) + lastlogin DateTime? @default(now()) @db.DateTime(0) + trainingprogram1 String? @default("") @db.VarChar(255) + trainingprogram2 String? @default("") @db.VarChar(255) + trainingprogram3 String? @default("") @db.VarChar(255) + telecaller_remarks telecaller_remarks[] + va_remarks va_remarks[] +} diff --git a/prisma/models/verification.prisma b/prisma/models/verification.prisma new file mode 100644 index 00000000..61f07840 --- /dev/null +++ b/prisma/models/verification.prisma @@ -0,0 +1,10 @@ +model verification { + id String @id @db.VarChar(36) + identifier String @db.VarChar(255) + value String @db.Text + expiresAt DateTime + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + @@index([identifier]) +} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bf12d06b..3ffa078b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,6 +1,7 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init +generator client { + provider = "prisma-client-js" +} +datasource db { + provider = "mysql" +}