diff --git a/.github/workflows/backend-cd.yml b/.github/workflows/backend-cd.yml
index 78256a2..29d0502 100644
--- a/.github/workflows/backend-cd.yml
+++ b/.github/workflows/backend-cd.yml
@@ -116,6 +116,7 @@ jobs:
INSTANCE_ID="${{ steps.cf.outputs.instance_id }}"
IMAGE_URI="${{ steps.cf.outputs.ecr_repo_uri }}:${{ github.sha }}"
REGION="us-east-1"
+ MONGO_PARAM="${{ steps.cf.outputs.mongo_param_name }}"
# <= 100 chars
COMMENT="Deploy backend ${GITHUB_SHA::7}"
@@ -128,32 +129,44 @@ jobs:
HOST_PORT="3000"
CONTAINER_PORT="3000"
IMAGE_URI="__IMAGE_URI__"
+ MONGO_PARAM="__MONGO_PARAM__"
+ NODE_ENV_VALUE="production"
- echo "[1/6] Ensure docker is running"
+ echo "[1/7] Fetch Mongo URI from SSM"
+ MONGO_URI="$(aws ssm get-parameter --name "$MONGO_PARAM" --with-decryption --query 'Parameter.Value' --output text)"
+ if [ -z "$MONGO_URI" ] || [ "$MONGO_URI" = "None" ]; then
+ echo "Mongo URI is empty; aborting deploy"
+ exit 1
+ fi
+
+ echo "[2/7] Ensure docker is running"
sudo systemctl start docker || true
- echo "[2/6] Login to ECR"
+ echo "[3/7] Login to ECR"
aws ecr get-login-password --region "$REGION" | sudo docker login --username AWS --password-stdin "$(echo "$IMAGE_URI" | cut -d/ -f1)"
- echo "[3/6] Pull image"
+ echo "[4/7] Pull image"
sudo docker pull "$IMAGE_URI"
- echo "[4/6] Stop/remove old container if exists"
+ echo "[5/7] Stop/remove old container if exists"
sudo docker rm -f "$APP_NAME" || true
- echo "[5/6] Run new container"
+ echo "[6/7] Run new container"
sudo docker run -d \
--name "$APP_NAME" \
--restart unless-stopped \
-p "${HOST_PORT}:${CONTAINER_PORT}" \
+ -e MONGO_URI="$MONGO_URI" \
+ -e NODE_ENV="$NODE_ENV_VALUE" \
"$IMAGE_URI"
- echo "[6/6] Show running container"
+ echo "[7/7] Show running container"
sudo docker ps --filter "name=$APP_NAME" --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
EOF
)
SCRIPT="${SCRIPT/__IMAGE_URI__/$IMAGE_URI}"
+ SCRIPT="${SCRIPT/__MONGO_PARAM__/$MONGO_PARAM}"
PARAMS="$(jq -n --arg cmd "$SCRIPT" '{commands:[$cmd]}')"
CMD_ID="$(aws ssm send-command \
diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml
index a056dd6..bef19e7 100644
--- a/.github/workflows/backend-ci.yml
+++ b/.github/workflows/backend-ci.yml
@@ -1,4 +1,4 @@
-name: CI - Backend (PR Validation)
+name: CI Backend
on:
pull_request:
@@ -17,7 +17,6 @@ permissions:
contents: read
jobs:
backend:
- name: backend checks
runs-on: ubuntu-latest
timeout-minutes: 20
diff --git a/.github/workflows/cdk-synth.yml b/.github/workflows/cdk-synth.yml
index 16ce84a..c9452e4 100644
--- a/.github/workflows/cdk-synth.yml
+++ b/.github/workflows/cdk-synth.yml
@@ -1,4 +1,4 @@
-name: CI - Infra (CDK Synth)
+name: CI Infra
on:
pull_request:
@@ -17,7 +17,6 @@ permissions:
contents: read
jobs:
synth:
- name: cdk synth (localSynth)
runs-on: ubuntu-latest
timeout-minutes: 20
diff --git a/.github/workflows/frontend-cd.yml b/.github/workflows/frontend-cd.yml
index b00a6e3..ed2b8ec 100644
--- a/.github/workflows/frontend-cd.yml
+++ b/.github/workflows/frontend-cd.yml
@@ -1,120 +1,129 @@
name: CD - Frontend (S3 + CloudFront Deploy) [Manual]
on:
- workflow_dispatch:
- push:
- branches: [master]
- paths:
- - "frontend/**"
- - "package.json"
- - "package-lock.json"
- - ".github/workflows/frontend-cd.yml"
+ workflow_dispatch:
+ push:
+ branches: [master]
+ paths:
+ - "frontend/**"
+ - "package.json"
+ - "package-lock.json"
+ - ".github/workflows/frontend-cd.yml"
concurrency:
- group: cd-frontend-${{ github.ref }}
- cancel-in-progress: true
+ group: cd-frontend-${{ github.ref }}
+ cancel-in-progress: true
permissions:
- id-token: write
- contents: read
+ id-token: write
+ contents: read
jobs:
- deploy:
- name: Deploy frontend to S3 + invalidate CloudFront
- runs-on: ubuntu-latest
- timeout-minutes: 30
-
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Check if frontend exists
- id: fe
- run: |
- if [ -f "frontend/package.json" ]; then
- echo "exists=true" >> "$GITHUB_OUTPUT"
- else
- echo "exists=false" >> "$GITHUB_OUTPUT"
- fi
-
- - name: Configure AWS credentials (OIDC)
- uses: aws-actions/configure-aws-credentials@v4
- with:
- role-to-assume: ${{ secrets.AWS_GHA_ROLE_ARN }}
- aws-region: us-east-1
-
- - name: Resolve CloudFormation outputs (bucket + distribution)
- id: cf
- run: |
- set -euo pipefail
- STACK="ComptaleyesFrontendStack"
-
- BUCKET_NAME="$(aws cloudformation describe-stacks \
- --stack-name "$STACK" \
- --query "Stacks[0].Outputs[?OutputKey=='FrontendBucketName'].OutputValue | [0]" \
- --output text)"
-
- DIST_ID="$(aws cloudformation describe-stacks \
- --stack-name "$STACK" \
- --query "Stacks[0].Outputs[?OutputKey=='CloudFrontDistributionId'].OutputValue | [0]" \
- --output text)"
-
- if [ -z "$BUCKET_NAME" ] || [ "$BUCKET_NAME" = "None" ]; then
- echo "Missing FrontendBucketName output in $STACK"
- exit 1
- fi
-
- if [ -z "$DIST_ID" ] || [ "$DIST_ID" = "None" ]; then
- echo "Missing CloudFrontDistributionId output in $STACK"
- exit 1
- fi
-
- echo "bucket_name=$BUCKET_NAME" >> "$GITHUB_OUTPUT"
- echo "distribution_id=$DIST_ID" >> "$GITHUB_OUTPUT"
-
- # This will only run once frontend/package.json exists.
- - name: Setup Node
- if: steps.fe.outputs.exists == 'true'
- uses: actions/setup-node@v4
- with:
- node-version: "22"
- cache: "npm"
-
- - name: Install (workspaces)
- if: steps.fe.outputs.exists == 'true'
- run: npm ci
-
- - name: Build frontend (placeholder)
- if: steps.fe.outputs.exists == 'true'
- run: npm -w frontend run build
-
- - name: Verify build output exists (placeholder expects frontend/dist)
- if: steps.fe.outputs.exists == 'true'
- run: |
- set -euo pipefail
- if [ ! -d "frontend/dist" ]; then
- echo "Expected build output folder frontend/dist not found."
- echo "When you create the frontend, ensure the build outputs to frontend/dist, or update this workflow."
- exit 1
- fi
-
- - name: Deploy to S3 (sync)
- if: steps.fe.outputs.exists == 'true'
- run: |
- set -euo pipefail
- aws s3 sync "frontend/dist" "s3://${{ steps.cf.outputs.bucket_name }}" --delete
-
- - name: Invalidate CloudFront
- if: steps.fe.outputs.exists == 'true'
- run: |
- set -euo pipefail
- aws cloudfront create-invalidation \
- --distribution-id "${{ steps.cf.outputs.distribution_id }}" \
- --paths "/*"
-
- - name: Skip (frontend not initialized yet)
- if: steps.fe.outputs.exists != 'true'
- run: |
- echo "frontend/package.json not found; frontend CD is intentionally a placeholder."
- echo "CloudFormation lookup succeeded (infra is ready)."
- echo "Once frontend exists, re-run this workflow."
+ deploy:
+ name: Deploy frontend to S3 + invalidate CloudFront
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ env:
+ API_BASE_URL: ${{ secrets.FRONTEND_API_BASE_URL }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Check if frontend exists
+ id: fe
+ run: |
+ if [ -f "frontend/package.json" ]; then
+ echo "exists=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "exists=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Configure AWS credentials (OIDC)
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: ${{ secrets.AWS_GHA_ROLE_ARN }}
+ aws-region: us-east-1
+
+ - name: Resolve CloudFormation outputs (bucket + distribution)
+ id: cf
+ run: |
+ set -euo pipefail
+ STACK="ComptaleyesFrontendStack"
+
+ BUCKET_NAME="$(aws cloudformation describe-stacks \
+ --stack-name "$STACK" \
+ --query "Stacks[0].Outputs[?OutputKey=='FrontendBucketName'].OutputValue | [0]" \
+ --output text)"
+
+ DIST_ID="$(aws cloudformation describe-stacks \
+ --stack-name "$STACK" \
+ --query "Stacks[0].Outputs[?OutputKey=='CloudFrontDistributionId'].OutputValue | [0]" \
+ --output text)"
+
+ if [ -z "$BUCKET_NAME" ] || [ "$BUCKET_NAME" = "None" ]; then
+ echo "Missing FrontendBucketName output in $STACK"
+ exit 1
+ fi
+
+ if [ -z "$DIST_ID" ] || [ "$DIST_ID" = "None" ]; then
+ echo "Missing CloudFrontDistributionId output in $STACK"
+ exit 1
+ fi
+
+ echo "bucket_name=$BUCKET_NAME" >> "$GITHUB_OUTPUT"
+ echo "distribution_id=$DIST_ID" >> "$GITHUB_OUTPUT"
+
+ # This will only run once frontend/package.json exists.
+ - name: Setup Node
+ if: steps.fe.outputs.exists == 'true'
+ uses: actions/setup-node@v4
+ with:
+ node-version: "22"
+ cache: "npm"
+
+ - name: Install (workspaces)
+ if: steps.fe.outputs.exists == 'true'
+ run: npm ci
+
+ - name: Build frontend (placeholder)
+ if: steps.fe.outputs.exists == 'true'
+ run: npm -w frontend run build
+
+ - name: Write frontend env (Vite)
+ if: steps.fe.outputs.exists == 'true'
+ run: |
+ set -euo pipefail
+ : "${API_BASE_URL:?Set FRONTEND_API_BASE_URL secret to your backend URL}"
+ echo "VITE_BACKEND_URL=${API_BASE_URL}" >> frontend/.env.production
+
+ - name: Verify build output exists (placeholder expects frontend/dist)
+ if: steps.fe.outputs.exists == 'true'
+ run: |
+ set -euo pipefail
+ if [ ! -d "frontend/dist" ]; then
+ echo "Expected build output folder frontend/dist not found."
+ echo "When you create the frontend, ensure the build outputs to frontend/dist, or update this workflow."
+ exit 1
+ fi
+
+ - name: Deploy to S3 (sync)
+ if: steps.fe.outputs.exists == 'true'
+ run: |
+ set -euo pipefail
+ aws s3 sync "frontend/dist" "s3://${{ steps.cf.outputs.bucket_name }}" --delete
+
+ - name: Invalidate CloudFront
+ if: steps.fe.outputs.exists == 'true'
+ run: |
+ set -euo pipefail
+ aws cloudfront create-invalidation \
+ --distribution-id "${{ steps.cf.outputs.distribution_id }}" \
+ --paths "/*"
+
+ - name: Skip (frontend not initialized yet)
+ if: steps.fe.outputs.exists != 'true'
+ run: |
+ echo "frontend/package.json not found; frontend CD is intentionally a placeholder."
+ echo "CloudFormation lookup succeeded (infra is ready)."
+ echo "Once frontend exists, re-run this workflow."
diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml
index 7db8caf..3fe9cb5 100644
--- a/.github/workflows/frontend-ci.yml
+++ b/.github/workflows/frontend-ci.yml
@@ -1,4 +1,4 @@
-name: CI - Frontend (PR Validation)
+name: CI Frontend
on:
pull_request:
@@ -17,7 +17,6 @@ permissions:
contents: read
jobs:
frontend:
- name: frontend checks
runs-on: ubuntu-latest
timeout-minutes: 20
diff --git a/frontend/index.html b/frontend/index.html
index 072a57e..c625614 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -2,9 +2,9 @@
-
+
- frontend
+ Comptaleyes
diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png
new file mode 100644
index 0000000..ac83eb1
Binary files /dev/null and b/frontend/public/favicon.png differ
diff --git a/frontend/public/logo.png b/frontend/public/logo.png
new file mode 100644
index 0000000..0cde2ab
Binary files /dev/null and b/frontend/public/logo.png differ
diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/frontend/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/frontend/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index 81794a0..27d5f6f 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -14,7 +14,7 @@ import { resources } from './i18n/loadAll';
const authConfig = {
baseUrl: import.meta.env.VITE_BACKEND_URL,
brandName: 'Comptaleyes',
- logoUrl: 'https://cdn-icons-png.flaticon.com/512/11027/11027014.png',
+ logoUrl: '/favicon.png',
oauthProviders: ['google', 'microsoft'],
colors: {
bg: 'bg-neutral-900', // ~ #1F1F1F
@@ -37,5 +37,15 @@ createRoot(document.getElementById('root')!).render(
+
+
+
+
+
+
+
+
+
+
,
);
diff --git a/frontend/src/pages/Loading.tsx b/frontend/src/pages/Loading.tsx
index 834fe87..ddccf39 100644
--- a/frontend/src/pages/Loading.tsx
+++ b/frontend/src/pages/Loading.tsx
@@ -25,12 +25,7 @@ export default function Loading() {
style={{ backgroundColor: 'rgb(23, 23, 23)' }}
className="min-h-screen flex flex-col items-center justify-center"
>
-
+
COMPTALEYES
);
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index fc5fbed..d1852dd 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -9,6 +9,7 @@ const __dirname = path.dirname(__filename);
export default defineConfig({
plugins: [react()],
+ publicDir: 'public',
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
diff --git a/package-lock.json b/package-lock.json
index 573bd98..689fbc6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
"frontend"
],
"devDependencies": {
+ "concurrently": "^9.1.0",
"husky": "^9.1.7",
"lint-staged": "^16.2.7"
}
@@ -20,22 +21,18 @@
"version": "0.0.1",
"license": "UNLICENSED",
"dependencies": {
- "@ciscode/authentication-kit": "^1.2.1",
"@ciscode/authentication-kit": "^1.2.1",
"@nestjs/common": "^11.0.1",
"@nestjs/core": "^11.0.1",
"@nestjs/mongoose": "^11.0.4",
- "@nestjs/mongoose": "^11.0.4",
"@nestjs/platform-express": "^11.0.1",
"@nestjs/swagger": "^11.2.4",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.3",
"compression": "^1.8.1",
"dotenv": "^17.2.3",
- "dotenv": "^17.2.3",
"helmet": "^8.1.0",
"mongoose": "^9.1.5",
- "mongoose": "^9.1.5",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1",
"swagger-ui-express": "^5.0.1",
@@ -1026,9 +1023,9 @@
}
},
"node_modules/@ciscode/ui-authentication-kit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@ciscode/ui-authentication-kit/-/ui-authentication-kit-1.0.0.tgz",
- "integrity": "sha512-YDCkEsq/yiZVj6CdgKsr9m1wVXCMB0ktWYtWE3Pa4YwVmQ05V8s6Lg9UKeHcKAJYGn1ig4f0stDd+FNAxkoeQA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@ciscode/ui-authentication-kit/-/ui-authentication-kit-1.0.2.tgz",
+ "integrity": "sha512-2sqfAa5jGaXIDPayY7BkT2Gh+RT5DSAHVd+4Wr+D42ZwVqMyOaD3CvsQ7ZKyEbrOXsdwicgV1Ya1v9Xlg7ahBg==",
"license": "ISC",
"peerDependencies": {
"@ciscode/ui-translate-core": "^1.0.0",
@@ -1992,29 +1989,6 @@
"node": ">=8"
}
},
- "node_modules/@inquirer/core/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@inquirer/core/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -2374,6 +2348,19 @@
"node": ">=12"
}
},
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -2920,15 +2907,6 @@
"sparse-bitfield": "^3.0.3"
}
},
- "node_modules/@mongodb-js/saslprep": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.5.tgz",
- "integrity": "sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw==",
- "license": "MIT",
- "dependencies": {
- "sparse-bitfield": "^3.0.3"
- }
- },
"node_modules/@napi-rs/nice": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz",
@@ -3485,18 +3463,6 @@
"rxjs": "^7.0.0"
}
},
- "node_modules/@nestjs/mongoose": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-11.0.4.tgz",
- "integrity": "sha512-LUOlUeSOfbjdIu22QwOmczv2CzJQr9LUBo2mOfbXrGCu2svpr5Hiu71zBFrb/9UC+H8BjGMKbBOq1nEbMF6ZJA==",
- "license": "MIT",
- "peerDependencies": {
- "@nestjs/common": "^10.0.0 || ^11.0.0",
- "@nestjs/core": "^10.0.0 || ^11.0.0",
- "mongoose": "^7.0.0 || ^8.0.0 || ^9.0.0",
- "rxjs": "^7.0.0"
- }
- },
"node_modules/@nestjs/platform-express": {
"version": "11.1.12",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.12.tgz",
@@ -5031,16 +4997,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/jsonwebtoken": {
- "version": "9.0.10",
- "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
- "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*",
- "@types/node": "*"
- }
- },
"node_modules/@types/methods": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
@@ -5054,12 +5010,6 @@
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"license": "MIT"
},
- "node_modules/@types/ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
- "license": "MIT"
- },
"node_modules/@types/node": {
"version": "22.19.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz",
@@ -5198,21 +5148,6 @@
"@types/webidl-conversions": "*"
}
},
- "node_modules/@types/webidl-conversions": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
- "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
- "license": "MIT"
- },
- "node_modules/@types/whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==",
- "license": "MIT",
- "dependencies": {
- "@types/webidl-conversions": "*"
- }
- },
"node_modules/@types/yargs": {
"version": "17.0.35",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
@@ -6549,13 +6484,16 @@
}
},
"node_modules/ansi-styles": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
- "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
@@ -7460,19 +7398,10 @@
"node": ">=6.0.0"
}
},
- "node_modules/base64url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
- "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/baseline-browser-mapping": {
- "version": "2.9.18",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz",
- "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==",
+ "version": "2.9.19",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
+ "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -7485,12 +7414,6 @@
"integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
"license": "MIT"
},
- "node_modules/bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
- "license": "MIT"
- },
"node_modules/bin-version": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz",
@@ -7677,15 +7600,6 @@
"node": ">=20.19.0"
}
},
- "node_modules/bson": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/bson/-/bson-7.1.1.tgz",
- "integrity": "sha512-TtJgBB+QyOlWjrbM+8bRgH84VM/xrDjyBFgSgGrfZF4xvt6gbEDtcswm27Tn9F9TWsjQybxT8b8VpCP/oJK4Dw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=20.19.0"
- }
- },
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -7727,12 +7641,6 @@
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
"license": "BSD-3-Clause"
},
- "node_modules/buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "license": "BSD-3-Clause"
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -7903,20 +7811,17 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/chalk/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/char-regex": {
@@ -8057,13 +7962,6 @@
"node": ">=8"
}
},
- "node_modules/cli-table3/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -8154,29 +8052,6 @@
"node": ">=8"
}
},
- "node_modules/cliui/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cliui/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -8409,6 +8284,31 @@
"typedarray": "^0.0.6"
}
},
+ "node_modules/concurrently": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
+ "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "4.1.2",
+ "rxjs": "7.8.2",
+ "shell-quote": "1.8.3",
+ "supports-color": "8.1.1",
+ "tree-kill": "1.2.2",
+ "yargs": "17.7.2"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
"node_modules/consola": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
@@ -9476,22 +9376,6 @@
"source-map": "^0.6.0"
}
},
- "node_modules/create-jest/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
"node_modules/create-jest/node_modules/type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
@@ -9890,15 +9774,6 @@
"safe-buffer": "^5.0.1"
}
},
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -9926,9 +9801,9 @@
}
},
"node_modules/emoji-regex": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
- "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true,
"license": "MIT"
},
@@ -11325,26 +11200,6 @@
}
}
},
- "node_modules/follow-redirects": {
- "version": "1.15.11",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
"node_modules/for-each": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
@@ -12900,6 +12755,19 @@
"node": ">=10"
}
},
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/istanbul-lib-source-maps": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
@@ -13637,26 +13505,10 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/jest/node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "node_modules/jest/node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14765,22 +14617,6 @@
"node": ">=8"
}
},
- "node_modules/jest/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
"node_modules/jest/node_modules/type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
@@ -14950,40 +14786,6 @@
"node": ">=10"
}
},
- "node_modules/jsonwebtoken": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
- "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
- "license": "MIT",
- "dependencies": {
- "jws": "^4.0.1",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">=12",
- "npm": ">=6"
- }
- },
- "node_modules/jsonwebtoken/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/jsx-ast-utils": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
@@ -15134,11 +14936,6 @@
"resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
"integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="
},
- "node_modules/limiter": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
- "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="
- },
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -15282,48 +15079,6 @@
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
"license": "MIT"
},
- "node_modules/lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
- "license": "MIT"
- },
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
- "license": "MIT"
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
- "license": "MIT"
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
- "license": "MIT"
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "license": "MIT"
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "license": "MIT"
- },
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -15344,12 +15099,6 @@
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
"license": "MIT"
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "license": "MIT"
- },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -16028,15 +15777,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/nodemailer": {
- "version": "6.10.1",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz",
- "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==",
- "license": "MIT-0",
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -16079,12 +15819,6 @@
"integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==",
"license": "MIT"
},
- "node_modules/oauth": {
- "version": "0.9.15",
- "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
- "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==",
- "license": "MIT"
- },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -16631,131 +16365,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/passport": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
- "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
- "license": "MIT",
- "dependencies": {
- "passport-strategy": "1.x.x",
- "pause": "0.0.1",
- "utils-merge": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/jaredhanson"
- }
- },
- "node_modules/passport-azure-ad-oauth2": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/passport-azure-ad-oauth2/-/passport-azure-ad-oauth2-0.0.4.tgz",
- "integrity": "sha512-yjwi0qXzGPIrR8yI5mBql2wO6tf/G5+HAFllkwwZ6f2EBCVvRv5z+6CwQeBvlrDbFh8RCXdj/IfB17r8LYDQQQ==",
- "dependencies": {
- "passport-oauth": "1.0.x"
- }
- },
- "node_modules/passport-facebook": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/passport-facebook/-/passport-facebook-3.0.0.tgz",
- "integrity": "sha512-K/qNzuFsFISYAyC1Nma4qgY/12V3RSLFdFVsPKXiKZt434wOvthFW1p7zKa1iQihQMRhaWorVE1o3Vi1o+ZgeQ==",
- "license": "MIT",
- "dependencies": {
- "passport-oauth2": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/passport-google-oauth20": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz",
- "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==",
- "license": "MIT",
- "dependencies": {
- "passport-oauth2": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/passport-local": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
- "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
- "dependencies": {
- "passport-strategy": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/passport-oauth": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz",
- "integrity": "sha512-4IZNVsZbN1dkBzmEbBqUxDG8oFOIK81jqdksE3HEb/vI3ib3FMjbiZZ6MTtooyYZzmKu0BfovjvT1pdGgIq+4Q==",
- "dependencies": {
- "passport-oauth1": "1.x.x",
- "passport-oauth2": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/passport-oauth1": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.3.0.tgz",
- "integrity": "sha512-8T/nX4gwKTw0PjxP1xfD0QhrydQNakzeOpZ6M5Uqdgz9/a/Ag62RmJxnZQ4LkbdXGrRehQHIAHNAu11rCP46Sw==",
- "license": "MIT",
- "dependencies": {
- "oauth": "0.9.x",
- "passport-strategy": "1.x.x",
- "utils-merge": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/jaredhanson"
- }
- },
- "node_modules/passport-oauth2": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
- "integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
- "license": "MIT",
- "dependencies": {
- "base64url": "3.x.x",
- "oauth": "0.10.x",
- "passport-strategy": "1.x.x",
- "uid2": "0.0.x",
- "utils-merge": "1.x.x"
- },
- "engines": {
- "node": ">= 0.4.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/jaredhanson"
- }
- },
- "node_modules/passport-oauth2/node_modules/oauth": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
- "integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==",
- "license": "MIT"
- },
- "node_modules/passport-strategy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
- "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -16840,11 +16449,6 @@
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
},
- "node_modules/pause": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
- "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
- },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -17227,12 +16831,6 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "license": "MIT"
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -18154,6 +17752,19 @@
"node": ">=8"
}
},
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -18232,12 +17843,6 @@
"integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
"license": "MIT"
},
- "node_modules/sift": {
- "version": "17.1.3",
- "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
- "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
- "license": "MIT"
- },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -18285,6 +17890,19 @@
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
@@ -18361,15 +17979,6 @@
"memory-pager": "^1.0.2"
}
},
- "node_modules/sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
- "license": "MIT",
- "dependencies": {
- "memory-pager": "^1.0.2"
- }
- },
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -18552,13 +18161,6 @@
"node": ">=8"
}
},
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -18867,16 +18469,19 @@
}
},
"node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -19206,22 +18811,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/terser-webpack-plugin/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -19413,16 +19002,14 @@
"node": ">=18"
}
},
- "node_modules/tr46": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
- "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "punycode": "^2.3.1"
- },
- "engines": {
- "node": ">=18"
+ "bin": {
+ "tree-kill": "cli.js"
}
},
"node_modules/ts-api-utils": {
@@ -19847,12 +19434,6 @@
"integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
"license": "MIT"
},
- "node_modules/uid2": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
- "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
- "license": "MIT"
- },
"node_modules/uint8array-extras": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
@@ -20048,15 +19629,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -20238,15 +19810,6 @@
"node": ">=12"
}
},
- "node_modules/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/webpack": {
"version": "5.104.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz",
@@ -20451,19 +20014,6 @@
"node": ">=18"
}
},
- "node_modules/whatwg-url": {
- "version": "14.2.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
- "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
- "license": "MIT",
- "dependencies": {
- "tr46": "^5.1.0",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -20633,29 +20183,6 @@
"node": ">=8"
}
},
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -20694,6 +20221,26 @@
"node": ">=8"
}
},
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/wrap-ansi/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
@@ -20812,13 +20359,6 @@
"node": ">=8"
}
},
- "node_modules/yargs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
diff --git a/package.json b/package.json
index a24c1ef..ca1ce32 100644
--- a/package.json
+++ b/package.json
@@ -10,13 +10,25 @@
"scripts": {
"prepare": "husky",
"lint-staged": "lint-staged",
+ "dev": "concurrently \"npm -w backend run dev\" \"npm -w frontend run dev\"",
+ "dev:backend": "npm -w backend run dev",
+ "dev:frontend": "npm -w frontend run dev",
+ "build": "npm run build -w backend && npm run build -w frontend",
+ "build:backend": "npm -w backend run build",
+ "build:frontend": "npm -w frontend run build",
"backend:lint": "npm -w backend run lint",
"backend:typecheck": "npm -w backend run typecheck",
"backend:test": "npm -w backend run test",
"backend:lint:fix": "npm -w backend run lint:fix",
- "backend:format": "npm -w backend run format"
+ "backend:format": "npm -w backend run format",
+ "frontend:lint": "npm -w frontend run lint",
+ "frontend:typecheck": "npm -w frontend run typecheck",
+ "frontend:test": "npm -w frontend run test",
+ "frontend:lint:fix": "npm -w frontend run lint:fix",
+ "frontend:format": "npm -w frontend run format"
},
"devDependencies": {
+ "concurrently": "^9.1.0",
"husky": "^9.1.7",
"lint-staged": "^16.2.7"
},
@@ -28,4 +40,4 @@
"npm --workspace backend exec -- prettier --write"
]
}
-}
+}
\ No newline at end of file