From bd5d50cf973a228fece4535da285756cd408c254 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:48:13 +0200 Subject: [PATCH 01/62] Update Dockerfile --- Dockerfile | 5 ++++- Dockerfile.front | 44 -------------------------------------------- 2 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 Dockerfile.front diff --git a/Dockerfile b/Dockerfile index be27f608..bf54d6c8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,13 +4,14 @@ FROM node:19-alpine AS deps WORKDIR leCoffre-front COPY package.json ./ +COPY .env ./ RUN apk update && apk add openssh-client git COPY id_rsa /root/.ssh/id_rsa RUN chmod 600 ~/.ssh/id_rsa RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa -RUN ssh-keyscan github.com smart-chain-fr/leCoffre-resources.git >> /root/.ssh/known_hosts +RUN ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts RUN npm install --frozen-lockfile @@ -21,6 +22,7 @@ WORKDIR leCoffre-front COPY --from=deps leCoffre-front/node_modules ./node_modules COPY --from=deps leCoffre-front/package.json package.json +COPY --from=deps leCoffre-front/.env ./.env COPY tsconfig.json tsconfig.json COPY next.config.js next.config.js COPY src src @@ -39,6 +41,7 @@ COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modu COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next COPY --from=builder --chown=lecoffreuser leCoffre-front/next.config.js ./next.config.js COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json +COPY --from=builder --chown=lecoffreuser leCoffre-front/.env ./.env USER lecoffreuser diff --git a/Dockerfile.front b/Dockerfile.front deleted file mode 100644 index 11d63f6c..00000000 --- a/Dockerfile.front +++ /dev/null @@ -1,44 +0,0 @@ -# Install dependencies only when needed -FROM node:19-alpine AS deps - -WORKDIR leCoffre-front - -COPY package.json ./ - -RUN apk update && apk add openssh-client git - -COPY id_rsa /root/.ssh/id_rsa -RUN chmod 600 ~/.ssh/id_rsa -RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa -RUN ssh-keyscan github.com smart-chain-fr/leCoffre-resources.git >> /root/.ssh/known_hosts - -RUN npm install --frozen-lockfile - -# Rebuild the source code only when needed -FROM node:19-alpine AS builder - -WORKDIR leCoffre-front - -COPY --from=deps leCoffre-front/node_modules ./node_modules -COPY --from=deps leCoffre-front/package.json package.json -COPY tsconfig.json tsconfig.json -COPY src src - -RUN npm run build - -# Production image, copy all the files and run next -FROM node:19-alpine AS production - -WORKDIR leCoffre-front - -RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . - -COPY public ./public -COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modules -COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next -COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json - -USER lecoffreuser - -CMD ["npm", "run", "start"] -EXPOSE 3000 \ No newline at end of file From 7fa33cbdbc9e3510a29ea26953005d2f04b54601 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:49:47 +0200 Subject: [PATCH 02/62] Update get repo method --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59175b5f..a830cbc8 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "heroicons": "^2.1.5", "jszip": "^3.10.1", "jwt-decode": "^3.1.2", - "le-coffre-resources": "file:../lecoffre-ressources", + "le-coffre-resources": "git+ssh://git@git.4nkweb.com/4nk/lecoffre-ressources.git#v2.167", "next": "^14.2.3", "prettier": "^2.8.7", "react": "18.2.0", From 82ee58dd255fa2ffaa9055b6c8c6795b92737ba2 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:50:09 +0200 Subject: [PATCH 03/62] Add CICD --- .github/workflows/cicd.yml | 35 +++++++++++++++++ .github/workflows/ppd.yml | 78 ------------------------------------- .github/workflows/prd.yml | 79 -------------------------------------- .github/workflows/stg.yml | 74 ----------------------------------- 4 files changed, 35 insertions(+), 231 deletions(-) create mode 100644 .github/workflows/cicd.yml delete mode 100644 .github/workflows/ppd.yml delete mode 100644 .github/workflows/prd.yml delete mode 100644 .github/workflows/stg.yml diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml new file mode 100644 index 00000000..7379e3b3 --- /dev/null +++ b/.github/workflows/cicd.yml @@ -0,0 +1,35 @@ +name: Build and Push to Registry + +on: + push: + branches: [ cicd ] + +env: + REGISTRY: git.4nkweb.com + IMAGE_NAME: 4nk/lecoffre-front + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.USER }} + password: ${{ secrets.TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/.github/workflows/ppd.yml b/.github/workflows/ppd.yml deleted file mode 100644 index 2929890d..00000000 --- a/.github/workflows/ppd.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Preprod - Build & Deploy to Scaleway - -on: - push: - branches: [preprod] - -env: - PROJECT_ID_LECOFFRE: 72d08499-37c2-412b-877e-f8af0471654a - NAMESPACE_ID_LECOFFRE: e975f056-967e-43fe-b237-84bfa8032e64 - CONTAINER_REGISTRY_ENDPOINT_LECOFFRE: rg.fr-par.scw.cloud/funcscwlecoffreppdmp73pool - - IMAGE_NAME: front - CONTAINER_NAME: front - -jobs: - build-and-push-image-lecoffre: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts - env: - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - - name: Copy SSH - run: cp ~/.ssh/id_rsa id_rsa - - name: Login to Scaleway Container Registry - uses: docker/login-action@v3 - with: - username: nologin - password: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - registry: ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }} - - name: Get Git Commit SHA - id: vars - run: echo "COMMIT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - - name: Build the Docker Image - run: docker build . -t ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - - name: Push the Docker Image to Scaleway Container Registry - run: docker push ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - deploy-to-scaleway-lecoffre: - needs: build-and-push-image-lecoffre - runs-on: ubuntu-latest - environment: preprod - steps: - - name: Install CLI - uses: scaleway/action-scw@v0 - - name: Get container ID - run: | - echo "CONTAINER_ID=$(scw container container list namespace-id=${{env.NAMESPACE_ID_LECOFFRE}} -o json | jq -r '.[] | select(.name == "${{ env.CONTAINER_NAME }}") | .id')" >> $GITHUB_ENV - env: - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} - - name: Deploy the container based on the new image - run: | - env_string="" - while IFS= read -r line; do - if [[ "$line" == *"="* ]]; then - key=$(echo "$line" | cut -d '=' -f 1) - value=$(echo "$line" | cut -d '=' -f 2-) - if [[ -n "$key" ]]; then - env_string+="environment-variables.$key=$value " - fi - fi - done <<< "$ENV_VARS" - env_string=$(echo $env_string | sed 's/ $//') - scw container container update ${{ env.CONTAINER_ID }} $env_string - env: - ENV_VARS: ${{ secrets.ENV }} - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} - \ No newline at end of file diff --git a/.github/workflows/prd.yml b/.github/workflows/prd.yml deleted file mode 100644 index e9e670c8..00000000 --- a/.github/workflows/prd.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Prod - Build & Deploy to Scaleway - -on: - push: - branches: [main] - -env: - - PROJECT_ID_LECOFFRE: 72d08499-37c2-412b-877e-f8af0471654a - NAMESPACE_ID_LECOFFRE: 8fbbce9d-31d1-4368-94c4-445e79f10834 - CONTAINER_REGISTRY_ENDPOINT_LECOFFRE: rg.fr-par.scw.cloud/funcscwlecoffreprdjulp9mam - - IMAGE_NAME: front - CONTAINER_NAME: front - -jobs: - build-and-push-image-lecoffre: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts - env: - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - - name: Copy SSH - run: cp ~/.ssh/id_rsa id_rsa - - name: Login to Scaleway Container Registry - uses: docker/login-action@v3 - with: - username: nologin - password: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - registry: ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }} - - name: Get Git Commit SHA - id: vars - run: echo "COMMIT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - - name: Build the Docker Image - run: docker build . -t ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - - name: Push the Docker Image to Scaleway Container Registry - run: docker push ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - deploy-to-scaleway-lecoffre: - needs: build-and-push-image-lecoffre - runs-on: ubuntu-latest - environment: prod - steps: - - name: Install CLI - uses: scaleway/action-scw@v0 - - name: Get container ID - run: | - echo "CONTAINER_ID=$(scw container container list namespace-id=${{env.NAMESPACE_ID_LECOFFRE}} -o json | jq -r '.[] | select(.name == "${{ env.CONTAINER_NAME }}") | .id')" >> $GITHUB_ENV - env: - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} - - name: Deploy the container based on the new image - run: | - env_string="" - while IFS= read -r line; do - if [[ "$line" == *"="* ]]; then - key=$(echo "$line" | cut -d '=' -f 1) - value=$(echo "$line" | cut -d '=' -f 2-) - if [[ -n "$key" ]]; then - env_string+="environment-variables.$key=$value " - fi - fi - done <<< "$ENV_VARS" - env_string=$(echo $env_string | sed 's/ $//') - scw container container update ${{ env.CONTAINER_ID }} $env_string - env: - ENV_VARS: ${{ secrets.ENV }} - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} - diff --git a/.github/workflows/stg.yml b/.github/workflows/stg.yml deleted file mode 100644 index de6edd82..00000000 --- a/.github/workflows/stg.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Staging - Build & Deploy to Scaleway - -on: - push: - branches: [staging] - -env: - PROJECT_ID_LECOFFRE: 72d08499-37c2-412b-877e-f8af0471654a - NAMESPACE_ID_LECOFFRE: f8137e85-47ad-46a5-9e2e-18af5de829c5 - CONTAINER_REGISTRY_ENDPOINT_LECOFFRE: rg.fr-par.scw.cloud/funcscwlecoffrestgbqbfhtv6 - - IMAGE_NAME: front - CONTAINER_NAME: front - -jobs: - build-and-push-image-lecoffre: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts - env: - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - - name: Copy SSH - run: cp ~/.ssh/id_rsa id_rsa - - name: Login to Scaleway Container Registry - uses: docker/login-action@v3 - with: - username: nologin - password: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - registry: ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }} - - name: Build the Docker Image - run: docker build . -t ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - - name: Push the Docker Image to Scaleway Container Registry - run: docker push ${{ env.CONTAINER_REGISTRY_ENDPOINT_LECOFFRE }}/${{ env.IMAGE_NAME }} - deploy-to-scaleway-lecoffre: - needs: build-and-push-image-lecoffre - runs-on: ubuntu-latest - environment: staging - steps: - - name: Install CLI - uses: scaleway/action-scw@v0 - - name: Get container ID - run: | - echo "CONTAINER_ID=$(scw container container list namespace-id=${{env.NAMESPACE_ID_LECOFFRE}} -o json | jq -r '.[] | select(.name == "${{ env.CONTAINER_NAME }}") | .id')" >> $GITHUB_ENV - env: - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} - - name: Deploy the container based on the new image - run: | - env_string="" - while IFS= read -r line; do - if [[ "$line" == *"="* ]]; then - key=$(echo "$line" | cut -d '=' -f 1) - value=$(echo "$line" | cut -d '=' -f 2-) - if [[ -n "$key" ]]; then - env_string+="environment-variables.$key=$value " - fi - fi - done <<< "$ENV_VARS" - env_string=$(echo $env_string | sed 's/ $//') - scw container container update ${{ env.CONTAINER_ID }} $env_string - env: - ENV_VARS: ${{ secrets.ENV }} - SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY_LECOFFRE }} - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY_LECOFFRE }} - SCW_DEFAULT_PROJECT_ID: ${{ env.PROJECT_ID_LECOFFRE }} - SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_ORGANIZATION_ID_LECOFFRE }} From 393bdae782c10bb6df8876b2bd17132ebca5b80e Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:50:46 +0200 Subject: [PATCH 04/62] Ignore type errors (only for dev) --- next.config.js | 3 + package-lock.json | 5772 --------------------------------------------- package.json | 2 +- 3 files changed, 4 insertions(+), 5773 deletions(-) delete mode 100644 package-lock.json diff --git a/next.config.js b/next.config.js index 748bd806..6a4eec96 100644 --- a/next.config.js +++ b/next.config.js @@ -2,6 +2,9 @@ const nextConfig = { reactStrictMode: false, + typescript: { + ignoreBuildErrors: true, + }, publicRuntimeConfig: { // Will be available on both server and client NEXT_PUBLIC_BACK_API_PROTOCOL: process.env.NEXT_PUBLIC_BACK_API_PROTOCOL, diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b4b13387..00000000 --- a/package-lock.json +++ /dev/null @@ -1,5772 +0,0 @@ -{ - "name": "lecoffre-front", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lecoffre-front", - "version": "0.1.0", - "dependencies": { - "@emotion/react": "^11.10.6", - "@emotion/styled": "^11.10.6", - "@heroicons/react": "^2.1.3", - "@mui/material": "^5.11.13", - "@next/third-parties": "^14.2.3", - "@types/node": "18.15.1", - "@types/react": "18.0.28", - "@types/react-dom": "18.0.11", - "@uidotdev/usehooks": "^2.4.1", - "class-validator": "^0.14.0", - "classnames": "^2.3.2", - "crypto-random-string": "^5.0.0", - "dotenv": "^16.0.3", - "eslint": "8.36.0", - "eslint-config-next": "13.2.4", - "file-saver": "^2.0.5", - "form-data": "^4.0.0", - "heroicons": "^2.1.5", - "jszip": "^3.10.1", - "jwt-decode": "^3.1.2", - "le-coffre-resources": "file:../lecoffre-ressources", - "next": "^14.2.3", - "prettier": "^2.8.7", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-gtm-module": "^2.0.11", - "react-hotjar": "^6.3.1", - "react-select": "^5.7.2", - "react-toastify": "^9.1.3", - "sass": "^1.59.2", - "sharp": "^0.32.1", - "typescript": "4.9.5", - "uuidv4": "^6.2.13" - }, - "devDependencies": { - "@types/file-saver": "^2.0.7", - "@types/react-gtm-module": "^2.0.3" - } - }, - "../lecoffre-ressources": { - "name": "le-coffre-resources", - "license": "MIT", - "dependencies": { - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "reflect-metadata": "^0.1.13" - }, - "devDependencies": { - "@types/node": "^18.16.1", - "@types/reflect-metadata": "^0.1.0", - "prettier": "^2.7.1", - "tslint": "^6.1.2", - "typescript": "~4.6.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/code-frame": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/highlight": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@types/node": { - "version": "18.19.50", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "../lecoffre-ressources/node_modules/@types/reflect-metadata": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "reflect-metadata": "*" - } - }, - "../lecoffre-ressources/node_modules/@types/validator": { - "version": "13.12.2", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "../lecoffre-ressources/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../lecoffre-ressources/node_modules/builtin-modules": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../lecoffre-ressources/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/class-transformer": { - "version": "0.5.1", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/class-validator": { - "version": "0.14.1", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", - "validator": "^13.9.0" - } - }, - "../lecoffre-ressources/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../lecoffre-ressources/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "../lecoffre-ressources/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../lecoffre-ressources/node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../lecoffre-ressources/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../lecoffre-ressources/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../lecoffre-ressources/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/is-core-module": { - "version": "2.15.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "../lecoffre-ressources/node_modules/libphonenumber-js": { - "version": "1.11.8", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../lecoffre-ressources/node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "../lecoffre-ressources/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "../lecoffre-ressources/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../lecoffre-ressources/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/picocolors": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "../lecoffre-ressources/node_modules/reflect-metadata": { - "version": "0.1.14", - "license": "Apache-2.0" - }, - "../lecoffre-ressources/node_modules/resolve": { - "version": "1.22.8", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "../lecoffre-ressources/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "../lecoffre-ressources/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "../lecoffre-ressources/node_modules/tslint": { - "version": "6.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "../lecoffre-ressources/node_modules/tsutils": { - "version": "2.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "../lecoffre-ressources/node_modules/typescript": { - "version": "4.6.4", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../lecoffre-ressources/node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/validator": { - "version": "13.12.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../lecoffre-ressources/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.3", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.3", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.4", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.4", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.4", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.3", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.36.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.1", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "license": "MIT" - }, - "node_modules/@heroicons/react": { - "version": "2.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">= 16 || ^19.0.0-rc" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.17.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/material": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.17.1", - "@mui/system": "^5.17.1", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^19.0.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.17.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.16.14", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.13.5", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.16.14", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.24", - "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "~7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^19.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@next/env": { - "version": "14.2.29", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.2.4", - "license": "MIT", - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.29", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/third-parties": { - "version": "14.2.29", - "license": "MIT", - "dependencies": { - "third-party-capital": "1.0.20" - }, - "peerDependencies": { - "next": "^13.0.0 || ^14.0.0", - "react": "^18.2.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.11.0", - "license": "MIT" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.15.1", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.0.28", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.11", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-gtm-module": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.26.0", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "license": "MIT" - }, - "node_modules/@types/validator": { - "version": "13.15.1", - "license": "MIT" - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@uidotdev/usehooks": { - "version": "2.4.1", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.7.8", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.14.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.3", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "license": "Apache-2.0" - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.5", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001720", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "license": "ISC" - }, - "node_modules/class-validator": { - "version": "0.14.2", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.11.1", - "validator": "^13.9.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dotenv": { - "version": "16.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.36.0", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "13.2.4", - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "13.2.4", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.1.7", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/heroicons": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/immutable": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jwt-decode": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/le-coffre-resources": { - "resolved": "../lecoffre-ressources", - "link": true - }, - "node_modules/levn": { - "version": "0.4.1", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.8", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.2.4", - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/next": { - "version": "14.2.29", - "license": "MIT", - "dependencies": { - "@next/env": "14.2.29", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.29", - "@next/swc-darwin-x64": "14.2.29", - "@next/swc-linux-arm64-gnu": "14.2.29", - "@next/swc-linux-arm64-musl": "14.2.29", - "@next/swc-linux-x64-gnu": "14.2.29", - "@next/swc-linux-x64-musl": "14.2.29", - "@next/swc-win32-arm64-msvc": "14.2.29", - "@next/swc-win32-ia32-msvc": "14.2.29", - "@next/swc-win32-x64-msvc": "14.2.29" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/node-abi": { - "version": "3.75.0", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "license": "MIT", - "optional": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.4", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.3", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-gtm-module": { - "version": "2.0.11", - "license": "MIT" - }, - "node_modules/react-hotjar": { - "version": "6.3.1", - "license": "MIT" - }, - "node_modules/react-is": { - "version": "19.1.0", - "license": "MIT" - }, - "node_modules/react-select": { - "version": "5.10.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-toastify": { - "version": "9.1.3", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-toastify/node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sass": { - "version": "1.89.1", - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.32.6", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.0.4", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-fs": { - "version": "3.0.9", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/third-party-capital": { - "version": "1.0.20", - "license": "ISC" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unrs-resolver": { - "version": "1.7.8", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.2.2" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-darwin-arm64": "1.7.8", - "@unrs/resolver-binding-darwin-x64": "1.7.8", - "@unrs/resolver-binding-freebsd-x64": "1.7.8", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.8", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.8", - "@unrs/resolver-binding-linux-arm64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-arm64-musl": "1.7.8", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-riscv64-musl": "1.7.8", - "@unrs/resolver-binding-linux-s390x-gnu": "1.7.8", - "@unrs/resolver-binding-linux-x64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-x64-musl": "1.7.8", - "@unrs/resolver-binding-wasm32-wasi": "1.7.8", - "@unrs/resolver-binding-win32-arm64-msvc": "1.7.8", - "@unrs/resolver-binding-win32-ia32-msvc": "1.7.8", - "@unrs/resolver-binding-win32-x64-msvc": "1.7.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuidv4": { - "version": "6.2.13", - "license": "MIT", - "dependencies": { - "@types/uuid": "8.3.4", - "uuid": "8.3.2" - } - }, - "node_modules/validator": { - "version": "13.15.15", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.29.tgz", - "integrity": "sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.29.tgz", - "integrity": "sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.29.tgz", - "integrity": "sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.29.tgz", - "integrity": "sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.29.tgz", - "integrity": "sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.29.tgz", - "integrity": "sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.29.tgz", - "integrity": "sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.29.tgz", - "integrity": "sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - } - } -} diff --git a/package.json b/package.json index a830cbc8..9602dfe1 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", + "build": "NEXT_TELEMETRY_DISABLED=1 next build --no-lint", "start": "next start", "lint": "next lint", "format": "prettier --write src" From e98b9ff6d7449c8f841c03e2467cde1101fa4c77 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:55:24 +0200 Subject: [PATCH 05/62] Add private key in secrets --- .github/workflows/cicd.yml | 2 ++ Dockerfile | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 7379e3b3..d1c8456f 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -30,6 +30,8 @@ jobs: with: context: . push: true + build-args: | + SSH_PRIVATE_KEY=${{ secrets.SSH_PRIVATE_KEY }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index bf54d6c8..4e17b189 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,10 +8,13 @@ COPY .env ./ RUN apk update && apk add openssh-client git -COPY id_rsa /root/.ssh/id_rsa -RUN chmod 600 ~/.ssh/id_rsa -RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa -RUN ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts +ARG SSH_PRIVATE_KEY +RUN mkdir -p /root/.ssh && \ + echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ + chmod 600 /root/.ssh/id_rsa && \ + eval "$(ssh-agent -s)" && \ + ssh-add /root/.ssh/id_rsa && \ + ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts RUN npm install --frozen-lockfile From cc4da39f74818f6fdc981c2d24e10e6f124f2526 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:55:45 +0200 Subject: [PATCH 06/62] Update back url --- src/front/Api/Auth/IdNot/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index 6e27e505..2c320808 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -44,7 +44,7 @@ export default class Auth extends BaseApiService { const variables = FrontendVariables.getInstance(); // TODO: review - const baseBackUrl = 'http://localhost:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; + const baseBackUrl = 'http://lecoffre-back:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; const url = new URL(`${baseBackUrl}/api/v1/idnot/user/${autorizationCode}`); try { From 5b3fcc1eaff1915eaf86035ed10ceb9b8ba301d2 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 15:56:33 +0200 Subject: [PATCH 07/62] Ignore unused erros (only for dev) --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 06d018fa..756a9eac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,7 +30,7 @@ "alwaysStrict": true, "noPropertyAccessFromIndexSignature": true, /* Additional Checks */ - "noUnusedLocals": true, + "noUnusedLocals": false, "noImplicitReturns": true, "noUncheckedIndexedAccess": true, "useUnknownInCatchVariables": true, From 5620084a352610c6d9e976d60f6d2e63cecc905f Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:01:02 +0200 Subject: [PATCH 08/62] Add env variables to secrets --- .github/workflows/cicd.yml | 1 + Dockerfile | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index d1c8456f..bb55c40e 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -32,6 +32,7 @@ jobs: push: true build-args: | SSH_PRIVATE_KEY=${{ secrets.SSH_PRIVATE_KEY }} + ENV_VARS=${{ secrets.ENV_VARS }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4e17b189..880169bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,9 @@ FROM node:19-alpine AS deps WORKDIR leCoffre-front COPY package.json ./ -COPY .env ./ + +ARG ENV_VARS +RUN echo "${ENV_VARS}" > .env RUN apk update && apk add openssh-client git From eb4e47a73e90d90e1c524aeb3054356f53c865c7 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:08:27 +0200 Subject: [PATCH 09/62] Minor update --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 880169bc..b6db09fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apk update && apk add openssh-client git ARG SSH_PRIVATE_KEY RUN mkdir -p /root/.ssh && \ - echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ + printf "%s" "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa && \ eval "$(ssh-agent -s)" && \ ssh-add /root/.ssh/id_rsa && \ From fd4a9d32b7f3b85b776e37e26ea5e7f57929b665 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:11:26 +0200 Subject: [PATCH 10/62] Minor update --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b6db09fe..880169bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apk update && apk add openssh-client git ARG SSH_PRIVATE_KEY RUN mkdir -p /root/.ssh && \ - printf "%s" "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ + echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa && \ eval "$(ssh-agent -s)" && \ ssh-add /root/.ssh/id_rsa && \ From e8d7c5777fafddd55a1e12a2d0a69929aa74ee5e Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:19:17 +0200 Subject: [PATCH 11/62] Minor Update --- .github/workflows/cicd.yml | 4 +++- Dockerfile | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index bb55c40e..10df55a0 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -26,6 +26,8 @@ jobs: password: ${{ secrets.TOKEN }} - name: Build and push + env: + SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }} uses: docker/build-push-action@v5 with: context: . @@ -35,4 +37,4 @@ jobs: ENV_VARS=${{ secrets.ENV_VARS }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 880169bc..77a9e1bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Install dependencies only when needed FROM node:19-alpine AS deps -WORKDIR leCoffre-front +WORKDIR /app COPY package.json ./ @@ -12,7 +12,7 @@ RUN apk update && apk add openssh-client git ARG SSH_PRIVATE_KEY RUN mkdir -p /root/.ssh && \ - echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ + echo "${SSH_PRIVATE_KEY}" | base64 -d > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa && \ eval "$(ssh-agent -s)" && \ ssh-add /root/.ssh/id_rsa && \ @@ -23,11 +23,11 @@ RUN npm install --frozen-lockfile # Rebuild the source code only when needed FROM node:19-alpine AS builder -WORKDIR leCoffre-front +WORKDIR /app -COPY --from=deps leCoffre-front/node_modules ./node_modules -COPY --from=deps leCoffre-front/package.json package.json -COPY --from=deps leCoffre-front/.env ./.env +COPY --from=deps /app/node_modules ./node_modules +COPY --from=deps /app/package.json package.json +COPY --from=deps /app/.env ./.env COPY tsconfig.json tsconfig.json COPY next.config.js next.config.js COPY src src @@ -37,16 +37,16 @@ RUN npm run build # Production image, copy all the files and run next FROM node:19-alpine AS production -WORKDIR leCoffre-front +WORKDIR /app RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . COPY public ./public -COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modules -COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next -COPY --from=builder --chown=lecoffreuser leCoffre-front/next.config.js ./next.config.js -COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json -COPY --from=builder --chown=lecoffreuser leCoffre-front/.env ./.env +COPY --from=builder --chown=lecoffreuser /app/node_modules ./node_modules +COPY --from=builder --chown=lecoffreuser /app/.next ./.next +COPY --from=builder --chown=lecoffreuser /app/next.config.js ./next.config.js +COPY --from=builder --chown=lecoffreuser /app/package.json ./package.json +COPY --from=builder --chown=lecoffreuser /app/.env ./.env USER lecoffreuser From 01d56c864a8f8e09b91dafc0cf4b96d8ff7d1fb2 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:21:22 +0200 Subject: [PATCH 12/62] Update --- .github/workflows/cicd.yml | 4 +--- Dockerfile | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 10df55a0..bb55c40e 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -26,8 +26,6 @@ jobs: password: ${{ secrets.TOKEN }} - name: Build and push - env: - SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }} uses: docker/build-push-action@v5 with: context: . @@ -37,4 +35,4 @@ jobs: ENV_VARS=${{ secrets.ENV_VARS }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 77a9e1bd..880169bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Install dependencies only when needed FROM node:19-alpine AS deps -WORKDIR /app +WORKDIR leCoffre-front COPY package.json ./ @@ -12,7 +12,7 @@ RUN apk update && apk add openssh-client git ARG SSH_PRIVATE_KEY RUN mkdir -p /root/.ssh && \ - echo "${SSH_PRIVATE_KEY}" | base64 -d > /root/.ssh/id_rsa && \ + echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa && \ eval "$(ssh-agent -s)" && \ ssh-add /root/.ssh/id_rsa && \ @@ -23,11 +23,11 @@ RUN npm install --frozen-lockfile # Rebuild the source code only when needed FROM node:19-alpine AS builder -WORKDIR /app +WORKDIR leCoffre-front -COPY --from=deps /app/node_modules ./node_modules -COPY --from=deps /app/package.json package.json -COPY --from=deps /app/.env ./.env +COPY --from=deps leCoffre-front/node_modules ./node_modules +COPY --from=deps leCoffre-front/package.json package.json +COPY --from=deps leCoffre-front/.env ./.env COPY tsconfig.json tsconfig.json COPY next.config.js next.config.js COPY src src @@ -37,16 +37,16 @@ RUN npm run build # Production image, copy all the files and run next FROM node:19-alpine AS production -WORKDIR /app +WORKDIR leCoffre-front RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . COPY public ./public -COPY --from=builder --chown=lecoffreuser /app/node_modules ./node_modules -COPY --from=builder --chown=lecoffreuser /app/.next ./.next -COPY --from=builder --chown=lecoffreuser /app/next.config.js ./next.config.js -COPY --from=builder --chown=lecoffreuser /app/package.json ./package.json -COPY --from=builder --chown=lecoffreuser /app/.env ./.env +COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modules +COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next +COPY --from=builder --chown=lecoffreuser leCoffre-front/next.config.js ./next.config.js +COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json +COPY --from=builder --chown=lecoffreuser leCoffre-front/.env ./.env USER lecoffreuser From 19f517a946cda269810d75e9f9c01cefe5b8490d Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:29:06 +0200 Subject: [PATCH 13/62] Update --- .github/workflows/cicd.yml | 9 +++++++-- Dockerfile | 39 +++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index bb55c40e..61ad0e81 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -15,6 +15,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Set up SSH agent + uses: webfactory/ssh-agent@v0.8.1 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -30,9 +35,9 @@ jobs: with: context: . push: true + ssh: default build-args: | - SSH_PRIVATE_KEY=${{ secrets.SSH_PRIVATE_KEY }} ENV_VARS=${{ secrets.ENV_VARS }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 880169bc..c2a5373a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,33 +1,28 @@ -# Install dependencies only when needed +# syntax=docker/dockerfile:1.4 FROM node:19-alpine AS deps - -WORKDIR leCoffre-front +WORKDIR /leCoffre-front COPY package.json ./ ARG ENV_VARS RUN echo "${ENV_VARS}" > .env -RUN apk update && apk add openssh-client git +RUN apk update && apk add --no-cache openssh-client git -ARG SSH_PRIVATE_KEY -RUN mkdir -p /root/.ssh && \ - echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa && \ - chmod 600 /root/.ssh/id_rsa && \ - eval "$(ssh-agent -s)" && \ - ssh-add /root/.ssh/id_rsa && \ +# Forward SSH agent via BuildKit (clé jamais écrite dans l'image) +RUN --mount=type=ssh \ + mkdir -p /root/.ssh && \ ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts RUN npm install --frozen-lockfile # Rebuild the source code only when needed FROM node:19-alpine AS builder +WORKDIR /leCoffre-front -WORKDIR leCoffre-front - -COPY --from=deps leCoffre-front/node_modules ./node_modules -COPY --from=deps leCoffre-front/package.json package.json -COPY --from=deps leCoffre-front/.env ./.env +COPY --from=deps /leCoffre-front/node_modules ./node_modules +COPY --from=deps /leCoffre-front/package.json ./package.json +COPY --from=deps /leCoffre-front/.env ./.env COPY tsconfig.json tsconfig.json COPY next.config.js next.config.js COPY src src @@ -36,17 +31,17 @@ RUN npm run build # Production image, copy all the files and run next FROM node:19-alpine AS production +WORKDIR /leCoffre-front -WORKDIR leCoffre-front - +# Création de l’utilisateur non-root RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . COPY public ./public -COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modules -COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next -COPY --from=builder --chown=lecoffreuser leCoffre-front/next.config.js ./next.config.js -COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json -COPY --from=builder --chown=lecoffreuser leCoffre-front/.env ./.env +COPY --from=builder --chown=lecoffreuser /leCoffre-front/node_modules ./node_modules +COPY --from=builder --chown=lecoffreuser /leCoffre-front/.next ./.next +COPY --from=builder --chown=lecoffreuser /leCoffre-front/next.config.js ./next.config.js +COPY --from=builder --chown=lecoffreuser /leCoffre-front/package.json ./package.json +COPY --from=builder --chown=lecoffreuser /leCoffre-front/.env ./.env USER lecoffreuser From 5667f07b51cb31cb0e351b2031cd7072c4bc664d Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:32:16 +0200 Subject: [PATCH 14/62] Update --- .github/workflows/cicd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 61ad0e81..47a0e6a2 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v4 - name: Set up SSH agent - uses: webfactory/ssh-agent@v0.8.1 + uses: webfactory/ssh-agent@v0.9.1 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} From 76650e30680bd3165241fcb5cda367ed48bac19b Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Tue, 1 Jul 2025 16:35:45 +0200 Subject: [PATCH 15/62] Update --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c2a5373a..c5d5b48e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,9 +12,8 @@ RUN apk update && apk add --no-cache openssh-client git # Forward SSH agent via BuildKit (clé jamais écrite dans l'image) RUN --mount=type=ssh \ mkdir -p /root/.ssh && \ - ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts - -RUN npm install --frozen-lockfile + ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts && \ + npm install --frozen-lockfile # Rebuild the source code only when needed FROM node:19-alpine AS builder From 2e54e77aee748fa5c3a571ce2190dd4834715d97 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Thu, 3 Jul 2025 10:56:46 +0200 Subject: [PATCH 16/62] Update bae url --- src/front/Api/Auth/IdNot/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index 2c320808..e4b9e360 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -44,7 +44,7 @@ export default class Auth extends BaseApiService { const variables = FrontendVariables.getInstance(); // TODO: review - const baseBackUrl = 'http://lecoffre-back:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; + const baseBackUrl = 'http://local.lecoffreio.4nkweb:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; const url = new URL(`${baseBackUrl}/api/v1/idnot/user/${autorizationCode}`); try { From 4e8dbcbf1783a4544461fd321a80fc5af02d7bda Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Thu, 3 Jul 2025 11:46:56 +0200 Subject: [PATCH 17/62] Update port --- src/front/Api/Auth/IdNot/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index e4b9e360..34f6b921 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -44,7 +44,7 @@ export default class Auth extends BaseApiService { const variables = FrontendVariables.getInstance(); // TODO: review - const baseBackUrl = 'http://local.lecoffreio.4nkweb:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; + const baseBackUrl = 'http://local.lecoffreio.4nkweb:3001'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; const url = new URL(`${baseBackUrl}/api/v1/idnot/user/${autorizationCode}`); try { From 7a137dbe2f56e11acb89dde574515113227f8b84 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 15:04:40 +0200 Subject: [PATCH 18/62] Add basic certificate --- .../DesignSystem/DragAndDrop/index.tsx | 4 +- .../DepositDocumentComponent/index.tsx | 6 +- .../Layouts/Folder/AskDocuments/index.tsx | 13 +- .../ClientView/DocumentTables/index.tsx | 87 ++++- src/front/Services/PdfService/index.ts | 311 ++++++++++++++++++ src/sdk/MessageBus.ts | 85 ++--- 6 files changed, 451 insertions(+), 55 deletions(-) create mode 100644 src/front/Services/PdfService/index.ts diff --git a/src/front/Components/DesignSystem/DragAndDrop/index.tsx b/src/front/Components/DesignSystem/DragAndDrop/index.tsx index 29896fc4..bc2a8021 100644 --- a/src/front/Components/DesignSystem/DragAndDrop/index.tsx +++ b/src/front/Components/DesignSystem/DragAndDrop/index.tsx @@ -213,9 +213,9 @@ export default function DragAndDrop(props: IProps) { {documentFiles.length > 0 && (
- {documentFiles.map((documentFile) => ( + {documentFiles.map((documentFile, index) => ( handleRemove(documentFile)} diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index 3f9ae3e6..a67df895 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -82,9 +82,9 @@ export default function DepositDocumentComponent(props: IProps) { (fileUid: string) => { return new Promise( (resolve: () => void) => { - FileService.getFileByUid(fileUid).then((process: any) => { - if (process) { - FileService.updateFile(process, { isDeleted: 'true' }).then(() => { + FileService.getFileByUid(fileUid).then((res: any) => { + if (res) { + FileService.updateFile(res.processId, { isDeleted: 'true' }).then(() => { DocumentService.getDocumentByUid(document.uid!).then((process: any) => { if (process) { const document: any = process.processData; diff --git a/src/front/Components/Layouts/Folder/AskDocuments/index.tsx b/src/front/Components/Layouts/Folder/AskDocuments/index.tsx index 949c1ca4..0828bfa1 100644 --- a/src/front/Components/Layouts/Folder/AskDocuments/index.tsx +++ b/src/front/Components/Layouts/Folder/AskDocuments/index.tsx @@ -18,6 +18,7 @@ import backgroundImage from "@Assets/images/background_refonte.svg"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; +import { DocumentData } from "../FolderInformation/ClientView/DocumentTables/types"; export default function AskDocuments() { const router = useRouter(); @@ -62,17 +63,21 @@ export default function AskDocuments() { LoaderService.getInstance().show(); const documentAsked: [] = values["document_types"] as []; for (let i = 0; i < documentAsked.length; i++) { + const documentTypeUid = documentAsked[i]; + if (!documentTypeUid) continue; + const documentData: any = { folder: { - uid: folderUid, + uid: folderUid as string, }, depositor: { - uid: customerUid, + uid: customerUid as string, }, document_type: { - uid: documentAsked[i] + uid: documentTypeUid }, - document_status: EDocumentStatus.ASKED + document_status: EDocumentStatus.ASKED, + file_uid: null, }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index 9f99eb02..acafddac 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -6,7 +6,7 @@ import Tag, { ETagColor, ETagVariant } from "@Front/Components/DesignSystem/Tag" import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import Module from "@Front/Config/Module"; import useOpenable from "@Front/Hooks/useOpenable"; -import { ArrowDownTrayIcon, EyeIcon, TrashIcon } from "@heroicons/react/24/outline"; +import { ArrowDownTrayIcon, EyeIcon, TrashIcon, DocumentTextIcon } from "@heroicons/react/24/outline"; import { useMediaQuery } from "@mui/material"; import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document"; import DocumentNotary, { EDocumentNotaryStatus } from "le-coffre-resources/dist/Notary/DocumentNotary"; @@ -22,6 +22,8 @@ import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import DocumentTypeService from "src/common/Api/LeCoffreApi/sdk/DocumentTypeService"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; +import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; +import PdfService, { CertificateData, Metadata } from "@Front/Services/PdfService"; type IProps = { customerUid: string; @@ -61,6 +63,12 @@ export default function DocumentTables(props: IProps) { // FilterBy folder.uid & depositor.uid documents = documents.filter((document: any) => document.folder.uid === folderUid && document.depositor && document.depositor.uid === customerUid); + console.log('[DocumentTables] fetchDocuments: all documents for this folder/customer:', documents.map(doc => ({ + uid: doc.uid, + status: doc.document_status, + type: doc.document_type?.name + }))); + for (const document of documents) { if (document.document_type) { document.document_type = (await DocumentTypeService.getDocumentTypeByUid(document.document_type.uid)).processData; @@ -176,6 +184,71 @@ export default function DocumentTables(props: IProps) { }).catch((e) => console.warn(e)); }, []); + const onDownloadCertificate = useCallback(async (doc: any) => { + try { + console.log('[DocumentTables] onDownloadCertificate: doc', doc); + const certificateData: CertificateData = { + customer: { + firstName: doc.depositor.first_name || doc.depositor.firstName || "N/A", + lastName: doc.depositor.last_name || doc.depositor.lastName || "N/A", + postalAddress: doc.depositor.postal_address || doc.depositor.address || doc.depositor.postalAddress || "N/A", + email: doc.depositor.email || "N/A" + }, + notary: { + name: "N/A" + }, + folderUid: folderUid, + documentHash: "N/A", + metadata: { + fileName: "N/A", + isDeleted: false, + updatedAt: new Date(), + commitmentId: "N/A", + createdAt: new Date(), + documentUid: "N/A", + documentType: "N/A" + } + }; + + // Fetch folder data to get office/notary information + // const folderProcess = await FolderService.getFolderByUid(folderUid, false, true); + // const folderData = folderProcess?.processData; + + // console.log('[DocumentTables] onDownloadCertificate: folderData', folderData); + + const documentProcesses = await DocumentService.getDocuments(); + documentProcesses.filter((process: any) => process.processData.folder.uid === folderUid); + + console.log('[DocumentTables] onDownloadCertificate: documentProcesses', documentProcesses); + + for (const document of documentProcesses) { + for (const file of document.processData.files) { + await FileService.getFileByUid(file.uid).then((res: any) => { + console.log('[DocumentTables] onDownloadCertificate: fileProcess', res); + const hash = res.lastUpdatedFileState.pcd_commitment.file_blob; + certificateData.documentHash = hash; + const metadata: Metadata = { + fileName: res.processData.file_name, + isDeleted: false, + updatedAt: new Date(res.processData.updated_at), + commitmentId: res.lastUpdatedFileState.commited_in, + createdAt: new Date(res.processData.created_at), + documentUid: doc.document_type.uid, + documentType: doc.document_type.name + }; + certificateData.metadata = metadata; + } + )} + } + + console.log('[DocumentTables] onDownloadCertificate: certificateData', certificateData); + + await PdfService.getInstance().downloadCertificate(certificateData); + } catch (error) { + console.error('Error downloading certificate:', error); + } + }, [folderUid, customerUid]); + const askedDocuments: IRowProps[] = useMemo( () => documents @@ -263,8 +336,8 @@ export default function DocumentTables(props: IProps) { ); const validatedDocuments: IRowProps[] = useMemo( - () => - documents + () => { + const validated = documents .map((document) => { if (document.document_status !== EDocumentStatus.VALIDATED) return null; return { @@ -300,13 +373,17 @@ export default function DocumentTables(props: IProps) { } /> onDownload(document)} icon={} /> + onDownloadCertificate(document)} icon={} />
), }, }; }) - .filter((document) => document !== null) as IRowProps[], - [documents, folderUid, onDownload], + .filter((document) => document !== null) as IRowProps[]; + + return validated; + }, + [documents, folderUid, onDownload, onDownloadCertificate], ); const refusedDocuments: IRowProps[] = useMemo( diff --git a/src/front/Services/PdfService/index.ts b/src/front/Services/PdfService/index.ts new file mode 100644 index 00000000..66f2ba2c --- /dev/null +++ b/src/front/Services/PdfService/index.ts @@ -0,0 +1,311 @@ +import { saveAs } from 'file-saver'; +import jsPDF from 'jspdf'; + +export interface CustomerInfo { + firstName: string; + lastName: string; + postalAddress: string; + email: string; +} + +export interface NotaryInfo { + name: string; + // Add more notary fields as needed +} + +export interface Metadata { + fileName: string, + createdAt: Date, + isDeleted: boolean, + updatedAt: Date, + commitmentId: string, + documentUid: string; + documentType: string; +} + +export interface CertificateData { + customer: CustomerInfo; + notary: NotaryInfo; + folderUid: string; + documentHash: string; + metadata: Metadata; +} + +export default class PdfService { + private static instance: PdfService; + + public static getInstance(): PdfService { + if (!PdfService.instance) { + PdfService.instance = new PdfService(); + } + return PdfService.instance; + } + + /** + * Generate a certificate PDF for a document + * @param certificateData - Data needed for the certificate + * @returns Promise - The generated PDF as a blob + */ + public async generateCertificate(certificateData: CertificateData): Promise { + try { + const doc = new jsPDF(); + + // Notary Information Section (Top Left) + doc.setFontSize(12); + doc.setFont('helvetica', 'bold'); + doc.text('Notaire Validateur:', 20, 30); + doc.setFont('helvetica', 'normal'); + doc.text(certificateData.notary.name, 20, 37); + + // Customer Information Section (Top Right) + doc.setFont('helvetica', 'bold'); + doc.text('Fournisseur de Document:', 120, 30); + doc.setFont('helvetica', 'normal'); + doc.text(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, 120, 37); + doc.text(certificateData.customer.email, 120, 44); + doc.text(certificateData.customer.postalAddress, 120, 51); + + // Centered Title + doc.setFontSize(20); + doc.setFont('helvetica', 'bold'); + doc.text('Certificat de Validation de Document', 105, 80, { align: 'center' }); + + // Add a line separator + doc.setLineWidth(0.5); + doc.line(20, 90, 190, 90); + + // Reset font for content + doc.setFontSize(12); + doc.setFont('helvetica', 'normal'); + + let yPosition = 110; + + // Document Information Section + doc.setFont('helvetica', 'bold'); + doc.text('Informations du Document', 20, yPosition); + yPosition += 10; + + doc.setFont('helvetica', 'normal'); + doc.text(`UID du Document: ${certificateData.metadata.documentUid}`, 20, yPosition); + yPosition += 7; + doc.text(`Type de Document: ${certificateData.metadata.documentType}`, 20, yPosition); + yPosition += 7; + doc.text(`UID du Dossier: ${certificateData.folderUid}`, 20, yPosition); + yPosition += 7; + doc.text(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, 20, yPosition); + yPosition += 7; + doc.text(`Nom du fichier: ${certificateData.metadata.fileName}`, 20, yPosition); + yPosition += 7; + doc.text(`ID de transaction: ${certificateData.metadata.commitmentId}`, 20, yPosition); + yPosition += 7; + doc.text(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, 20, yPosition); + yPosition += 7; + doc.text(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, 20, yPosition); + yPosition += 15; + + // Document Hash Section + doc.setFont('helvetica', 'bold'); + doc.text('Intégrité du Document', 20, yPosition); + yPosition += 10; + + doc.setFont('helvetica', 'normal'); + doc.text(`Hash SHA256 du Document:`, 20, yPosition); + yPosition += 7; + + // Split hash into multiple lines if needed + const hash = certificateData.documentHash; + const maxWidth = 170; // Available width for text + const hashLines = this.splitTextToFit(doc, hash, maxWidth); + + for (const line of hashLines) { + doc.text(line, 25, yPosition); + yPosition += 7; + } + yPosition += 8; // Extra space after hash + + // Footer + const pageCount = doc.getNumberOfPages(); + for (let i = 1; i <= pageCount; i++) { + doc.setPage(i); + doc.setFontSize(10); + doc.setFont('helvetica', 'italic'); + doc.text(`Page ${i} sur ${pageCount}`, 105, 280, { align: 'center' }); + doc.text(`Généré le ${new Date().toLocaleString('fr-FR')}`, 105, 285, { align: 'center' }); + } + + return doc.output('blob'); + } catch (error) { + console.error('Error generating certificate:', error); + throw new Error('Failed to generate certificate'); + } + } + + /** + * Split text to fit within a specified width + * @param doc - jsPDF document instance + * @param text - Text to split + * @param maxWidth - Maximum width in points + * @returns Array of text lines + */ + private splitTextToFit(doc: jsPDF, text: string, maxWidth: number): string[] { + const lines: string[] = []; + let currentLine = ''; + + // Split by words first + const words = text.split(''); + + for (const char of words) { + const testLine = currentLine + char; + const testWidth = doc.getTextWidth(testLine); + + if (testWidth <= maxWidth) { + currentLine = testLine; + } else { + if (currentLine) { + lines.push(currentLine); + currentLine = char; + } else { + // If even a single character is too wide, force a break + lines.push(char); + } + } + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; + } + + /** + * Download a certificate PDF + * @param certificateData - Data needed for the certificate + * @param filename - Optional filename for the download + */ + public async downloadCertificate(certificateData: CertificateData, filename?: string): Promise { + try { + const pdfBlob = await this.generateCertificate(certificateData); + const defaultFilename = `certificate_${certificateData.metadata.documentUid}_${new Date().toISOString().split('T')[0]}.pdf`; + saveAs(pdfBlob, filename || defaultFilename); + } catch (error) { + console.error('Error downloading certificate:', error); + throw error; + } + } + + /** + * Generate certificate for notary documents + * @param certificateData - Data needed for the certificate + * @returns Promise - The generated PDF as a blob + */ + public async generateNotaryCertificate(certificateData: CertificateData): Promise { + try { + const doc = new jsPDF(); + + // Notary Information Section (Top Left) + doc.setFontSize(12); + doc.setFont('helvetica', 'bold'); + doc.text('Notaire Validateur:', 20, 30); + doc.setFont('helvetica', 'normal'); + doc.text(certificateData.notary.name, 20, 37); + + // Customer Information Section (Top Right) + doc.setFont('helvetica', 'bold'); + doc.text('Fournisseur de Document:', 120, 30); + doc.setFont('helvetica', 'normal'); + doc.text(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, 120, 37); + doc.text(certificateData.customer.email, 120, 44); + doc.text(certificateData.customer.postalAddress, 120, 51); + + // Centered Title + doc.setFontSize(20); + doc.setFont('helvetica', 'bold'); + doc.text('Certificat Notarial de Validation de Document', 105, 80, { align: 'center' }); + + // Add a line separator + doc.setLineWidth(0.5); + doc.line(20, 90, 190, 90); + + // Reset font for content + doc.setFontSize(12); + doc.setFont('helvetica', 'normal'); + + let yPosition = 110; + + // Document Information Section + doc.setFont('helvetica', 'bold'); + doc.text('Informations du Document', 20, yPosition); + yPosition += 10; + + doc.setFont('helvetica', 'normal'); + doc.text(`Identifiant du Document: ${certificateData.metadata.documentUid}`, 20, yPosition); + yPosition += 7; + doc.text(`Type de Document: ${certificateData.metadata.documentType}`, 20, yPosition); + yPosition += 7; + doc.text(`Numéro de dossier: ${certificateData.folderUid}`, 20, yPosition); + yPosition += 7; + doc.text(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, 20, yPosition); + yPosition += 7; + doc.text(`Nom du fichier: ${certificateData.metadata.fileName}`, 20, yPosition); + yPosition += 7; + doc.text(`ID de transaction: ${certificateData.metadata.commitmentId}`, 20, yPosition); + yPosition += 7; + doc.text(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, 20, yPosition); + yPosition += 7; + doc.text(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, 20, yPosition); + yPosition += 15; + + // Document Hash Section + doc.setFont('helvetica', 'bold'); + doc.text('Intégrité du Document', 20, yPosition); + yPosition += 10; + + doc.setFont('helvetica', 'normal'); + doc.text(`Hash SHA256 du Document:`, 20, yPosition); + yPosition += 7; + + // Split hash into multiple lines if needed + const hash = certificateData.documentHash; + const maxWidth = 170; // Available width for text + const hashLines = this.splitTextToFit(doc, hash, maxWidth); + + for (const line of hashLines) { + doc.text(line, 25, yPosition); + yPosition += 7; + } + yPosition += 8; // Extra space after hash + + // Footer + const pageCount = doc.getNumberOfPages(); + for (let i = 1; i <= pageCount; i++) { + doc.setPage(i); + doc.setFontSize(10); + doc.setFont('helvetica', 'italic'); + doc.text(`Page ${i} sur ${pageCount}`, 105, 280, { align: 'center' }); + doc.text(`Certificat Notarial - Généré le ${new Date().toLocaleString('fr-FR')}`, 105, 285, { align: 'center' }); + } + + return doc.output('blob'); + } catch (error) { + console.error('Error generating notary certificate:', error); + throw new Error('Failed to generate notary certificate'); + } + } + + /** + * Download a notary certificate PDF + * @param certificateData - Data needed for the certificate + * @param filename - Optional filename for the download + */ + public async downloadNotaryCertificate(certificateData: CertificateData, filename?: string): Promise { + try { + const pdfBlob = await this.generateNotaryCertificate(certificateData); + const defaultFilename = `notary_certificate_${certificateData.metadata.documentUid}_${new Date().toISOString().split('T')[0]}.pdf`; + saveAs(pdfBlob, filename || defaultFilename); + } catch (error) { + console.error('Error downloading notary certificate:', error); + throw error; + } + } +} \ No newline at end of file diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 2d26952c..137d578d 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -113,65 +113,68 @@ export default class MessageBus { const publicDataDecoded: { [key: string]: any } = {}; - for (let stateId = 0; stateId < process.states.length - 1; stateId++) { - const state = process.states[stateId]; - if (!state) { - continue; - } + // We only care about the public data as they are in the last commited state + const processTip = process.states[process.states.length - 1].commited_in; + const lastCommitedState = process.states.findLast((state: any) => state.commited_in !== processTip); - const publicDataEncoded = state.public_data; - if (!publicDataEncoded) { - continue; - } + if (!lastCommitedState) { + continue; + } - for (const key of Object.keys(publicDataEncoded)) { - publicDataDecoded[key] = await this.getPublicData(publicDataEncoded[key]); - } + const publicDataEncoded = lastCommitedState.public_data; + if (!publicDataEncoded) { + continue; + } + + for (const key of Object.keys(publicDataEncoded)) { + publicDataDecoded[key] = await this.getPublicData(publicDataEncoded[key]); } if (!(publicDataDecoded['uid'] && publicDataDecoded['uid'] === uid && publicDataDecoded['utype'] && publicDataDecoded['utype'] === 'file')) { continue; } + // We take the file in it's latest commited state let file: any; - for (let stateId = 0; stateId < process.states.length - 1; stateId++) { - const lastState = process.states[stateId]; - if (!lastState) { + // Which is the last state that updated file_blob? + const lastUpdatedFileState = process.states.findLast((state: any) => state.pcd_commitment['file_blob']); + + if (!lastUpdatedFileState) { + continue; + } + + try { + const processData = await this.getData(processId, lastUpdatedFileState.state_id); + const isEmpty = Object.keys(processData).length === 0; + if (isEmpty) { continue; } - const lastStateId = lastState.state_id; - if (!lastStateId) { + const publicDataEncoded = lastUpdatedFileState.public_data; + if (!publicDataEncoded) { continue; } - try { - const processData = await this.getData(processId, lastStateId); - const isEmpty = Object.keys(processData).length === 0; - if (isEmpty) { - continue; + + if (!file) { + file = { + processId, + lastUpdatedFileState, + processData, + publicDataDecoded, + }; + } else { + for (const key of Object.keys(processData)) { + file.processData[key] = processData[key]; } - + file.lastUpdatedFileState = lastUpdatedFileState; for (const key of Object.keys(publicDataDecoded)) { - processData[key] = publicDataDecoded[key]; + file.publicDataDecoded[key] = publicDataDecoded[key]; } - - if (!file) { - file = { - processId, - lastStateId, - processData, - }; - } else { - for (const key of Object.keys(processData)) { - file.processData[key] = processData[key]; - } - file.lastStateId = lastStateId; - } - } catch (error) { - console.error(error); } + } catch (error) { + console.error(error); } files.push(file); @@ -651,7 +654,7 @@ export default class MessageBus { console.error('[MessageBus] sendMessage: iframe not found'); return; } - console.log('[MessageBus] sendMessage:', message); + // console.log('[MessageBus] sendMessage:', message); iframe.contentWindow?.postMessage(message, targetOrigin); } @@ -688,7 +691,7 @@ export default class MessageBus { } const message = event.data; - console.log('[MessageBus] handleMessage:', message); + // console.log('[MessageBus] handleMessage:', message); switch (message.type) { case 'LISTENING': From d17f4aa8d91f1fdaed16d7012940ea344fe464ee Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:34:26 +0200 Subject: [PATCH 19/62] Add FileBlob and FileData --- src/front/Api/Entities/types.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/front/Api/Entities/types.ts diff --git a/src/front/Api/Entities/types.ts b/src/front/Api/Entities/types.ts new file mode 100644 index 00000000..06087a1f --- /dev/null +++ b/src/front/Api/Entities/types.ts @@ -0,0 +1,21 @@ +/** + * FileBlob interface representing a file's binary data and metadata + * Used for file transmission and storage in the application + */ +export interface FileBlob { + /** MIME type of the file (e.g., "application/pdf", "image/jpeg") */ + type: string; + /** Binary data of the file as Uint8Array */ + data: Uint8Array; +} + +/** + * FileData interface representing a complete file object with blob and metadata + * Used when creating or updating files in the system + */ +export interface FileData { + /** The file blob containing type and binary data */ + file_blob: FileBlob; + /** The name of the file */ + file_name: string; +} \ No newline at end of file From 723322cc0a5854d2e4e630beb5cc783729f8fa1b Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:37:24 +0200 Subject: [PATCH 20/62] Use FileBlob and FileData everywhere --- src/common/Api/LeCoffreApi/sdk/FileService.ts | 5 +++-- src/front/Api/Entities/index.ts | 2 ++ .../ClientDashboard/DepositDocumentComponent/index.tsx | 5 +++-- .../Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx | 5 +++-- .../ClientView/DocumentTables/FilePreviewModal/index.tsx | 6 +++++- .../Components/Layouts/Folder/ViewDocuments/index.tsx | 7 +++++-- 6 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 src/front/Api/Entities/index.ts diff --git a/src/common/Api/LeCoffreApi/sdk/FileService.ts b/src/common/Api/LeCoffreApi/sdk/FileService.ts index 9b639cf9..b6dff078 100644 --- a/src/common/Api/LeCoffreApi/sdk/FileService.ts +++ b/src/common/Api/LeCoffreApi/sdk/FileService.ts @@ -2,6 +2,7 @@ import { v4 as uuidv4 } from 'uuid'; import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; +import { FileData } from '../../../../front/Api/Entities/types'; export default class FileService { @@ -9,7 +10,7 @@ export default class FileService { private constructor() { } - public static createFile(fileData: any, validatorId: string): Promise { + public static createFile(fileData: FileData, validatorId: string): Promise { const ownerId = User.getInstance().getPairingId()!; const processData: any = { @@ -81,7 +82,7 @@ export default class FileService { return this.messageBus.getFileByUid(uid); } - public static updateFile(process: any, newData: any): Promise { + public static updateFile(process: any, newData: Partial & { isDeleted?: string }): Promise { return new Promise((resolve: () => void, reject: (error: string) => void) => { this.messageBus.updateProcess(process.processId, { updated_at: new Date().toISOString(), ...newData }, [], null).then((processUpdated: any) => { const newStateId: string = processUpdated.diffs[0]?.state_id; diff --git a/src/front/Api/Entities/index.ts b/src/front/Api/Entities/index.ts new file mode 100644 index 00000000..e322dc9c --- /dev/null +++ b/src/front/Api/Entities/index.ts @@ -0,0 +1,2 @@ +export * from './types'; +export * from './rule'; \ No newline at end of file diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index a67df895..0d69a387 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -9,6 +9,7 @@ import Confirm from "@Front/Components/DesignSystem/OldModal/Confirm"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; +import { FileBlob, FileData } from "@Front/Api/Entities/types"; type IProps = { document: any; @@ -39,12 +40,12 @@ export default function DepositDocumentComponent(props: IProps) { const arrayBuffer = event.target.result as ArrayBuffer; const uint8Array = new Uint8Array(arrayBuffer); - const fileBlob: any = { + const fileBlob: FileBlob = { type: file.type, data: uint8Array }; - const fileData: any = { + const fileData: FileData = { file_blob: fileBlob, file_name: file.name }; diff --git a/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx b/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx index 89a6af09..22cb4ba4 100644 --- a/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx @@ -7,6 +7,7 @@ import { DocumentNotary } from "le-coffre-resources/dist/Notary"; import Image from "next/image"; import { NextRouter, useRouter } from "next/router"; import React from "react"; +import { FileBlob } from "@Front/Api/Entities/types"; import BasePage from "../../Base"; import classes from "./classes.module.scss"; @@ -28,7 +29,7 @@ type IState = { isValidateModalVisible: boolean; refuseText: string; selectedFileIndex: number; - selectedFile: any; + selectedFile: { uid: string; file_name: string; file_blob: FileBlob } | null; documentNotary: DocumentNotary | null; fileBlob: Blob | null; isLoading: boolean; @@ -150,7 +151,7 @@ class ViewDocumentsNotaryClass extends BasePage { { documentNotary, selectedFileIndex: 0, - selectedFile: documentNotary.files![0]!, + selectedFile: documentNotary.files![0] as any, isLoading: false, }, () => { diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/FilePreviewModal/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/FilePreviewModal/index.tsx index 65da2374..8a07fe46 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/FilePreviewModal/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/FilePreviewModal/index.tsx @@ -1,8 +1,12 @@ import Modal from "@Front/Components/DesignSystem/Modal"; import React from "react"; +import { FileBlob } from "@Front/Api/Entities/types"; type IProps = { - file: any; + file: { + uid: string; + file_blob: FileBlob; + }; url: string; isOpen: boolean; onClose?: () => void; diff --git a/src/front/Components/Layouts/Folder/ViewDocuments/index.tsx b/src/front/Components/Layouts/Folder/ViewDocuments/index.tsx index dd3f5312..89f6be30 100644 --- a/src/front/Components/Layouts/Folder/ViewDocuments/index.tsx +++ b/src/front/Components/Layouts/Folder/ViewDocuments/index.tsx @@ -19,6 +19,7 @@ import MessageBox from "@Front/Components/Elements/MessageBox"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; +import { FileBlob } from "@Front/Api/Entities/types"; type IProps = {}; type IPropsClass = { @@ -32,7 +33,7 @@ type IState = { isValidateModalVisible: boolean; refuseText: string; selectedFileIndex: number; - selectedFile: any; // File | null; TODO: review + selectedFile: { uid: string; file_name: string; file_blob: FileBlob } | null; validatedPercentage: number; document: Document | null; fileBlob: Blob | null; @@ -237,6 +238,8 @@ class ViewDocumentsClass extends BasePage { private async getFilePreview(): Promise { try { + if (!this.state.selectedFile) return; + const fileBlob: Blob = new Blob([this.state.selectedFile.file_blob.data], { type: this.state.selectedFile.file_blob.type }); this.setState({ fileBlob, @@ -247,7 +250,7 @@ class ViewDocumentsClass extends BasePage { } private downloadFile() { - if (!this.state.fileBlob) return; + if (!this.state.fileBlob || !this.state.selectedFile) return; const url = URL.createObjectURL(this.state.fileBlob); const a = document.createElement('a'); From 095c4efba2c1019e8596ed2cc963f5f845f96a21 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:38:06 +0200 Subject: [PATCH 21/62] Add hashDocument to MessageBus --- src/sdk/MessageBus.ts | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 137d578d..7964a234 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -6,6 +6,7 @@ import EventBus from './EventBus'; import User from './User'; import MapUtils from './MapUtils'; +import { FileBlob } from '../front/Api/Entities/types'; export default class MessageBus { private static instance: MessageBus; @@ -564,6 +565,49 @@ export default class MessageBus { }); } + /** + * Hash a document file using SHA-256 + * @param fileBlob - The file blob to hash + * @returns Promise - The SHA-256 hash of the file + */ + public hashDocument(fileBlob: FileBlob, commitedIn: string): Promise { + return new Promise((resolve: (hash: string) => void, reject: (error: string) => void) => { + this.checkToken().then(() => { + const messageId = `HASH_VALUE_${uuidv4()}`; + + const unsubscribe = EventBus.getInstance().on('VALUE_HASHED', (responseId: string, hash: string) => { + if (responseId !== messageId) { + return; + } + unsubscribe(); + resolve(hash); + }); + + const unsubscribeError = EventBus.getInstance().on('ERROR_VALUE_HASHED', (responseId: string, error: string) => { + if (responseId !== messageId) { + return; + } + unsubscribeError(); + reject(error); + }); + + const user = User.getInstance(); + const accessToken = user.getAccessToken()!; + + const label = 'file_blob'; + + this.sendMessage({ + type: 'HASH_VALUE', + accessToken, + commitedIn, + label, + fileBlob, + messageId + }); + }).catch(reject); + }); + } + private validateToken(): Promise { return new Promise((resolve: (isValid: boolean) => void, reject: (error: string) => void) => { const messageId = `VALIDATE_TOKEN_${uuidv4()}`; @@ -753,6 +797,10 @@ export default class MessageBus { this.doHandleMessage(message.messageId, 'STATE_VALIDATED', message, (message: any) => message.validatedProcess); break; + case 'VALUE_HASHED': // HASH_VALUE + this.doHandleMessage(message.messageId, 'VALUE_HASHED', message, (message: any) => message.hash); + break; + case 'ERROR': console.error('Error:', message); this.errors[message.messageId] = message.error; From a450d806002e39513cc3e8587dee5989f61a072b Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:38:30 +0200 Subject: [PATCH 22/62] Add generateMerkleProof --- src/sdk/MessageBus.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 7964a234..69728549 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -608,6 +608,41 @@ export default class MessageBus { }); } + public generateMerkleProof(processState: any, attributeName: string): Promise { + return new Promise((resolve: (proof: any) => void, reject: (error: string) => void) => { + this.checkToken().then(() => { + const messageId = `GET_MERKLE_PROOF_${uuidv4()}`; + + const unsubscribe = EventBus.getInstance().on('MERKLE_PROOF_RETRIEVED', (responseId: string, proof: any) => { + if (responseId !== messageId) { + return; + } + unsubscribe(); + resolve(proof); + }); + + const unsubscribeError = EventBus.getInstance().on('ERROR_MERKLE_PROOF_RETRIEVED', (responseId: string, error: string) => { + if (responseId !== messageId) { + return; + } + unsubscribeError(); + reject(error); + }); + + const user = User.getInstance(); + const accessToken = user.getAccessToken()!; + + this.sendMessage({ + type: 'GET_MERKLE_PROOF', + accessToken, + processState, + attributeName, + messageId + }); + }).catch(reject); + }); + } + private validateToken(): Promise { return new Promise((resolve: (isValid: boolean) => void, reject: (error: string) => void) => { const messageId = `VALIDATE_TOKEN_${uuidv4()}`; @@ -801,6 +836,10 @@ export default class MessageBus { this.doHandleMessage(message.messageId, 'VALUE_HASHED', message, (message: any) => message.hash); break; + case 'MERKLE_PROOF_RETRIEVED': // GENERATE_MERKLE_PROOF + this.doHandleMessage(message.messageId, 'MERKLE_PROOF_RETRIEVED', message, (message: any) => message.proof); + break; + case 'ERROR': console.error('Error:', message); this.errors[message.messageId] = message.error; From c178b60d51e1c0809285bf129ba78685225945bf Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:38:57 +0200 Subject: [PATCH 23/62] Add merkleProof to CertificateData --- src/front/Services/PdfService/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/front/Services/PdfService/index.ts b/src/front/Services/PdfService/index.ts index 66f2ba2c..62ea9765 100644 --- a/src/front/Services/PdfService/index.ts +++ b/src/front/Services/PdfService/index.ts @@ -21,6 +21,7 @@ export interface Metadata { commitmentId: string, documentUid: string; documentType: string; + merkleProof: string; } export interface CertificateData { From 7bfe3bcad26445852dbf197bd8328555adef14d0 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Mon, 30 Jun 2025 22:39:44 +0200 Subject: [PATCH 24/62] Get merkle proof when generating certificate --- .../ClientView/DocumentTables/index.tsx | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index acafddac..7ac93374 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -24,6 +24,7 @@ import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import PdfService, { CertificateData, Metadata } from "@Front/Services/PdfService"; +import MessageBus from "src/sdk/MessageBus"; type IProps = { customerUid: string; @@ -206,7 +207,8 @@ export default function DocumentTables(props: IProps) { commitmentId: "N/A", createdAt: new Date(), documentUid: "N/A", - documentType: "N/A" + documentType: "N/A", + merkleProof: "N/A" } }; @@ -219,7 +221,7 @@ export default function DocumentTables(props: IProps) { const documentProcesses = await DocumentService.getDocuments(); documentProcesses.filter((process: any) => process.processData.folder.uid === folderUid); - console.log('[DocumentTables] onDownloadCertificate: documentProcesses', documentProcesses); + // console.log('[DocumentTables] onDownloadCertificate: documentProcesses', documentProcesses); for (const document of documentProcesses) { for (const file of document.processData.files) { @@ -227,16 +229,21 @@ export default function DocumentTables(props: IProps) { console.log('[DocumentTables] onDownloadCertificate: fileProcess', res); const hash = res.lastUpdatedFileState.pcd_commitment.file_blob; certificateData.documentHash = hash; - const metadata: Metadata = { - fileName: res.processData.file_name, - isDeleted: false, - updatedAt: new Date(res.processData.updated_at), - commitmentId: res.lastUpdatedFileState.commited_in, - createdAt: new Date(res.processData.created_at), - documentUid: doc.document_type.uid, - documentType: doc.document_type.name - }; - certificateData.metadata = metadata; + + MessageBus.getInstance().generateMerkleProof(res.lastUpdatedFileState, 'file_blob').then((proof) => { + console.log('[DocumentTables] onDownloadCertificate: proof', proof); + const metadata: Metadata = { + fileName: res.processData.file_name, + isDeleted: false, + updatedAt: new Date(res.processData.updated_at), + commitmentId: res.lastUpdatedFileState.commited_in, + createdAt: new Date(res.processData.created_at), + documentUid: doc.document_type.uid, + documentType: doc.document_type.name, + merkleProof: proof + }; + certificateData.metadata = metadata; + }); } )} } From 4f76d43f38ee8eb702c55e74142deb776a4393b4 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 1 Jul 2025 22:33:20 +0200 Subject: [PATCH 25/62] Add watermark when loading documents --- package.json | 1 + .../DepositDocumentComponent/index.tsx | 126 ++++++++--- src/front/Services/WatermarkService/index.ts | 211 ++++++++++++++++++ 3 files changed, 301 insertions(+), 37 deletions(-) create mode 100644 src/front/Services/WatermarkService/index.ts diff --git a/package.json b/package.json index 59175b5f..a663ce2a 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "jwt-decode": "^3.1.2", "le-coffre-resources": "file:../lecoffre-ressources", "next": "^14.2.3", + "pdf-lib": "^1.17.1", "prettier": "^2.8.7", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index 0d69a387..041af337 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -10,6 +10,7 @@ import Confirm from "@Front/Components/DesignSystem/OldModal/Confirm"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import { FileBlob, FileData } from "@Front/Api/Entities/types"; +import WatermarkService from "@Front/Services/WatermarkService"; type IProps = { document: any; @@ -31,50 +32,101 @@ export default function DepositDocumentComponent(props: IProps) { }, [document.files]); const addFile = useCallback( - (file: File) => { - return new Promise( - (resolve: () => void) => { - const reader = new FileReader(); - reader.onload = (event) => { - if (event.target?.result) { - const arrayBuffer = event.target.result as ArrayBuffer; - const uint8Array = new Uint8Array(arrayBuffer); + async (file: File) => { + try { + // Add watermark to the file before processing + const watermarkedFile = await WatermarkService.getInstance().addWatermark(file); + + return new Promise( + (resolve: () => void) => { + const reader = new FileReader(); + reader.onload = (event) => { + if (event.target?.result) { + const arrayBuffer = event.target.result as ArrayBuffer; + const uint8Array = new Uint8Array(arrayBuffer); - const fileBlob: FileBlob = { - type: file.type, - data: uint8Array - }; + const fileBlob: FileBlob = { + type: watermarkedFile.type, + data: uint8Array + }; - const fileData: FileData = { - file_blob: fileBlob, - file_name: file.name - }; - const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; + const fileData: FileData = { + file_blob: fileBlob, + file_name: watermarkedFile.name + }; + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; - FileService.createFile(fileData, validatorId).then((processCreated: any) => { - const fileUid: string = processCreated.processData.uid; + FileService.createFile(fileData, validatorId).then((processCreated: any) => { + const fileUid: string = processCreated.processData.uid; - DocumentService.getDocumentByUid(document.uid!).then((process: any) => { - if (process) { - const document: any = process.processData; + DocumentService.getDocumentByUid(document.uid!).then((process: any) => { + if (process) { + const document: any = process.processData; - let files: any[] = document.files; - if (!files) { - files = []; + let files: any[] = document.files; + if (!files) { + files = []; + } + files.push({ uid: fileUid }); + + DocumentService.updateDocument(process, { files: files, document_status: EDocumentStatus.DEPOSITED }).then(() => resolve()); } - files.push({ uid: fileUid }); - - DocumentService.updateDocument(process, { files: files, document_status: EDocumentStatus.DEPOSITED }).then(() => resolve()); - } + }); }); - }); - } - }; - reader.readAsArrayBuffer(file); - }) - .then(onChange) - .then(() => ToasterService.getInstance().success({ title: "Succès !", description: "Fichier uploadé avec succès!" })) - .catch((error) => ToasterService.getInstance().error({ title: "Erreur !", description: error.message })); + } + }; + reader.readAsArrayBuffer(watermarkedFile); + }) + .then(onChange) + .then(() => ToasterService.getInstance().success({ title: "Succès !", description: "Fichier uploadé avec succès!" })) + .catch((error) => ToasterService.getInstance().error({ title: "Erreur !", description: error.message })); + } catch (error) { + console.error('Error processing file with watermark:', error); + // If watermarking fails, proceed with original file + return new Promise( + (resolve: () => void) => { + const reader = new FileReader(); + reader.onload = (event) => { + if (event.target?.result) { + const arrayBuffer = event.target.result as ArrayBuffer; + const uint8Array = new Uint8Array(arrayBuffer); + + const fileBlob: FileBlob = { + type: file.type, + data: uint8Array + }; + + const fileData: FileData = { + file_blob: fileBlob, + file_name: file.name + }; + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; + + FileService.createFile(fileData, validatorId).then((processCreated: any) => { + const fileUid: string = processCreated.processData.uid; + + DocumentService.getDocumentByUid(document.uid!).then((process: any) => { + if (process) { + const document: any = process.processData; + + let files: any[] = document.files; + if (!files) { + files = []; + } + files.push({ uid: fileUid }); + + DocumentService.updateDocument(process, { files: files, document_status: EDocumentStatus.DEPOSITED }).then(() => resolve()); + } + }); + }); + } + }; + reader.readAsArrayBuffer(file); + }) + .then(onChange) + .then(() => ToasterService.getInstance().success({ title: "Succès !", description: "Fichier uploadé avec succès!" })) + .catch((error) => ToasterService.getInstance().error({ title: "Erreur !", description: error.message })); + } }, [document.uid, onChange], ); diff --git a/src/front/Services/WatermarkService/index.ts b/src/front/Services/WatermarkService/index.ts new file mode 100644 index 00000000..b7dcf66a --- /dev/null +++ b/src/front/Services/WatermarkService/index.ts @@ -0,0 +1,211 @@ +export default class WatermarkService { + private static instance: WatermarkService; + + public static getInstance(): WatermarkService { + if (!WatermarkService.instance) { + WatermarkService.instance = new WatermarkService(); + } + return WatermarkService.instance; + } + + /** + * Add a watermark to a file based on its type + * @param file - The original file + * @returns Promise - The file with watermark added + */ + public async addWatermark(file: File): Promise { + const fileType = file.type; + + try { + if (fileType.startsWith('image/')) { + return await this.addWatermarkToImage(file); + } else if (fileType === 'application/pdf') { + return await this.addWatermarkToPdf(file); + } else { + // For other file types, return the original file + console.log(`Watermark not supported for file type: ${fileType}`); + return file; + } + } catch (error) { + console.error('Error adding watermark:', error); + // Return original file if watermarking fails + return file; + } + } + + /** + * Add watermark to image files + * @param file - Image file + * @returns Promise - Image with watermark + */ + private async addWatermarkToImage(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (event) => { + try { + const img = new Image(); + img.onload = () => { + try { + // Create canvas + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + + if (!ctx) { + reject(new Error('Could not get canvas context')); + return; + } + + // Set canvas size to image size + canvas.width = img.width; + canvas.height = img.height; + + // Draw original image + ctx.drawImage(img, 0, 0); + + // Add watermark + this.addImageWatermark(ctx, img.width, img.height); + + // Convert to blob + canvas.toBlob((blob) => { + if (blob) { + const watermarkedFile = new File([blob], file.name, { type: file.type }); + resolve(watermarkedFile); + } else { + reject(new Error('Could not create blob from canvas')); + } + }, file.type); + } catch (error) { + reject(error); + } + }; + img.onerror = reject; + img.src = event.target?.result as string; + } catch (error) { + reject(error); + } + }; + reader.onerror = reject; + reader.readAsDataURL(file); + }); + } + + /** + * Add watermark to PDF files + * @param file - PDF file + * @returns Promise - PDF with watermark + */ + private async addWatermarkToPdf(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = async (event) => { + try { + const arrayBuffer = event.target?.result as ArrayBuffer; + + // Import pdf-lib dynamically to avoid SSR issues + const { PDFDocument, rgb } = await import('pdf-lib'); + + // Load the existing PDF + const pdfDoc = await PDFDocument.load(arrayBuffer); + + // Get all pages + const pages = pdfDoc.getPages(); + + // Add watermark to each page + for (const page of pages) { + this.addPdfWatermark(page, rgb(0.8, 0.2, 0.2)); // Pale red color + } + + // Save the modified PDF + const pdfBytes = await pdfDoc.save(); + const watermarkedFile = new File([pdfBytes], file.name, { type: file.type }); + resolve(watermarkedFile); + + } catch (error) { + console.error('Error adding watermark to PDF:', error); + // If PDF watermarking fails, return original file + resolve(file); + } + }; + reader.onerror = reject; + reader.readAsArrayBuffer(file); + }); + } + + /** + * Add watermark to image using Canvas + * @param ctx - Canvas 2D context + * @param width - Image width + * @param height - Image height + */ + private addImageWatermark(ctx: CanvasRenderingContext2D, width: number, height: number): void { + // Save current state + ctx.save(); + + // Set watermark properties + ctx.fillStyle = 'rgba(128, 128, 128, 0.7)'; // Semi-transparent gray + ctx.font = '12px Arial'; + ctx.textAlign = 'right'; + ctx.textBaseline = 'bottom'; + + // Position watermark in bottom-right corner + const text = 'Processed by LeCoffre'; + const x = width - 10; // 10 pixels from right edge + const y = height - 10; // 10 pixels from bottom + + // Add watermark text + ctx.fillText(text, x, y); + + // Restore state + ctx.restore(); + } + + /** + * Add watermark to PDF using pdf-lib + * @param page - PDF page from pdf-lib + * @param color - Color for the watermark + */ + private addPdfWatermark(page: any, color: any): void { + const { width, height } = page.getSize(); + + // Calculate watermark position (bottom-right corner) + const text = 'Processed by LeCoffre'; + const dateTime = new Date().toLocaleString('fr-FR', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + + const fontSize = 10; + const lineHeight = 12; // Space between lines + + // Calculate text widths (approximate - pdf-lib doesn't have a direct method for this) + // Using a conservative estimate: ~6 points per character for 10pt font + const estimatedTextWidth1 = text.length * 6; + const estimatedTextWidth2 = dateTime.length * 6; + const maxTextWidth = Math.max(estimatedTextWidth1, estimatedTextWidth2); + + // Position watermark with proper margins (20 points from edges) + const x = width - maxTextWidth - 20; // 20 points from right edge + const y = 20; // 20 points from bottom + + // Add watermark text with transparency (first line) + page.drawText(text, { + x: x, + y: y + lineHeight, // Second line (top) + size: fontSize, + color: color, + opacity: 0.7 + }); + + // Add date/time with transparency (second line) + page.drawText(dateTime, { + x: x, + y: y, // First line (bottom) + size: fontSize, + color: color, + opacity: 0.7 + }); + } +} \ No newline at end of file From d94fd9e017a4bcf7bdbc2beb3ad62286d2021bdf Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 1 Jul 2025 23:26:37 +0200 Subject: [PATCH 26/62] Refactor certificate generation --- .../ClientView/DocumentTables/index.tsx | 58 +- src/front/Services/PdfService/index.ts | 717 ++++++++++++++---- 2 files changed, 599 insertions(+), 176 deletions(-) diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index 7ac93374..925929d7 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -212,40 +212,34 @@ export default function DocumentTables(props: IProps) { } }; - // Fetch folder data to get office/notary information - // const folderProcess = await FolderService.getFolderByUid(folderUid, false, true); - // const folderData = folderProcess?.processData; + // Get the specific document that was clicked + const documentProcess = await DocumentService.getDocumentByUid(doc.uid); + if (!documentProcess) { + throw new Error('Document not found'); + } - // console.log('[DocumentTables] onDownloadCertificate: folderData', folderData); + // Process only the files for this specific document + for (const file of documentProcess.processData.files) { + const fileProcess = await FileService.getFileByUid(file.uid); + console.log('[DocumentTables] onDownloadCertificate: fileProcess', fileProcess); + + const hash = fileProcess.lastUpdatedFileState.pcd_commitment.file_blob; + certificateData.documentHash = hash; - const documentProcesses = await DocumentService.getDocuments(); - documentProcesses.filter((process: any) => process.processData.folder.uid === folderUid); - - // console.log('[DocumentTables] onDownloadCertificate: documentProcesses', documentProcesses); - - for (const document of documentProcesses) { - for (const file of document.processData.files) { - await FileService.getFileByUid(file.uid).then((res: any) => { - console.log('[DocumentTables] onDownloadCertificate: fileProcess', res); - const hash = res.lastUpdatedFileState.pcd_commitment.file_blob; - certificateData.documentHash = hash; - - MessageBus.getInstance().generateMerkleProof(res.lastUpdatedFileState, 'file_blob').then((proof) => { - console.log('[DocumentTables] onDownloadCertificate: proof', proof); - const metadata: Metadata = { - fileName: res.processData.file_name, - isDeleted: false, - updatedAt: new Date(res.processData.updated_at), - commitmentId: res.lastUpdatedFileState.commited_in, - createdAt: new Date(res.processData.created_at), - documentUid: doc.document_type.uid, - documentType: doc.document_type.name, - merkleProof: proof - }; - certificateData.metadata = metadata; - }); - } - )} + const proof = await MessageBus.getInstance().generateMerkleProof(fileProcess.lastUpdatedFileState, 'file_blob'); + console.log('[DocumentTables] onDownloadCertificate: proof', proof); + + const metadata: Metadata = { + fileName: fileProcess.processData.file_name, + isDeleted: false, + updatedAt: new Date(fileProcess.processData.updated_at), + commitmentId: fileProcess.lastUpdatedFileState.commited_in, + createdAt: new Date(fileProcess.processData.created_at), + documentUid: doc.uid, + documentType: doc.document_type.name, + merkleProof: proof + }; + certificateData.metadata = metadata; } console.log('[DocumentTables] onDownloadCertificate: certificateData', certificateData); diff --git a/src/front/Services/PdfService/index.ts b/src/front/Services/PdfService/index.ts index 62ea9765..1b2e7af5 100644 --- a/src/front/Services/PdfService/index.ts +++ b/src/front/Services/PdfService/index.ts @@ -1,5 +1,5 @@ import { saveAs } from 'file-saver'; -import jsPDF from 'jspdf'; +import { PDFDocument, rgb, StandardFonts } from 'pdf-lib'; export interface CustomerInfo { firstName: string; @@ -49,92 +49,218 @@ export default class PdfService { */ public async generateCertificate(certificateData: CertificateData): Promise { try { - const doc = new jsPDF(); - + const pdfDoc = await PDFDocument.create(); + const page = pdfDoc.addPage([595, 842]); // A4 size + const { width, height } = page.getSize(); + + const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica); + const helveticaBoldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + const helveticaObliqueFont = await pdfDoc.embedFont(StandardFonts.HelveticaOblique); + + let y = height - 40; // Start 40pt from the top + const leftMargin = 20; + const rightSectionX = 320; + const lineSpacing = 16; + // Notary Information Section (Top Left) - doc.setFontSize(12); - doc.setFont('helvetica', 'bold'); - doc.text('Notaire Validateur:', 20, 30); - doc.setFont('helvetica', 'normal'); - doc.text(certificateData.notary.name, 20, 37); - + page.drawText('Notaire Validateur:', { + x: leftMargin, + y: y, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(certificateData.notary.name, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + // Customer Information Section (Top Right) - doc.setFont('helvetica', 'bold'); - doc.text('Fournisseur de Document:', 120, 30); - doc.setFont('helvetica', 'normal'); - doc.text(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, 120, 37); - doc.text(certificateData.customer.email, 120, 44); - doc.text(certificateData.customer.postalAddress, 120, 51); - + let yRight = height - 40; + page.drawText('Fournisseur de Document:', { + x: rightSectionX, + y: yRight, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + yRight -= lineSpacing; + page.drawText(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, { + x: rightSectionX, + y: yRight, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yRight -= lineSpacing; + page.drawText(certificateData.customer.email, { + x: rightSectionX, + y: yRight, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yRight -= lineSpacing; + page.drawText(certificateData.customer.postalAddress, { + x: rightSectionX, + y: yRight, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + // Centered Title - doc.setFontSize(20); - doc.setFont('helvetica', 'bold'); - doc.text('Certificat de Validation de Document', 105, 80, { align: 'center' }); - + y -= 4 * lineSpacing; // Add more space between header and title + const titleText = 'Certificat de Validation de Document'; + const titleWidth = helveticaBoldFont.widthOfTextAtSize(titleText, 20); + page.drawText(titleText, { + x: (width - titleWidth) / 2, + y: y, + size: 20, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + // Add a line separator - doc.setLineWidth(0.5); - doc.line(20, 90, 190, 90); - - // Reset font for content - doc.setFontSize(12); - doc.setFont('helvetica', 'normal'); - - let yPosition = 110; - + page.drawLine({ + start: { x: leftMargin, y: y }, + end: { x: width - leftMargin, y: y }, + thickness: 0.5, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + // Document Information Section - doc.setFont('helvetica', 'bold'); - doc.text('Informations du Document', 20, yPosition); - yPosition += 10; - - doc.setFont('helvetica', 'normal'); - doc.text(`UID du Document: ${certificateData.metadata.documentUid}`, 20, yPosition); - yPosition += 7; - doc.text(`Type de Document: ${certificateData.metadata.documentType}`, 20, yPosition); - yPosition += 7; - doc.text(`UID du Dossier: ${certificateData.folderUid}`, 20, yPosition); - yPosition += 7; - doc.text(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, 20, yPosition); - yPosition += 7; - doc.text(`Nom du fichier: ${certificateData.metadata.fileName}`, 20, yPosition); - yPosition += 7; - doc.text(`ID de transaction: ${certificateData.metadata.commitmentId}`, 20, yPosition); - yPosition += 7; - doc.text(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, 20, yPosition); - yPosition += 7; - doc.text(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, 20, yPosition); - yPosition += 15; - + page.drawText('Informations du Document', { + x: leftMargin, + y: y, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(`UID du Dossier: ${certificateData.folderUid}`, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(`Type de Document: ${certificateData.metadata.documentType}`, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(`Nom du fichier: ${certificateData.metadata.fileName}`, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + page.drawText(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, { + x: leftMargin, + y: y, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + // Document Hash Section - doc.setFont('helvetica', 'bold'); - doc.text('Intégrité du Document', 20, yPosition); - yPosition += 10; + page.drawText('Intégrité du Document', { + x: leftMargin, + y: y, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + y -= lineSpacing; + + // Add verification data as base64 + const verificationData = { + documentHash: certificateData.documentHash, + commitmentId: certificateData.metadata.commitmentId, + merkleProof: certificateData.metadata.merkleProof || "N/A" + }; + const verificationDataBase64 = btoa(JSON.stringify(verificationData)); - doc.setFont('helvetica', 'normal'); - doc.text(`Hash SHA256 du Document:`, 20, yPosition); - yPosition += 7; + // Calculate proper chunk size based on available width and font size + const availableWidth = width - (2 * leftMargin) - 20; // Full width minus margins and safety buffer + const fontSize = 12; + // Use a typical base64 character for width calculation + const avgCharWidth = helveticaFont.widthOfTextAtSize('A', fontSize); + const charsPerLine = Math.floor(availableWidth / avgCharWidth); + const chunkSize = Math.max(60, Math.min(100, charsPerLine)); // More conservative limits - // Split hash into multiple lines if needed - const hash = certificateData.documentHash; - const maxWidth = 170; // Available width for text - const hashLines = this.splitTextToFit(doc, hash, maxWidth); - - for (const line of hashLines) { - doc.text(line, 25, yPosition); - yPosition += 7; + const chunks = []; + for (let j = 0; j < verificationDataBase64.length; j += chunkSize) { + chunks.push(verificationDataBase64.slice(j, j + chunkSize)); } - yPosition += 8; // Extra space after hash - + chunks.forEach((chunk, index) => { + page.drawText(chunk, { + x: leftMargin, + y: y - (index * 12), // Increased line spacing + size: fontSize, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + }); + + // Add explanatory text about certificate usage + y -= (chunks.length * 12) + 40; // Space after verification data + const explanatoryText = "Ce certificat doit être utilisé avec le document qu'il certifie pour être vérifié sur la page dédiée. Le document correspondant à ce certificat doit être téléchargé depuis LeCoffre et peut être conservé avec le certificat tant qu'il n'est pas modifié."; + const explanatoryLines = this.splitTextToFit(helveticaObliqueFont, explanatoryText, width - (2 * leftMargin), 11); + explanatoryLines.forEach((line, index) => { + page.drawText(line, { + x: leftMargin, + y: y - (index * 14), // Slightly more spacing for readability + size: 11, + font: helveticaObliqueFont, + color: rgb(0.3, 0.3, 0.3) // Slightly grayed out to distinguish from main content + }); + }); + // Footer - const pageCount = doc.getNumberOfPages(); - for (let i = 1; i <= pageCount; i++) { - doc.setPage(i); - doc.setFontSize(10); - doc.setFont('helvetica', 'italic'); - doc.text(`Page ${i} sur ${pageCount}`, 105, 280, { align: 'center' }); - doc.text(`Généré le ${new Date().toLocaleString('fr-FR')}`, 105, 285, { align: 'center' }); - } - - return doc.output('blob'); + const footerText1 = `Page 1 sur 1`; + const footerText2 = `Généré le ${new Date().toLocaleString('fr-FR')}`; + const footerWidth1 = helveticaObliqueFont.widthOfTextAtSize(footerText1, 10); + const footerWidth2 = helveticaObliqueFont.widthOfTextAtSize(footerText2, 10); + page.drawText(footerText1, { + x: (width - footerWidth1) / 2, + y: 35, + size: 10, + font: helveticaObliqueFont, + color: rgb(0, 0, 0) + }); + page.drawText(footerText2, { + x: (width - footerWidth2) / 2, + y: 25, + size: 10, + font: helveticaObliqueFont, + color: rgb(0, 0, 0) + }); + + const pdfBytes = await pdfDoc.save(); + return new Blob([pdfBytes], { type: 'application/pdf' }); } catch (error) { console.error('Error generating certificate:', error); throw new Error('Failed to generate certificate'); @@ -143,21 +269,22 @@ export default class PdfService { /** * Split text to fit within a specified width - * @param doc - jsPDF document instance + * @param font - PDF font instance * @param text - Text to split * @param maxWidth - Maximum width in points + * @param fontSize - Font size * @returns Array of text lines */ - private splitTextToFit(doc: jsPDF, text: string, maxWidth: number): string[] { + private splitTextToFit(font: any, text: string, maxWidth: number, fontSize: number): string[] { const lines: string[] = []; let currentLine = ''; - // Split by words first - const words = text.split(''); + // Split by characters (pdf-lib doesn't have word-level text measurement) + const chars = text.split(''); - for (const char of words) { + for (const char of chars) { const testLine = currentLine + char; - const testWidth = doc.getTextWidth(testLine); + const testWidth = font.widthOfTextAtSize(testLine, fontSize); if (testWidth <= maxWidth) { currentLine = testLine; @@ -202,92 +329,257 @@ export default class PdfService { */ public async generateNotaryCertificate(certificateData: CertificateData): Promise { try { - const doc = new jsPDF(); + // Create a new PDF document + const pdfDoc = await PDFDocument.create(); + const page = pdfDoc.addPage([595, 842]); // A4 size + const { width, height } = page.getSize(); + + // Embed the standard font + const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica); + const helveticaBoldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + const helveticaObliqueFont = await pdfDoc.embedFont(StandardFonts.HelveticaOblique); // Notary Information Section (Top Left) - doc.setFontSize(12); - doc.setFont('helvetica', 'bold'); - doc.text('Notaire Validateur:', 20, 30); - doc.setFont('helvetica', 'normal'); - doc.text(certificateData.notary.name, 20, 37); + page.drawText('Notaire Validateur:', { + x: 20, + y: height - 30, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + + page.drawText(certificateData.notary.name, { + x: 20, + y: height - 37, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); // Customer Information Section (Top Right) - doc.setFont('helvetica', 'bold'); - doc.text('Fournisseur de Document:', 120, 30); - doc.setFont('helvetica', 'normal'); - doc.text(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, 120, 37); - doc.text(certificateData.customer.email, 120, 44); - doc.text(certificateData.customer.postalAddress, 120, 51); + page.drawText('Fournisseur de Document:', { + x: 120, + y: height - 30, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + + page.drawText(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, { + x: 120, + y: height - 37, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + + page.drawText(certificateData.customer.email, { + x: 120, + y: height - 44, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + + page.drawText(certificateData.customer.postalAddress, { + x: 120, + y: height - 51, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); // Centered Title - doc.setFontSize(20); - doc.setFont('helvetica', 'bold'); - doc.text('Certificat Notarial de Validation de Document', 105, 80, { align: 'center' }); + const titleText = 'Certificat Notarial de Validation de Document'; + const titleWidth = helveticaBoldFont.widthOfTextAtSize(titleText, 20); + page.drawText(titleText, { + x: (width - titleWidth) / 2, + y: height - 80, + size: 20, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); // Add a line separator - doc.setLineWidth(0.5); - doc.line(20, 90, 190, 90); + page.drawLine({ + start: { x: 20, y: height - 90 }, + end: { x: width - 20, y: height - 90 }, + thickness: 0.5, + color: rgb(0, 0, 0) + }); - // Reset font for content - doc.setFontSize(12); - doc.setFont('helvetica', 'normal'); - - let yPosition = 110; + let yPosition = height - 110; // Document Information Section - doc.setFont('helvetica', 'bold'); - doc.text('Informations du Document', 20, yPosition); - yPosition += 10; + page.drawText('Informations du Document', { + x: 20, + y: yPosition, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + yPosition -= 10; - doc.setFont('helvetica', 'normal'); - doc.text(`Identifiant du Document: ${certificateData.metadata.documentUid}`, 20, yPosition); - yPosition += 7; - doc.text(`Type de Document: ${certificateData.metadata.documentType}`, 20, yPosition); - yPosition += 7; - doc.text(`Numéro de dossier: ${certificateData.folderUid}`, 20, yPosition); - yPosition += 7; - doc.text(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, 20, yPosition); - yPosition += 7; - doc.text(`Nom du fichier: ${certificateData.metadata.fileName}`, 20, yPosition); - yPosition += 7; - doc.text(`ID de transaction: ${certificateData.metadata.commitmentId}`, 20, yPosition); - yPosition += 7; - doc.text(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, 20, yPosition); - yPosition += 7; - doc.text(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, 20, yPosition); - yPosition += 15; + page.drawText(`Identifiant du Document: ${certificateData.metadata.documentUid}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Type de Document: ${certificateData.metadata.documentType}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Numéro de dossier: ${certificateData.folderUid}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Nom du fichier: ${certificateData.metadata.fileName}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`ID de transaction: ${certificateData.metadata.commitmentId}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; + + page.drawText(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 15; // Document Hash Section - doc.setFont('helvetica', 'bold'); - doc.text('Intégrité du Document', 20, yPosition); - yPosition += 10; + page.drawText('Intégrité du Document', { + x: 20, + y: yPosition, + size: 12, + font: helveticaBoldFont, + color: rgb(0, 0, 0) + }); + yPosition -= 10; - doc.setFont('helvetica', 'normal'); - doc.text(`Hash SHA256 du Document:`, 20, yPosition); - yPosition += 7; + page.drawText(`Hash SHA256 du Document:`, { + x: 20, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; // Split hash into multiple lines if needed const hash = certificateData.documentHash; const maxWidth = 170; // Available width for text - const hashLines = this.splitTextToFit(doc, hash, maxWidth); + const hashLines = this.splitTextToFit(helveticaFont, hash, maxWidth, 12); for (const line of hashLines) { - doc.text(line, 25, yPosition); - yPosition += 7; + page.drawText(line, { + x: 25, + y: yPosition, + size: 12, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + yPosition -= 7; } - yPosition += 8; // Extra space after hash + yPosition -= 8; // Extra space after hash + + yPosition -= 5; // Footer - const pageCount = doc.getNumberOfPages(); - for (let i = 1; i <= pageCount; i++) { - doc.setPage(i); - doc.setFontSize(10); - doc.setFont('helvetica', 'italic'); - doc.text(`Page ${i} sur ${pageCount}`, 105, 280, { align: 'center' }); - doc.text(`Certificat Notarial - Généré le ${new Date().toLocaleString('fr-FR')}`, 105, 285, { align: 'center' }); + const footerText1 = `Page 1 sur 1`; + const footerText2 = `Certificat Notarial - Généré le ${new Date().toLocaleString('fr-FR')}`; + const footerWidth1 = helveticaObliqueFont.widthOfTextAtSize(footerText1, 10); + const footerWidth2 = helveticaObliqueFont.widthOfTextAtSize(footerText2, 10); + + page.drawText(footerText1, { + x: (width - footerWidth1) / 2, + y: 30, + size: 10, + font: helveticaObliqueFont, + color: rgb(0, 0, 0) + }); + + page.drawText(footerText2, { + x: (width - footerWidth2) / 2, + y: 25, + size: 10, + font: helveticaObliqueFont, + color: rgb(0, 0, 0) + }); + + // Add verification data as base64 in small font + const verificationData = { + documentHash: certificateData.documentHash, + commitmentId: certificateData.metadata.commitmentId, + merkleProof: certificateData.metadata.merkleProof || "N/A" + }; + const verificationDataBase64 = btoa(JSON.stringify(verificationData)); + + // Split into chunks if too long + const chunkSize = 80; + const chunks = []; + for (let j = 0; j < verificationDataBase64.length; j += chunkSize) { + chunks.push(verificationDataBase64.slice(j, j + chunkSize)); } - return doc.output('blob'); + chunks.forEach((chunk, index) => { + page.drawText(chunk, { + x: 20, + y: 15 - (index * 3), + size: 6, + font: helveticaFont, + color: rgb(0, 0, 0) + }); + }); + + // Save the PDF + const pdfBytes = await pdfDoc.save(); + return new Blob([pdfBytes], { type: 'application/pdf' }); } catch (error) { console.error('Error generating notary certificate:', error); throw new Error('Failed to generate notary certificate'); @@ -309,4 +601,141 @@ export default class PdfService { throw error; } } -} \ No newline at end of file + + /** + * Parse a PDF certificate and extract document information + * @param pdfBlob - The PDF file as a blob + * @returns Promise<{documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string}> - Extracted information + */ + public async parseCertificate(pdfBlob: Blob): Promise<{documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string}> { + return new Promise((resolve, reject) => { + const fileReader = new FileReader(); + + fileReader.onload = async () => { + try { + // Convert PDF to text using browser's PDF capabilities + const arrayBuffer = fileReader.result as ArrayBuffer; + const pdfData = new Uint8Array(arrayBuffer); + console.log("PDF data:", pdfData); + + // Use a simple text extraction approach + // This is a basic implementation - for production, consider using pdfjs-dist + const text = await this.extractTextFromPdf(pdfData); + + // Parse the extracted text to find our certificate data + const parsedData = this.parseCertificateText(text); + + if (!parsedData.documentHash) { + throw new Error('Document hash not found in certificate'); + } + + resolve(parsedData); + } catch (error) { + reject(error); + } + }; + + fileReader.onerror = () => { + reject(new Error('Failed to read PDF file')); + }; + + fileReader.readAsArrayBuffer(pdfBlob); + }); + } + + /** + * Extract text from PDF using browser capabilities + * @param pdfData - PDF data as Uint8Array + * @returns Promise - Extracted text + */ + private async extractTextFromPdf(pdfData: Uint8Array): Promise { + console.log("extractTextFromPdf"); + + // Convert PDF data to string to search for base64 patterns + const pdfString = new TextDecoder('utf-8').decode(pdfData); + + // Look for base64 patterns in the PDF content + // This is a simple approach that should work for our embedded data + const base64Matches = pdfString.match(/([A-Za-z0-9+/]{80,}={0,2})/g); + + if (base64Matches && base64Matches.length > 0) { + console.log('Found base64 patterns in PDF:', base64Matches.length); + // Return the longest base64 string (most likely our verification data) + const longestBase64 = base64Matches.reduce((a, b) => a.length > b.length ? a : b); + return longestBase64; + } + + // If no base64 found, return empty string + console.log('No base64 patterns found in PDF'); + return ''; + } + + /** + * Parse certificate text to extract specific fields + * @param text - Extracted text from PDF (could be base64 or regular text) + * @returns Parsed certificate data + */ + private parseCertificateText(text: string): {documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string} { + const result = { + documentHash: '', + documentUid: '', + commitmentId: '', + merkleProof: undefined as string | undefined + }; + + // Check if the text is a base64 string (our new format) + if (text.match(/^[A-Za-z0-9+/]+={0,2}$/)) { + try { + console.log('Attempting to decode base64 data:', text.substring(0, 50) + '...'); + const decodedData = atob(text); + const verificationData = JSON.parse(decodedData); + + console.log('Successfully decoded verification data:', verificationData); + + if (verificationData.documentHash) { + result.documentHash = verificationData.documentHash; + } + if (verificationData.commitmentId) { + result.commitmentId = verificationData.commitmentId; + } + if (verificationData.merkleProof && verificationData.merkleProof !== "N/A") { + result.merkleProof = verificationData.merkleProof; + } + + // If we successfully extracted data from base64, return early + if (result.documentHash) { + return result; + } + } catch (error) { + console.log('Failed to decode base64 data:', error); + } + } + + // Fallback to text parsing for older certificates + // Extract document hash (64 character hex string) + const hashMatch = text.match(/Hash SHA256 du Document:\s*([a-fA-F0-9]{64})/); + if (hashMatch && hashMatch[1]) { + result.documentHash = hashMatch[1]; + } + + // Extract document UID + const uidMatch = text.match(/UID du Document:\s*([^\n\r]+)/); + if (uidMatch && uidMatch[1]) { + result.documentUid = uidMatch[1].trim(); + } + + // Extract commitment ID + const commitmentMatch = text.match(/ID de transaction:\s*([^\n\r]+)/); + if (commitmentMatch && commitmentMatch[1]) { + result.commitmentId = commitmentMatch[1].trim(); + } + + // Extract merkle proof + const merkleProofMatch = text.match(/Preuve Merkle \(Blockchain\):\s*([^\n\r]+)/); + if (merkleProofMatch && merkleProofMatch[1]) { + result.merkleProof = merkleProofMatch[1].trim(); + } + + return result; + } +} From 56fe4fbcd3240e58f230b87d36a1a3308851c36b Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 3 Jul 2025 18:00:18 +0200 Subject: [PATCH 27/62] Add document verification page --- .../DocumentVerification/classes.module.scss | 171 ++++++++++++ .../Folder/DocumentVerification/index.tsx | 260 ++++++++++++++++++ .../InformationSection/index.tsx | 36 ++- src/front/Config/Module/development.json | 7 + src/front/Config/Module/preprod.json | 7 + src/front/Config/Module/production.json | 7 + src/front/Config/Module/staging.json | 7 + .../folders/[folderUid]/verify-documents.tsx | 20 ++ 8 files changed, 512 insertions(+), 3 deletions(-) create mode 100644 src/front/Components/Layouts/Folder/DocumentVerification/classes.module.scss create mode 100644 src/front/Components/Layouts/Folder/DocumentVerification/index.tsx create mode 100644 src/pages/folders/[folderUid]/verify-documents.tsx diff --git a/src/front/Components/Layouts/Folder/DocumentVerification/classes.module.scss b/src/front/Components/Layouts/Folder/DocumentVerification/classes.module.scss new file mode 100644 index 00000000..c99b4817 --- /dev/null +++ b/src/front/Components/Layouts/Folder/DocumentVerification/classes.module.scss @@ -0,0 +1,171 @@ +@import "@Themes/constants.scss"; + +.root { + display: flex; + flex-direction: column; + gap: var(--spacing-2xl, 40px); + max-width: 800px; + margin: 0 auto; + padding: var(--spacing-xl, 32px); + + .header { + display: flex; + flex-direction: column; + gap: var(--spacing-md, 16px); + text-align: center; + } + + .content { + display: flex; + flex-direction: column; + gap: var(--spacing-2xl, 40px); + + .drag-drop-container { + display: flex; + flex-direction: column; + gap: var(--spacing-xl, 32px); + + @media (min-width: $screen-m) { + flex-direction: row; + gap: var(--spacing-lg, 24px); + } + + .drag-drop-box { + flex: 1; + min-height: 200px; + display: flex; + flex-direction: column; + gap: var(--spacing-sm, 8px); + + // Force the DragAndDrop component to take full width and height + > div { + width: 100% !important; + height: 100% !important; + min-height: 200px !important; + display: flex !important; + flex-direction: column !important; + + // Override the fit-content width from DragAndDrop + &.root { + width: 100% !important; + height: 100% !important; + min-height: 200px !important; + } + } + + .file-info { + padding: var(--spacing-sm, 8px) var(--spacing-md, 16px); + background-color: var(--color-success-50, #f0f9ff); + border: 1px solid var(--color-success-200, #bae6fd); + border-radius: var(--radius-md, 8px); + margin-top: var(--spacing-sm, 8px); + } + } + } + + .warning { + text-align: center; + padding: var(--spacing-md, 16px); + background-color: var(--color-warning-50, #fffbeb); + border: 1px solid var(--color-warning-200, #fde68a); + border-radius: var(--radius-md, 8px); + } + + .verification-result { + text-align: center; + padding: var(--spacing-lg, 24px); + border-radius: var(--radius-md, 8px); + border: 2px solid; + display: flex; + flex-direction: column; + gap: var(--spacing-md, 16px); + + &.success { + background-color: var(--color-success-50, #f0fdf4); + border-color: var(--color-success-200, #bbf7d0); + } + + &.error { + background-color: var(--color-error-50, #fef2f2); + border-color: var(--color-error-200, #fecaca); + } + + .verification-details { + background-color: rgba(0, 0, 0, 0.05); + padding: var(--spacing-md, 16px); + border-radius: var(--radius-sm, 4px); + font-family: monospace; + white-space: pre-line; + text-align: left; + max-width: 100%; + overflow-x: auto; + } + + .merkle-proof-section { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-md, 16px); + padding: var(--spacing-lg, 24px); + background-color: rgba(0, 0, 0, 0.02); + border-radius: var(--radius-md, 8px); + border: 1px solid rgba(0, 0, 0, 0.1); + } + } + + .qr-container { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-sm, 8px); + + .qr-code { + width: 150px; + height: 150px; + border: 2px solid var(--color-neutral-200, #e5e7eb); + border-radius: var(--radius-sm, 4px); + padding: var(--spacing-sm, 8px); + background-color: white; + } + + .qr-description { + text-align: center; + max-width: 200px; + } + } + + .qr-loading { + display: flex; + justify-content: center; + align-items: center; + width: 150px; + height: 150px; + border: 2px dashed var(--color-neutral-300, #d1d5db); + border-radius: var(--radius-sm, 4px); + background-color: var(--color-neutral-50, #f9fafb); + } + + .qr-error { + display: flex; + justify-content: center; + align-items: center; + width: 150px; + height: 150px; + border: 2px solid var(--color-error-200, #fecaca); + border-radius: var(--radius-sm, 4px); + background-color: var(--color-error-50, #fef2f2); + } + + .actions { + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--spacing-lg, 24px); + + @media (max-width: $screen-s) { + flex-direction: column; + gap: var(--spacing-md, 16px); + } + } + } +} \ No newline at end of file diff --git a/src/front/Components/Layouts/Folder/DocumentVerification/index.tsx b/src/front/Components/Layouts/Folder/DocumentVerification/index.tsx new file mode 100644 index 00000000..2c1bdad6 --- /dev/null +++ b/src/front/Components/Layouts/Folder/DocumentVerification/index.tsx @@ -0,0 +1,260 @@ +import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button"; +import DragAndDrop from "@Front/Components/DesignSystem/DragAndDrop"; +import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; +import Module from "@Front/Config/Module"; +import PdfService from "@Front/Services/PdfService"; +import { FileBlob } from "@Front/Api/Entities/types"; +import { ShieldCheckIcon } from "@heroicons/react/24/outline"; +import { useRouter } from "next/router"; +import React, { useState } from "react"; +import MessageBus from "src/sdk/MessageBus"; + +import classes from "./classes.module.scss"; +import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; +import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; + +type IProps = { + folderUid: string; +}; + +/** + * Convert a File object to FileBlob + * @param file - The File object to convert + * @returns Promise - The converted FileBlob + */ +const convertFileToFileBlob = async (file: File): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + const arrayBuffer = reader.result as ArrayBuffer; + const uint8Array = new Uint8Array(arrayBuffer); + resolve({ + type: file.type, + data: uint8Array + }); + }; + reader.onerror = () => reject(new Error('Failed to read file')); + reader.readAsArrayBuffer(file); + }); +}; + + + +export default function DocumentVerification(props: IProps) { + const { folderUid } = props; + const router = useRouter(); + + const [documentToVerify, setDocumentToVerify] = useState(null); + const [validationCertificate, setValidationCertificate] = useState(null); + const [isVerifying, setIsVerifying] = useState(false); + const [verificationResult, setVerificationResult] = useState<{ + success: boolean; + message: string; + details?: string; + merkleProof?: string; + } | null>(null); + + const handleDocumentToVerifyChange = (files: File[]) => { + if (files.length > 0 && files[0]) { + setDocumentToVerify(files[0]); + } else { + setDocumentToVerify(null); + } + }; + + const handleValidationCertificateChange = (files: File[]) => { + if (files.length > 0 && files[0]) { + setValidationCertificate(files[0]); + } else { + setValidationCertificate(null); + } + }; + + const handleVerifyDocuments = async () => { + if (!documentToVerify || !validationCertificate) { + console.error("Both documents are required for verification"); + return; + } + + setIsVerifying(true); + setVerificationResult(null); + + const messageBus = MessageBus.getInstance(); + + try { + // Here the things we need to verify: + // - we can produce the same hash from the document provided than what is in the validation certificate + // - the merkle proof is valid with that hash + // - the root of the merkle tree is a state id from a commited state in the process + // - that process is a file process linked to the right folder + // Step 1: Parse the validation certificate + const validationData = await PdfService.getInstance().parseCertificate(validationCertificate); + + // Step 2: Convert File to FileBlob and hash the document using MessageBus + const fileBlob = await convertFileToFileBlob(documentToVerify); + + await messageBus.isReady(); + const documentHash = await messageBus.hashDocument(fileBlob, validationData.commitmentId); + + // Step 3: Compare hashes + const hashesMatch = documentHash.toLowerCase() === validationData.documentHash.toLowerCase(); + + if (!hashesMatch) { + throw new Error('Hash du document invalide, le document fourni n\'est pas celui qui a été certifié'); + } + + // Step 4: Verify the merkle proof + const merkleProof = validationData.merkleProof; + const merkleProofValid = await messageBus.verifyMerkleProof(merkleProof, documentHash); + + if (!merkleProofValid) { + throw new Error('Preuve de Merkle invalide, le document n\'a pas été certifié là où le certificat le prétend'); + } + + // Step 5: Verify that this file process depends on the right folder process + // First pin all the validated documents related to the folder + const documentProcesses = await DocumentService.getDocuments(); + + const documents = documentProcesses.filter((process: any) => + process.processData.document_status === "VALIDATED" && + process.processData.folder.uid === folderUid + ); + + if (!documents || documents.length === 0) { + throw new Error(`Aucune demande de document trouvé pour le dossier ${folderUid}`); + } + + // Step 6: verify that the merkle proof match the last commited state for the file process + const stateId = JSON.parse(validationData.merkleProof)['root']; + + let stateIdExists = false; + for (const doc of documents) { + const processData = doc.processData; + + for (const file of processData.files) { + const fileUid = file.uid; + const fileProcess = await FileService.getFileByUid(fileUid); + const lastUpdatedStateId = fileProcess.lastUpdatedFileState.state_id; + + stateIdExists = lastUpdatedStateId === stateId; // we assume that last state is the validated document, that seems reasonable + if (stateIdExists) break; + } + + if (stateIdExists) break; + } + + if (!stateIdExists) { + throw new Error('La preuve fournie ne correspond à aucun document demandé pour ce dossier.'); + } + + setVerificationResult({ + success: true, + message: "✅ Vérification réussie ! Le document est authentique et intègre.", + }); + } catch (error) { + console.error("Verification failed:", error); + setVerificationResult({ + success: false, + message: `❌ Erreur lors de la vérification: ${error}`, + }); + } finally { + setIsVerifying(false); + } + }; + + const handleBackToFolder = () => { + const folderPath = Module.getInstance() + .get() + .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid); + router.push(folderPath); + }; + + const bothDocumentsPresent = documentToVerify && validationCertificate; + + return ( +
+
+ + Vérification de Documents + + + Vérifiez l'intégrité et l'authenticité de vos documents + +
+ +
+
+
+ + {documentToVerify && ( +
+ + ✓ {documentToVerify.name} + +
+ )} +
+ +
+ + {validationCertificate && ( +
+ + ✓ {validationCertificate.name} + +
+ )} +
+
+ + {!bothDocumentsPresent && ( +
+ + ⚠️ Veuillez sélectionner les deux documents pour procéder à la vérification + +
+ )} + + {verificationResult && ( +
+ + {verificationResult.message} + +
+ )} + +
+ + + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/front/Components/Layouts/Folder/FolderInformation/InformationSection/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/InformationSection/index.tsx index 6dff266c..ba604883 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/InformationSection/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/InformationSection/index.tsx @@ -5,11 +5,12 @@ import { IItem } from "@Front/Components/DesignSystem/Menu/MenuItem"; import Tag, { ETagColor } from "@Front/Components/DesignSystem/Tag"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import Module from "@Front/Config/Module"; -import { ArchiveBoxIcon, EllipsisHorizontalIcon, PaperAirplaneIcon, PencilSquareIcon, UsersIcon } from "@heroicons/react/24/outline"; +import { ArchiveBoxIcon, EllipsisHorizontalIcon, PaperAirplaneIcon, PencilSquareIcon, ShieldCheckIcon, UsersIcon } from "@heroicons/react/24/outline"; import classNames from "classnames"; import { OfficeFolder } from "le-coffre-resources/dist/Notary"; import Link from "next/link"; import { useMemo } from "react"; +import { useRouter } from "next/router"; import { AnchorStatus } from ".."; import classes from "./classes.module.scss"; @@ -24,6 +25,7 @@ type IProps = { export default function InformationSection(props: IProps) { const { folder, progress, onArchive, anchorStatus, isArchived } = props; + const router = useRouter(); const menuItemsDekstop = useMemo(() => { let elements: IItem[] = []; @@ -43,6 +45,17 @@ export default function InformationSection(props: IProps) { link: Module.getInstance() .get() .modules.pages.Folder.pages.EditInformations.props.path.replace("[folderUid]", folder?.uid ?? ""), + hasSeparator: true, + }; + const verifyDocumentElement = { + icon: , + text: "Vérifier le document", + onClick: () => { + const verifyPath = Module.getInstance() + .get() + .modules.pages.Folder.pages.VerifyDocuments.props.path.replace("[folderUid]", folder?.uid ?? ""); + router.push(verifyPath); + }, hasSeparator: false, }; @@ -52,8 +65,11 @@ export default function InformationSection(props: IProps) { elements.push(modifyInformationsElement); } + // Add verify document option + elements.push(verifyDocumentElement); + return elements; - }, [anchorStatus, folder?.uid]); + }, [anchorStatus, folder?.uid, router]); const menuItemsMobile = useMemo(() => { let elements: IItem[] = []; @@ -75,6 +91,17 @@ export default function InformationSection(props: IProps) { .modules.pages.Folder.pages.EditInformations.props.path.replace("[folderUid]", folder?.uid ?? ""), hasSeparator: true, }; + const verifyDocumentElement = { + icon: , + text: "Vérifier le document", + onClick: () => { + const verifyPath = Module.getInstance() + .get() + .modules.pages.Folder.pages.VerifyDocuments.props.path.replace("[folderUid]", folder?.uid ?? ""); + router.push(verifyPath); + }, + hasSeparator: true, + }; // If the folder is not anchored, we can modify the collaborators and the informations if (anchorStatus === AnchorStatus.NOT_ANCHORED) { @@ -82,6 +109,9 @@ export default function InformationSection(props: IProps) { elements.push(modifyInformationsElement); } + // Add verify document option + elements.push(verifyDocumentElement); + elements.push({ icon: , text: "Envoyer des documents", @@ -101,7 +131,7 @@ export default function InformationSection(props: IProps) { } return elements; - }, [anchorStatus, folder?.uid, isArchived, onArchive]); + }, [anchorStatus, folder?.uid, isArchived, onArchive, router]); return (
diff --git a/src/front/Config/Module/development.json b/src/front/Config/Module/development.json index ffbcdb99..a6032c66 100644 --- a/src/front/Config/Module/development.json +++ b/src/front/Config/Module/development.json @@ -160,6 +160,13 @@ "path": "/folders/select", "labelKey": "select_folder" } + }, + "VerifyDocuments": { + "enabled": true, + "props": { + "path": "/folders/[folderUid]/verify-documents", + "labelKey": "verify_documents" + } } } }, diff --git a/src/front/Config/Module/preprod.json b/src/front/Config/Module/preprod.json index ffbcdb99..a6032c66 100644 --- a/src/front/Config/Module/preprod.json +++ b/src/front/Config/Module/preprod.json @@ -160,6 +160,13 @@ "path": "/folders/select", "labelKey": "select_folder" } + }, + "VerifyDocuments": { + "enabled": true, + "props": { + "path": "/folders/[folderUid]/verify-documents", + "labelKey": "verify_documents" + } } } }, diff --git a/src/front/Config/Module/production.json b/src/front/Config/Module/production.json index ffbcdb99..a6032c66 100644 --- a/src/front/Config/Module/production.json +++ b/src/front/Config/Module/production.json @@ -160,6 +160,13 @@ "path": "/folders/select", "labelKey": "select_folder" } + }, + "VerifyDocuments": { + "enabled": true, + "props": { + "path": "/folders/[folderUid]/verify-documents", + "labelKey": "verify_documents" + } } } }, diff --git a/src/front/Config/Module/staging.json b/src/front/Config/Module/staging.json index ffbcdb99..a6032c66 100644 --- a/src/front/Config/Module/staging.json +++ b/src/front/Config/Module/staging.json @@ -160,6 +160,13 @@ "path": "/folders/select", "labelKey": "select_folder" } + }, + "VerifyDocuments": { + "enabled": true, + "props": { + "path": "/folders/[folderUid]/verify-documents", + "labelKey": "verify_documents" + } } } }, diff --git a/src/pages/folders/[folderUid]/verify-documents.tsx b/src/pages/folders/[folderUid]/verify-documents.tsx new file mode 100644 index 00000000..4c468779 --- /dev/null +++ b/src/pages/folders/[folderUid]/verify-documents.tsx @@ -0,0 +1,20 @@ +import { useRouter } from "next/router"; +import React from "react"; + +import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; +import DocumentVerification from "@Front/Components/Layouts/Folder/DocumentVerification"; + +export default function VerifyDocuments() { + const router = useRouter(); + const { folderUid } = router.query; + + if (!folderUid || Array.isArray(folderUid)) { + return null; + } + + return ( + + + + ); +} \ No newline at end of file From c87ad8fed532ab05612e4d0a5ab389e28b9e6306 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 3 Jul 2025 18:00:52 +0200 Subject: [PATCH 28/62] Add merkle proof validation message bus --- src/sdk/MessageBus.ts | 45 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 69728549..4a6ffe31 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -643,6 +643,41 @@ export default class MessageBus { }); } + public verifyMerkleProof(merkleProof: string, documentHash: string): Promise { + return new Promise((resolve: (isValid: boolean) => void, reject: (error: string) => void) => { + this.checkToken().then(() => { + const messageId = `VALIDATE_MERKLE_PROOF_${uuidv4()}`; + + const unsubscribe = EventBus.getInstance().on('MERKLE_PROOF_VALIDATED', (responseId: string, isValid: boolean) => { + if (responseId !== messageId) { + return; + } + unsubscribe(); + resolve(isValid); + }); + + const unsubscribeError = EventBus.getInstance().on('ERROR_MERKLE_PROOF_VALIDATED', (responseId: string, error: string) => { + if (responseId !== messageId) { + return; + } + unsubscribeError(); + reject(error); + }); + + const user = User.getInstance(); + const accessToken = user.getAccessToken()!; + + this.sendMessage({ + type: 'VALIDATE_MERKLE_PROOF', + accessToken, + merkleProof, + documentHash, + messageId + }); + }).catch(reject); + }); + } + private validateToken(): Promise { return new Promise((resolve: (isValid: boolean) => void, reject: (error: string) => void) => { const messageId = `VALIDATE_TOKEN_${uuidv4()}`; @@ -733,7 +768,9 @@ export default class MessageBus { console.error('[MessageBus] sendMessage: iframe not found'); return; } - // console.log('[MessageBus] sendMessage:', message); + if (message.type === 'VALIDATE_MERKLE_PROOF') { + console.log('[MessageBus] sendMessage:', message); + } iframe.contentWindow?.postMessage(message, targetOrigin); } @@ -836,10 +873,14 @@ export default class MessageBus { this.doHandleMessage(message.messageId, 'VALUE_HASHED', message, (message: any) => message.hash); break; - case 'MERKLE_PROOF_RETRIEVED': // GENERATE_MERKLE_PROOF + case 'MERKLE_PROOF_RETRIEVED': // GET_MERKLE_PROOF this.doHandleMessage(message.messageId, 'MERKLE_PROOF_RETRIEVED', message, (message: any) => message.proof); break; + case 'MERKLE_PROOF_VALIDATED': // VALIDATE_MERKLE_PROOF + this.doHandleMessage(message.messageId, 'MERKLE_PROOF_VALIDATED', message, (message: any) => message.isValid); + break; + case 'ERROR': console.error('Error:', message); this.errors[message.messageId] = message.error; From 6f6d3e8de5a57e9faf531fae4d8fd053028110ff Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 3 Jul 2025 18:01:33 +0200 Subject: [PATCH 29/62] Fix pdf generation and parsing --- src/front/Services/PdfService/index.ts | 478 +++---------------------- 1 file changed, 42 insertions(+), 436 deletions(-) diff --git a/src/front/Services/PdfService/index.ts b/src/front/Services/PdfService/index.ts index 1b2e7af5..24533913 100644 --- a/src/front/Services/PdfService/index.ts +++ b/src/front/Services/PdfService/index.ts @@ -1,6 +1,8 @@ import { saveAs } from 'file-saver'; import { PDFDocument, rgb, StandardFonts } from 'pdf-lib'; +const separator = '\x1f'; + export interface CustomerInfo { firstName: string; lastName: string; @@ -185,50 +187,17 @@ export default class PdfService { }); y -= lineSpacing; - // Document Hash Section - page.drawText('Intégrité du Document', { - x: leftMargin, - y: y, - size: 12, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - y -= lineSpacing; - - // Add verification data as base64 - const verificationData = { - documentHash: certificateData.documentHash, - commitmentId: certificateData.metadata.commitmentId, - merkleProof: certificateData.metadata.merkleProof || "N/A" - }; - const verificationDataBase64 = btoa(JSON.stringify(verificationData)); - - // Calculate proper chunk size based on available width and font size - const availableWidth = width - (2 * leftMargin) - 20; // Full width minus margins and safety buffer - const fontSize = 12; - // Use a typical base64 character for width calculation - const avgCharWidth = helveticaFont.widthOfTextAtSize('A', fontSize); - const charsPerLine = Math.floor(availableWidth / avgCharWidth); - const chunkSize = Math.max(60, Math.min(100, charsPerLine)); // More conservative limits - - const chunks = []; - for (let j = 0; j < verificationDataBase64.length; j += chunkSize) { - chunks.push(verificationDataBase64.slice(j, j + chunkSize)); - } - chunks.forEach((chunk, index) => { - page.drawText(chunk, { - x: leftMargin, - y: y - (index * 12), // Increased line spacing - size: fontSize, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - }); + const keywords = [ + certificateData.documentHash, + certificateData.metadata.commitmentId, + JSON.stringify(certificateData.metadata.merkleProof) + ]; + pdfDoc.setKeywords([keywords.join(separator)]); // Add explanatory text about certificate usage - y -= (chunks.length * 12) + 40; // Space after verification data const explanatoryText = "Ce certificat doit être utilisé avec le document qu'il certifie pour être vérifié sur la page dédiée. Le document correspondant à ce certificat doit être téléchargé depuis LeCoffre et peut être conservé avec le certificat tant qu'il n'est pas modifié."; const explanatoryLines = this.splitTextToFit(helveticaObliqueFont, explanatoryText, width - (2 * leftMargin), 11); + y -= (explanatoryLines.length * 12) + 40; // Space after verification data explanatoryLines.forEach((line, index) => { page.drawText(line, { x: leftMargin, @@ -322,314 +291,47 @@ export default class PdfService { } } - /** - * Generate certificate for notary documents - * @param certificateData - Data needed for the certificate - * @returns Promise - The generated PDF as a blob - */ - public async generateNotaryCertificate(certificateData: CertificateData): Promise { - try { - // Create a new PDF document - const pdfDoc = await PDFDocument.create(); - const page = pdfDoc.addPage([595, 842]); // A4 size - const { width, height } = page.getSize(); - - // Embed the standard font - const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica); - const helveticaBoldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - const helveticaObliqueFont = await pdfDoc.embedFont(StandardFonts.HelveticaOblique); - - // Notary Information Section (Top Left) - page.drawText('Notaire Validateur:', { - x: 20, - y: height - 30, - size: 12, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - - page.drawText(certificateData.notary.name, { - x: 20, - y: height - 37, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - - // Customer Information Section (Top Right) - page.drawText('Fournisseur de Document:', { - x: 120, - y: height - 30, - size: 12, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - - page.drawText(`${certificateData.customer.firstName} ${certificateData.customer.lastName}`, { - x: 120, - y: height - 37, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - - page.drawText(certificateData.customer.email, { - x: 120, - y: height - 44, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - - page.drawText(certificateData.customer.postalAddress, { - x: 120, - y: height - 51, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - - // Centered Title - const titleText = 'Certificat Notarial de Validation de Document'; - const titleWidth = helveticaBoldFont.widthOfTextAtSize(titleText, 20); - page.drawText(titleText, { - x: (width - titleWidth) / 2, - y: height - 80, - size: 20, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - - // Add a line separator - page.drawLine({ - start: { x: 20, y: height - 90 }, - end: { x: width - 20, y: height - 90 }, - thickness: 0.5, - color: rgb(0, 0, 0) - }); - - let yPosition = height - 110; - - // Document Information Section - page.drawText('Informations du Document', { - x: 20, - y: yPosition, - size: 12, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - yPosition -= 10; - - page.drawText(`Identifiant du Document: ${certificateData.metadata.documentUid}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Type de Document: ${certificateData.metadata.documentType}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Numéro de dossier: ${certificateData.folderUid}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Créé le: ${certificateData.metadata.createdAt.toLocaleDateString('fr-FR')}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Nom du fichier: ${certificateData.metadata.fileName}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`ID de transaction: ${certificateData.metadata.commitmentId}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Dernière modification: ${certificateData.metadata.updatedAt.toLocaleDateString('fr-FR')}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - page.drawText(`Statut: ${certificateData.metadata.isDeleted ? 'Supprimé' : 'Actif'}`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 15; - - // Document Hash Section - page.drawText('Intégrité du Document', { - x: 20, - y: yPosition, - size: 12, - font: helveticaBoldFont, - color: rgb(0, 0, 0) - }); - yPosition -= 10; - - page.drawText(`Hash SHA256 du Document:`, { - x: 20, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - - // Split hash into multiple lines if needed - const hash = certificateData.documentHash; - const maxWidth = 170; // Available width for text - const hashLines = this.splitTextToFit(helveticaFont, hash, maxWidth, 12); - - for (const line of hashLines) { - page.drawText(line, { - x: 25, - y: yPosition, - size: 12, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - yPosition -= 7; - } - yPosition -= 8; // Extra space after hash - - yPosition -= 5; - - // Footer - const footerText1 = `Page 1 sur 1`; - const footerText2 = `Certificat Notarial - Généré le ${new Date().toLocaleString('fr-FR')}`; - const footerWidth1 = helveticaObliqueFont.widthOfTextAtSize(footerText1, 10); - const footerWidth2 = helveticaObliqueFont.widthOfTextAtSize(footerText2, 10); - - page.drawText(footerText1, { - x: (width - footerWidth1) / 2, - y: 30, - size: 10, - font: helveticaObliqueFont, - color: rgb(0, 0, 0) - }); - - page.drawText(footerText2, { - x: (width - footerWidth2) / 2, - y: 25, - size: 10, - font: helveticaObliqueFont, - color: rgb(0, 0, 0) - }); - - // Add verification data as base64 in small font - const verificationData = { - documentHash: certificateData.documentHash, - commitmentId: certificateData.metadata.commitmentId, - merkleProof: certificateData.metadata.merkleProof || "N/A" - }; - const verificationDataBase64 = btoa(JSON.stringify(verificationData)); - - // Split into chunks if too long - const chunkSize = 80; - const chunks = []; - for (let j = 0; j < verificationDataBase64.length; j += chunkSize) { - chunks.push(verificationDataBase64.slice(j, j + chunkSize)); - } - - chunks.forEach((chunk, index) => { - page.drawText(chunk, { - x: 20, - y: 15 - (index * 3), - size: 6, - font: helveticaFont, - color: rgb(0, 0, 0) - }); - }); - - // Save the PDF - const pdfBytes = await pdfDoc.save(); - return new Blob([pdfBytes], { type: 'application/pdf' }); - } catch (error) { - console.error('Error generating notary certificate:', error); - throw new Error('Failed to generate notary certificate'); - } - } - - /** - * Download a notary certificate PDF - * @param certificateData - Data needed for the certificate - * @param filename - Optional filename for the download - */ - public async downloadNotaryCertificate(certificateData: CertificateData, filename?: string): Promise { - try { - const pdfBlob = await this.generateNotaryCertificate(certificateData); - const defaultFilename = `notary_certificate_${certificateData.metadata.documentUid}_${new Date().toISOString().split('T')[0]}.pdf`; - saveAs(pdfBlob, filename || defaultFilename); - } catch (error) { - console.error('Error downloading notary certificate:', error); - throw error; - } - } - /** * Parse a PDF certificate and extract document information * @param pdfBlob - The PDF file as a blob * @returns Promise<{documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string}> - Extracted information */ - public async parseCertificate(pdfBlob: Blob): Promise<{documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string}> { + public async parseCertificate(certificateFile: File): Promise<{documentHash: string, commitmentId: string, merkleProof: any}> { return new Promise((resolve, reject) => { const fileReader = new FileReader(); + + console.log("certificateFile", certificateFile); fileReader.onload = async () => { try { - // Convert PDF to text using browser's PDF capabilities - const arrayBuffer = fileReader.result as ArrayBuffer; - const pdfData = new Uint8Array(arrayBuffer); - console.log("PDF data:", pdfData); - - // Use a simple text extraction approach - // This is a basic implementation - for production, consider using pdfjs-dist - const text = await this.extractTextFromPdf(pdfData); - - // Parse the extracted text to find our certificate data - const parsedData = this.parseCertificateText(text); - - if (!parsedData.documentHash) { - throw new Error('Document hash not found in certificate'); + // Read the metadata and get the validation data from the keywords + const pdfDoc = await PDFDocument.load(await certificateFile.arrayBuffer()); + const keywords = pdfDoc.getKeywords()?.split(separator); + + if (!keywords) { + throw new Error("No keywords found in certificate"); } - - resolve(parsedData); + + console.log(keywords); + + if (keywords.length !== 3) { + throw new Error("Invalid keywords found in certificate"); + } + + const documentHash = keywords[0]; + const commitmentId = keywords[1]; + const merkleProof = keywords[2]; + + if (!documentHash || !commitmentId || !merkleProof) { + throw new Error("Invalid keywords found in certificate"); + } + + console.log("documentHash", documentHash); + console.log("commitmentId", commitmentId); + console.log("merkleProof", merkleProof); + + + resolve({ documentHash, commitmentId, merkleProof }); } catch (error) { reject(error); } @@ -637,105 +339,9 @@ export default class PdfService { fileReader.onerror = () => { reject(new Error('Failed to read PDF file')); - }; - - fileReader.readAsArrayBuffer(pdfBlob); + }; + + fileReader.readAsArrayBuffer(certificateFile); }); } - - /** - * Extract text from PDF using browser capabilities - * @param pdfData - PDF data as Uint8Array - * @returns Promise - Extracted text - */ - private async extractTextFromPdf(pdfData: Uint8Array): Promise { - console.log("extractTextFromPdf"); - - // Convert PDF data to string to search for base64 patterns - const pdfString = new TextDecoder('utf-8').decode(pdfData); - - // Look for base64 patterns in the PDF content - // This is a simple approach that should work for our embedded data - const base64Matches = pdfString.match(/([A-Za-z0-9+/]{80,}={0,2})/g); - - if (base64Matches && base64Matches.length > 0) { - console.log('Found base64 patterns in PDF:', base64Matches.length); - // Return the longest base64 string (most likely our verification data) - const longestBase64 = base64Matches.reduce((a, b) => a.length > b.length ? a : b); - return longestBase64; - } - - // If no base64 found, return empty string - console.log('No base64 patterns found in PDF'); - return ''; - } - - /** - * Parse certificate text to extract specific fields - * @param text - Extracted text from PDF (could be base64 or regular text) - * @returns Parsed certificate data - */ - private parseCertificateText(text: string): {documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string} { - const result = { - documentHash: '', - documentUid: '', - commitmentId: '', - merkleProof: undefined as string | undefined - }; - - // Check if the text is a base64 string (our new format) - if (text.match(/^[A-Za-z0-9+/]+={0,2}$/)) { - try { - console.log('Attempting to decode base64 data:', text.substring(0, 50) + '...'); - const decodedData = atob(text); - const verificationData = JSON.parse(decodedData); - - console.log('Successfully decoded verification data:', verificationData); - - if (verificationData.documentHash) { - result.documentHash = verificationData.documentHash; - } - if (verificationData.commitmentId) { - result.commitmentId = verificationData.commitmentId; - } - if (verificationData.merkleProof && verificationData.merkleProof !== "N/A") { - result.merkleProof = verificationData.merkleProof; - } - - // If we successfully extracted data from base64, return early - if (result.documentHash) { - return result; - } - } catch (error) { - console.log('Failed to decode base64 data:', error); - } - } - - // Fallback to text parsing for older certificates - // Extract document hash (64 character hex string) - const hashMatch = text.match(/Hash SHA256 du Document:\s*([a-fA-F0-9]{64})/); - if (hashMatch && hashMatch[1]) { - result.documentHash = hashMatch[1]; - } - - // Extract document UID - const uidMatch = text.match(/UID du Document:\s*([^\n\r]+)/); - if (uidMatch && uidMatch[1]) { - result.documentUid = uidMatch[1].trim(); - } - - // Extract commitment ID - const commitmentMatch = text.match(/ID de transaction:\s*([^\n\r]+)/); - if (commitmentMatch && commitmentMatch[1]) { - result.commitmentId = commitmentMatch[1].trim(); - } - - // Extract merkle proof - const merkleProofMatch = text.match(/Preuve Merkle \(Blockchain\):\s*([^\n\r]+)/); - if (merkleProofMatch && merkleProofMatch[1]) { - result.merkleProof = merkleProofMatch[1].trim(); - } - - return result; - } } From 758a32a4d6f6f4806894c683ea6b907e1cb3efac Mon Sep 17 00:00:00 2001 From: Sosthene Date: Thu, 3 Jul 2025 19:58:48 +0200 Subject: [PATCH 30/62] Fixing build errors --- package-lock.json | 11573 ++++++++-------- src/front/Api/Auth/IdNot/index.ts | 2 +- .../DesignSystem/Header/Navigation/index.tsx | 4 +- .../Components/DesignSystem/Header/index.tsx | 17 +- src/front/Components/Elements/Rules/index.tsx | 4 +- .../DefaultCollaboratorDashboard/index.tsx | 4 +- .../DefaultOfficeDashboard/index.tsx | 2 +- .../DefaultRoleDashboard/index.tsx | 2 +- .../DefaultUserDashboard/index.tsx | 2 +- .../ClientDashboard/ContactBox/index.tsx | 7 +- .../ReceivedDocuments/index.tsx | 10 +- 11 files changed, 5829 insertions(+), 5798 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4b13387..877cff24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5772 +1,5805 @@ { - "name": "lecoffre-front", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lecoffre-front", - "version": "0.1.0", - "dependencies": { - "@emotion/react": "^11.10.6", - "@emotion/styled": "^11.10.6", - "@heroicons/react": "^2.1.3", - "@mui/material": "^5.11.13", - "@next/third-parties": "^14.2.3", - "@types/node": "18.15.1", - "@types/react": "18.0.28", - "@types/react-dom": "18.0.11", - "@uidotdev/usehooks": "^2.4.1", - "class-validator": "^0.14.0", - "classnames": "^2.3.2", - "crypto-random-string": "^5.0.0", - "dotenv": "^16.0.3", - "eslint": "8.36.0", - "eslint-config-next": "13.2.4", - "file-saver": "^2.0.5", - "form-data": "^4.0.0", - "heroicons": "^2.1.5", - "jszip": "^3.10.1", - "jwt-decode": "^3.1.2", - "le-coffre-resources": "file:../lecoffre-ressources", - "next": "^14.2.3", - "prettier": "^2.8.7", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-gtm-module": "^2.0.11", - "react-hotjar": "^6.3.1", - "react-select": "^5.7.2", - "react-toastify": "^9.1.3", - "sass": "^1.59.2", - "sharp": "^0.32.1", - "typescript": "4.9.5", - "uuidv4": "^6.2.13" - }, - "devDependencies": { - "@types/file-saver": "^2.0.7", - "@types/react-gtm-module": "^2.0.3" - } - }, - "../lecoffre-ressources": { - "name": "le-coffre-resources", - "license": "MIT", - "dependencies": { - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "reflect-metadata": "^0.1.13" - }, - "devDependencies": { - "@types/node": "^18.16.1", - "@types/reflect-metadata": "^0.1.0", - "prettier": "^2.7.1", - "tslint": "^6.1.2", - "typescript": "~4.6.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/code-frame": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@babel/highlight": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../lecoffre-ressources/node_modules/@types/node": { - "version": "18.19.50", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "../lecoffre-ressources/node_modules/@types/reflect-metadata": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "reflect-metadata": "*" - } - }, - "../lecoffre-ressources/node_modules/@types/validator": { - "version": "13.12.2", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "../lecoffre-ressources/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../lecoffre-ressources/node_modules/builtin-modules": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../lecoffre-ressources/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/class-transformer": { - "version": "0.5.1", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/class-validator": { - "version": "0.14.1", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", - "validator": "^13.9.0" - } - }, - "../lecoffre-ressources/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../lecoffre-ressources/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "../lecoffre-ressources/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../lecoffre-ressources/node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../lecoffre-ressources/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../lecoffre-ressources/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../lecoffre-ressources/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/is-core-module": { - "version": "2.15.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "../lecoffre-ressources/node_modules/libphonenumber-js": { - "version": "1.11.8", - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../lecoffre-ressources/node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "../lecoffre-ressources/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "../lecoffre-ressources/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../lecoffre-ressources/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/picocolors": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../lecoffre-ressources/node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "../lecoffre-ressources/node_modules/reflect-metadata": { - "version": "0.1.14", - "license": "Apache-2.0" - }, - "../lecoffre-ressources/node_modules/resolve": { - "version": "1.22.8", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "../lecoffre-ressources/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "../lecoffre-ressources/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../lecoffre-ressources/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../lecoffre-ressources/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "../lecoffre-ressources/node_modules/tslint": { - "version": "6.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "../lecoffre-ressources/node_modules/tsutils": { - "version": "2.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "../lecoffre-ressources/node_modules/typescript": { - "version": "4.6.4", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../lecoffre-ressources/node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, - "../lecoffre-ressources/node_modules/validator": { - "version": "13.12.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../lecoffre-ressources/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.3", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.3", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.4", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.4", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.4", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.3", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.14.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.36.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.1", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "license": "MIT" - }, - "node_modules/@heroicons/react": { - "version": "2.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">= 16 || ^19.0.0-rc" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.17.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/material": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.17.1", - "@mui/system": "^5.17.1", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^19.0.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.17.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.16.14", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.13.5", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.16.14", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.24", - "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.17.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "~7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^19.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@next/env": { - "version": "14.2.29", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.2.4", - "license": "MIT", - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.29", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/third-parties": { - "version": "14.2.29", - "license": "MIT", - "dependencies": { - "third-party-capital": "1.0.20" - }, - "peerDependencies": { - "next": "^13.0.0 || ^14.0.0", - "react": "^18.2.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.11.0", - "license": "MIT" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.15.1", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.0.28", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.11", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-gtm-module": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.26.0", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "license": "MIT" - }, - "node_modules/@types/validator": { - "version": "13.15.1", - "license": "MIT" - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@uidotdev/usehooks": { - "version": "2.4.1", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.7.8", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.14.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.3", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "license": "Apache-2.0" - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.5", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001720", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "license": "ISC" - }, - "node_modules/class-validator": { - "version": "0.14.2", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.11.1", - "validator": "^13.9.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dotenv": { - "version": "16.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.36.0", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "13.2.4", - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "13.2.4", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.1.7", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/heroicons": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/immutable": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jwt-decode": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/le-coffre-resources": { - "resolved": "../lecoffre-ressources", - "link": true - }, - "node_modules/levn": { - "version": "0.4.1", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.8", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.2.4", - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/next": { - "version": "14.2.29", - "license": "MIT", - "dependencies": { - "@next/env": "14.2.29", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.29", - "@next/swc-darwin-x64": "14.2.29", - "@next/swc-linux-arm64-gnu": "14.2.29", - "@next/swc-linux-arm64-musl": "14.2.29", - "@next/swc-linux-x64-gnu": "14.2.29", - "@next/swc-linux-x64-musl": "14.2.29", - "@next/swc-win32-arm64-msvc": "14.2.29", - "@next/swc-win32-ia32-msvc": "14.2.29", - "@next/swc-win32-x64-msvc": "14.2.29" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/node-abi": { - "version": "3.75.0", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "license": "MIT", - "optional": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.4", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.3", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-gtm-module": { - "version": "2.0.11", - "license": "MIT" - }, - "node_modules/react-hotjar": { - "version": "6.3.1", - "license": "MIT" - }, - "node_modules/react-is": { - "version": "19.1.0", - "license": "MIT" - }, - "node_modules/react-select": { - "version": "5.10.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-toastify": { - "version": "9.1.3", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-toastify/node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sass": { - "version": "1.89.1", - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.32.6", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.0.4", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-fs": { - "version": "3.0.9", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/third-party-capital": { - "version": "1.0.20", - "license": "ISC" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unrs-resolver": { - "version": "1.7.8", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.2.2" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-darwin-arm64": "1.7.8", - "@unrs/resolver-binding-darwin-x64": "1.7.8", - "@unrs/resolver-binding-freebsd-x64": "1.7.8", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.8", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.8", - "@unrs/resolver-binding-linux-arm64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-arm64-musl": "1.7.8", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-riscv64-musl": "1.7.8", - "@unrs/resolver-binding-linux-s390x-gnu": "1.7.8", - "@unrs/resolver-binding-linux-x64-gnu": "1.7.8", - "@unrs/resolver-binding-linux-x64-musl": "1.7.8", - "@unrs/resolver-binding-wasm32-wasi": "1.7.8", - "@unrs/resolver-binding-win32-arm64-msvc": "1.7.8", - "@unrs/resolver-binding-win32-ia32-msvc": "1.7.8", - "@unrs/resolver-binding-win32-x64-msvc": "1.7.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuidv4": { - "version": "6.2.13", - "license": "MIT", - "dependencies": { - "@types/uuid": "8.3.4", - "uuid": "8.3.2" - } - }, - "node_modules/validator": { - "version": "13.15.15", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.29.tgz", - "integrity": "sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.29.tgz", - "integrity": "sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.29.tgz", - "integrity": "sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.29.tgz", - "integrity": "sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.29.tgz", - "integrity": "sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.29.tgz", - "integrity": "sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.29.tgz", - "integrity": "sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.29", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.29.tgz", - "integrity": "sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - } - } + "name": "lecoffre-front", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lecoffre-front", + "version": "0.1.0", + "dependencies": { + "@emotion/react": "^11.10.6", + "@emotion/styled": "^11.10.6", + "@heroicons/react": "^2.1.3", + "@mui/material": "^5.11.13", + "@next/third-parties": "^14.2.3", + "@types/node": "18.15.1", + "@types/react": "18.0.28", + "@types/react-dom": "18.0.11", + "@uidotdev/usehooks": "^2.4.1", + "class-validator": "^0.14.0", + "classnames": "^2.3.2", + "crypto-random-string": "^5.0.0", + "dotenv": "^16.0.3", + "eslint": "8.36.0", + "eslint-config-next": "13.2.4", + "file-saver": "^2.0.5", + "form-data": "^4.0.0", + "heroicons": "^2.1.5", + "jszip": "^3.10.1", + "jwt-decode": "^3.1.2", + "le-coffre-resources": "file:../lecoffre-ressources", + "next": "^14.2.3", + "pdf-lib": "^1.17.1", + "prettier": "^2.8.7", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-gtm-module": "^2.0.11", + "react-hotjar": "^6.3.1", + "react-select": "^5.7.2", + "react-toastify": "^9.1.3", + "sass": "^1.59.2", + "sharp": "^0.32.1", + "typescript": "4.9.5", + "uuidv4": "^6.2.13" + }, + "devDependencies": { + "@types/file-saver": "^2.0.7", + "@types/react-gtm-module": "^2.0.3" + } + }, + "../lecoffre-ressources": { + "name": "le-coffre-resources", + "license": "MIT", + "dependencies": { + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "reflect-metadata": "^0.1.13" + }, + "devDependencies": { + "@types/node": "^18.16.1", + "@types/reflect-metadata": "^0.1.0", + "prettier": "^2.7.1", + "tslint": "^6.1.2", + "typescript": "~4.6.0" + } + }, + "../lecoffre-ressources/node_modules/@babel/code-frame": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../lecoffre-ressources/node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../lecoffre-ressources/node_modules/@babel/highlight": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../lecoffre-ressources/node_modules/@types/node": { + "version": "18.19.50", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../lecoffre-ressources/node_modules/@types/reflect-metadata": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "reflect-metadata": "*" + } + }, + "../lecoffre-ressources/node_modules/@types/validator": { + "version": "13.12.2", + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../lecoffre-ressources/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "../lecoffre-ressources/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../lecoffre-ressources/node_modules/builtin-modules": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../lecoffre-ressources/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../lecoffre-ressources/node_modules/class-transformer": { + "version": "0.5.1", + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/class-validator": { + "version": "0.14.1", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, + "../lecoffre-ressources/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../lecoffre-ressources/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "../lecoffre-ressources/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../lecoffre-ressources/node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../lecoffre-ressources/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../lecoffre-ressources/node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../lecoffre-ressources/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../lecoffre-ressources/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../lecoffre-ressources/node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../lecoffre-ressources/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../lecoffre-ressources/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../lecoffre-ressources/node_modules/is-core-module": { + "version": "2.15.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../lecoffre-ressources/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../lecoffre-ressources/node_modules/libphonenumber-js": { + "version": "1.11.8", + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../lecoffre-ressources/node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../lecoffre-ressources/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../lecoffre-ressources/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../lecoffre-ressources/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../lecoffre-ressources/node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/picocolors": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "../lecoffre-ressources/node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../lecoffre-ressources/node_modules/reflect-metadata": { + "version": "0.1.14", + "license": "Apache-2.0" + }, + "../lecoffre-ressources/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../lecoffre-ressources/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "../lecoffre-ressources/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "../lecoffre-ressources/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../lecoffre-ressources/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../lecoffre-ressources/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "../lecoffre-ressources/node_modules/tslint": { + "version": "6.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "../lecoffre-ressources/node_modules/tsutils": { + "version": "2.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "../lecoffre-ressources/node_modules/typescript": { + "version": "4.6.4", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "../lecoffre-ressources/node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "../lecoffre-ressources/node_modules/validator": { + "version": "13.12.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../lecoffre-ressources/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.4", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "license": "MIT" + }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "license": "MIT", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.17.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.17.1", + "@mui/system": "^5.17.1", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.14", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.16.14", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "14.2.29", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.2.4", + "license": "MIT", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.29.tgz", + "integrity": "sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.29.tgz", + "integrity": "sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.29.tgz", + "integrity": "sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.29.tgz", + "integrity": "sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.29.tgz", + "integrity": "sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.29.tgz", + "integrity": "sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.29.tgz", + "integrity": "sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.29", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.29.tgz", + "integrity": "sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.29", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/third-parties": { + "version": "14.2.29", + "license": "MIT", + "dependencies": { + "third-party-capital": "1.0.20" + }, + "peerDependencies": { + "next": "^13.0.0 || ^14.0.0", + "react": "^18.2.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.1", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.0.28", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-gtm-module": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.26.0", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.1", + "license": "MIT" + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uidotdev/usehooks": { + "version": "2.4.1", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.8", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.14.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "license": "Apache-2.0" + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.5", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001720", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/class-validator": { + "version": "0.14.2", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.11.1", + "validator": "^13.9.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.36.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "13.2.4", + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.1.7", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/heroicons": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.2", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/le-coffre-resources": { + "resolved": "../lecoffre-ressources", + "link": true + }, + "node_modules/levn": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.12.8", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/next": { + "version": "14.2.29", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.29", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.29", + "@next/swc-darwin-x64": "14.2.29", + "@next/swc-linux-arm64-gnu": "14.2.29", + "@next/swc-linux-arm64-musl": "14.2.29", + "@next/swc-linux-x64-gnu": "14.2.29", + "@next/swc-linux-x64-musl": "14.2.29", + "@next/swc-win32-arm64-msvc": "14.2.29", + "@next/swc-win32-ia32-msvc": "14.2.29", + "@next/swc-win32-x64-msvc": "14.2.29" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-abi": { + "version": "3.75.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "license": "MIT", + "optional": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/detect-libc": { + "version": "2.0.4", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-gtm-module": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/react-hotjar": { + "version": "6.3.1", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "19.1.0", + "license": "MIT" + }, + "node_modules/react-select": { + "version": "5.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-toastify": { + "version": "9.1.3", + "license": "MIT", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sass": { + "version": "1.89.1", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.32.6", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.0.4", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/sharp/node_modules/node-addon-api": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.22.0", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "3.0.9", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/third-party-capital": { + "version": "1.0.20", + "license": "ISC" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.5", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.8", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.8", + "@unrs/resolver-binding-darwin-x64": "1.7.8", + "@unrs/resolver-binding-freebsd-x64": "1.7.8", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.8", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.8", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.8", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.8", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.8", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-x64-musl": "1.7.8", + "@unrs/resolver-binding-wasm32-wasi": "1.7.8", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.8", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.8", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuidv4": { + "version": "6.2.13", + "license": "MIT", + "dependencies": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, + "node_modules/validator": { + "version": "13.15.15", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index 6e27e505..7fdcdd8e 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -41,7 +41,7 @@ export default class Auth extends BaseApiService { } public async getIdnotJwt(autorizationCode: string | string[]): Promise<{ accessToken: string; refreshToken: string }> { - const variables = FrontendVariables.getInstance(); + // const variables = FrontendVariables.getInstance(); // TODO: review const baseBackUrl = 'http://localhost:8080'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; diff --git a/src/front/Components/DesignSystem/Header/Navigation/index.tsx b/src/front/Components/DesignSystem/Header/Navigation/index.tsx index d72b3a15..328ebbdc 100644 --- a/src/front/Components/DesignSystem/Header/Navigation/index.tsx +++ b/src/front/Components/DesignSystem/Header/Navigation/index.tsx @@ -1,6 +1,4 @@ import { AppRuleActions, AppRuleNames } from "@Front/Api/Entities/rule"; -import Notifications from "@Front/Api/LeCoffreApi/Notary/Notifications/Notifications"; -import OfficeFolderAnchors from "@Front/Api/LeCoffreApi/Notary/OfficeFolderAnchors/OfficeFolderAnchors"; import Rules, { RulesMode } from "@Front/Components/Elements/Rules"; import Module from "@Front/Config/Module"; import Toasts from "@Front/Stores/Toasts"; @@ -29,7 +27,7 @@ export default function Navigation() { }, }); */ - const anchors = [] as any[]; + // const anchors = [] as any[]; /* TODO: review try { diff --git a/src/front/Components/DesignSystem/Header/index.tsx b/src/front/Components/DesignSystem/Header/index.tsx index 5a45f63f..e42fd796 100644 --- a/src/front/Components/DesignSystem/Header/index.tsx +++ b/src/front/Components/DesignSystem/Header/index.tsx @@ -1,17 +1,16 @@ import LogoIcon from "@Assets/logo_standard_neutral.svg"; -import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe"; -import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; +// import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe"; +// import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; import Module from "@Front/Config/Module"; -import JwtService from "@Front/Services/JwtService/JwtService"; -import { InformationCircleIcon, LifebuoyIcon } from "@heroicons/react/24/outline"; +// import JwtService from "@Front/Services/JwtService/JwtService"; +import { LifebuoyIcon } from "@heroicons/react/24/outline"; import Head from "next/head"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/router"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect } from "react"; import IconButton from "../IconButton"; -import Typography, { ETypo, ETypoColor } from "../Typography"; import BurgerMenu from "./BurgerMenu"; import classes from "./classes.module.scss"; import LogoCielNatureIcon from "./logo-ciel-notaires.jpeg"; @@ -32,7 +31,7 @@ export default function Header(props: IProps) { const { pathname } = router; const isOnCustomerLoginPage = Module.getInstance().get().modules.pages.CustomersLogin.props.path === pathname; - const [cancelAt, setCancelAt] = useState(null); + // const [cancelAt, setCancelAt] = useState(null); const loadSubscription = useCallback(async () => { /* TODO: review @@ -86,7 +85,7 @@ export default function Header(props: IProps) { )} {isOnCustomerLoginPage && ciel-nature}
- {cancelAt && ( + {/* {cancelAt && (
@@ -94,7 +93,7 @@ export default function Header(props: IProps) { {cancelAt.toLocaleDateString()}.
- )} + )} */} ); } diff --git a/src/front/Components/Elements/Rules/index.tsx b/src/front/Components/Elements/Rules/index.tsx index a0ac67f7..df347680 100644 --- a/src/front/Components/Elements/Rules/index.tsx +++ b/src/front/Components/Elements/Rules/index.tsx @@ -20,7 +20,7 @@ export default function Rules(props: IProps) { const router = useRouter(); const [isShowing, setIsShowing] = React.useState(false); - const [hasJwt, setHasJwt] = React.useState(false); + // const [hasJwt, setHasJwt] = React.useState(false); const getShowValue = useCallback(() => { if (props.mode === RulesMode.NECESSARY) { @@ -32,7 +32,7 @@ export default function Rules(props: IProps) { useEffect(() => { // TODO: review //if (!JwtService.getInstance().decodeJwt()) return; - setHasJwt(true); + // setHasJwt(true); setIsShowing(getShowValue()); }, [getShowValue, isShowing]); diff --git a/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx index 315a81cf..c9818720 100644 --- a/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx @@ -5,8 +5,8 @@ import Module from "@Front/Config/Module"; import { IBlock } from "@Front/Components/DesignSystem/SearchBlockList/BlockList/Block"; import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDashboardWithList"; import User from "le-coffre-resources/dist/Notary"; -import JwtService from "@Front/Services/JwtService/JwtService"; -import Users, { IGetUsersparams } from "@Front/Api/LeCoffreApi/Admin/Users/Users"; +// import JwtService from "@Front/Services/JwtService/JwtService"; +// import Users, { IGetUsersparams } from "@Front/Api/LeCoffreApi/Admin/Users/Users"; type IProps = IPropsDashboardWithList; diff --git a/src/front/Components/LayoutTemplates/DefaultOfficeDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultOfficeDashboard/index.tsx index ab34dcf2..d8e0fa6c 100644 --- a/src/front/Components/LayoutTemplates/DefaultOfficeDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultOfficeDashboard/index.tsx @@ -5,7 +5,7 @@ import { useRouter } from "next/router"; import Module from "@Front/Config/Module"; import { IBlock } from "@Front/Components/DesignSystem/SearchBlockList/BlockList/Block"; import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDashboardWithList"; -import Offices from "@Front/Api/LeCoffreApi/SuperAdmin/Offices/Offices"; +// import Offices from "@Front/Api/LeCoffreApi/SuperAdmin/Offices/Offices"; type IProps = IPropsDashboardWithList; diff --git a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx index 00f3d709..aaa86b35 100644 --- a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx @@ -5,7 +5,7 @@ import Module from "@Front/Config/Module"; import { IBlock } from "@Front/Components/DesignSystem/SearchBlockList/BlockList/Block"; import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDashboardWithList"; import { OfficeRole } from "le-coffre-resources/dist/Notary"; -import OfficeRoles, { IGetRolesParams } from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles"; +// import OfficeRoles, { IGetRolesParams } from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles"; import RoleService from "src/common/Api/LeCoffreApi/sdk/RoleService"; diff --git a/src/front/Components/LayoutTemplates/DefaultUserDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultUserDashboard/index.tsx index 84b22acd..c690ebe9 100644 --- a/src/front/Components/LayoutTemplates/DefaultUserDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultUserDashboard/index.tsx @@ -1,4 +1,4 @@ -import Users, { IGetUsersparams } from "@Front/Api/LeCoffreApi/SuperAdmin/Users/Users"; +// import Users, { IGetUsersparams } from "@Front/Api/LeCoffreApi/SuperAdmin/Users/Users"; import User from "le-coffre-resources/dist/SuperAdmin"; import React, { useEffect } from "react"; diff --git a/src/front/Components/Layouts/ClientDashboard/ContactBox/index.tsx b/src/front/Components/Layouts/ClientDashboard/ContactBox/index.tsx index e84bfeea..9947c5c4 100644 --- a/src/front/Components/Layouts/ClientDashboard/ContactBox/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/ContactBox/index.tsx @@ -3,10 +3,10 @@ import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Ty import { ArrowDownTrayIcon } from "@heroicons/react/24/outline"; import Customer from "le-coffre-resources/dist/Customer"; import { OfficeFolder as OfficeFolderNotary } from "le-coffre-resources/dist/Notary"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import classes from "./classes.module.scss"; -import OfficeRib from "@Front/Api/LeCoffreApi/Customer/OfficeRib/OfficeRib"; +// import OfficeRib from "@Front/Api/LeCoffreApi/Customer/OfficeRib/OfficeRib"; type IProps = { folder: OfficeFolderNotary; @@ -16,7 +16,8 @@ type IProps = { export default function ContactBox(props: IProps) { const { folder, customer } = props; - const [ribUrl, setRibUrl] = useState(null); + // const [ribUrl, setRibUrl] = useState(null); + const ribUrl = null; // TODO: review const stakeholder = { diff --git a/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx b/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx index c137971e..87e007d4 100644 --- a/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx @@ -6,7 +6,7 @@ import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Ty import BackArrow from "@Front/Components/Elements/BackArrow"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import Module from "@Front/Config/Module"; -import JwtService, { ICustomerJwtPayload } from "@Front/Services/JwtService/JwtService"; +// import JwtService, { ICustomerJwtPayload } from "@Front/Services/JwtService/JwtService"; import { ArrowDownTrayIcon, EyeIcon } from "@heroicons/react/24/outline"; import { saveAs } from "file-saver"; import JSZip from "jszip"; @@ -44,10 +44,10 @@ export default function ReceivedDocuments() { const [customer, setCustomer] = useState(null); const fetchFolderAndCustomer = useCallback(async () => { - let jwt: ICustomerJwtPayload | undefined; - if (typeof document !== "undefined") { - jwt = JwtService.getInstance().decodeCustomerJwt(); - } + // let jwt: ICustomerJwtPayload | undefined; + // if (typeof document !== "undefined") { + // jwt = JwtService.getInstance().decodeCustomerJwt(); + // } // TODO: review LoaderService.getInstance().show(); From 63fc45927f0bbacf3e24be65e4f1a85a45685ae4 Mon Sep 17 00:00:00 2001 From: omaroughriss Date: Fri, 4 Jul 2025 12:09:28 +0200 Subject: [PATCH 31/62] Update Dockerfile to use dev mode --- Dockerfile | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index c5d5b48e..589a009e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,34 +15,19 @@ RUN --mount=type=ssh \ ssh-keyscan git.4nkweb.com >> /root/.ssh/known_hosts && \ npm install --frozen-lockfile -# Rebuild the source code only when needed -FROM node:19-alpine AS builder +# Configuration pour le développement +FROM node:19-alpine AS development WORKDIR /leCoffre-front COPY --from=deps /leCoffre-front/node_modules ./node_modules COPY --from=deps /leCoffre-front/package.json ./package.json COPY --from=deps /leCoffre-front/.env ./.env -COPY tsconfig.json tsconfig.json -COPY next.config.js next.config.js -COPY src src +COPY . . -RUN npm run build - -# Production image, copy all the files and run next -FROM node:19-alpine AS production -WORKDIR /leCoffre-front - -# Création de l’utilisateur non-root +# Création de l'utilisateur non-root RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . -COPY public ./public -COPY --from=builder --chown=lecoffreuser /leCoffre-front/node_modules ./node_modules -COPY --from=builder --chown=lecoffreuser /leCoffre-front/.next ./.next -COPY --from=builder --chown=lecoffreuser /leCoffre-front/next.config.js ./next.config.js -COPY --from=builder --chown=lecoffreuser /leCoffre-front/package.json ./package.json -COPY --from=builder --chown=lecoffreuser /leCoffre-front/.env ./.env - USER lecoffreuser -CMD ["npm", "run", "start"] +CMD ["npm", "run", "dev"] EXPOSE 3000 \ No newline at end of file From c5bf3322423ee9ade2a08108eff557580c516f71 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Fri, 4 Jul 2025 16:12:58 +0200 Subject: [PATCH 32/62] Fix somes issues --- .../DepositOtherDocument/index.tsx | 23 +++- .../Header/Profile/ProfileModal/index.tsx | 17 +-- .../DesignSystem/Header/Profile/index.tsx | 4 +- .../Components/DesignSystem/Header/index.tsx | 10 +- .../DesignSystem/LogOutButton/index.tsx | 13 ++- .../DefaultCustomerDashboard/index.tsx | 22 ++-- .../DefaultDashboardWithList/index.tsx | 4 +- .../DepositDocumentComponent/index.tsx | 14 ++- .../Layouts/ClientDashboard/index.tsx | 109 ++++++++++-------- .../Layouts/Folder/SendDocuments/index.tsx | 21 +++- 10 files changed, 150 insertions(+), 87 deletions(-) diff --git a/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx b/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx index c6398dfa..fe6b1c22 100644 --- a/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx +++ b/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx @@ -16,9 +16,10 @@ import Button, { EButtonstyletype, EButtonVariant } from "../Button"; import Confirm from "../OldModal/Confirm"; import Alert from "../OldModal/Alert"; -import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; +import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; +import CustomerService from "src/common/Api/LeCoffreApi/sdk/CustomerService"; type IProps = { onChange?: (files: File[]) => void; @@ -238,14 +239,28 @@ export default class DepositOtherDocument extends React.Component((resolve: (customer: any) => void) => { + CustomerService.getCustomerByUid(this.props.customer_uid).then((process: any) => { + if (process) { + const customer: any = process.processData; + resolve(customer); + } + }); + }); + for (let i = 0; i < filesArray.length; i++) { const file = filesArray[i]!.file; await new Promise((resolve: () => void) => { const reader = new FileReader(); reader.onload = (event) => { if (event.target?.result) { - const arrayBuffer = event.target.result as ArrayBuffer; - const uint8Array = new Uint8Array(arrayBuffer); + const date: Date = new Date(); + const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; + + const fileName: string = `${customer.contact.last_name}-${strDate}-APCL.${file.name.split('.').pop()}`.toUpperCase(); + + const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; + const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); const fileBlob: any = { type: file.type, @@ -254,7 +269,7 @@ export default class DepositOtherDocument extends React.Component void; + isCustomer?: boolean; }; type IState = {}; @@ -19,29 +20,31 @@ export default class ProfileModal extends React.Component { <>
- + />} - + />} - - + />} + +
); diff --git a/src/front/Components/DesignSystem/Header/Profile/index.tsx b/src/front/Components/DesignSystem/Header/Profile/index.tsx index e2d66719..4298665f 100644 --- a/src/front/Components/DesignSystem/Header/Profile/index.tsx +++ b/src/front/Components/DesignSystem/Header/Profile/index.tsx @@ -9,7 +9,7 @@ import ProfileModal from "./ProfileModal"; const headerBreakpoint = 1023; -export default function Profile() { +export default function Profile(props: { isCustomer?: boolean }) { const { isOpen, toggle, close } = useOpenable(); useEffect(() => { @@ -27,7 +27,7 @@ export default function Profile() { return (
} onClick={toggle} /> - +
); } diff --git a/src/front/Components/DesignSystem/Header/index.tsx b/src/front/Components/DesignSystem/Header/index.tsx index e42fd796..aea3aa66 100644 --- a/src/front/Components/DesignSystem/Header/index.tsx +++ b/src/front/Components/DesignSystem/Header/index.tsx @@ -20,12 +20,13 @@ import Profile from "./Profile"; type IProps = { isUserConnected: boolean; + isCustomer?: boolean; }; const headerHeight = 75; export default function Header(props: IProps) { - const { isUserConnected } = props; + const { isUserConnected, isCustomer } = props; const router = useRouter(); const { pathname } = router; @@ -62,7 +63,7 @@ export default function Header(props: IProps) { logo
- {isUserConnected && ( + {isUserConnected && !isCustomer && ( <>
@@ -83,6 +84,11 @@ export default function Header(props: IProps) {
)} + {isCustomer && ( +
+ +
+ )} {isOnCustomerLoginPage && ciel-nature} {/* {cancelAt && ( diff --git a/src/front/Components/DesignSystem/LogOutButton/index.tsx b/src/front/Components/DesignSystem/LogOutButton/index.tsx index 6e1b1e13..24f6a88a 100644 --- a/src/front/Components/DesignSystem/LogOutButton/index.tsx +++ b/src/front/Components/DesignSystem/LogOutButton/index.tsx @@ -6,14 +6,19 @@ import React, { useCallback } from "react"; import MenuItem from "../Menu/MenuItem"; -export default function LogOut() { +export default function LogOut(props: { isCustomer?: boolean }) { const router = useRouter(); const variables = FrontendVariables.getInstance(); const disconnect = useCallback(() => { - UserStore.instance - .disconnect() - .then(() => router.push(`https://qual-connexion.idnot.fr/user/auth/logout?sourceURL=${variables.FRONT_APP_HOST}`)); + if (!props.isCustomer) { + UserStore.instance + .disconnect() + .then(() => router.push(`https://qual-connexion.idnot.fr/user/auth/logout?sourceURL=${variables.FRONT_APP_HOST}`)); + } else { + sessionStorage.setItem("customerIsConnected", "false"); + router.push("/"); + } }, [router, variables.FRONT_APP_HOST]); return , onClick: disconnect }} />; diff --git a/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx index d539fb3b..b56f9238 100644 --- a/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx @@ -9,7 +9,9 @@ import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDas import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; -type IProps = IPropsDashboardWithList & {}; +type IProps = IPropsDashboardWithList & { + isReady: boolean; +}; export default function DefaultCustomerDashboard(props: IProps) { const router = useRouter(); @@ -46,13 +48,15 @@ export default function DefaultCustomerDashboard(props: IProps) { .then((folders) => setFolders(folders)); */ - FolderService.getFolders().then((processes: any[]) => { - if (processes.length > 0) { - const folders: any[] = processes.map((process: any) => process.processData); - setFolders(folders); - } - }); - }, []); + if (props.isReady) { + FolderService.getFolders().then((processes: any[]) => { + if (processes.length > 0) { + const folders: any[] = processes.map((process: any) => process.processData); + setFolders(folders); + } + }); + } + }, [props.isReady]); const onSelectedBlock = (block: IBlock) => { const folder = folders.find((folder) => folder.uid === block.id); @@ -65,7 +69,7 @@ export default function DefaultCustomerDashboard(props: IProps) { .replace("[profileUid]", profileUid as string ?? ""), ); }; - return ; + return ; function getBlocks(folders: OfficeFolder[]): IBlock[] { return folders.map((folder) => { diff --git a/src/front/Components/LayoutTemplates/DefaultDashboardWithList/index.tsx b/src/front/Components/LayoutTemplates/DefaultDashboardWithList/index.tsx index 5261e700..5fc1d600 100644 --- a/src/front/Components/LayoutTemplates/DefaultDashboardWithList/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultDashboardWithList/index.tsx @@ -15,6 +15,7 @@ export type IPropsDashboardWithList = { mobileBackText?: string; headerConnected?: boolean; noPadding?: boolean; + isCustomer?: boolean; }; type IProps = IPropsDashboardWithList & ISearchBlockListProps; @@ -29,11 +30,12 @@ export default function DefaultDashboardWithList(props: IProps) { headerConnected = true, bottomButton, noPadding = false, + isCustomer = false, } = props; return (
-
+
diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index 041af337..d472709f 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -14,11 +14,12 @@ import WatermarkService from "@Front/Services/WatermarkService"; type IProps = { document: any; + customer: any; onChange: () => void; }; export default function DepositDocumentComponent(props: IProps) { - const { document, onChange } = props; + const { document, customer,onChange } = props; const [isModalOpen, setIsModalOpen] = useState(false); const [refused_reason, setRefusedReason] = useState(null); @@ -42,8 +43,13 @@ export default function DepositDocumentComponent(props: IProps) { const reader = new FileReader(); reader.onload = (event) => { if (event.target?.result) { - const arrayBuffer = event.target.result as ArrayBuffer; - const uint8Array = new Uint8Array(arrayBuffer); + const date: Date = new Date(); + const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; + + const fileName: string = `aplc-${document.document_type.name}-${customer.contact.last_name}-${strDate}.${file.name.split('.').pop()}`; + + const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; + const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); const fileBlob: FileBlob = { type: watermarkedFile.type, @@ -52,7 +58,7 @@ export default function DepositDocumentComponent(props: IProps) { const fileData: FileData = { file_blob: fileBlob, - file_name: watermarkedFile.name + file_name: fileName }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; diff --git a/src/front/Components/Layouts/ClientDashboard/index.tsx b/src/front/Components/Layouts/ClientDashboard/index.tsx index c02202dd..5c94d6f8 100644 --- a/src/front/Components/Layouts/ClientDashboard/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/index.tsx @@ -46,14 +46,16 @@ export default function ClientDashboard(props: IProps) { const [documentsNotary, setDocumentsNotary] = useState([]); const [isAddDocumentModalVisible, setIsAddDocumentModalVisible] = useState(false); + const [isReady, setIsReady] = useState(false); const [isAuthModalOpen, setIsAuthModalOpen] = useState(false); - const [isSmsModalOpen, setIsSmsModalOpen] = useState(false); + const [isSmsModalOpen, setIsSmsModalOpen] = useState(true); const [smsCode, setSmsCode] = useState(""); const [smsError, setSmsError] = useState(""); const verifySmsCode = useCallback(() => { if (smsCode === "1234") { setIsSmsModalOpen(false); + setIsAuthModalOpen(true); } else { setSmsError("Code incorrect. Le code valide est 1234."); } @@ -97,7 +99,6 @@ export default function ClientDashboard(props: IProps) { setCustomer(customer); setFolder(folder); - setIsAuthModalOpen(true); LoaderService.getInstance().hide(); return { folder, customer }; @@ -171,9 +172,11 @@ export default function ClientDashboard(props: IProps) { [folderUid], ); + /* useEffect(() => { fetchFolderAndCustomer().then(({ customer }) => fetchDocuments(customer.uid)); }, [fetchDocuments, fetchFolderAndCustomer]); + */ useEffect(() => { const customerUid = customer?.uid; @@ -235,8 +238,8 @@ export default function ClientDashboard(props: IProps) { }, [customer, folderUid, isAddDocumentModalVisible, onCloseModalAddDocument, folder]); return ( - -
+ + {isReady && (
@@ -315,6 +318,7 @@ export default function ClientDashboard(props: IProps) { fetchDocuments(customer?.uid)} /> ))} @@ -332,58 +336,61 @@ export default function ClientDashboard(props: IProps) { Ajouter d'autres documents {isAddDocumentModalVisible && renderBox()} +
)} - {isAuthModalOpen && { - setIsAuthModalOpen(false); - setIsSmsModalOpen(true); - }} - />} + {isAuthModalOpen && { + setIsReady(true); + setIsAuthModalOpen(false); + fetchFolderAndCustomer().then(({ customer }) => fetchDocuments(customer.uid)); - {isSmsModalOpen && ( - setIsSmsModalOpen(false)} - title="Vérification SMS" - > -
- - Veuillez saisir le code à 4 chiffres que vous avez reçu par SMS + sessionStorage.setItem("customerIsConnected", "true"); + }} + />} + + {isSmsModalOpen && ( + setIsSmsModalOpen(false)} + title="Vérification SMS" + > +
+ + Veuillez saisir le code à 4 chiffres que vous avez reçu par SMS + + + { + const value = e.target.value; + // Only allow digits + if (value === "" || /^\d+$/.test(value)) { + setSmsCode(value); + setSmsError(""); + } + }} + /> + + {smsError && ( + + {smsError} + )} - { - const value = e.target.value; - // Only allow digits - if (value === "" || /^\d+$/.test(value)) { - setSmsCode(value); - setSmsError(""); - } - }} - /> - - {smsError && ( - - {smsError} - - )} - -
- -
+
+
- - )} -
+
+
+ )} ); } diff --git a/src/front/Components/Layouts/Folder/SendDocuments/index.tsx b/src/front/Components/Layouts/Folder/SendDocuments/index.tsx index 81f50e1c..dcc56311 100644 --- a/src/front/Components/Layouts/Folder/SendDocuments/index.tsx +++ b/src/front/Components/Layouts/Folder/SendDocuments/index.tsx @@ -22,6 +22,7 @@ import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; +import CustomerService from "src/common/Api/LeCoffreApi/sdk/CustomerService"; enum EClientSelection { ALL_CLIENTS = "all_clients", @@ -65,13 +66,27 @@ export default function SendDocuments() { LoaderService.getInstance().show(); for (const selectedClient of selectedClients) { + const customer: any = await new Promise((resolve: (customer: any) => void) => { + CustomerService.getCustomerByUid(selectedClient as string).then((process: any) => { + if (process) { + const customer: any = process.processData; + resolve(customer); + } + }); + }); + for (const file of files) { await new Promise((resolve: () => void) => { const reader = new FileReader(); reader.onload = (event) => { if (event.target?.result) { - const arrayBuffer = event.target.result as ArrayBuffer; - const uint8Array = new Uint8Array(arrayBuffer); + const date: Date = new Date(); + const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; + + const fileName: string = `${customer.contact.last_name}-${strDate}-APCL.${file.name.split('.').pop()}`.toUpperCase(); + + const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; + const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); const fileBlob: any = { type: file.type, @@ -80,7 +95,7 @@ export default function SendDocuments() { const fileData: any = { file_blob: fileBlob, - file_name: file.name + file_name: fileName }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; From 4b7a08534d063aded2de6e56d14584ba44cc360d Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Mon, 7 Jul 2025 14:28:32 +0200 Subject: [PATCH 33/62] Fix some issues --- .../DesignSystem/DepositOtherDocument/index.tsx | 2 +- .../ClientDashboard/ReceivedDocuments/index.tsx | 6 +----- .../ClientView/DocumentTables/index.tsx | 14 +++++--------- .../Layouts/Folder/SendDocuments/index.tsx | 2 +- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx b/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx index fe6b1c22..cce649bf 100644 --- a/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx +++ b/src/front/Components/DesignSystem/DepositOtherDocument/index.tsx @@ -257,7 +257,7 @@ export default class DepositOtherDocument extends React.Component ({ key: documentNotary.uid ?? "", - name: formatName(documentNotary.files?.[0]?.file_name?.split(".")?.[0] ?? "") || "_", + name: documentNotary.files?.[0]?.file_name?.split(".")?.[0] || "_", sentAt: new Date(documentNotary.created_at!).toLocaleDateString(), // actions: onDownloadFileNotary(documentNotary)} icon={} />, actions: { @@ -228,7 +228,3 @@ function buildRows( }, })); } - -function formatName(text: string): string { - return text.replace(/[^a-zA-Z0-9 ]/g, ""); -} diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index 925929d7..8776d020 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -314,7 +314,7 @@ export default function DocumentTables(props: IProps) { }, file: { sx: { width: 120 }, - content: document.files?.[0]?.file_name ?? "_", + content: document.files?.[0]?.file_name?.split(".")?.[0] ?? "_", }, actions: { sx: { width: 76 }, @@ -360,7 +360,7 @@ export default function DocumentTables(props: IProps) { }, file: { sx: { width: 120 }, - content: document.files?.[0]?.file_name ?? "_", + content: document.files?.[0]?.file_name?.split(".")?.[0] ?? "_", }, actions: { sx: { width: 76 }, @@ -411,7 +411,7 @@ export default function DocumentTables(props: IProps) { }, file: { sx: { width: 120 }, - content: document.files?.[0]?.file_name ?? "_", + content: document.files?.[0]?.file_name?.split(".")?.[0] ?? "_", }, actions: { sx: { width: 76 }, content: "" }, }; @@ -428,7 +428,7 @@ export default function DocumentTables(props: IProps) { key: document.uid, document_type: { sx: { width: 300 }, - content: formatName(document.files?.[0]?.file_name?.split(".")?.[0] ?? "") || "_", + content: "Autre document", }, document_status: { sx: { width: 107 }, @@ -440,7 +440,7 @@ export default function DocumentTables(props: IProps) { }, file: { sx: { width: 120 }, - content: document.files?.[0]?.file_name ?? "_", + content: document.files?.[0]?.file_name?.split(".")?.[0] ?? "_", }, actions: { sx: { width: 76 }, @@ -539,10 +539,6 @@ function getHeader(dateColumnTitle: string, isMobile: boolean): IHead[] { ]; } -function formatName(text: string): string { - return text.replace(/[^a-zA-Z0-9 ]/g, ""); -} - function getTagForSentDocument(status: EDocumentNotaryStatus) { if (status === EDocumentNotaryStatus.SENT) { return ( diff --git a/src/front/Components/Layouts/Folder/SendDocuments/index.tsx b/src/front/Components/Layouts/Folder/SendDocuments/index.tsx index dcc56311..9a856be1 100644 --- a/src/front/Components/Layouts/Folder/SendDocuments/index.tsx +++ b/src/front/Components/Layouts/Folder/SendDocuments/index.tsx @@ -83,7 +83,7 @@ export default function SendDocuments() { const date: Date = new Date(); const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; - const fileName: string = `${customer.contact.last_name}-${strDate}-APCL.${file.name.split('.').pop()}`.toUpperCase(); + const fileName: string = `aplc-${customer.contact.last_name}-${strDate}.${file.name.split('.').pop()}`; const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); From 863533be33756781fc0384c0c49ac5a3f25b7a82 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Mon, 7 Jul 2025 15:18:04 +0200 Subject: [PATCH 34/62] Fix some issues --- .../DepositDocumentComponent/index.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index d472709f..8c038057 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -19,7 +19,7 @@ type IProps = { }; export default function DepositDocumentComponent(props: IProps) { - const { document, customer,onChange } = props; + const { document, customer, onChange } = props; const [isModalOpen, setIsModalOpen] = useState(false); const [refused_reason, setRefusedReason] = useState(null); @@ -37,7 +37,7 @@ export default function DepositDocumentComponent(props: IProps) { try { // Add watermark to the file before processing const watermarkedFile = await WatermarkService.getInstance().addWatermark(file); - + return new Promise( (resolve: () => void) => { const reader = new FileReader(); @@ -45,9 +45,9 @@ export default function DepositDocumentComponent(props: IProps) { if (event.target?.result) { const date: Date = new Date(); const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; - + const fileName: string = `aplc-${document.document_type.name}-${customer.contact.last_name}-${strDate}.${file.name.split('.').pop()}`; - + const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); @@ -94,8 +94,13 @@ export default function DepositDocumentComponent(props: IProps) { const reader = new FileReader(); reader.onload = (event) => { if (event.target?.result) { - const arrayBuffer = event.target.result as ArrayBuffer; - const uint8Array = new Uint8Array(arrayBuffer); + const date: Date = new Date(); + const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; + + const fileName: string = `aplc-${document.document_type.name}-${customer.contact.last_name}-${strDate}.${file.name.split('.').pop()}`; + + const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; + const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); const fileBlob: FileBlob = { type: file.type, @@ -104,7 +109,7 @@ export default function DepositDocumentComponent(props: IProps) { const fileData: FileData = { file_blob: fileBlob, - file_name: file.name + file_name: fileName }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; From 6edde3781bdb231290bb24e7f3ed23551e180842 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Tue, 8 Jul 2025 15:53:01 +0200 Subject: [PATCH 35/62] Fix some issues --- .../Api/LeCoffreApi/sdk/CustomerService.ts | 104 +++++++++++- .../Api/LeCoffreApi/sdk/DocumentService.ts | 104 +++++++++++- .../Api/LeCoffreApi/sdk/FolderService.ts | 149 +++++++++++++++--- src/front/Api/Auth/IdNot/index.ts | 2 +- .../DefaultRoleDashboard/index.tsx | 90 ++++++++++- .../ViewDocumentsNotary/index.tsx | 4 +- .../DeedTypes/DeedTypesCreate/index.tsx | 2 +- .../Layouts/DeedTypes/DeedTypesEdit/index.tsx | 4 +- .../DeedTypes/DeedTypesInformations/index.tsx | 4 +- .../DocumentTypesCreate/index.tsx | 2 +- .../DocumentTypes/DocumentTypesEdit/index.tsx | 4 +- .../Folder/AddClientToFolder/index.tsx | 33 ++-- .../Layouts/Folder/AskDocuments/index.tsx | 5 +- .../Layouts/Folder/CreateFolder/index.tsx | 2 +- .../ClientView/DocumentTables/index.tsx | 17 +- .../FolderInformation/ClientView/index.tsx | 4 +- .../NoClientView/DeleteFolderModal/index.tsx | 2 +- .../Folder/FolderInformation/index.tsx | 2 - .../Layouts/Folder/UpdateClient/index.tsx | 4 +- .../Folder/UpdateFolderMetadata/index.tsx | 4 +- .../Layouts/Roles/RolesCreate/index.tsx | 2 +- .../Layouts/Roles/RolesInformations/index.tsx | 8 +- src/front/Services/PdfService/index.ts | 27 ++-- src/front/Services/WatermarkService/index.ts | 46 +++--- src/sdk/MessageBus.ts | 6 +- 25 files changed, 499 insertions(+), 132 deletions(-) diff --git a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts index 5bf3a3b7..de3122e7 100644 --- a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts +++ b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts @@ -7,6 +7,8 @@ export default class CustomerService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); + private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private constructor() { } public static createCustomer(customerData: any, validatorId: string): Promise { @@ -70,7 +72,7 @@ export default class CustomerService { this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { - resolve(processCreated); + this.getCustomerByUid(processCreated.processData.uid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); @@ -78,16 +80,64 @@ export default class CustomerService { } public static getCustomers(): Promise { - return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['utype'] && publicValues['utype'] === 'customer' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false'); + // Check if we have valid cache + const cacheProcesses: any[] = []; + const now = Date.now(); + const customers: any[] = JSON.parse(sessionStorage.getItem('_customers_') || '[]'); + for (const customer of customers) { + if (now - customer.timestamp < this.CACHE_TTL) { + cacheProcesses.push(customer.process); + } + } + const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'customer' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !cacheUids.includes(publicValues['uid']) + ).then((processes: any[]) => { + if (processes.length === 0) { + return cacheProcesses; + } else { + for (const process of processes) { + // Update cache + this.setCache(process); + + cacheProcesses.push(process); + } + return cacheProcesses; + } + }); } public static getCustomerByUid(uid: string): Promise { + // Check if we have valid cache + const now = Date.now(); + const cache: any = this.getCache(uid); + if (cache && (now - cache.timestamp) < this.CACHE_TTL) { + return Promise.resolve(cache.process); + } + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { - this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['uid'] === uid && publicValues['utype'] && publicValues['utype'] === 'customer' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false').then((processes: any[]) => { + this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['uid'] === uid && + publicValues['utype'] && + publicValues['utype'] === 'customer' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' + ).then((processes: any[]) => { if (processes.length === 0) { resolve(null); } else { const process: any = processes[0]; + + // Update cache + this.setCache(process); + resolve(process); } }).catch(reject); @@ -100,10 +150,56 @@ export default class CustomerService { const newStateId: string = processUpdated.diffs[0]?.state_id; this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { - resolve(); + const customerUid: string = process.processData.uid; + this.removeCache(customerUid); + + this.getCustomerByUid(customerUid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); }); } + + private static setCache(process: any): void { + const key: string = '_customers_'; + + const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = customers.findIndex((customer: any) => customer.process.processData.uid === process.processData.uid); + if (index !== -1) { + customers[index] = { + process: process, + timestamp: Date.now() + }; + } else { + customers.push({ + process: process, + timestamp: Date.now() + }); + } + + sessionStorage.setItem(key, JSON.stringify(customers)); + } + + private static getCache(uid: string): any { + const key: string = '_customers_'; + + const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + if (customers.length === 0) { + return null; + } + + return customers.find((customer: any) => customer.process.processData.uid === uid); + } + + private static removeCache(uid: string): void { + const key: string = '_customers_'; + + const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = customers.findIndex((customer: any) => customer.process.processData.uid === uid); + if (index !== -1) { + customers.splice(index, 1); + } + + sessionStorage.setItem(key, JSON.stringify(customers)); + } } diff --git a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts index 987ca689..5546a386 100644 --- a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts +++ b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts @@ -7,6 +7,8 @@ export default class DocumentService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); + private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private constructor() { } public static createDocument(documentData: any, validatorId: string): Promise { @@ -70,7 +72,7 @@ export default class DocumentService { this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { - resolve(processCreated); + this.getDocumentByUid(processCreated.processData.uid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); @@ -78,16 +80,64 @@ export default class DocumentService { } public static getDocuments(): Promise { - return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['utype'] && publicValues['utype'] === 'document' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false'); + // Check if we have valid cache + const cacheProcesses: any[] = []; + const now = Date.now(); + const customers: any[] = JSON.parse(sessionStorage.getItem('_documents') || '[]'); + for (const customer of customers) { + if (now - customer.timestamp < this.CACHE_TTL) { + cacheProcesses.push(customer.process); + } + } + const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'document' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !cacheUids.includes(publicValues['uid']) + ).then((processes: any[]) => { + if (processes.length === 0) { + return cacheProcesses; + } else { + for (const process of processes) { + // Update cache + this.setCache(process); + + cacheProcesses.push(process); + } + return cacheProcesses; + } + }); } public static getDocumentByUid(uid: string): Promise { + // Check if we have valid cache + const now = Date.now(); + const cache: any = this.getCache(uid); + if (cache && (now - cache.timestamp) < this.CACHE_TTL) { + return Promise.resolve(cache.process); + } + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { - this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['uid'] === uid && publicValues['utype'] && publicValues['utype'] === 'document' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false').then((processes: any[]) => { + this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['uid'] === uid && + publicValues['utype'] && + publicValues['utype'] === 'document' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' + ).then((processes: any[]) => { if (processes.length === 0) { resolve(null); } else { const process: any = processes[0]; + + // Update cache + this.setCache(process); + resolve(process); } }).catch(reject); @@ -100,10 +150,56 @@ export default class DocumentService { const newStateId: string = processUpdated.diffs[0]?.state_id; this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { - resolve(); + const documentUid: string = process.processData.uid; + this.removeCache(documentUid); + + this.getDocumentByUid(documentUid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); }); } + + private static setCache(process: any): void { + const key: string = '_documents_'; + + const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = documents.findIndex((document: any) => document.process.processData.uid === process.processData.uid); + if (index !== -1) { + documents[index] = { + process: process, + timestamp: Date.now() + }; + } else { + documents.push({ + process: process, + timestamp: Date.now() + }); + } + + sessionStorage.setItem(key, JSON.stringify(documents)); + } + + private static getCache(uid: string): any { + const key: string = '_documents_'; + + const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + if (documents.length === 0) { + return null; + } + + return documents.find((document: any) => document.process.processData.uid === uid); + } + + private static removeCache(uid: string): void { + const key: string = '_documents_'; + + const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = documents.findIndex((document: any) => document.process.processData.uid === uid); + if (index !== -1) { + documents.splice(index, 1); + } + + sessionStorage.setItem(key, JSON.stringify(documents)); + } } diff --git a/src/common/Api/LeCoffreApi/sdk/FolderService.ts b/src/common/Api/LeCoffreApi/sdk/FolderService.ts index e8e49afb..c19d73ac 100644 --- a/src/common/Api/LeCoffreApi/sdk/FolderService.ts +++ b/src/common/Api/LeCoffreApi/sdk/FolderService.ts @@ -10,6 +10,8 @@ export default class FolderService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); + private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private constructor() { } public static createFolder(folderData: any, stakeholdersId: string[], customersId: string[]): Promise { @@ -79,7 +81,7 @@ export default class FolderService { this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { - resolve(processCreated); + this.getFolderByUid(processCreated.processData.uid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); @@ -87,34 +89,66 @@ export default class FolderService { } public static getFolders(): Promise { - return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['utype'] && publicValues['utype'] === 'folder' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false'); + // Check if we have valid cache + const cacheProcesses: any[] = []; + const now = Date.now(); + const folders: any[] = JSON.parse(sessionStorage.getItem('_folders_') || '[]'); + for (const folder of folders) { + if (now - folder.timestamp < this.CACHE_TTL) { + cacheProcesses.push(folder.process); + } + } + const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'folder' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !cacheUids.includes(publicValues['uid']) + ).then(async (processes: any[]) => { + if (processes.length === 0) { + return cacheProcesses; + } else { + for (const process of processes) { + await this.completeFolder(process); + + // Update cache + this.setCache(process); + + cacheProcesses.push(process); + } + return cacheProcesses; + } + }); } - public static getFolderByUid(uid: string, includeCustomers: boolean = true, includeDeedType: boolean = true): Promise { + public static getFolderByUid(uid: string): Promise { + // Check if we have valid cache + const now = Date.now(); + const cache: any = this.getCache(uid); + if (cache && (now - cache.timestamp) < this.CACHE_TTL) { + return Promise.resolve(cache.process); + } + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { - this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['uid'] === uid && publicValues['utype'] && publicValues['utype'] === 'folder' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false').then(async (processes: any[]) => { + this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['uid'] === uid && + publicValues['utype'] && + publicValues['utype'] === 'folder' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' + ).then(async (processes: any[]) => { if (processes.length === 0) { resolve(null); } else { const process: any = processes[0]; + await this.completeFolder(process); - if (includeCustomers && process.processData.customers && process.processData.customers.length > 0) { - process.processData.customers = await new Promise(async (resolve: (customers: any[]) => void) => { - const customers: any[] = []; - for (const uid of process.processData.customers) { - const p: any = await CustomerService.getCustomerByUid(uid); - customers.push(p.processData); - } - resolve(customers); - }); - } - - if (includeDeedType && process.processData.deed && process.processData.deed.deed_type) { - const p: any = await DeedTypeService.getDeedTypeByUid(process.processData.deed.deed_type.uid); - process.processData.deed.deed_type = p.processData; - // Remove duplicates - process.processData.deed.document_types = p.processData.document_types.filter((item: any, index: number) => p.processData.document_types.findIndex((t: any) => t.uid === item.uid) === index); - } + // Update cache + this.setCache(process); resolve(process); } @@ -128,10 +162,81 @@ export default class FolderService { const newStateId: string = processUpdated.diffs[0]?.state_id; this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { - resolve(); + const folderUid: string = process.processData.uid; + this.removeCache(folderUid); + + this.getFolderByUid(folderUid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); }); } + + private static async completeFolder(process: any): Promise { + if (process.processData.customers && process.processData.customers.length > 0) { + process.processData.customers = await new Promise(async (resolve: (customers: any[]) => void) => { + const customers: any[] = []; + for (const customer of process.processData.customers) { + const p: any = await CustomerService.getCustomerByUid(customer.uid); + customers.push(p.processData); + } + resolve(customers); + }); + } + + if (process.processData.deed && process.processData.deed.deed_type) { + const p: any = await DeedTypeService.getDeedTypeByUid(process.processData.deed.deed_type.uid); + process.processData.deed.deed_type = p.processData; + + // Remove duplicates + if (p.processData.document_types && p.processData.document_types.length > 0) { + process.processData.deed.document_types = p.processData.document_types.filter((item: any, index: number) => p.processData.document_types.findIndex((t: any) => t.uid === item.uid) === index); + } + } + + return process; + } + + private static setCache(process: any): void { + const key: string = '_folders_'; + + const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = folders.findIndex((folder: any) => folder.process.processData.uid === process.processData.uid); + if (index !== -1) { + folders[index] = { + process: process, + timestamp: Date.now() + }; + } else { + folders.push({ + process: process, + timestamp: Date.now() + }); + } + + sessionStorage.setItem(key, JSON.stringify(folders)); + } + + private static getCache(uid: string): any { + const key: string = '_folders_'; + + const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + if (folders.length === 0) { + return null; + } + + return folders.find((folder: any) => folder.process.processData.uid === uid); + } + + private static removeCache(uid: string): void { + const key: string = '_folders_'; + + const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const index: number = folders.findIndex((folder: any) => folder.process.processData.uid === uid); + if (index !== -1) { + folders.splice(index, 1); + } + + sessionStorage.setItem(key, JSON.stringify(folders)); + } } diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index 4023b179..5cd82e71 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -44,7 +44,7 @@ export default class Auth extends BaseApiService { // const variables = FrontendVariables.getInstance(); // TODO: review - const baseBackUrl = 'http://local.lecoffreio.4nkweb:3001'//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; + const baseBackUrl = 'http://localhost:8080';//variables.BACK_API_PROTOCOL + variables.BACK_API_HOST; const url = new URL(`${baseBackUrl}/api/v1/idnot/user/${autorizationCode}`); try { diff --git a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx index aaa86b35..8e6215a4 100644 --- a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx @@ -7,6 +7,8 @@ import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDas import { OfficeRole } from "le-coffre-resources/dist/Notary"; // import OfficeRoles, { IGetRolesParams } from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles"; +import { v4 as uuidv4 } from 'uuid'; + import RoleService from "src/common/Api/LeCoffreApi/sdk/RoleService"; type IProps = IPropsDashboardWithList; @@ -26,10 +28,96 @@ export default function DefaultRoleDashboard(props: IProps) { .then((roles) => setRoles(roles)); */ - RoleService.getRoles().then((processes: any[]) => { + const roles: any[] = [ + { + uid: uuidv4(), + name: 'Notaire', + office: { + name: '', + crpcen: '', + created_at: new Date(), + updated_at: new Date() + }, + rules: [ + { + uid: uuidv4(), + name: "Gestion de l'abonnement", + label: "Gestion de l'abonnement", + namespace: "Gestion de l'abonnement", + created_at: new Date(), + updated_at: new Date() + }, + { + uid: uuidv4(), + name: "Gestion des matrices d'actes et des documents", + label: "Gestion des matrices d'actes et des documents", + namespace: "Gestion des matrices d'actes et des documents", + created_at: new Date(), + updated_at: new Date() + }, + { + uid: uuidv4(), + name: "Intégration du RIB", + label: "Intégration du RIB", + namespace: "Intégration du RIB", + created_at: new Date(), + updated_at: new Date() + } + ], + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uuidv4(), + name: 'Collaborateur', + office: { + name: '', + crpcen: '', + created_at: new Date(), + updated_at: new Date() + }, + rules: [ + { + uid: uuidv4(), + name: "Gestion de l'abonnement", + label: "Gestion de l'abonnement", + namespace: "Gestion de l'abonnement", + created_at: new Date(), + updated_at: new Date() + }, + { + uid: uuidv4(), + name: "Gestion des matrices d'actes et des documents", + label: "Gestion des matrices d'actes et des documents", + namespace: "Gestion des matrices d'actes et des documents", + created_at: new Date(), + updated_at: new Date() + }, + { + uid: uuidv4(), + name: "Intégration du RIB", + label: "Intégration du RIB", + namespace: "Intégration du RIB", + created_at: new Date(), + updated_at: new Date() + } + ], + created_at: new Date(), + updated_at: new Date(), + } + ]; + + RoleService.getRoles().then(async (processes: any[]) => { if (processes.length > 0) { const roles: any[] = processes.map((process: any) => process.processData); setRoles(roles); + } else { + for (let role of roles) { + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; + + await RoleService.createRole(role, validatorId); + } + setRoles(roles); } }); }, []); diff --git a/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx b/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx index 22cb4ba4..b9cf69df 100644 --- a/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/ViewDocumentsNotary/index.tsx @@ -30,7 +30,7 @@ type IState = { refuseText: string; selectedFileIndex: number; selectedFile: { uid: string; file_name: string; file_blob: FileBlob } | null; - documentNotary: DocumentNotary | null; + documentNotary: any | null; fileBlob: Blob | null; isLoading: boolean; }; @@ -168,7 +168,7 @@ class ViewDocumentsNotaryClass extends BasePage { private async getFilePreview(): Promise { try { - const fileBlob: Blob = new Blob([this.state.selectedFile.file_blob.data], { type: this.state.selectedFile.file_blob.type }); + const fileBlob: Blob = new Blob([this.state.selectedFile!.file_blob.data], { type: this.state.selectedFile!.file_blob.type }); this.setState({ fileBlob, }); diff --git a/src/front/Components/Layouts/DeedTypes/DeedTypesCreate/index.tsx b/src/front/Components/Layouts/DeedTypes/DeedTypesCreate/index.tsx index 96a68be9..c93c3507 100644 --- a/src/front/Components/Layouts/DeedTypes/DeedTypesCreate/index.tsx +++ b/src/front/Components/Layouts/DeedTypes/DeedTypesCreate/index.tsx @@ -60,12 +60,12 @@ export default function DeedTypesCreate(props: IProps) { title: "Succès !", description: "Type d'acte créé avec succès" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push( Module.getInstance() .get() .modules.pages.DeedTypes.pages.DeedTypesInformations.props.path.replace("[uid]", processCreated.processData.uid), ); + LoaderService.getInstance().hide(); }); } catch (validationErrors: Array | any) { setValidationError(validationErrors as ValidationError[]); diff --git a/src/front/Components/Layouts/DeedTypes/DeedTypesEdit/index.tsx b/src/front/Components/Layouts/DeedTypes/DeedTypesEdit/index.tsx index 064509a3..be9d649d 100644 --- a/src/front/Components/Layouts/DeedTypes/DeedTypesEdit/index.tsx +++ b/src/front/Components/Layouts/DeedTypes/DeedTypesEdit/index.tsx @@ -36,7 +36,7 @@ export default function DeedTypesEdit() { const deedType: any = process.processData; setDeedTypeSelected(deedType); } - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); }); } @@ -66,12 +66,12 @@ export default function DeedTypesEdit() { DeedTypeService.getDeedTypeByUid(deedTypeUid as string).then((process: any) => { if (process) { DeedTypeService.updateDeedType(process, { name: values["name"], description: values["description"] }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push( Module.getInstance() .get() .modules.pages.DeedTypes.pages.DeedTypesInformations.props.path.replace("[uid]", deedTypeUid as string), ); + LoaderService.getInstance().hide(); }); } }); diff --git a/src/front/Components/Layouts/DeedTypes/DeedTypesInformations/index.tsx b/src/front/Components/Layouts/DeedTypes/DeedTypesInformations/index.tsx index 778758f7..f7cc77f0 100644 --- a/src/front/Components/Layouts/DeedTypes/DeedTypesInformations/index.tsx +++ b/src/front/Components/Layouts/DeedTypes/DeedTypesInformations/index.tsx @@ -55,8 +55,8 @@ export default function DeedTypesInformations(props: IProps) { DeedTypeService.getDeedTypeByUid(deedTypeUid as string).then((process: any) => { if (process) { DeedTypeService.updateDeedType(process, { archived_at: new Date().toISOString() }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push(Module.getInstance().get().modules.pages.DeedTypes.props.path); + LoaderService.getInstance().hide(); }); } }); @@ -119,7 +119,7 @@ export default function DeedTypesInformations(props: IProps) { .forEach((selectedDocument: any) => document_types.push(selectedDocument)); DeedTypeService.updateDeedType(process, { document_types: document_types }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); closeSaveModal(); }); } diff --git a/src/front/Components/Layouts/DocumentTypes/DocumentTypesCreate/index.tsx b/src/front/Components/Layouts/DocumentTypes/DocumentTypesCreate/index.tsx index eba9773d..1a8d38ce 100644 --- a/src/front/Components/Layouts/DocumentTypes/DocumentTypesCreate/index.tsx +++ b/src/front/Components/Layouts/DocumentTypes/DocumentTypesCreate/index.tsx @@ -53,12 +53,12 @@ export default function DocumentTypesCreate(props: IProps) { title: "Succès !", description: "Type de document créé avec succès" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push( Module.getInstance() .get() .modules.pages.DocumentTypes.pages.DocumentTypesInformations.props.path.replace("[uid]", processCreated.processData.uid), ); + LoaderService.getInstance().hide(); }); } catch (e) { if (e instanceof Array) { diff --git a/src/front/Components/Layouts/DocumentTypes/DocumentTypesEdit/index.tsx b/src/front/Components/Layouts/DocumentTypes/DocumentTypesEdit/index.tsx index 3fe6de1b..bf17ef91 100644 --- a/src/front/Components/Layouts/DocumentTypes/DocumentTypesEdit/index.tsx +++ b/src/front/Components/Layouts/DocumentTypes/DocumentTypesEdit/index.tsx @@ -31,7 +31,7 @@ export default function DocumentTypesEdit() { const documentType: any = process.processData; setDocumentTypeSelected(documentType); } - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); }); } @@ -56,7 +56,6 @@ export default function DocumentTypesEdit() { DocumentTypeService.getDocumentTypeByUid(documentTypeUid as string).then((process: any) => { if (process) { DocumentTypeService.updateDocumentType(process, values).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push( Module.getInstance() .get() @@ -65,6 +64,7 @@ export default function DocumentTypesEdit() { documentTypeUid as string ?? "", ) ); + LoaderService.getInstance().hide(); }); } }); diff --git a/src/front/Components/Layouts/Folder/AddClientToFolder/index.tsx b/src/front/Components/Layouts/Folder/AddClientToFolder/index.tsx index 358cc6c1..ae2f53c3 100644 --- a/src/front/Components/Layouts/Folder/AddClientToFolder/index.tsx +++ b/src/front/Components/Layouts/Folder/AddClientToFolder/index.tsx @@ -82,21 +82,21 @@ export default function AddClientToFolder(props: IProps) { LoaderService.getInstance().show(); CustomerService.createCustomer(customerData, validatorId).then((processCreated: any) => { - FolderService.getFolderByUid(folderUid as string, false, false).then((process: any) => { + FolderService.getFolderByUid(folderUid as string).then((process: any) => { if (process) { - let customers: any[] = process.processData.customers; - if (!customers) { - customers = []; + const customers: any[] = []; + for (const customerUid of process.processData.customers.map((customer: any) => customer.uid)) { + customers.push({ uid: customerUid }); } - customers.push(processCreated.processData.uid); + customers.push({ uid: processCreated.processData.uid }); FolderService.updateFolder(process, { customers: customers }).then(() => { - ToasterService.getInstance().success({ - title: "Succès !", - description: "Client ajouté avec succès au dossier" + ToasterService.getInstance().success({ + title: "Succès !", + description: "Client ajouté avec succès au dossier" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push(`/folders/${folderUid}`); + LoaderService.getInstance().hide(); }); } }); @@ -108,17 +108,20 @@ export default function AddClientToFolder(props: IProps) { } } else { LoaderService.getInstance().show(); - FolderService.getFolderByUid(folderUid as string, false, false).then((process: any) => { + FolderService.getFolderByUid(folderUid as string).then((process: any) => { if (process) { - const customers: any[] = customersToLink.map((customer: any) => customer.uid); + const customers: any[] = []; + for (const customerUid of customersToLink.map((customer: any) => customer.uid)) { + customers.push({ uid: customerUid }); + } FolderService.updateFolder(process, { customers: customers }).then(() => { - ToasterService.getInstance().success({ - title: "Succès !", - description: selectedCustomers.length > 1 ? "Clients associés avec succès au dossier" : "Client associé avec succès au dossier" + ToasterService.getInstance().success({ + title: "Succès !", + description: selectedCustomers.length > 1 ? "Clients associés avec succès au dossier" : "Client associé avec succès au dossier" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push(`/folders/${folderUid}`); + LoaderService.getInstance().hide(); }); } }); diff --git a/src/front/Components/Layouts/Folder/AskDocuments/index.tsx b/src/front/Components/Layouts/Folder/AskDocuments/index.tsx index 0828bfa1..5805598e 100644 --- a/src/front/Components/Layouts/Folder/AskDocuments/index.tsx +++ b/src/front/Components/Layouts/Folder/AskDocuments/index.tsx @@ -18,7 +18,6 @@ import backgroundImage from "@Assets/images/background_refonte.svg"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; -import { DocumentData } from "../FolderInformation/ClientView/DocumentTables/types"; export default function AskDocuments() { const router = useRouter(); @@ -65,7 +64,7 @@ export default function AskDocuments() { for (let i = 0; i < documentAsked.length; i++) { const documentTypeUid = documentAsked[i]; if (!documentTypeUid) continue; - + const documentData: any = { folder: { uid: folderUid as string, @@ -106,7 +105,7 @@ export default function AskDocuments() { // If those UIDs are already asked, filter them to not show them in the list and only // show the documents that are not asked yet - const documentTypes = folder.deed!.document_types!.filter((documentType) => { + const documentTypes = folder.deed?.document_types?.filter((documentType) => { if (userDocumentTypesUids.includes(documentType!.uid!)) return false; return true; }); diff --git a/src/front/Components/Layouts/Folder/CreateFolder/index.tsx b/src/front/Components/Layouts/Folder/CreateFolder/index.tsx index e41a625d..f1bdf7ba 100644 --- a/src/front/Components/Layouts/Folder/CreateFolder/index.tsx +++ b/src/front/Components/Layouts/Folder/CreateFolder/index.tsx @@ -103,9 +103,9 @@ export default function CreateFolder(): JSX.Element { title: "Succès !", description: "Dossier créé avec succès" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); const folderUid: string = processCreated.processData.uid; router.push(`/folders/${folderUid}`); + LoaderService.getInstance().hide(); }); } catch (backError) { if (!Array.isArray(backError)) return; diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index 8776d020..526420c3 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -64,12 +64,6 @@ export default function DocumentTables(props: IProps) { // FilterBy folder.uid & depositor.uid documents = documents.filter((document: any) => document.folder.uid === folderUid && document.depositor && document.depositor.uid === customerUid); - console.log('[DocumentTables] fetchDocuments: all documents for this folder/customer:', documents.map(doc => ({ - uid: doc.uid, - status: doc.document_status, - type: doc.document_type?.name - }))); - for (const document of documents) { if (document.document_type) { document.document_type = (await DocumentTypeService.getDocumentTypeByUid(document.document_type.uid)).processData; @@ -187,7 +181,6 @@ export default function DocumentTables(props: IProps) { const onDownloadCertificate = useCallback(async (doc: any) => { try { - console.log('[DocumentTables] onDownloadCertificate: doc', doc); const certificateData: CertificateData = { customer: { firstName: doc.depositor.first_name || doc.depositor.firstName || "N/A", @@ -221,14 +214,12 @@ export default function DocumentTables(props: IProps) { // Process only the files for this specific document for (const file of documentProcess.processData.files) { const fileProcess = await FileService.getFileByUid(file.uid); - console.log('[DocumentTables] onDownloadCertificate: fileProcess', fileProcess); - + const hash = fileProcess.lastUpdatedFileState.pcd_commitment.file_blob; certificateData.documentHash = hash; const proof = await MessageBus.getInstance().generateMerkleProof(fileProcess.lastUpdatedFileState, 'file_blob'); - console.log('[DocumentTables] onDownloadCertificate: proof', proof); - + const metadata: Metadata = { fileName: fileProcess.processData.file_name, isDeleted: false, @@ -241,8 +232,6 @@ export default function DocumentTables(props: IProps) { }; certificateData.metadata = metadata; } - - console.log('[DocumentTables] onDownloadCertificate: certificateData', certificateData); await PdfService.getInstance().downloadCertificate(certificateData); } catch (error) { @@ -381,7 +370,7 @@ export default function DocumentTables(props: IProps) { }; }) .filter((document) => document !== null) as IRowProps[]; - + return validated; }, [documents, folderUid, onDownload, onDownloadCertificate], diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/index.tsx index 61677356..a6de0584 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/index.tsx @@ -64,7 +64,7 @@ export default function ClientView(props: IProps) { (customerUid: string) => { if (!folder.uid) return; LoaderService.getInstance().show(); - FolderService.getFolderByUid(folder.uid, false, false).then((process: any) => { + FolderService.getFolderByUid(folder.uid).then((process: any) => { if (process) { const folder: any = process.processData; @@ -72,7 +72,7 @@ export default function ClientView(props: IProps) { const customers = folder.customers.filter((uid: string) => uid !== customerUid); FolderService.updateFolder(process, { customers: customers }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); window.location.reload(); }); } diff --git a/src/front/Components/Layouts/Folder/FolderInformation/NoClientView/DeleteFolderModal/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/NoClientView/DeleteFolderModal/index.tsx index ec0958e6..197325c0 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/NoClientView/DeleteFolderModal/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/NoClientView/DeleteFolderModal/index.tsx @@ -29,7 +29,7 @@ export default function DeleteFolderModal(props: IProps) { FolderService.getFolderByUid(folder.uid!).then((process: any) => { if (process) { FolderService.updateFolder(process, { isDeleted: 'true' }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); resolve(); }); } diff --git a/src/front/Components/Layouts/Folder/FolderInformation/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/index.tsx index e2cb8518..dfeadf48 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/index.tsx @@ -109,7 +109,6 @@ export default function FolderInformation(props: IProps) { */ // TODO: review - LoaderService.getInstance().show(); return FolderService.getFolderByUid(folderUid).then(async (process: any) => { if (process) { const folder: any = process.processData; @@ -143,7 +142,6 @@ export default function FolderInformation(props: IProps) { }); setFolder(folder); - setTimeout(() => LoaderService.getInstance().hide(), 2000); } }); }, [folderUid]); diff --git a/src/front/Components/Layouts/Folder/UpdateClient/index.tsx b/src/front/Components/Layouts/Folder/UpdateClient/index.tsx index 1272a6a3..2408227a 100644 --- a/src/front/Components/Layouts/Folder/UpdateClient/index.tsx +++ b/src/front/Components/Layouts/Folder/UpdateClient/index.tsx @@ -41,7 +41,7 @@ export default function UpdateClient() { if (process) { const customer: any = process.processData; setCustomer(customer); - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); } }); } catch (error) { @@ -77,8 +77,8 @@ export default function UpdateClient() { if (process) { // TODO: review - address CustomerService.updateCustomer(process, { contact: contact }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push(backwardPath); + LoaderService.getInstance().hide(); }); } }); diff --git a/src/front/Components/Layouts/Folder/UpdateFolderMetadata/index.tsx b/src/front/Components/Layouts/Folder/UpdateFolderMetadata/index.tsx index 163d7197..a995c32a 100644 --- a/src/front/Components/Layouts/Folder/UpdateFolderMetadata/index.tsx +++ b/src/front/Components/Layouts/Folder/UpdateFolderMetadata/index.tsx @@ -54,10 +54,10 @@ export default function UpdateFolderMetadata() { FolderService.getFolderByUid(folderUid).then((process: any) => { if (process) { FolderService.updateFolder(process, { ...values, deed: { uid: values["deed"] } }).then(() => { - setTimeout(() => LoaderService.getInstance().hide(), 2000); router.push(Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid)); + LoaderService.getInstance().hide(); }); } }); @@ -75,7 +75,7 @@ export default function UpdateFolderMetadata() { if (process) { const folder: any = process.processData; setSelectedFolder(folder); - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); } }); }, [folderUid]); diff --git a/src/front/Components/Layouts/Roles/RolesCreate/index.tsx b/src/front/Components/Layouts/Roles/RolesCreate/index.tsx index 1ed07e3a..7a7694ea 100644 --- a/src/front/Components/Layouts/Roles/RolesCreate/index.tsx +++ b/src/front/Components/Layouts/Roles/RolesCreate/index.tsx @@ -64,9 +64,9 @@ export default function RolesCreate(props: IProps) { title: "Succès !", description: "Rôle créé avec succès" }); - setTimeout(() => LoaderService.getInstance().hide(), 2000); const role: any = processCreated.processData; router.push(Module.getInstance().get().modules.pages.Roles.pages.RolesInformations.props.path.replace("[uid]", role.uid!)); + LoaderService.getInstance().hide(); } }); diff --git a/src/front/Components/Layouts/Roles/RolesInformations/index.tsx b/src/front/Components/Layouts/Roles/RolesInformations/index.tsx index 490908a6..d186a6c0 100644 --- a/src/front/Components/Layouts/Roles/RolesInformations/index.tsx +++ b/src/front/Components/Layouts/Roles/RolesInformations/index.tsx @@ -57,7 +57,7 @@ export default function RolesInformations() { if (process) { const role: any = process.processData; resolve(role); - setTimeout(() => LoaderService.getInstance().hide(), 2000); + LoaderService.getInstance().hide(); } }); }) @@ -69,6 +69,8 @@ export default function RolesInformations() { }, }); */ + + /* const rulesGroups: RulesGroup[] = [ { uid: 'toto', @@ -87,12 +89,14 @@ export default function RolesInformations() { updated_at: new Date(), } ]; + */ if (!role) return; setRoleSelected(role); // TODO: review if (!role.rules) return; + /* const rulesCheckboxes = rulesGroups .map((ruleGroup) => { if (ruleGroup.rules?.every((rule) => role.rules?.find((r: any) => r.uid === rule.uid))) { @@ -106,6 +110,8 @@ export default function RolesInformations() { const selectAll = rulesCheckboxes.every((rule) => rule.checked); setSelectAll(selectAll); setRulesGroupsCheckboxes(rulesCheckboxes); + */ + setRulesGroupsCheckboxes(role.rules); } getUser(); diff --git a/src/front/Services/PdfService/index.ts b/src/front/Services/PdfService/index.ts index 24533913..fcfa0eb3 100644 --- a/src/front/Services/PdfService/index.ts +++ b/src/front/Services/PdfService/index.ts @@ -19,7 +19,7 @@ export interface Metadata { fileName: string, createdAt: Date, isDeleted: boolean, - updatedAt: Date, + updatedAt: Date, commitmentId: string, documentUid: string; documentType: string; @@ -247,14 +247,14 @@ export default class PdfService { private splitTextToFit(font: any, text: string, maxWidth: number, fontSize: number): string[] { const lines: string[] = []; let currentLine = ''; - + // Split by characters (pdf-lib doesn't have word-level text measurement) const chars = text.split(''); - + for (const char of chars) { const testLine = currentLine + char; const testWidth = font.widthOfTextAtSize(testLine, fontSize); - + if (testWidth <= maxWidth) { currentLine = testLine; } else { @@ -267,11 +267,11 @@ export default class PdfService { } } } - + if (currentLine) { lines.push(currentLine); } - + return lines; } @@ -296,12 +296,10 @@ export default class PdfService { * @param pdfBlob - The PDF file as a blob * @returns Promise<{documentHash: string, documentUid: string, commitmentId: string, merkleProof?: string}> - Extracted information */ - public async parseCertificate(certificateFile: File): Promise<{documentHash: string, commitmentId: string, merkleProof: any}> { + public async parseCertificate(certificateFile: File): Promise<{ documentHash: string, commitmentId: string, merkleProof: any }> { return new Promise((resolve, reject) => { const fileReader = new FileReader(); - console.log("certificateFile", certificateFile); - fileReader.onload = async () => { try { // Read the metadata and get the validation data from the keywords @@ -312,8 +310,6 @@ export default class PdfService { throw new Error("No keywords found in certificate"); } - console.log(keywords); - if (keywords.length !== 3) { throw new Error("Invalid keywords found in certificate"); } @@ -326,20 +322,15 @@ export default class PdfService { throw new Error("Invalid keywords found in certificate"); } - console.log("documentHash", documentHash); - console.log("commitmentId", commitmentId); - console.log("merkleProof", merkleProof); - - resolve({ documentHash, commitmentId, merkleProof }); } catch (error) { reject(error); } }; - + fileReader.onerror = () => { reject(new Error('Failed to read PDF file')); - }; + }; fileReader.readAsArrayBuffer(certificateFile); }); diff --git a/src/front/Services/WatermarkService/index.ts b/src/front/Services/WatermarkService/index.ts index b7dcf66a..ebfc8ff5 100644 --- a/src/front/Services/WatermarkService/index.ts +++ b/src/front/Services/WatermarkService/index.ts @@ -15,7 +15,7 @@ export default class WatermarkService { */ public async addWatermark(file: File): Promise { const fileType = file.type; - + try { if (fileType.startsWith('image/')) { return await this.addWatermarkToImage(file); @@ -23,7 +23,7 @@ export default class WatermarkService { return await this.addWatermarkToPdf(file); } else { // For other file types, return the original file - console.log(`Watermark not supported for file type: ${fileType}`); + console.warn(`Watermark not supported for file type: ${fileType}`); return file; } } catch (error) { @@ -49,22 +49,22 @@ export default class WatermarkService { // Create canvas const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); - + if (!ctx) { reject(new Error('Could not get canvas context')); return; } - + // Set canvas size to image size canvas.width = img.width; canvas.height = img.height; - + // Draw original image ctx.drawImage(img, 0, 0); - + // Add watermark this.addImageWatermark(ctx, img.width, img.height); - + // Convert to blob canvas.toBlob((blob) => { if (blob) { @@ -100,26 +100,26 @@ export default class WatermarkService { reader.onload = async (event) => { try { const arrayBuffer = event.target?.result as ArrayBuffer; - + // Import pdf-lib dynamically to avoid SSR issues const { PDFDocument, rgb } = await import('pdf-lib'); - + // Load the existing PDF const pdfDoc = await PDFDocument.load(arrayBuffer); - + // Get all pages const pages = pdfDoc.getPages(); - + // Add watermark to each page for (const page of pages) { this.addPdfWatermark(page, rgb(0.8, 0.2, 0.2)); // Pale red color } - + // Save the modified PDF const pdfBytes = await pdfDoc.save(); const watermarkedFile = new File([pdfBytes], file.name, { type: file.type }); resolve(watermarkedFile); - + } catch (error) { console.error('Error adding watermark to PDF:', error); // If PDF watermarking fails, return original file @@ -140,21 +140,21 @@ export default class WatermarkService { private addImageWatermark(ctx: CanvasRenderingContext2D, width: number, height: number): void { // Save current state ctx.save(); - + // Set watermark properties ctx.fillStyle = 'rgba(128, 128, 128, 0.7)'; // Semi-transparent gray ctx.font = '12px Arial'; ctx.textAlign = 'right'; ctx.textBaseline = 'bottom'; - + // Position watermark in bottom-right corner const text = 'Processed by LeCoffre'; const x = width - 10; // 10 pixels from right edge const y = height - 10; // 10 pixels from bottom - + // Add watermark text ctx.fillText(text, x, y); - + // Restore state ctx.restore(); } @@ -166,7 +166,7 @@ export default class WatermarkService { */ private addPdfWatermark(page: any, color: any): void { const { width, height } = page.getSize(); - + // Calculate watermark position (bottom-right corner) const text = 'Processed by LeCoffre'; const dateTime = new Date().toLocaleString('fr-FR', { @@ -176,20 +176,20 @@ export default class WatermarkService { hour: '2-digit', minute: '2-digit' }); - + const fontSize = 10; const lineHeight = 12; // Space between lines - + // Calculate text widths (approximate - pdf-lib doesn't have a direct method for this) // Using a conservative estimate: ~6 points per character for 10pt font const estimatedTextWidth1 = text.length * 6; const estimatedTextWidth2 = dateTime.length * 6; const maxTextWidth = Math.max(estimatedTextWidth1, estimatedTextWidth2); - + // Position watermark with proper margins (20 points from edges) const x = width - maxTextWidth - 20; // 20 points from right edge const y = 20; // 20 points from bottom - + // Add watermark text with transparency (first line) page.drawText(text, { x: x, @@ -198,7 +198,7 @@ export default class WatermarkService { color: color, opacity: 0.7 }); - + // Add date/time with transparency (second line) page.drawText(dateTime, { x: x, diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 4a6ffe31..b75165d3 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -6,6 +6,7 @@ import EventBus from './EventBus'; import User from './User'; import MapUtils from './MapUtils'; + import { FileBlob } from '../front/Api/Entities/types'; export default class MessageBus { @@ -768,9 +769,6 @@ export default class MessageBus { console.error('[MessageBus] sendMessage: iframe not found'); return; } - if (message.type === 'VALIDATE_MERKLE_PROOF') { - console.log('[MessageBus] sendMessage:', message); - } iframe.contentWindow?.postMessage(message, targetOrigin); } @@ -807,8 +805,6 @@ export default class MessageBus { } const message = event.data; - // console.log('[MessageBus] handleMessage:', message); - switch (message.type) { case 'LISTENING': this.isListening = true; From 02091bf433385bcea4e9c8b7ca767d117257bf1d Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Tue, 8 Jul 2025 17:45:21 +0200 Subject: [PATCH 36/62] Fix some issues --- .../Api/LeCoffreApi/sdk/CustomerService.ts | 2 +- .../Api/LeCoffreApi/sdk/DocumentService.ts | 2 +- .../Api/LeCoffreApi/sdk/FolderService.ts | 34 ++++++++- src/front/Components/Elements/Tabs/index.tsx | 13 ++-- .../ClientView/DocumentTables/index.tsx | 69 +++++++------------ .../Folder/FolderInformation/index.tsx | 33 --------- 6 files changed, 63 insertions(+), 90 deletions(-) diff --git a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts index de3122e7..5f5622f0 100644 --- a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts +++ b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts @@ -7,7 +7,7 @@ export default class CustomerService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); - private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL private constructor() { } diff --git a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts index 5546a386..5879cbd8 100644 --- a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts +++ b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts @@ -7,7 +7,7 @@ export default class DocumentService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); - private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL private constructor() { } diff --git a/src/common/Api/LeCoffreApi/sdk/FolderService.ts b/src/common/Api/LeCoffreApi/sdk/FolderService.ts index c19d73ac..8779f6e9 100644 --- a/src/common/Api/LeCoffreApi/sdk/FolderService.ts +++ b/src/common/Api/LeCoffreApi/sdk/FolderService.ts @@ -5,12 +5,16 @@ import User from 'src/sdk/User'; import CustomerService from './CustomerService'; import DeedTypeService from './DeedTypeService'; +import DocumentTypeService from './DocumentTypeService'; +import DocumentService from './DocumentService'; +import FileService from './FileService'; +import NoteService from './NoteService'; export default class FolderService { private static readonly messageBus: MessageBus = MessageBus.getInstance(); - private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL + private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL private constructor() { } @@ -182,18 +186,44 @@ export default class FolderService { } resolve(customers); }); + + if (process.processData.customers && process.processData.customers.length > 0) { + const documents: any[] = (await DocumentService.getDocuments()).map((process: any) => process.processData); + for (const customer of process.processData.customers) { + customer.documents = documents.filter((document: any) => (document.depositor && document.depositor.uid === customer.uid) || (document.customer && document.customer.uid === customer.uid)); + + for (const document of customer.documents) { + if (document.document_type) { + document.document_type = (await DocumentTypeService.getDocumentTypeByUid(document.document_type.uid)).processData; + } + + if (document.files && document.files.length > 0) { + const files: any[] = []; + for (const file of document.files) { + files.push((await FileService.getFileByUid(file.uid)).processData); + } + document.files = files; + } + } + } + } } if (process.processData.deed && process.processData.deed.deed_type) { const p: any = await DeedTypeService.getDeedTypeByUid(process.processData.deed.deed_type.uid); process.processData.deed.deed_type = p.processData; - // Remove duplicates + // Remove duplicates - TODO: review - see getDeedTypeByUid - completeDeedType if (p.processData.document_types && p.processData.document_types.length > 0) { process.processData.deed.document_types = p.processData.document_types.filter((item: any, index: number) => p.processData.document_types.findIndex((t: any) => t.uid === item.uid) === index); } } + const notes: any[] = (await NoteService.getNotes()).map((process: any) => process.processData); + if (notes.length > 0) { + process.processData.notes = notes.filter((note: any) => note.folder.uid === process.processData.uid); + } + return process; } diff --git a/src/front/Components/Elements/Tabs/index.tsx b/src/front/Components/Elements/Tabs/index.tsx index 603cad29..e99cd955 100644 --- a/src/front/Components/Elements/Tabs/index.tsx +++ b/src/front/Components/Elements/Tabs/index.tsx @@ -58,13 +58,12 @@ export default function Tabs({ onSelect, tabs: propsTabs }: IProps) { useEffect(() => { tabs.current = propsTabs; - // TODO: review - setTimeout(() => { - calculateVisibleElements(); - if (tabs.current && tabs.current.length > 0 && tabs.current[0]) { - setSelectedTab(tabs.current[0].value); - } - }, 150); + if (tabs.current && tabs.current.length > 0 && tabs.current[0]) { + setSelectedTab(tabs.current[0].value); + onSelect(tabs.current[0].value); + + setTimeout(() => calculateVisibleElements(), 100); + } }, [propsTabs]); useEffect(() => { diff --git a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx index 526420c3..fa7e0e37 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/ClientView/DocumentTables/index.tsx @@ -18,11 +18,10 @@ import classes from "./classes.module.scss"; import DeleteAskedDocumentModal from "./DeleteAskedDocumentModal"; import DeleteSentDocumentModal from "./DeleteSentDocumentModal"; -import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; -import DocumentTypeService from "src/common/Api/LeCoffreApi/sdk/DocumentTypeService"; -import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; -import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; +import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; +import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; + import PdfService, { CertificateData, Metadata } from "@Front/Services/PdfService"; import MessageBus from "src/sdk/MessageBus"; @@ -56,33 +55,20 @@ export default function DocumentTables(props: IProps) { const fetchDocuments = useCallback( () => { - LoaderService.getInstance().show(); - DocumentService.getDocuments().then(async (processes: any[]) => { - if (processes.length > 0) { - let documents: any[] = processes.map((process: any) => process.processData); - - // FilterBy folder.uid & depositor.uid - documents = documents.filter((document: any) => document.folder.uid === folderUid && document.depositor && document.depositor.uid === customerUid); - - for (const document of documents) { - if (document.document_type) { - document.document_type = (await DocumentTypeService.getDocumentTypeByUid(document.document_type.uid)).processData; - } - - if (document.files && document.files.length > 0) { - const files: any[] = []; - for (const file of document.files) { - files.push((await FileService.getFileByUid(file.uid)).processData); - } - document.files = files; - } + setDocuments([]); + FolderService.getFolderByUid(folderUid).then((process: any) => { + if (process) { + const folder: any = process.processData; + const customer: any = folder.customers.find((customer: any) => customer.uid === customerUid); + if (customer && customer.documents) { + const documents: any[] = customer.documents.filter((document: any) => document.depositor); + setDocuments(documents); + } else { + setDocuments([]); } - - setDocuments(documents); } else { setDocuments([]); } - LoaderService.getInstance().hide(); }); }, [customerUid, folderUid], @@ -90,29 +76,20 @@ export default function DocumentTables(props: IProps) { const fetchDocumentsNotary = useCallback( () => { - LoaderService.getInstance().show(); - DocumentService.getDocuments().then(async (processes: any[]) => { - if (processes.length > 0) { - let documents: any[] = processes.map((process: any) => process.processData); - - // FilterBy folder.uid & customer.uid - documents = documents.filter((document: any) => document.folder.uid === folderUid && document.customer && document.customer.uid === customerUid); - - for (const document of documents) { - if (document.files && document.files.length > 0) { - const files: any[] = []; - for (const file of document.files) { - files.push((await FileService.getFileByUid(file.uid)).processData); - } - document.files = files; - } + setDocumentsNotary([]); + FolderService.getFolderByUid(folderUid).then((process: any) => { + if (process) { + const folder: any = process.processData; + const customer: any = folder.customers.find((customer: any) => customer.uid === customerUid); + if (customer && customer.documents) { + const documents: any[] = customer.documents.filter((document: any) => document.customer); + setDocumentsNotary(documents); + } else { + setDocumentsNotary([]); } - - setDocumentsNotary(documents); } else { setDocumentsNotary([]); } - LoaderService.getInstance().hide(); }); }, [customerUid, folderUid], diff --git a/src/front/Components/Layouts/Folder/FolderInformation/index.tsx b/src/front/Components/Layouts/Folder/FolderInformation/index.tsx index dfeadf48..a10f69ff 100644 --- a/src/front/Components/Layouts/Folder/FolderInformation/index.tsx +++ b/src/front/Components/Layouts/Folder/FolderInformation/index.tsx @@ -1,4 +1,3 @@ -import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders"; import OfficeFolderAnchors from "@Front/Api/LeCoffreApi/Notary/OfficeFolderAnchors/OfficeFolderAnchors"; import Loader from "@Front/Components/DesignSystem/Loader"; import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; @@ -22,9 +21,6 @@ import NoClientView from "./NoClientView"; import AnchoringProcessingInfo from "./elements/AnchoringProcessingInfo"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; -import NoteService from "src/common/Api/LeCoffreApi/sdk/NoteService"; -import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; -import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; export enum AnchorStatus { "VERIFIED_ON_CHAIN" = "VERIFIED_ON_CHAIN", @@ -112,35 +108,6 @@ export default function FolderInformation(props: IProps) { return FolderService.getFolderByUid(folderUid).then(async (process: any) => { if (process) { const folder: any = process.processData; - - await new Promise((resolve: () => void) => { - NoteService.getNotes().then((processes: any) => { - if (processes.length > 0) { - let notes: any[] = processes.map((process: any) => process.processData); - - // FilterBy folder.uid - notes = notes.filter((note: any) => note.folder.uid === folderUid); - - if (notes.length > 0) { - folder.notes = notes; - } - } - resolve(); - }); - }); - - await new Promise((resolve: () => void) => { - DocumentService.getDocuments().then((processes: any[]) => { - if (processes.length > 0) { - const documents: any[] = processes.map((process: any) => process.processData); - for (const customer of folder.customers) { - customer.documents = documents.filter((document: any) => document.depositor && document.depositor.uid === customer.uid); - } - } - resolve(); - }); - }); - setFolder(folder); } }); From f48240bea323b3436ed2ed427578721b7ac5834d Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Tue, 8 Jul 2025 19:35:08 +0200 Subject: [PATCH 37/62] Fix some issues --- .../Api/LeCoffreApi/sdk/AbstractService.ts | 75 ++++++++++++ .../Api/LeCoffreApi/sdk/CustomerService.ts | 85 +++---------- .../Api/LeCoffreApi/sdk/DeedTypeService.ts | 82 +++++++++---- .../Api/LeCoffreApi/sdk/DocumentService.ts | 85 +++---------- .../LeCoffreApi/sdk/DocumentTypeService.ts | 50 ++++++-- .../Api/LeCoffreApi/sdk/FolderService.ts | 114 +++++------------- .../DepositDocumentComponent/index.tsx | 5 +- 7 files changed, 247 insertions(+), 249 deletions(-) create mode 100644 src/common/Api/LeCoffreApi/sdk/AbstractService.ts diff --git a/src/common/Api/LeCoffreApi/sdk/AbstractService.ts b/src/common/Api/LeCoffreApi/sdk/AbstractService.ts new file mode 100644 index 00000000..c8224c89 --- /dev/null +++ b/src/common/Api/LeCoffreApi/sdk/AbstractService.ts @@ -0,0 +1,75 @@ +import { v4 as uuidv4 } from 'uuid'; + +import MessageBus from 'src/sdk/MessageBus'; + +export default abstract class AbstractService { + + protected static readonly messageBus: MessageBus = MessageBus.getInstance(); + + private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL + + protected constructor() { } + + protected static setItem(key: string, process: any): void { + const list: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + + const index: number = list.findIndex((item: any) => item.process.processData.uid === process.processData.uid); + if (index !== -1) { + list[index] = { + process: process, + timestamp: Date.now() + }; + } else { + list.push({ + process: process, + timestamp: Date.now() + }); + } + + sessionStorage.setItem(key, JSON.stringify(list)); + } + + protected static getItem(key: string, uid: string): any { + const list: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + if (list.length === 0) { + return null; + } + + const item: any = list.find((item: any) => item.process.processData.uid === uid); + if (!item) { + return null; + } + + const now = Date.now(); + if ((now - item.timestamp) < this.CACHE_TTL) { + return item.process; + } + + return null; + } + + protected static getItems(key: string): any[] { + const list: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + const now = Date.now(); + + const items: any[] = []; + for (const item of list) { + if (now - item.timestamp < this.CACHE_TTL) { + items.push(item.process); + } + } + + return items; + } + + protected static removeItem(key: string, uid: string): void { + const list: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); + + const index: number = list.findIndex((item: any) => item.process.processData.uid === uid); + if (index !== -1) { + list.splice(index, 1); + } + + sessionStorage.setItem(key, JSON.stringify(list)); + } +} diff --git a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts index 5f5622f0..5fecb25f 100644 --- a/src/common/Api/LeCoffreApi/sdk/CustomerService.ts +++ b/src/common/Api/LeCoffreApi/sdk/CustomerService.ts @@ -1,15 +1,14 @@ import { v4 as uuidv4 } from 'uuid'; -import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; -export default class CustomerService { +import AbstractService from './AbstractService'; - private static readonly messageBus: MessageBus = MessageBus.getInstance(); +export default class CustomerService extends AbstractService { - private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL - - private constructor() { } + private constructor() { + super(); + } public static createCustomer(customerData: any, validatorId: string): Promise { const ownerId = User.getInstance().getPairingId()!; @@ -81,15 +80,7 @@ export default class CustomerService { public static getCustomers(): Promise { // Check if we have valid cache - const cacheProcesses: any[] = []; - const now = Date.now(); - const customers: any[] = JSON.parse(sessionStorage.getItem('_customers_') || '[]'); - for (const customer of customers) { - if (now - customer.timestamp < this.CACHE_TTL) { - cacheProcesses.push(customer.process); - } - } - const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + const items: any[] = this.getItems('_customers_'); return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && @@ -97,28 +88,27 @@ export default class CustomerService { publicValues['utype'] === 'customer' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false' && - !cacheUids.includes(publicValues['uid']) + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) ).then((processes: any[]) => { if (processes.length === 0) { - return cacheProcesses; + return items; } else { for (const process of processes) { // Update cache - this.setCache(process); + this.setItem('_customers_', process); - cacheProcesses.push(process); + items.push(process); } - return cacheProcesses; + return items; } }); } public static getCustomerByUid(uid: string): Promise { // Check if we have valid cache - const now = Date.now(); - const cache: any = this.getCache(uid); - if (cache && (now - cache.timestamp) < this.CACHE_TTL) { - return Promise.resolve(cache.process); + const item: any = this.getItem('_customers_', uid); + if (item) { + return Promise.resolve(item); } return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { @@ -136,7 +126,7 @@ export default class CustomerService { const process: any = processes[0]; // Update cache - this.setCache(process); + this.setItem('_customers_', process); resolve(process); } @@ -151,7 +141,7 @@ export default class CustomerService { this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { const customerUid: string = process.processData.uid; - this.removeCache(customerUid); + this.removeItem('_customers_', customerUid); this.getCustomerByUid(customerUid).then(resolve).catch(reject); }).catch(reject); @@ -159,47 +149,4 @@ export default class CustomerService { }).catch(reject); }); } - - private static setCache(process: any): void { - const key: string = '_customers_'; - - const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = customers.findIndex((customer: any) => customer.process.processData.uid === process.processData.uid); - if (index !== -1) { - customers[index] = { - process: process, - timestamp: Date.now() - }; - } else { - customers.push({ - process: process, - timestamp: Date.now() - }); - } - - sessionStorage.setItem(key, JSON.stringify(customers)); - } - - private static getCache(uid: string): any { - const key: string = '_customers_'; - - const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - if (customers.length === 0) { - return null; - } - - return customers.find((customer: any) => customer.process.processData.uid === uid); - } - - private static removeCache(uid: string): void { - const key: string = '_customers_'; - - const customers: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = customers.findIndex((customer: any) => customer.process.processData.uid === uid); - if (index !== -1) { - customers.splice(index, 1); - } - - sessionStorage.setItem(key, JSON.stringify(customers)); - } } diff --git a/src/common/Api/LeCoffreApi/sdk/DeedTypeService.ts b/src/common/Api/LeCoffreApi/sdk/DeedTypeService.ts index 0a868b4c..722bb126 100644 --- a/src/common/Api/LeCoffreApi/sdk/DeedTypeService.ts +++ b/src/common/Api/LeCoffreApi/sdk/DeedTypeService.ts @@ -1,15 +1,15 @@ import { v4 as uuidv4 } from 'uuid'; -import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; +import AbstractService from './AbstractService'; import DocumentTypeService from './DocumentTypeService'; -export default class DeedTypeService { +export default class DeedTypeService extends AbstractService { - private static readonly messageBus: MessageBus = MessageBus.getInstance(); - - private constructor() { } + private constructor() { + super(); + } public static createDeedType(deedTypeData: any, validatorId: string): Promise { const ownerId = User.getInstance().getPairingId()!; @@ -72,7 +72,7 @@ export default class DeedTypeService { this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { - resolve(processCreated); + this.getDeedTypeByUid(processCreated.processData.uid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); @@ -80,29 +80,49 @@ export default class DeedTypeService { } public static getDeedTypes(): Promise { - return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['utype'] && publicValues['utype'] === 'deedType' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false'); + // Check if we have valid cache + const items: any[] = this.getItems('_deed_types_'); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'deedType' && + publicValues['isDeleted'] && publicValues['isDeleted'] === 'false' && + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) + ).then(async (processes: any[]) => { + if (processes.length === 0) { + return items; + } else { + for (let process of processes) { + process = await this.completeDeedType(process); + + // Update cache + this.setItem('_deed_types_', process); + + items.push(process); + } + return items; + } + }); } public static getDeedTypeByUid(uid: string, includeDocumentTypes: boolean = true): Promise { + // Check if we have valid cache + const item: any = this.getItem('_deed_types_', uid); + if (item) { + return Promise.resolve(item); + } + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['uid'] === uid && publicValues['utype'] && publicValues['utype'] === 'deedType' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false').then(async (processes: any[]) => { if (processes.length === 0) { resolve(null); } else { - const process: any = processes[0]; + let process: any = processes[0]; + process = await this.completeDeedType(process); - if (includeDocumentTypes && process.processData.document_types && process.processData.document_types.length > 0) { - process.processData.document_types = await new Promise(async (resolve: (document_types: any[]) => void) => { - let document_types: any[] = []; - for (const document_type of process.processData.document_types) { - const p: any = await DocumentTypeService.getDocumentTypeByUid(document_type.uid); - document_types.push(p.processData); - } - // Remove duplicates - document_types = document_types.filter((item: any, index: number) => document_types.findIndex((t: any) => t.uid === item.uid) === index); - resolve(document_types); - }); - } + // Update cache + this.setItem('_deed_types_', process); resolve(process); } @@ -116,10 +136,30 @@ export default class DeedTypeService { const newStateId: string = processUpdated.diffs[0]?.state_id; this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { - resolve(); + const deedTypeUid: string = process.processData.uid; + this.removeItem('_deed_types_', deedTypeUid); + + this.getDeedTypeByUid(deedTypeUid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); }); } + + private static async completeDeedType(process: any): Promise { + if (process.processData.document_types && process.processData.document_types.length > 0) { + process.processData.document_types = await new Promise(async (resolve: (document_types: any[]) => void) => { + let document_types: any[] = []; + for (const document_type of process.processData.document_types) { + document_types.push((await DocumentTypeService.getDocumentTypeByUid(document_type.uid)).processData); + } + + // Remove duplicates + document_types = document_types.filter((item: any, index: number) => document_types.findIndex((t: any) => t.uid === item.uid) === index); + resolve(document_types); + }); + } + + return process + } } diff --git a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts index 5879cbd8..1246f987 100644 --- a/src/common/Api/LeCoffreApi/sdk/DocumentService.ts +++ b/src/common/Api/LeCoffreApi/sdk/DocumentService.ts @@ -1,15 +1,14 @@ import { v4 as uuidv4 } from 'uuid'; -import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; -export default class DocumentService { +import AbstractService from './AbstractService'; - private static readonly messageBus: MessageBus = MessageBus.getInstance(); +export default class DocumentService extends AbstractService { - private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL - - private constructor() { } + private constructor() { + super(); + } public static createDocument(documentData: any, validatorId: string): Promise { const ownerId = User.getInstance().getPairingId()!; @@ -81,15 +80,7 @@ export default class DocumentService { public static getDocuments(): Promise { // Check if we have valid cache - const cacheProcesses: any[] = []; - const now = Date.now(); - const customers: any[] = JSON.parse(sessionStorage.getItem('_documents') || '[]'); - for (const customer of customers) { - if (now - customer.timestamp < this.CACHE_TTL) { - cacheProcesses.push(customer.process); - } - } - const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + const items: any[] = this.getItems('_documents_'); return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && @@ -97,28 +88,27 @@ export default class DocumentService { publicValues['utype'] === 'document' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false' && - !cacheUids.includes(publicValues['uid']) + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) ).then((processes: any[]) => { if (processes.length === 0) { - return cacheProcesses; + return items; } else { for (const process of processes) { // Update cache - this.setCache(process); + this.setItem('_documents_', process); - cacheProcesses.push(process); + items.push(process); } - return cacheProcesses; + return items; } }); } public static getDocumentByUid(uid: string): Promise { // Check if we have valid cache - const now = Date.now(); - const cache: any = this.getCache(uid); - if (cache && (now - cache.timestamp) < this.CACHE_TTL) { - return Promise.resolve(cache.process); + const item: any = this.getItem('_documents_', uid); + if (item) { + return Promise.resolve(item); } return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { @@ -136,7 +126,7 @@ export default class DocumentService { const process: any = processes[0]; // Update cache - this.setCache(process); + this.setItem('_documents_', process); resolve(process); } @@ -151,7 +141,7 @@ export default class DocumentService { this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { const documentUid: string = process.processData.uid; - this.removeCache(documentUid); + this.removeItem('_documents_', documentUid); this.getDocumentByUid(documentUid).then(resolve).catch(reject); }).catch(reject); @@ -159,47 +149,4 @@ export default class DocumentService { }).catch(reject); }); } - - private static setCache(process: any): void { - const key: string = '_documents_'; - - const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = documents.findIndex((document: any) => document.process.processData.uid === process.processData.uid); - if (index !== -1) { - documents[index] = { - process: process, - timestamp: Date.now() - }; - } else { - documents.push({ - process: process, - timestamp: Date.now() - }); - } - - sessionStorage.setItem(key, JSON.stringify(documents)); - } - - private static getCache(uid: string): any { - const key: string = '_documents_'; - - const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - if (documents.length === 0) { - return null; - } - - return documents.find((document: any) => document.process.processData.uid === uid); - } - - private static removeCache(uid: string): void { - const key: string = '_documents_'; - - const documents: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = documents.findIndex((document: any) => document.process.processData.uid === uid); - if (index !== -1) { - documents.splice(index, 1); - } - - sessionStorage.setItem(key, JSON.stringify(documents)); - } } diff --git a/src/common/Api/LeCoffreApi/sdk/DocumentTypeService.ts b/src/common/Api/LeCoffreApi/sdk/DocumentTypeService.ts index 1f663663..65eb32d6 100644 --- a/src/common/Api/LeCoffreApi/sdk/DocumentTypeService.ts +++ b/src/common/Api/LeCoffreApi/sdk/DocumentTypeService.ts @@ -1,13 +1,14 @@ import { v4 as uuidv4 } from 'uuid'; -import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; -export default class DocumentTypeService { +import AbstractService from './AbstractService'; - private static readonly messageBus: MessageBus = MessageBus.getInstance(); +export default class DocumentTypeService extends AbstractService { - private constructor() { } + private constructor() { + super(); + } public static createDocumentType(documentTypeData: any, validatorId: string): Promise { const ownerId = User.getInstance().getPairingId()!; @@ -70,7 +71,7 @@ export default class DocumentTypeService { this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { - resolve(processCreated); + this.getDocumentTypeByUid(processCreated.processData.uid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); @@ -78,16 +79,48 @@ export default class DocumentTypeService { } public static getDocumentTypes(): Promise { - return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['utype'] && publicValues['utype'] === 'documentType' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false'); + // Check if we have valid cache + const items: any[] = this.getItems('_document_types_'); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'documentType' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) + ).then(async (processes: any[]) => { + if (processes.length === 0) { + return items; + } else { + for (const process of processes) { + // Update cache + this.setItem('_document_types_', process); + + items.push(process); + } + return items; + } + }); } public static getDocumentTypeByUid(uid: string): Promise { + // Check if we have valid cache + const item: any = this.getItem('_document_types_', uid); + if (item) { + return Promise.resolve(item); + } + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && publicValues['uid'] === uid && publicValues['utype'] && publicValues['utype'] === 'documentType' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false').then((processes: any[]) => { if (processes.length === 0) { resolve(null); } else { const process: any = processes[0]; + + // Update cache + this.setItem('_document_types_', process); + resolve(process); } }).catch(reject); @@ -100,7 +133,10 @@ export default class DocumentTypeService { const newStateId: string = processUpdated.diffs[0]?.state_id; this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { - resolve(); + const documentTypeUid: string = process.processData.uid; + this.removeItem('_document_types_', documentTypeUid); + + this.getDocumentTypeByUid(documentTypeUid).then(resolve).catch(reject); }).catch(reject); }).catch(reject); }).catch(reject); diff --git a/src/common/Api/LeCoffreApi/sdk/FolderService.ts b/src/common/Api/LeCoffreApi/sdk/FolderService.ts index 8779f6e9..70a7f9aa 100644 --- a/src/common/Api/LeCoffreApi/sdk/FolderService.ts +++ b/src/common/Api/LeCoffreApi/sdk/FolderService.ts @@ -1,8 +1,8 @@ import { v4 as uuidv4 } from 'uuid'; -import MessageBus from 'src/sdk/MessageBus'; import User from 'src/sdk/User'; +import AbstractService from './AbstractService'; import CustomerService from './CustomerService'; import DeedTypeService from './DeedTypeService'; import DocumentTypeService from './DocumentTypeService'; @@ -10,13 +10,15 @@ import DocumentService from './DocumentService'; import FileService from './FileService'; import NoteService from './NoteService'; -export default class FolderService { +export default class FolderService extends AbstractService { - private static readonly messageBus: MessageBus = MessageBus.getInstance(); + private constructor() { + super(); + } - private static readonly CACHE_TTL = 45 * 60 * 1000; // 45 minutes cache TTL - - private constructor() { } + public static invalidateCache(uid: string): void { + this.removeItem('_folders_', uid); + } public static createFolder(folderData: any, stakeholdersId: string[], customersId: string[]): Promise { const ownerId = User.getInstance().getPairingId()!; @@ -94,15 +96,7 @@ export default class FolderService { public static getFolders(): Promise { // Check if we have valid cache - const cacheProcesses: any[] = []; - const now = Date.now(); - const folders: any[] = JSON.parse(sessionStorage.getItem('_folders_') || '[]'); - for (const folder of folders) { - if (now - folder.timestamp < this.CACHE_TTL) { - cacheProcesses.push(folder.process); - } - } - const cacheUids: string[] = cacheProcesses.map((process: any) => process.processData.uid); + const items: any[] = this.getItems('_folders_'); return this.messageBus.getProcessesDecoded((publicValues: any) => publicValues['uid'] && @@ -110,30 +104,29 @@ export default class FolderService { publicValues['utype'] === 'folder' && publicValues['isDeleted'] && publicValues['isDeleted'] === 'false' && - !cacheUids.includes(publicValues['uid']) + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) ).then(async (processes: any[]) => { if (processes.length === 0) { - return cacheProcesses; + return items; } else { - for (const process of processes) { - await this.completeFolder(process); + for (let process of processes) { + process = await this.completeFolder(process); // Update cache - this.setCache(process); + this.setItem('_folders_', process); - cacheProcesses.push(process); + items.push(process); } - return cacheProcesses; + return items; } }); } public static getFolderByUid(uid: string): Promise { // Check if we have valid cache - const now = Date.now(); - const cache: any = this.getCache(uid); - if (cache && (now - cache.timestamp) < this.CACHE_TTL) { - return Promise.resolve(cache.process); + const item: any = this.getItem('_folders_', uid); + if (item) { + return Promise.resolve(item); } return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { @@ -148,11 +141,11 @@ export default class FolderService { if (processes.length === 0) { resolve(null); } else { - const process: any = processes[0]; - await this.completeFolder(process); + let process: any = processes[0]; + process = await this.completeFolder(process); // Update cache - this.setCache(process); + this.setItem('_folders_', process); resolve(process); } @@ -167,7 +160,7 @@ export default class FolderService { this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { const folderUid: string = process.processData.uid; - this.removeCache(folderUid); + this.removeItem('_folders_', folderUid); this.getFolderByUid(folderUid).then(resolve).catch(reject); }).catch(reject); @@ -181,8 +174,7 @@ export default class FolderService { process.processData.customers = await new Promise(async (resolve: (customers: any[]) => void) => { const customers: any[] = []; for (const customer of process.processData.customers) { - const p: any = await CustomerService.getCustomerByUid(customer.uid); - customers.push(p.processData); + customers.push((await CustomerService.getCustomerByUid(customer.uid)).processData); } resolve(customers); }); @@ -200,7 +192,8 @@ export default class FolderService { if (document.files && document.files.length > 0) { const files: any[] = []; for (const file of document.files) { - files.push((await FileService.getFileByUid(file.uid)).processData); + const p: any = await FileService.getFileByUid(file.uid); + files.push({ uid: p.processData.uid, file_name: p.processData.file_name }); } document.files = files; } @@ -210,12 +203,12 @@ export default class FolderService { } if (process.processData.deed && process.processData.deed.deed_type) { - const p: any = await DeedTypeService.getDeedTypeByUid(process.processData.deed.deed_type.uid); - process.processData.deed.deed_type = p.processData; + const deed_type: any = (await DeedTypeService.getDeedTypeByUid(process.processData.deed.deed_type.uid)).processData; + process.processData.deed.deed_type = deed_type; - // Remove duplicates - TODO: review - see getDeedTypeByUid - completeDeedType - if (p.processData.document_types && p.processData.document_types.length > 0) { - process.processData.deed.document_types = p.processData.document_types.filter((item: any, index: number) => p.processData.document_types.findIndex((t: any) => t.uid === item.uid) === index); + if (deed_type.document_types && deed_type.document_types.length > 0) { + // Remove duplicates + process.processData.deed.document_types = deed_type.document_types.filter((item: any, index: number) => deed_type.document_types.findIndex((t: any) => t.uid === item.uid) === index); } } @@ -223,50 +216,7 @@ export default class FolderService { if (notes.length > 0) { process.processData.notes = notes.filter((note: any) => note.folder.uid === process.processData.uid); } - + return process; } - - private static setCache(process: any): void { - const key: string = '_folders_'; - - const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = folders.findIndex((folder: any) => folder.process.processData.uid === process.processData.uid); - if (index !== -1) { - folders[index] = { - process: process, - timestamp: Date.now() - }; - } else { - folders.push({ - process: process, - timestamp: Date.now() - }); - } - - sessionStorage.setItem(key, JSON.stringify(folders)); - } - - private static getCache(uid: string): any { - const key: string = '_folders_'; - - const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - if (folders.length === 0) { - return null; - } - - return folders.find((folder: any) => folder.process.processData.uid === uid); - } - - private static removeCache(uid: string): void { - const key: string = '_folders_'; - - const folders: any[] = JSON.parse(sessionStorage.getItem(key) || '[]'); - const index: number = folders.findIndex((folder: any) => folder.process.processData.uid === uid); - if (index !== -1) { - folders.splice(index, 1); - } - - sessionStorage.setItem(key, JSON.stringify(folders)); - } } diff --git a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx index 8c038057..7222ce23 100644 --- a/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/DepositDocumentComponent/index.tsx @@ -7,8 +7,10 @@ import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document"; import { ToasterService } from "@Front/Components/DesignSystem/Toaster"; import Confirm from "@Front/Components/DesignSystem/OldModal/Confirm"; -import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; +import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; +import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; + import { FileBlob, FileData } from "@Front/Api/Entities/types"; import WatermarkService from "@Front/Services/WatermarkService"; @@ -68,6 +70,7 @@ export default function DepositDocumentComponent(props: IProps) { DocumentService.getDocumentByUid(document.uid!).then((process: any) => { if (process) { const document: any = process.processData; + FolderService.invalidateCache(document.folder.uid); let files: any[] = document.files; if (!files) { From 09a2c85119eed72bce201ff48b887e2eab30a9a6 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Wed, 9 Jul 2025 08:34:48 +0200 Subject: [PATCH 38/62] Fix some issues --- .../LayoutTemplates/DefaultCustomerDashboard/index.tsx | 6 +++++- .../Layouts/ClientDashboard/ReceivedDocuments/index.tsx | 2 +- src/front/Components/Layouts/ClientDashboard/index.tsx | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx index b56f9238..1c8a8f2d 100644 --- a/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultCustomerDashboard/index.tsx @@ -51,7 +51,11 @@ export default function DefaultCustomerDashboard(props: IProps) { if (props.isReady) { FolderService.getFolders().then((processes: any[]) => { if (processes.length > 0) { - const folders: any[] = processes.map((process: any) => process.processData); + let folders: any[] = processes.map((process: any) => process.processData); + + // Filter By customer.uid + folders = folders.filter((folder: any) => folder.customers.some((customer: any) => customer.uid === profileUid)); + setFolders(folders); } }); diff --git a/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx b/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx index 4d6d7882..75071c0a 100644 --- a/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/ReceivedDocuments/index.tsx @@ -115,7 +115,7 @@ export default function ReceivedDocuments() { let documents: any[] = processes.map((process: any) => process.processData); // FilterBy folder.uid & customer.uid - documents = documents.filter((document: any) => document.folder.uid === folderUid && document.customer && document.customer.uid === customerUid); + documents = documents.filter((document: any) => document.folder.uid === folderUid && document.customer /*&& document.customer.uid === customerUid*/); for (const document of documents) { if (document.files && document.files.length > 0) { diff --git a/src/front/Components/Layouts/ClientDashboard/index.tsx b/src/front/Components/Layouts/ClientDashboard/index.tsx index 5c94d6f8..61acd009 100644 --- a/src/front/Components/Layouts/ClientDashboard/index.tsx +++ b/src/front/Components/Layouts/ClientDashboard/index.tsx @@ -139,6 +139,7 @@ export default function ClientDashboard(props: IProps) { const fetchDocuments = useCallback( async (customerUid: string | undefined) => { + setDocuments([]); LoaderService.getInstance().show(); return new Promise((resolve: () => void) => { DocumentService.getDocuments().then(async (processes: any[]) => { @@ -179,9 +180,9 @@ export default function ClientDashboard(props: IProps) { */ useEffect(() => { + setDocumentsNotary([]); const customerUid = customer?.uid; if (!folderUid || !customerUid) return; - LoaderService.getInstance().show(); DocumentService.getDocuments().then(async (processes: any[]) => { if (processes.length > 0) { From c8f6d625f840db2aa9c616a9e380aac1170ef7a6 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Wed, 9 Jul 2025 20:35:05 +0200 Subject: [PATCH 39/62] Fix some issues --- .../LeCoffreApi/sdk/CollaboratorService.ts | 152 ++++++++++ .../Api/LeCoffreApi/sdk/OfficeService.ts | 152 ++++++++++ src/front/Api/Auth/IdNot/index.ts | 4 +- .../DefaultCollaboratorDashboard/index.tsx | 28 +- .../DefaultRoleDashboard/index.tsx | 8 +- .../CollaboratorInformations/index.tsx | 28 ++ .../Layouts/LoginCallback/index.tsx | 284 +++++++++++++----- .../Layouts/Roles/RolesInformations/index.tsx | 4 +- src/front/Services/JwtService/JwtService.ts | 22 +- src/front/Stores/UserStore.ts | 28 +- src/middleware.ts | 2 + src/sdk/AuthModal.tsx | 18 +- 12 files changed, 594 insertions(+), 136 deletions(-) create mode 100644 src/common/Api/LeCoffreApi/sdk/CollaboratorService.ts create mode 100644 src/common/Api/LeCoffreApi/sdk/OfficeService.ts diff --git a/src/common/Api/LeCoffreApi/sdk/CollaboratorService.ts b/src/common/Api/LeCoffreApi/sdk/CollaboratorService.ts new file mode 100644 index 00000000..a071141d --- /dev/null +++ b/src/common/Api/LeCoffreApi/sdk/CollaboratorService.ts @@ -0,0 +1,152 @@ +import { v4 as uuidv4 } from 'uuid'; + +import User from 'src/sdk/User'; + +import AbstractService from './AbstractService'; + +export default class CollaboratorService extends AbstractService { + + private constructor() { + super(); + } + + public static createCollaborator(collaboratorData: any, validatorId: string): Promise { + const ownerId = User.getInstance().getPairingId()!; + + const processData: any = { + uid: uuidv4(), + utype: 'collaborator', + isDeleted: 'false', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + ...collaboratorData, + }; + + const privateFields: string[] = Object.keys(processData); + privateFields.splice(privateFields.indexOf('uid'), 1); + privateFields.splice(privateFields.indexOf('utype'), 1); + privateFields.splice(privateFields.indexOf('isDeleted'), 1); + + const roles: any = { + demiurge: { + members: [...[ownerId], validatorId], + validation_rules: [], + storages: [] + }, + owner: { + members: [ownerId], + validation_rules: [ + { + quorum: 0.5, + fields: [...privateFields, 'roles', 'uid', 'utype'], + min_sig_member: 1, + }, + ], + storages: [] + }, + validator: { + members: [validatorId], + validation_rules: [ + { + quorum: 0.5, + fields: ['idCertified', 'roles'], + min_sig_member: 1, + }, + { + quorum: 0.0, + fields: [...privateFields], + min_sig_member: 0, + }, + ], + storages: [] + }, + apophis: { + members: [ownerId], + validation_rules: [], + storages: [] + } + }; + + return new Promise((resolve: (processCreated: any) => void, reject: (error: string) => void) => { + this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { + this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { + this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { + this.getCollaboratorByUid(processCreated.processData.uid).then(resolve).catch(reject); + }).catch(reject); + }).catch(reject); + }).catch(reject); + }); + } + + public static getCollaborators(): Promise { + // Check if we have valid cache + const items: any[] = this.getItems('_collaborators_'); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'collaborator' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) + ).then((processes: any[]) => { + if (processes.length === 0) { + return items; + } else { + for (const process of processes) { + // Update cache + this.setItem('_collaborators_', process); + + items.push(process); + } + return items; + } + }); + } + + public static getCollaboratorByUid(uid: string): Promise { + // Check if we have valid cache + const item: any = this.getItem('_collaborators_', uid); + if (item) { + return Promise.resolve(item); + } + + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { + this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['uid'] === uid && + publicValues['utype'] && + publicValues['utype'] === 'collaborator' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' + ).then((processes: any[]) => { + if (processes.length === 0) { + resolve(null); + } else { + const process: any = processes[0]; + + // Update cache + this.setItem('_collaborators_', process); + + resolve(process); + } + }).catch(reject); + }); + } + + public static updateCollaborator(process: any, newData: any): Promise { + return new Promise((resolve: () => void, reject: (error: string) => void) => { + this.messageBus.updateProcess(process.processId, { updated_at: new Date().toISOString(), ...newData }, [], null).then((processUpdated: any) => { + const newStateId: string = processUpdated.diffs[0]?.state_id; + this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { + this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { + const collaboratorUid: string = process.processData.uid; + this.removeItem('_collaborators_', collaboratorUid); + + this.getCollaboratorByUid(collaboratorUid).then(resolve).catch(reject); + }).catch(reject); + }).catch(reject); + }).catch(reject); + }); + } +} diff --git a/src/common/Api/LeCoffreApi/sdk/OfficeService.ts b/src/common/Api/LeCoffreApi/sdk/OfficeService.ts new file mode 100644 index 00000000..eeed8a9e --- /dev/null +++ b/src/common/Api/LeCoffreApi/sdk/OfficeService.ts @@ -0,0 +1,152 @@ +import { v4 as uuidv4 } from 'uuid'; + +import User from 'src/sdk/User'; + +import AbstractService from './AbstractService'; + +export default class OfficeService extends AbstractService { + + private constructor() { + super(); + } + + public static createOffice(officeData: any, validatorId: string): Promise { + const ownerId = User.getInstance().getPairingId()!; + + const processData: any = { + uid: uuidv4(), + utype: 'office', + isDeleted: 'false', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + ...officeData, + }; + + const privateFields: string[] = Object.keys(processData); + privateFields.splice(privateFields.indexOf('uid'), 1); + privateFields.splice(privateFields.indexOf('utype'), 1); + privateFields.splice(privateFields.indexOf('isDeleted'), 1); + + const roles: any = { + demiurge: { + members: [...[ownerId], validatorId], + validation_rules: [], + storages: [] + }, + owner: { + members: [ownerId], + validation_rules: [ + { + quorum: 0.5, + fields: [...privateFields, 'roles', 'uid', 'utype'], + min_sig_member: 1, + }, + ], + storages: [] + }, + validator: { + members: [validatorId], + validation_rules: [ + { + quorum: 0.5, + fields: ['idCertified', 'roles'], + min_sig_member: 1, + }, + { + quorum: 0.0, + fields: [...privateFields], + min_sig_member: 0, + }, + ], + storages: [] + }, + apophis: { + members: [ownerId], + validation_rules: [], + storages: [] + } + }; + + return new Promise((resolve: (processCreated: any) => void, reject: (error: string) => void) => { + this.messageBus.createProcess(processData, privateFields, roles).then((processCreated: any) => { + this.messageBus.notifyUpdate(processCreated.processId, processCreated.process.states[0].state_id).then(() => { + this.messageBus.validateState(processCreated.processId, processCreated.process.states[0].state_id).then((_stateValidated: any) => { + this.getOfficeByUid(processCreated.processData.uid).then(resolve).catch(reject); + }).catch(reject); + }).catch(reject); + }).catch(reject); + }); + } + + public static getOffices(): Promise { + // Check if we have valid cache + const items: any[] = this.getItems('_offices_'); + + return this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['utype'] && + publicValues['utype'] === 'office' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' && + !items.map((item: any) => item.processData.uid).includes(publicValues['uid']) + ).then((processes: any[]) => { + if (processes.length === 0) { + return items; + } else { + for (const process of processes) { + // Update cache + this.setItem('_offices_', process); + + items.push(process); + } + return items; + } + }); + } + + public static getOfficeByUid(uid: string): Promise { + // Check if we have valid cache + const item: any = this.getItem('_offices_', uid); + if (item) { + return Promise.resolve(item); + } + + return new Promise((resolve: (process: any) => void, reject: (error: string) => void) => { + this.messageBus.getProcessesDecoded((publicValues: any) => + publicValues['uid'] && + publicValues['uid'] === uid && + publicValues['utype'] && + publicValues['utype'] === 'office' && + publicValues['isDeleted'] && + publicValues['isDeleted'] === 'false' + ).then((processes: any[]) => { + if (processes.length === 0) { + resolve(null); + } else { + const process: any = processes[0]; + + // Update cache + this.setItem('_offices_', process); + + resolve(process); + } + }).catch(reject); + }); + } + + public static updateDocument(process: any, newData: any): Promise { + return new Promise((resolve: () => void, reject: (error: string) => void) => { + this.messageBus.updateProcess(process.processId, { updated_at: new Date().toISOString(), ...newData }, [], null).then((processUpdated: any) => { + const newStateId: string = processUpdated.diffs[0]?.state_id; + this.messageBus.notifyUpdate(process.processId, newStateId).then(() => { + this.messageBus.validateState(process.processId, newStateId).then((_stateValidated) => { + const officeUid: string = process.processData.uid; + this.removeItem('_offices_', officeUid); + + this.getOfficeByUid(officeUid).then(resolve).catch(reject); + }).catch(reject); + }).catch(reject); + }).catch(reject); + }); + } +} diff --git a/src/front/Api/Auth/IdNot/index.ts b/src/front/Api/Auth/IdNot/index.ts index 5cd82e71..2aad0c33 100644 --- a/src/front/Api/Auth/IdNot/index.ts +++ b/src/front/Api/Auth/IdNot/index.ts @@ -40,7 +40,7 @@ export default class Auth extends BaseApiService { } } - public async getIdnotJwt(autorizationCode: string | string[]): Promise<{ accessToken: string; refreshToken: string }> { + public async getIdNotUser(autorizationCode: string | string[]): Promise<{ idNotUser: any }> { // const variables = FrontendVariables.getInstance(); // TODO: review @@ -48,7 +48,7 @@ export default class Auth extends BaseApiService { const url = new URL(`${baseBackUrl}/api/v1/idnot/user/${autorizationCode}`); try { - return await this.postRequest<{ accessToken: string; refreshToken: string }>(url); + return await this.postRequest<{ idNotUser: any }>(url); } catch (err) { this.onError(err); return Promise.reject(err); diff --git a/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx index c9818720..cc6db955 100644 --- a/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultCollaboratorDashboard/index.tsx @@ -2,11 +2,12 @@ import React, { useEffect } from "react"; import { useRouter } from "next/router"; import Module from "@Front/Config/Module"; +import UserStore from "@Front/Stores/UserStore"; import { IBlock } from "@Front/Components/DesignSystem/SearchBlockList/BlockList/Block"; import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDashboardWithList"; import User from "le-coffre-resources/dist/Notary"; -// import JwtService from "@Front/Services/JwtService/JwtService"; -// import Users, { IGetUsersparams } from "@Front/Api/LeCoffreApi/Admin/Users/Users"; + +import CollaboratorService from "src/common/Api/LeCoffreApi/sdk/CollaboratorService"; type IProps = IPropsDashboardWithList; @@ -33,7 +34,20 @@ export default function DefaultCollaboratorDashboard(props: IProps) { .get(query) .then((users) => setCollaborators(users)); */ - setCollaborators([]); + + const user: any = UserStore.instance.getUser(); + const officeUid: string = user.office.uid; + + CollaboratorService.getCollaborators().then((processes: any[]) => { + if (processes.length > 0) { + let collaborators: any[] = processes.map((process: any) => process.processData); + + // FilterBy office.uid + collaborators = collaborators.filter((collaborator: any) => collaborator.office.uid === officeUid); + + setCollaborators(collaborators); + } + }); }, []); const onSelectedBlock = (block: IBlock) => { @@ -49,10 +63,10 @@ export default function DefaultCollaboratorDashboard(props: IProps) { blocks={ collaborators ? collaborators.map((collaborator) => ({ - id: collaborator.uid!, - primaryText: collaborator.contact?.first_name + " " + collaborator.contact?.last_name, - isActive: collaborator.uid === collaboratorUid, - })) + id: collaborator.uid!, + primaryText: collaborator.contact?.first_name + " " + collaborator.contact?.last_name, + isActive: collaborator.uid === collaboratorUid, + })) : [] } /> diff --git a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx index 8e6215a4..b701b441 100644 --- a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx @@ -4,8 +4,6 @@ import { useRouter } from "next/router"; import Module from "@Front/Config/Module"; import { IBlock } from "@Front/Components/DesignSystem/SearchBlockList/BlockList/Block"; import DefaultDashboardWithList, { IPropsDashboardWithList } from "../DefaultDashboardWithList"; -import { OfficeRole } from "le-coffre-resources/dist/Notary"; -// import OfficeRoles, { IGetRolesParams } from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles"; import { v4 as uuidv4 } from 'uuid'; @@ -14,7 +12,7 @@ import RoleService from "src/common/Api/LeCoffreApi/sdk/RoleService"; type IProps = IPropsDashboardWithList; export default function DefaultRoleDashboard(props: IProps) { - const [roles, setRoles] = React.useState(null); + const [roles, setRoles] = React.useState(null); const router = useRouter(); const { roleUid } = router.query; useEffect(() => { @@ -112,12 +110,14 @@ export default function DefaultRoleDashboard(props: IProps) { const roles: any[] = processes.map((process: any) => process.processData); setRoles(roles); } else { + /* for (let role of roles) { const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; await RoleService.createRole(role, validatorId); } setRoles(roles); + */ } }); }, []); @@ -134,7 +134,7 @@ export default function DefaultRoleDashboard(props: IProps) { roles ? roles.map((role) => ({ id: role.uid!, - primaryText: role.name, + primaryText: role.label, isActive: role.uid === roleUid, })) : [] diff --git a/src/front/Components/Layouts/Collaborators/CollaboratorInformations/index.tsx b/src/front/Components/Layouts/Collaborators/CollaboratorInformations/index.tsx index 9e6553b0..4babe364 100644 --- a/src/front/Components/Layouts/Collaborators/CollaboratorInformations/index.tsx +++ b/src/front/Components/Layouts/Collaborators/CollaboratorInformations/index.tsx @@ -18,6 +18,9 @@ import { IOption } from "@Front/Components/DesignSystem/Dropdown/DropdownMenu/Dr import { getLabel } from "@Front/Components/DesignSystem/Dropdown"; import SelectField from "@Front/Components/DesignSystem/Form/SelectField"; +import CollaboratorService from "src/common/Api/LeCoffreApi/sdk/CollaboratorService"; +import RoleService from "src/common/Api/LeCoffreApi/sdk/RoleService"; + type IProps = {}; export default function CollaboratorInformations(props: IProps) { const router = useRouter(); @@ -120,6 +123,30 @@ export default function CollaboratorInformations(props: IProps) { useEffect(() => { async function getUser() { if (!collaboratorUid) return; + + CollaboratorService.getCollaboratorByUid(collaboratorUid as string).then(async (process: any) => { + if (process) { + const collaborator: any = process.processData; + + const roles: any[] = await new Promise((resolve: (roles: any[]) => void) => { + RoleService.getRoles().then((processes: any[]) => { + if (processes.length > 0) { + const roles: any[] = processes.map((process: any) => process.processData); + resolve(roles); + } + }); + }); + setAvailableRoles(roles.map((role) => ({ id: role.uid ?? "", label: role.label }))); + + setUserSelected(collaborator); + setSelectedOption({ + id: (collaborator?.office_role ? collaborator?.office_role?.uid : collaborator?.role?.uid) ?? "", + label: collaborator?.office_role ? collaborator?.office_role?.label : "Utilisateur restreint", + }); + } + }); + + /* const user = await Users.getInstance().getByUid(collaboratorUid as string, { q: { contact: true, @@ -142,6 +169,7 @@ export default function CollaboratorInformations(props: IProps) { id: (user?.office_role ? user?.office_role?.uid : user?.role?.uid) ?? "", label: user?.office_role ? user?.office_role?.name : "Utilisateur restreint", }); + */ } getUser(); diff --git a/src/front/Components/Layouts/LoginCallback/index.tsx b/src/front/Components/Layouts/LoginCallback/index.tsx index 5d6c3c45..9117561f 100644 --- a/src/front/Components/Layouts/LoginCallback/index.tsx +++ b/src/front/Components/Layouts/LoginCallback/index.tsx @@ -6,8 +6,6 @@ import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Ty import HelpBox from "@Front/Components/Elements/HelpBox"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import Module from "@Front/Config/Module"; -import CookieService from "@Front/Services/CookieService/CookieService"; -import JwtService from "@Front/Services/JwtService/JwtService"; import UserStore from "@Front/Stores/UserStore"; import Image from "next/image"; import { useRouter } from "next/router"; @@ -16,89 +14,213 @@ import classes from "./classes.module.scss"; import AuthModal from "src/sdk/AuthModal"; +import MessageBus from "src/sdk/MessageBus"; +import Iframe from "src/sdk/Iframe"; + +import OfficeService from "src/common/Api/LeCoffreApi/sdk/OfficeService"; +import RoleService from "src/common/Api/LeCoffreApi/sdk/RoleService"; +import CollaboratorService from "src/common/Api/LeCoffreApi/sdk/CollaboratorService"; + export default function LoginCallBack() { - const router = useRouter(); - const [isAuthModalOpen, setIsAuthModalOpen] = useState(false); + const router = useRouter(); + const [idNotUser, setIdNotUser] = useState(null); + const [isAuthModalOpen, setIsAuthModalOpen] = useState(false); + const [isConnected, setIsConnected] = useState(false); - useEffect(() => { - async function getUser() { - // TODO: review - // HACK: If start with http://local.lecoffreio.4nkweb:3000/authorized-client - // Replace with http://localhost:3000/authorized-client - if (window.location.href.startsWith('http://local.lecoffreio.4nkweb:3000/authorized-client')) { - window.location.href = window.location.href.replace('http://local.lecoffreio.4nkweb:3000/authorized-client', 'http://localhost:3000/authorized-client'); - return; - } + const getOffice = async (idNotUser: any) => { + return await new Promise((resolve: (office: any) => void) => { + OfficeService.getOffices().then((processes: any[]) => { + const officeFound: any = processes.length > 0 ? processes.map((process: any) => process.processData).find((office: any) => office.idNot === idNotUser.office.idNot) : null; + if (officeFound) { + resolve(officeFound); + } else { + const officeData: any = { + idNot: idNotUser.office.idNot, + name: idNotUser.office.name, + crpcen: idNotUser.office.crpcen, + address: { + create: { + address: idNotUser.office.address.address, + zip_code: idNotUser.office.address.zip_code, + city: idNotUser.office.address.city, + }, + }, + office_status: 'ACTIVATED' + }; + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; - const code = router.query["code"]; - if (code) { - try { - const token = await Auth.getInstance().getIdnotJwt(code as string); - if (!token) return router.push(Module.getInstance().get().modules.pages.Login.props.path); - await UserStore.instance.connect(token.accessToken, token.refreshToken); - const jwt = JwtService.getInstance().decodeJwt(); - if (!jwt) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); - if (jwt.rules && !jwt.rules.includes("GET folders")) { - return router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path); - } - setIsAuthModalOpen(true); - //return router.push(Module.getInstance().get().modules.pages.Folder.props.path); - return; - } catch (e: any) { - if (e.http_status === 401 && e.message === "Email not found") { - return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=3"); - } - if (e.http_status === 409) { - return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=4"); - } - return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); - } - } + OfficeService.createOffice(officeData, validatorId).then((process: any) => { + if (process) { + const office: any = process.processData; + resolve(office); + } + }); + } + }); + }); + }; - const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken"); - if (!refreshToken) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); - const isTokenRefreshed = await JwtService.getInstance().refreshToken(refreshToken); - const jwt = JwtService.getInstance().decodeJwt(); - if (!jwt) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); - if (!jwt.rules.includes("GET folders")) { - return router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path); - } - if (isTokenRefreshed) { - setIsAuthModalOpen(true); - //return router.push(Module.getInstance().get().modules.pages.Folder.props.path); - return; - } - return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=2"); - } - getUser(); - }), - [router]; + const getRole = async (idNotUser: any) => { + return await new Promise((resolve: (role: any) => void) => { + RoleService.getRoles().then((processes: any[]) => { + const roleFound: any = processes.length > 0 ? processes.map((process: any) => process.processData).find((role: any) => role.name === idNotUser.role.name) : null; + if (roleFound) { + resolve(roleFound); + } else { + const roleData: any = { + name: idNotUser.role!.name, + label: idNotUser.role!.label + }; + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; - return ( - -
-
- coffre - - Connexion à votre espace professionnel - -
+ RoleService.createRole(roleData, validatorId).then((process: any) => { + if (process) { + const role: any = process.processData; + resolve(role); + } + }); + } + }); + }); + }; - -
- - {isAuthModalOpen && { - setIsAuthModalOpen(false); - router.push(Module.getInstance().get().modules.pages.Folder.props.path); - }} - />} -
- - ); + const getCollaborator = async (collaboratorData: any) => { + return await new Promise((resolve: (role: any) => void) => { + CollaboratorService.getCollaborators().then((processes: any[]) => { + const collaboratorFound: any = processes.length > 0 ? processes.map((process: any) => process.processData).find((collaborator: any) => collaborator.idNot === idNotUser.idNot) : null; + if (collaboratorFound) { + resolve(collaboratorFound); + } else { + const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; + + CollaboratorService.createCollaborator(collaboratorData, validatorId).then((process: any) => { + if (process) { + const collaborator: any = process.processData; + resolve(collaborator); + } + }); + } + }); + }); + }; + + useEffect(() => { + async function getUser() { + UserStore.instance.disconnect(); + + // TODO: review + // HACK: If start with http://local.lecoffreio.4nkweb:3000/authorized-client + // Replace with http://localhost:3000/authorized-client + if (window.location.href.startsWith('http://local.lecoffreio.4nkweb:3000/authorized-client')) { + window.location.href = window.location.href.replace('http://local.lecoffreio.4nkweb:3000/authorized-client', 'http://localhost:3000/authorized-client'); + return; + } + + const code = router.query["code"]; + if (code) { + try { + const idNotUser: any = await Auth.getInstance().getIdNotUser(code as string); + setIdNotUser(idNotUser); + setIsAuthModalOpen(true); + /* + const token: any = null; + if (!token) return router.push(Module.getInstance().get().modules.pages.Login.props.path); + await UserStore.instance.connect(token.accessToken, token.refreshToken); + const jwt = JwtService.getInstance().decodeJwt(); + if (!jwt) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); + if (jwt.rules && !jwt.rules.includes("GET folders")) { + return router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path); + } + setIsAuthModalOpen(true); + //return router.push(Module.getInstance().get().modules.pages.Folder.props.path); + */ + return; + } catch (e: any) { + if (e.http_status === 401 && e.message === "Email not found") { + return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=3"); + } + if (e.http_status === 409) { + return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=4"); + } + return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); + } + } + /* + const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken"); + if (!refreshToken) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); + const isTokenRefreshed = await JwtService.getInstance().refreshToken(refreshToken); + const jwt = JwtService.getInstance().decodeJwt(); + if (!jwt) return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=1"); + if (!jwt.rules.includes("GET folders")) { + return router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path); + } + if (isTokenRefreshed) { + //setIsAuthModalOpen(true); + //return router.push(Module.getInstance().get().modules.pages.Folder.props.path); + return; + } + */ + return router.push(Module.getInstance().get().modules.pages.Login.props.path + "?error=2"); + } + getUser(); + }, [router]); + + return ( + +
+
+ coffre + + Connexion à votre espace professionnel + +
+ + +
+ + {isAuthModalOpen && { + setIsAuthModalOpen(false); + setIsConnected(true); + setTimeout(() => { + MessageBus.getInstance().initMessageListener(); + MessageBus.getInstance().isReady().then(async () => { + const office: any = await getOffice(idNotUser); + const role: any = await getRole(idNotUser); + + const collaboratorData: any = { + idNot: idNotUser.idNot, + contact: idNotUser.contact, + office: { + uid: office.uid + }, + role: { + uid: role.uid + } + }; + const collaborator: any = await getCollaborator(collaboratorData); + collaborator.office = office; + collaborator.role = role; + UserStore.instance.connect(collaborator); + + MessageBus.getInstance().destroyMessageListener(); + /* + if (jwt.rules && !jwt.rules.includes("GET folders")) { + router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path); + } + */ + router.push(Module.getInstance().get().modules.pages.Folder.props.path); + }); + }, 100); + }} + />} + {isConnected &&