Compare commits
53 Commits
905ce98bc4
...
v1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 70de139cb0 | |||
| b015c62650 | |||
| b7dac5d463 | |||
| 10bdfdfe97 | |||
| 9ad63a0a82 | |||
| eb117cc0b8 | |||
| 23ee915194 | |||
| 3dff891023 | |||
| f55c27c43d | |||
| 3e04427646 | |||
| 6b51d63c8b | |||
| 60ca4ad656 | |||
| aae5275990 | |||
| b639fffe7f | |||
| ab15f7f35b | |||
| 025906889c | |||
| 760a6d6db3 | |||
| 7f8cea4728 | |||
| fb09b1de9a | |||
| cb4afe2e91 | |||
| 1f68234a49 | |||
| e2d68c2828 | |||
| cb6f133e0c | |||
| 7990189505 | |||
| 2167044543 | |||
| 0665e3e224 | |||
| 2bdcbfb907 | |||
| ac1e0081f7 | |||
| 4f452cf2a9 | |||
| 1404aa0406 | |||
| 9e10ce06ed | |||
| a400e6f94d | |||
| 2f95c8d968 | |||
| 9aa6f5f4d0 | |||
| 071302fe6b | |||
| cf3a96cead | |||
| af5f91e6f8 | |||
| 5e453418d6 | |||
| 10980ba8b3 | |||
| 6444aea5f6 | |||
| ad50929bf3 | |||
| 07928a182f | |||
| b493ce0ba0 | |||
| db445d0b76 | |||
| 22a6a06a4e | |||
| 4f66dd914c | |||
| bb54750085 | |||
| 5cbbd81384 | |||
| c167e36626 | |||
| 0fb872161d | |||
| a360ea6a98 | |||
| a537294832 | |||
| 459bdc6eda |
@@ -13,6 +13,9 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|
||||||
|
env:
|
||||||
|
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ (github.ref_type == 'tag' && !contains(github.ref_name, '-')) && 'prod' || (github.ref_name == 'main' && 'testing' || github.ref_name) }}
|
group: ${{ github.workflow }}-${{ (github.ref_type == 'tag' && !contains(github.ref_name, '-')) && 'prod' || (github.ref_name == 'main' && 'testing' || github.ref_name) }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
@@ -149,18 +152,35 @@ jobs:
|
|||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v3
|
||||||
with:
|
with:
|
||||||
version: 10
|
version: 10
|
||||||
|
- name: Provide sibling monorepo
|
||||||
|
run: |
|
||||||
|
git clone https://git.infra.mintel.me/mmintel/at-mintel.git _at-mintel
|
||||||
|
sed -i 's|../../../at-mintel|../../_at-mintel|g' apps/web/package.json
|
||||||
|
sed -i 's|../../../at-mintel|../../_at-mintel|g' apps/web/tsconfig.json
|
||||||
|
sed -i 's|../at-mintel|./_at-mintel|g' package.json
|
||||||
- name: 🔐 Registry Auth
|
- name: 🔐 Registry Auth
|
||||||
run: |
|
run: |
|
||||||
echo "@mintel:registry=https://${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" > .npmrc
|
echo "@mintel:registry=https://${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" > .npmrc
|
||||||
echo "//${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}/:_authToken=${{ secrets.REGISTRY_PASS }}" >> .npmrc
|
echo "//${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}/:_authToken=${{ secrets.REGISTRY_PASS }}" >> .npmrc
|
||||||
|
- name: 🏗️ Compile Sibling Monorepo
|
||||||
|
run: |
|
||||||
|
cp .npmrc _at-mintel/
|
||||||
|
cd _at-mintel
|
||||||
|
pnpm install --no-frozen-lockfile
|
||||||
|
pnpm build
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: |
|
||||||
- name: 🧪 QA Checks
|
pnpm store prune
|
||||||
|
pnpm install --no-frozen-lockfile
|
||||||
|
- name: 🧹 Lint
|
||||||
if: github.event.inputs.skip_checks != 'true'
|
if: github.event.inputs.skip_checks != 'true'
|
||||||
run: npx turbo run lint typecheck test
|
run: pnpm --filter @mintel/web lint --max-warnings 999
|
||||||
- name: 🏗️ Build Test
|
- name: 🔍 Typecheck
|
||||||
if: github.event.inputs.skip_checks != 'true'
|
if: github.event.inputs.skip_checks != 'true'
|
||||||
run: pnpm build
|
run: pnpm --filter @mintel/web typecheck
|
||||||
|
- name: 🧪 Test
|
||||||
|
if: github.event.inputs.skip_checks != 'true'
|
||||||
|
run: pnpm --filter @mintel/web test
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────────────────────
|
||||||
# JOB 3: Build & Push
|
# JOB 3: Build & Push
|
||||||
@@ -175,6 +195,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
- name: Provide sibling monorepo (context)
|
||||||
|
run: git clone https://git.infra.mintel.me/mmintel/at-mintel.git _at-mintel
|
||||||
- name: 🐳 Set up Docker Buildx
|
- name: 🐳 Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
- name: 🔐 Registry Login
|
- name: 🔐 Registry Login
|
||||||
@@ -184,6 +206,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
|
provenance: false
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
build-args: |
|
build-args: |
|
||||||
NEXT_PUBLIC_BASE_URL=${{ needs.prepare.outputs.next_public_url }}
|
NEXT_PUBLIC_BASE_URL=${{ needs.prepare.outputs.next_public_url }}
|
||||||
@@ -217,7 +240,7 @@ jobs:
|
|||||||
postgres_DB_NAME: ${{ secrets.DIRECTUS_DB_NAME || vars.DIRECTUS_DB_NAME || 'directus' }}
|
postgres_DB_NAME: ${{ secrets.DIRECTUS_DB_NAME || vars.DIRECTUS_DB_NAME || 'directus' }}
|
||||||
postgres_DB_USER: ${{ secrets.DIRECTUS_DB_USER || vars.DIRECTUS_DB_USER || 'directus' }}
|
postgres_DB_USER: ${{ secrets.DIRECTUS_DB_USER || vars.DIRECTUS_DB_USER || 'directus' }}
|
||||||
postgres_DB_PASSWORD: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DIRECTUS_DB_PASSWORD) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DIRECTUS_DB_PASSWORD) || secrets.DIRECTUS_DB_PASSWORD || vars.DIRECTUS_DB_PASSWORD || 'directus' }}
|
postgres_DB_PASSWORD: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DIRECTUS_DB_PASSWORD) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DIRECTUS_DB_PASSWORD) || secrets.DIRECTUS_DB_PASSWORD || vars.DIRECTUS_DB_PASSWORD || 'directus' }}
|
||||||
DATABASE_URI: postgres://${{ env.postgres_DB_USER }}:${{ env.postgres_DB_PASSWORD }}@postgres-db:5432/${{ env.postgres_DB_NAME }}
|
DATABASE_URI: postgres://${{ secrets.DIRECTUS_DB_USER || vars.DIRECTUS_DB_USER || 'directus' }}:${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DIRECTUS_DB_PASSWORD) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DIRECTUS_DB_PASSWORD) || secrets.DIRECTUS_DB_PASSWORD || vars.DIRECTUS_DB_PASSWORD || 'directus' }}@postgres-db:5432/${{ secrets.DIRECTUS_DB_NAME || vars.DIRECTUS_DB_NAME || 'directus' }}
|
||||||
PAYLOAD_SECRET: ${{ secrets.PAYLOAD_SECRET || vars.PAYLOAD_SECRET || 'secret' }}
|
PAYLOAD_SECRET: ${{ secrets.PAYLOAD_SECRET || vars.PAYLOAD_SECRET || 'secret' }}
|
||||||
|
|
||||||
# Mail
|
# Mail
|
||||||
@@ -270,6 +293,10 @@ jobs:
|
|||||||
|
|
||||||
GATEKEEPER_ORIGIN="$NEXT_PUBLIC_BASE_URL/gatekeeper"
|
GATEKEEPER_ORIGIN="$NEXT_PUBLIC_BASE_URL/gatekeeper"
|
||||||
|
|
||||||
|
if [[ "$UMAMI_API_ENDPOINT" != http* ]]; then
|
||||||
|
UMAMI_API_ENDPOINT="https://$UMAMI_API_ENDPOINT"
|
||||||
|
fi
|
||||||
|
|
||||||
cat > .env.deploy << EOF
|
cat > .env.deploy << EOF
|
||||||
# Generated by CI - $TARGET
|
# Generated by CI - $TARGET
|
||||||
IMAGE_TAG=$IMAGE_TAG
|
IMAGE_TAG=$IMAGE_TAG
|
||||||
@@ -309,6 +336,9 @@ jobs:
|
|||||||
TRAEFIK_HOST='$TRAEFIK_HOST'
|
TRAEFIK_HOST='$TRAEFIK_HOST'
|
||||||
COMPOSE_PROFILES=$COMPOSE_PROFILES
|
COMPOSE_PROFILES=$COMPOSE_PROFILES
|
||||||
TRAEFIK_MIDDLEWARES=$AUTH_MIDDLEWARE
|
TRAEFIK_MIDDLEWARES=$AUTH_MIDDLEWARE
|
||||||
|
TRAEFIK_ENTRYPOINT=websecure
|
||||||
|
TRAEFIK_TLS=true
|
||||||
|
TRAEFIK_CERT_RESOLVER=le
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
- name: 🚀 SSH Deploy
|
- name: 🚀 SSH Deploy
|
||||||
@@ -321,6 +351,15 @@ jobs:
|
|||||||
chmod 600 ~/.ssh/id_ed25519
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
ssh-keyscan -H alpha.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
ssh-keyscan -H alpha.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
||||||
|
|
||||||
|
# SSH keepalive to prevent timeout during long docker pull
|
||||||
|
cat > ~/.ssh/config <<SSHCFG
|
||||||
|
Host alpha.mintel.me
|
||||||
|
ServerAliveInterval 15
|
||||||
|
ServerAliveCountMax 20
|
||||||
|
ConnectTimeout 30
|
||||||
|
SSHCFG
|
||||||
|
chmod 600 ~/.ssh/config
|
||||||
|
|
||||||
if [[ "$TARGET" == "production" ]]; then
|
if [[ "$TARGET" == "production" ]]; then
|
||||||
SITE_DIR="/home/deploy/sites/mintel.me"
|
SITE_DIR="/home/deploy/sites/mintel.me"
|
||||||
elif [[ "$TARGET" == "testing" ]]; then
|
elif [[ "$TARGET" == "testing" ]]; then
|
||||||
@@ -331,20 +370,22 @@ jobs:
|
|||||||
SITE_DIR="/home/deploy/sites/branch.mintel.me/${SLUG:-unknown}"
|
SITE_DIR="/home/deploy/sites/branch.mintel.me/${SLUG:-unknown}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Upload files
|
||||||
ssh root@alpha.mintel.me "mkdir -p $SITE_DIR/directus/schema $SITE_DIR/directus/uploads $SITE_DIR/directus/extensions"
|
ssh root@alpha.mintel.me "mkdir -p $SITE_DIR/directus/schema $SITE_DIR/directus/uploads $SITE_DIR/directus/extensions"
|
||||||
scp .env.deploy root@alpha.mintel.me:$SITE_DIR/$ENV_FILE
|
scp .env.deploy root@alpha.mintel.me:$SITE_DIR/$ENV_FILE
|
||||||
scp docker-compose.yml root@alpha.mintel.me:$SITE_DIR/docker-compose.yml
|
scp docker-compose.yml root@alpha.mintel.me:$SITE_DIR/docker-compose.yml
|
||||||
|
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin"
|
# Deploy
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' pull"
|
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' up -d --remove-orphans"
|
|
||||||
|
|
||||||
# Migration Sanitization
|
|
||||||
DB_CONTAINER="${{ needs.prepare.outputs.project_name }}-postgres-db-1"
|
DB_CONTAINER="${{ needs.prepare.outputs.project_name }}-postgres-db-1"
|
||||||
echo "🔧 Sanitizing payload_migrations table..."
|
ssh root@alpha.mintel.me bash <<DEPLOYEOF
|
||||||
ssh root@alpha.mintel.me "docker exec $DB_CONTAINER psql -U $postgres_DB_USER -d $postgres_DB_NAME -c \"DELETE FROM payload_migrations WHERE batch = -1;\" 2>/dev/null || true"
|
set -e
|
||||||
|
docker network create '${{ needs.prepare.outputs.project_name }}-internal' || true
|
||||||
ssh root@alpha.mintel.me "docker system prune -f --filter 'until=24h'"
|
docker volume create 'mintel-me_payload-db-data' || true
|
||||||
|
echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin
|
||||||
|
cd $SITE_DIR
|
||||||
|
docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' pull
|
||||||
|
docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' up -d --remove-orphans
|
||||||
|
DEPLOYEOF
|
||||||
|
|
||||||
- name: 🧹 Post-Deploy Cleanup (Runner)
|
- name: 🧹 Post-Deploy Cleanup (Runner)
|
||||||
if: always()
|
if: always()
|
||||||
@@ -363,23 +404,72 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: 🏥 CMS Deep Health Check
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@v3
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
- name: Provide sibling monorepo
|
||||||
|
run: |
|
||||||
|
git clone https://git.infra.mintel.me/mmintel/at-mintel.git _at-mintel
|
||||||
|
sed -i 's|../../../at-mintel|../../_at-mintel|g' apps/web/package.json
|
||||||
|
sed -i 's|../../../at-mintel|../../_at-mintel|g' apps/web/tsconfig.json
|
||||||
|
sed -i 's|../at-mintel|./_at-mintel|g' package.json
|
||||||
|
- name: 🔐 Registry Auth
|
||||||
|
run: |
|
||||||
|
echo "@mintel:registry=https://${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" > .npmrc
|
||||||
|
echo "//${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}/:_authToken=${{ secrets.REGISTRY_PASS }}" >> .npmrc
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pnpm install --no-frozen-lockfile
|
||||||
|
- name: 🏥 App Health Check
|
||||||
|
shell: bash
|
||||||
env:
|
env:
|
||||||
DEPLOY_URL: ${{ needs.prepare.outputs.next_public_url }}
|
DEPLOY_URL: ${{ needs.prepare.outputs.next_public_url }}
|
||||||
run: |
|
run: |
|
||||||
echo "Waiting for app to start..."
|
echo "Waiting for app to start at $DEPLOY_URL ..."
|
||||||
sleep 10
|
for i in {1..30}; do
|
||||||
curl -sf "$DEPLOY_URL/api/health/cms" || { echo "❌ CMS health check failed"; exit 1; }
|
HTTP_CODE=$(curl -sk -o /dev/null -w '%{http_code}' "$DEPLOY_URL" 2>&1) || true
|
||||||
echo "✅ CMS health OK"
|
echo "Attempt $i: HTTP $HTTP_CODE"
|
||||||
|
if [[ "$HTTP_CODE" =~ ^2 ]]; then
|
||||||
|
echo "✅ App is up (HTTP $HTTP_CODE)"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "⏳ Waiting... (got $HTTP_CODE)"
|
||||||
|
sleep 10
|
||||||
|
done
|
||||||
|
echo "❌ App health check failed after 30 attempts"
|
||||||
|
exit 1
|
||||||
- name: 🚀 OG Image Check
|
- name: 🚀 OG Image Check
|
||||||
env:
|
env:
|
||||||
TEST_URL: ${{ needs.prepare.outputs.next_public_url }}
|
TEST_URL: ${{ needs.prepare.outputs.next_public_url }}
|
||||||
run: npx tsx apps/web/scripts/check-og-images.ts
|
run: pnpm --filter @mintel/web check:og
|
||||||
- name: 📝 E2E Smoke Test
|
- name: 📝 E2E Smoke Test
|
||||||
env:
|
env:
|
||||||
NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }}
|
TEST_URL: ${{ needs.prepare.outputs.next_public_url }}
|
||||||
GATEKEEPER_PASSWORD: ${{ env.GATEKEEPER_PASSWORD }}
|
GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD }}
|
||||||
run: npx tsx apps/web/scripts/check-forms.ts
|
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||||
|
PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium
|
||||||
|
run: |
|
||||||
|
# Install system Chromium + dependencies (KLZ pattern)
|
||||||
|
# Ubuntu's default 'chromium' is a snap wrapper, so we use xtradeb PPA for native binary
|
||||||
|
sudo apt-get update && sudo apt-get install -y gnupg wget ca-certificates
|
||||||
|
|
||||||
|
# Setup xtradeb PPA for native chromium
|
||||||
|
CODENAME=$(. /etc/os-release && echo $VERSION_CODENAME)
|
||||||
|
sudo mkdir -p /etc/apt/keyrings
|
||||||
|
wget -qO- "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x82BB6851C64F6880" | sudo gpg --dearmor -o /etc/apt/keyrings/xtradeb.gpg || true
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/xtradeb.gpg] http://ppa.launchpad.net/xtradeb/apps/ubuntu $CODENAME main" | sudo tee /etc/apt/sources.list.d/xtradeb-ppa.list
|
||||||
|
printf "Package: *\nPin: release o=LP-PPA-xtradeb-apps\nPin-Priority: 1001\n" | sudo tee /etc/apt/preferences.d/xtradeb
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --allow-downgrades chromium libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2t64
|
||||||
|
|
||||||
|
[ -f /usr/bin/chromium ] && sudo ln -sf /usr/bin/chromium /usr/bin/google-chrome
|
||||||
|
pnpm --filter @mintel/web check:forms
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────────────────────
|
||||||
# JOB 6: Notifications
|
# JOB 6: Notifications
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -54,3 +54,5 @@ apps/web/out/estimations/
|
|||||||
|
|
||||||
# Backups
|
# Backups
|
||||||
backups/
|
backups/
|
||||||
|
|
||||||
|
.turbo
|
||||||
13
Dockerfile
13
Dockerfile
@@ -18,20 +18,25 @@ ENV CI=true
|
|||||||
# Copy manifest files specifically for better layer caching
|
# Copy manifest files specifically for better layer caching
|
||||||
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json .npmrc* ./
|
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json .npmrc* ./
|
||||||
COPY apps/web/package.json ./apps/web/package.json
|
COPY apps/web/package.json ./apps/web/package.json
|
||||||
|
# Copy sibling monorepo for linked dependencies (cloned during CI)
|
||||||
|
COPY _at-mintel* /at-mintel/
|
||||||
|
|
||||||
# Install dependencies with cache mount and dynamic .npmrc (High Fidelity pattern)
|
# Install dependencies with cache mount and dynamic .npmrc (High Fidelity pattern)
|
||||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
|
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
|
||||||
--mount=type=secret,id=NPM_TOKEN \
|
--mount=type=secret,id=NPM_TOKEN \
|
||||||
export NPM_TOKEN=$(cat /run/secrets/NPM_TOKEN 2>/dev/null || echo $NPM_TOKEN) && \
|
export NPM_TOKEN=$(cat /run/secrets/NPM_TOKEN 2>/dev/null || echo $NPM_TOKEN) && \
|
||||||
echo "@mintel:registry=https://npm.infra.mintel.me" > .npmrc && \
|
echo "@mintel:registry=https://npm.infra.mintel.me" > /at-mintel/.npmrc && \
|
||||||
echo "//npm.infra.mintel.me/:_authToken=\${NPM_TOKEN}" >> .npmrc && \
|
echo "//npm.infra.mintel.me/:_authToken=\${NPM_TOKEN}" >> /at-mintel/.npmrc && \
|
||||||
pnpm install --frozen-lockfile && \
|
cp /at-mintel/.npmrc .npmrc && \
|
||||||
rm .npmrc
|
cd /at-mintel && pnpm install --no-frozen-lockfile && pnpm build && \
|
||||||
|
cd /app && pnpm install --no-frozen-lockfile && \
|
||||||
|
rm /at-mintel/.npmrc .npmrc
|
||||||
|
|
||||||
# Copy source code
|
# Copy source code
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Build application (monorepo filter)
|
# Build application (monorepo filter)
|
||||||
|
ENV NODE_OPTIONS="--max_old_space_size=4096"
|
||||||
RUN pnpm --filter @mintel/web build
|
RUN pnpm --filter @mintel/web build
|
||||||
|
|
||||||
# Stage 2: Runner
|
# Stage 2: Runner
|
||||||
|
|||||||
@@ -1,327 +1,334 @@
|
|||||||
|
|
||||||
|
> @mintel/web@0.1.0 lint /Users/marcmintel/Projects/mintel.me/apps/web
|
||||||
> @mintel/web@0.1.0 lint /Users/marcmintel/Projects/mintel.me/apps/web
|
> eslint app src scripts video
|
||||||
> eslint app src scripts video
|
|
||||||
|
|
||||||
[0m
|
/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/about/page.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/about/page.tsx[24m
|
3:8 warning 'Image' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:8[22m [33mwarning[39m 'Image' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
9:3 warning 'ResultIllustration' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m9:3[22m [33mwarning[39m 'ResultIllustration' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
11:3 warning 'HeroLines' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m11:3[22m [33mwarning[39m 'HeroLines' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
12:3 warning 'ParticleNetwork' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m12:3[22m [33mwarning[39m 'ParticleNetwork' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
13:3 warning 'GridLines' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m13:3[22m [33mwarning[39m 'GridLines' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
16:10 warning 'Check' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m16:10[22m [33mwarning[39m 'Check' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
31:3 warning 'CodeSnippet' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m31:3[22m [33mwarning[39m 'CodeSnippet' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
32:3 warning 'AbstractCircuit' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m32:3[22m [33mwarning[39m 'AbstractCircuit' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
53:21 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m53:21[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/case-studies/klz-cables/page.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/case-studies/klz-cables/page.tsx[24m
|
8:3 warning 'H1' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m8:3[22m [33mwarning[39m 'H1' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/not-found.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/not-found.tsx[24m
|
6:8 warning 'Link' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m6:8[22m [33mwarning[39m 'Link' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/page.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/page.tsx[24m
|
18:3 warning 'MonoLabel' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m18:3[22m [33mwarning[39m 'MonoLabel' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
21:16 warning 'Container' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m21:16[22m [33mwarning[39m 'Container' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
23:24 warning 'CodeSnippet' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m23:24[22m [33mwarning[39m 'CodeSnippet' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
24:10 warning 'IconList' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m24:10[22m [33mwarning[39m 'IconList' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
24:20 warning 'IconListItem' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m24:20[22m [33mwarning[39m 'IconListItem' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/technologies/[slug]/data.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/app/(site)/technologies/[slug]/data.tsx[24m
|
1:24 warning 'Database' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m1:24[22m [33mwarning[39m 'Database' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/scripts/ai-estimate.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/scripts/ai-estimate.ts[24m
|
8:10 warning 'fileURLToPath' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m8:10[22m [33mwarning[39m 'fileURLToPath' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/scripts/check-og-images.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/scripts/check-og-images.ts[24m
|
19:11 warning 'body' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m19:15[22m [33mwarning[39m 'body' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/scripts/generate-thumbnail.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/scripts/generate-thumbnail.ts[24m
|
28:18 warning 'e' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m28:18[22m [33mwarning[39m 'e' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/scripts/migrate-posts.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/scripts/migrate-posts.ts[24m
|
107:18 warning 'e' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m107:18[22m [33mwarning[39m 'e' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/scripts/pagespeed-sitemap.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/scripts/pagespeed-sitemap.ts[24m
|
109:14 warning 'err' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m109:14[22m [33mwarning[39m 'err' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ArticleMeme.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ArticleMeme.tsx[24m
|
110:21 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m110:21[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ArticleQuote.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ArticleQuote.tsx[24m
|
20:5 warning 'role' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m20:5[22m [33mwarning[39m 'role' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/BlogOGImageTemplate.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/BlogOGImageTemplate.tsx[24m
|
41:17 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m41:17[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/CombinedQuotePDF.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ComponentShareButton.tsx[24m
|
30:9 warning 'date' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m126:30[22m [33mwarning[39m 'e' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ComponentShareButton.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/Configurator/ConfiguratorLayout.tsx[24m
|
126:30 warning 'e' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m24:3[22m [33mwarning[39m 'title' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/Configurator/ConfiguratorLayout.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/Configurator/ReferenceInput.tsx[24m
|
24:3 warning 'title' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m7:10[22m [33mwarning[39m 'cn' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/Configurator/ReferenceInput.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/DirectMessageFlow.tsx[24m
|
7:10 warning 'cn' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:10[22m [33mwarning[39m 'motion' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/DirectMessageFlow.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/EmailTemplates.tsx[24m
|
3:10 warning 'motion' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m1:13[22m [33mwarning[39m 'React' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/EmailTemplates.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/BaseStep.tsx[24m
|
1:13 warning 'React' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m13:3[22m [33mwarning[39m 'HelpCircle' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m14:3[22m [33mwarning[39m 'ArrowRight' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/pdf/LocalEstimationPDF.tsx
|
||||||
|
94:9 warning 'getPageNum' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/ContentStep.tsx[24m
|
|
||||||
[2m103:25[22m [33mwarning[39m 'index' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/BaseStep.tsx
|
||||||
|
13:3 warning 'HelpCircle' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/DesignStep.tsx[24m
|
14:3 warning 'ArrowRight' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m7:19[22m [33mwarning[39m 'Palette' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m104:38[22m [33mwarning[39m 'index' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/ContentStep.tsx
|
||||||
|
103:25 warning 'index' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/FeaturesStep.tsx[24m
|
|
||||||
[2m8:18[22m [33mwarning[39m 'AnimatePresence' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/DesignStep.tsx
|
||||||
[2m9:10[22m [33mwarning[39m 'Minus' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
7:19 warning 'Palette' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m9:17[22m [33mwarning[39m 'Plus' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
104:38 warning 'index' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/FunctionsStep.tsx[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/FeaturesStep.tsx
|
||||||
[2m7:18[22m [33mwarning[39m 'AnimatePresence' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
8:18 warning 'AnimatePresence' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m8:10[22m [33mwarning[39m 'Minus' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
9:10 warning 'Minus' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m8:17[22m [33mwarning[39m 'Plus' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
9:17 warning 'Plus' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/LanguageStep.tsx[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/FunctionsStep.tsx
|
||||||
[2m5:23[22m [33mwarning[39m 'Plus' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
7:18 warning 'AnimatePresence' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m125:31[22m [33mwarning[39m 'i' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
8:10 warning 'Minus' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
8:17 warning 'Plus' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/PresenceStep.tsx[24m
|
|
||||||
[2m5:10[22m [33mwarning[39m 'Checkbox' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/LanguageStep.tsx
|
||||||
|
5:23 warning 'Plus' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/DiagramShareButton.tsx[24m
|
125:31 warning 'i' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m28:9[22m [33mwarning[39m 'generateDiagramImage' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ContactForm/steps/PresenceStep.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/DiagramState.tsx[24m
|
5:10 warning 'Checkbox' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m25:3[22m [33mwarning[39m 'states' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/DiagramShareButton.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Effects/CMSVisualizer.tsx[24m
|
28:9 warning 'generateDiagramImage' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m8:3[22m [33mwarning[39m 'Edit3' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/DiagramState.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Effects/CircuitBoard.tsx[24m
|
25:3 warning 'states' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m120:9[22m [33mwarning[39m 'drawTrace' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m130:13[22m [33mwarning[39m 'midX' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Effects/CMSVisualizer.tsx
|
||||||
[2m131:13[22m [33mwarning[39m 'midY' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
8:3 warning 'Edit3' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/FAQSection.tsx[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Effects/CircuitBoard.tsx
|
||||||
[2m5:10[22m [33mwarning[39m 'Paragraph' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
120:9 warning 'drawTrace' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m7:11[22m [33mwarning[39m 'FAQItem' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
130:13 warning 'midX' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
131:13 warning 'midY' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/FileExample.tsx[24m
|
|
||||||
[2m3:27[22m [33mwarning[39m 'useRef' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/FAQSection.tsx
|
||||||
|
5:10 warning 'Paragraph' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/IframeSection.tsx[24m
|
7:11 warning 'FAQItem' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m207:18[22m [33mwarning[39m Empty block statement [2mno-empty[22m
|
|
||||||
[2m252:18[22m [33mwarning[39m Empty block statement [2mno-empty[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/FileExample.tsx
|
||||||
[2m545:30[22m [33mwarning[39m 'e' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:27 warning 'useRef' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ImageText.tsx[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/IframeSection.tsx
|
||||||
[2m25:17[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
207:18 warning Empty block statement no-empty
|
||||||
|
252:18 warning Empty block statement no-empty
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/MediumCard.tsx[24m
|
545:30 warning 'e' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:10[22m [33mwarning[39m 'Card' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m34:13[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ImageText.tsx
|
||||||
|
25:17 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Mermaid.tsx[24m
|
|
||||||
[2m248:18[22m [33mwarning[39m 'err' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/MediumCard.tsx
|
||||||
|
3:10 warning 'Card' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/PayloadRichText.tsx[24m
|
34:13 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m180:31[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m183:26[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/Mermaid.tsx
|
||||||
[2m184:34[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
248:18 warning 'err' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m189:27[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m194:29[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/PayloadRichText.tsx
|
||||||
[2m199:32[22m [33mwarning[39m 'node' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
177:31 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
180:26 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ShareModal.tsx[24m
|
181:34 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m7:8[22m [33mwarning[39m 'IconBlack' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
186:27 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m181:23[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
191:29 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m231:21[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
196:32 warning 'node' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m258:13[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/ShareModal.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/blog/BlogClient.tsx[24m
|
7:8 warning 'IconBlack' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m27:11[22m [33mwarning[39m 'trackEvent' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
181:23 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
|
231:21 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/components/blog/BlogPostHeader.tsx[24m
|
258:13 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m54:17[22m [33mwarning[39m Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element [2m@next/next/no-img-element[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/blog/BlogClient.tsx
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/migrations/20260227_171023_crm_collections.ts[24m
|
27:11 warning 'trackEvent' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:32[22m [33mwarning[39m 'payload' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m3:41[22m [33mwarning[39m 'req' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/components/blog/BlogPostHeader.tsx
|
||||||
[2m360:3[22m [33mwarning[39m 'payload' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
54:17 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
[2m361:3[22m [33mwarning[39m 'req' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/migrations/20260227_171023_crm_collections.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/actions/generateField.ts[24m
|
3:32 warning 'payload' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:10[22m [33mwarning[39m 'config' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:41 warning 'req' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
360:3 warning 'payload' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/actions/optimizePost.ts[24m
|
361:3 warning 'req' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m4:10[22m [33mwarning[39m 'revalidatePath' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/migrations/20260301_151838.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArchitectureBuilderBlock.ts[24m
|
3:32 warning 'payload' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:41 warning 'req' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
110:3 warning 'payload' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleBlockquoteBlock.ts[24m
|
111:3 warning 'req' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/actions/generateField.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleMemeBlock.ts[24m
|
3:10 warning 'config' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m2:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/actions/optimizePost.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleQuoteBlock.ts[24m
|
4:10 warning 'revalidatePath' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArchitectureBuilderBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/BoldNumberBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleBlockquoteBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ButtonBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleMemeBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/CarouselBlock.ts[24m
|
2:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ArticleQuoteBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ComparisonRowBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/BoldNumberBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramFlowBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ButtonBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramGanttBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/CarouselBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramPieBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ComparisonRowBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramSequenceBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramFlowBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramStateBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramGanttBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramTimelineBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramPieBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DigitalAssetVisualizerBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramSequenceBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ExternalLinkBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramStateBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/FAQSectionBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m39:22[22m [33mwarning[39m 'ai' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DiagramTimelineBlock.ts
|
||||||
[2m39:26[22m [33mwarning[39m 'render' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/IconListBlock.ts[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/DigitalAssetVisualizerBlock.ts
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ImageTextBlock.ts[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ExternalLinkBlock.ts
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LeadMagnetBlock.ts[24m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/FAQSectionBlock.ts
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
39:22 warning 'ai' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LeadParagraphBlock.ts[24m
|
39:26 warning 'render' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/IconListBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LinkedInEmbedBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ImageTextBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LoadTimeSimulatorBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LeadMagnetBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MarkerBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LeadParagraphBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MemeCardBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m2:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LinkedInEmbedBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MermaidBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/LoadTimeSimulatorBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MetricBarBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MarkerBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ParagraphBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MemeCardBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PerformanceChartBlock.ts[24m
|
2:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MermaidBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PerformanceROICalculatorBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/MetricBarBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PremiumComparisonChartBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/ParagraphBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/RevealBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PerformanceChartBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/RevenueLossCalculatorBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PerformanceROICalculatorBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/SectionBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/PremiumComparisonChartBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/StatsDisplayBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/RevealBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/StatsGridBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/RevenueLossCalculatorBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TLDRBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m2:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/SectionBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TrackedLinkBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/StatsDisplayBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TwitterEmbedBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/StatsGridBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/WaterfallChartBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TLDRBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/WebVitalsScoreBlock.ts[24m
|
2:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TrackedLinkBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/YouTubeEmbedBlock.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m3:15[22m [33mwarning[39m 'Block' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/TwitterEmbedBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/allBlocks.ts[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m100:47[22m [33mwarning[39m 'ai' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m100:51[22m [33mwarning[39m 'render' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/WaterfallChartBlock.ts
|
||||||
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/collections/ContextFiles.ts[24m
|
|
||||||
[2m2:8[22m [33mwarning[39m 'fs' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/WebVitalsScoreBlock.ts
|
||||||
[2m27:10[22m [33mwarning[39m 'doc' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m27:15[22m [33mwarning[39m 'operation' is defined but never used. Allowed unused args must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/YouTubeEmbedBlock.ts
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/AiAnalyzeButton.tsx[24m
|
3:15 warning 'Block' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m9:15[22m [33mwarning[39m 'title' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m10:9[22m [33mwarning[39m 'router' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/blocks/allBlocks.ts
|
||||||
|
100:47 warning 'ai' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/AiFieldButton.tsx[24m
|
100:51 warning 'render' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m13:11[22m [33mwarning[39m 'value' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m59:14[22m [33mwarning[39m 'e' is defined but never used. Allowed unused caught errors must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/collections/ContextFiles.ts
|
||||||
|
2:8 warning 'fs' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/GenerateSlugButton.tsx[24m
|
27:10 warning 'doc' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m6:10[22m [33mwarning[39m 'Button' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
27:15 warning 'operation' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m23:19[22m [33mwarning[39m 'replaceState' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m24:11[22m [33mwarning[39m 'value' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/AiFieldButton.tsx
|
||||||
|
13:11 warning 'value' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/GenerateThumbnailButton.tsx[24m
|
59:14 warning 'e' is defined but never used. Allowed unused caught errors must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m6:10[22m [33mwarning[39m 'Button' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
|
||||||
[2m24:11[22m [33mwarning[39m 'value' is assigned a value but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/GenerateSlugButton.tsx
|
||||||
|
6:10 warning 'Button' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[4m/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/OptimizeButton.tsx[24m
|
23:19 warning 'replaceState' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
[2m6:10[22m [33mwarning[39m 'Button' is defined but never used. Allowed unused vars must match /^_/u [2m@typescript-eslint/no-unused-vars[22m
|
24:11 warning 'value' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
[33m[1m✖ 137 problems (0 errors, 137 warnings)[22m[39m
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/FieldGenerators/GenerateThumbnailButton.tsx
|
||||||
[0m
|
6:10 warning 'Button' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
24:11 warning 'value' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/mintel.me/apps/web/src/payload/components/OptimizeButton.tsx
|
||||||
|
6:10 warning 'Button' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
✖ 141 problems (0 errors, 141 warnings)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
|
> @mintel/web@0.1.0 test /Users/marcmintel/Projects/mintel.me/apps/web
|
||||||
> @mintel/web@0.1.0 test /Users/marcmintel/Projects/mintel.me/apps/web
|
> echo "No tests configured"
|
||||||
> echo "No tests configured"
|
|
||||||
|
No tests configured
|
||||||
No tests configured
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
|
> @mintel/web@0.1.0 typecheck /Users/marcmintel/Projects/mintel.me/apps/web
|
||||||
> @mintel/web@0.1.0 typecheck /Users/marcmintel/Projects/mintel.me/apps/web
|
> tsc --noEmit
|
||||||
> tsc --noEmit
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use server";
|
"use server";
|
||||||
import { handleServerFunctions as payloadHandleServerFunctions } from "@payloadcms/next/layouts";
|
import { handleServerFunctions as payloadHandleServerFunctions } from "@payloadcms/next/layouts";
|
||||||
import config from "@payload-config";
|
import config from "@payload-config";
|
||||||
|
// @ts-expect-error - Payload generates this file during the build process
|
||||||
import { importMap } from "./admin/importMap";
|
import { importMap } from "./admin/importMap";
|
||||||
|
|
||||||
export const handleServerFunctions = async (args: any) => {
|
export const handleServerFunctions = async (args: any) => {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { Metadata } from "next";
|
|||||||
|
|
||||||
import configPromise from "@payload-config";
|
import configPromise from "@payload-config";
|
||||||
import { RootPage, generatePageMetadata } from "@payloadcms/next/views";
|
import { RootPage, generatePageMetadata } from "@payloadcms/next/views";
|
||||||
|
// @ts-expect-error - Payload generates this file during the build process
|
||||||
import { importMap } from "../importMap";
|
import { importMap } from "../importMap";
|
||||||
|
|
||||||
type Args = {
|
type Args = {
|
||||||
|
|||||||
@@ -1,111 +1 @@
|
|||||||
import { OptimizeButton as OptimizeButton_a629b3460534b7aa208597fdc5e30aec } from "@/src/payload/components/OptimizeButton";
|
export const importMap = {};
|
||||||
import { GenerateSlugButton as GenerateSlugButton_63aadb132a046b3f001fac7a715e5717 } from "@/src/payload/components/FieldGenerators/GenerateSlugButton";
|
|
||||||
import { default as default_76cec558bd86098fa1dab70b12eb818f } from "@/src/payload/components/TagSelector";
|
|
||||||
import { GenerateThumbnailButton as GenerateThumbnailButton_39d416c162062cbe7173a99e3239786e } from "@/src/payload/components/FieldGenerators/GenerateThumbnailButton";
|
|
||||||
import { RscEntryLexicalCell as RscEntryLexicalCell_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { RscEntryLexicalField as RscEntryLexicalField_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { LexicalDiffComponent as LexicalDiffComponent_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { BlocksFeatureClient as BlocksFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { AiFieldButton as AiFieldButton_da42292f87769a8025025b774910be6d } from "@/src/payload/components/FieldGenerators/AiFieldButton";
|
|
||||||
import { InlineToolbarFeatureClient as InlineToolbarFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { HorizontalRuleFeatureClient as HorizontalRuleFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UploadFeatureClient as UploadFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { BlockquoteFeatureClient as BlockquoteFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { RelationshipFeatureClient as RelationshipFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { LinkFeatureClient as LinkFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ChecklistFeatureClient as ChecklistFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { OrderedListFeatureClient as OrderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UnorderedListFeatureClient as UnorderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { IndentFeatureClient as IndentFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { AlignFeatureClient as AlignFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { HeadingFeatureClient as HeadingFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ParagraphFeatureClient as ParagraphFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { InlineCodeFeatureClient as InlineCodeFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { SuperscriptFeatureClient as SuperscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { SubscriptFeatureClient as SubscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { StrikethroughFeatureClient as StrikethroughFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UnderlineFeatureClient as UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { BoldFeatureClient as BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ItalicFeatureClient as ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { default as default_2ebf44fdf8ebc607cf0de30cff485248 } from "@/src/payload/components/ColorPicker";
|
|
||||||
import { default as default_a1c6da8fb7dd9846a8b07123ff256d09 } from "@/src/payload/components/IconSelector";
|
|
||||||
import { ConvertInquiryButton as ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168 } from "@/src/payload/components/ConvertInquiryButton";
|
|
||||||
import { AiAnalyzeButton as AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71 } from "@/src/payload/components/AiAnalyzeButton";
|
|
||||||
import { GanttChartView as GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4 } from "@/src/payload/views/GanttChart";
|
|
||||||
import { S3ClientUploadHandler as S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24 } from "@payloadcms/storage-s3/client";
|
|
||||||
import { CollectionCards as CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } from "@payloadcms/next/rsc";
|
|
||||||
|
|
||||||
export const importMap = {
|
|
||||||
"@/src/payload/components/OptimizeButton#OptimizeButton":
|
|
||||||
OptimizeButton_a629b3460534b7aa208597fdc5e30aec,
|
|
||||||
"@/src/payload/components/FieldGenerators/GenerateSlugButton#GenerateSlugButton":
|
|
||||||
GenerateSlugButton_63aadb132a046b3f001fac7a715e5717,
|
|
||||||
"@/src/payload/components/TagSelector#default":
|
|
||||||
default_76cec558bd86098fa1dab70b12eb818f,
|
|
||||||
"@/src/payload/components/FieldGenerators/GenerateThumbnailButton#GenerateThumbnailButton":
|
|
||||||
GenerateThumbnailButton_39d416c162062cbe7173a99e3239786e,
|
|
||||||
"@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell":
|
|
||||||
RscEntryLexicalCell_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/rsc#RscEntryLexicalField":
|
|
||||||
RscEntryLexicalField_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/rsc#LexicalDiffComponent":
|
|
||||||
LexicalDiffComponent_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/client#BlocksFeatureClient":
|
|
||||||
BlocksFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@/src/payload/components/FieldGenerators/AiFieldButton#AiFieldButton":
|
|
||||||
AiFieldButton_da42292f87769a8025025b774910be6d,
|
|
||||||
"@payloadcms/richtext-lexical/client#InlineToolbarFeatureClient":
|
|
||||||
InlineToolbarFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#HorizontalRuleFeatureClient":
|
|
||||||
HorizontalRuleFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UploadFeatureClient":
|
|
||||||
UploadFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#BlockquoteFeatureClient":
|
|
||||||
BlockquoteFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#RelationshipFeatureClient":
|
|
||||||
RelationshipFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#LinkFeatureClient":
|
|
||||||
LinkFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ChecklistFeatureClient":
|
|
||||||
ChecklistFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#OrderedListFeatureClient":
|
|
||||||
OrderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UnorderedListFeatureClient":
|
|
||||||
UnorderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#IndentFeatureClient":
|
|
||||||
IndentFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#AlignFeatureClient":
|
|
||||||
AlignFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#HeadingFeatureClient":
|
|
||||||
HeadingFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ParagraphFeatureClient":
|
|
||||||
ParagraphFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#InlineCodeFeatureClient":
|
|
||||||
InlineCodeFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#SuperscriptFeatureClient":
|
|
||||||
SuperscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#SubscriptFeatureClient":
|
|
||||||
SubscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#StrikethroughFeatureClient":
|
|
||||||
StrikethroughFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UnderlineFeatureClient":
|
|
||||||
UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#BoldFeatureClient":
|
|
||||||
BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ItalicFeatureClient":
|
|
||||||
ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@/src/payload/components/ColorPicker#default":
|
|
||||||
default_2ebf44fdf8ebc607cf0de30cff485248,
|
|
||||||
"@/src/payload/components/IconSelector#default":
|
|
||||||
default_a1c6da8fb7dd9846a8b07123ff256d09,
|
|
||||||
"@/src/payload/components/ConvertInquiryButton#ConvertInquiryButton":
|
|
||||||
ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168,
|
|
||||||
"@/src/payload/components/AiAnalyzeButton#AiAnalyzeButton":
|
|
||||||
AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71,
|
|
||||||
"@/src/payload/views/GanttChart#GanttChartView":
|
|
||||||
GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4,
|
|
||||||
"@payloadcms/storage-s3/client#S3ClientUploadHandler":
|
|
||||||
S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24,
|
|
||||||
"@payloadcms/next/rsc#CollectionCards":
|
|
||||||
CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1,
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { RootLayout } from "@payloadcms/next/layouts";
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import { handleServerFunctions } from "./actions";
|
import { handleServerFunctions } from "./actions";
|
||||||
|
// @ts-expect-error - Payload generates this file during the build process
|
||||||
import { importMap } from "./admin/importMap";
|
import { importMap } from "./admin/importMap";
|
||||||
|
|
||||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||||
|
|||||||
@@ -16,7 +16,9 @@ const nextConfig = {
|
|||||||
'@mintel/pdf',
|
'@mintel/pdf',
|
||||||
'canvas',
|
'canvas',
|
||||||
'sharp',
|
'sharp',
|
||||||
'puppeteer' // Explicitly externalizing heavy node-native dependencies
|
'puppeteer',
|
||||||
|
'require-in-the-middle',
|
||||||
|
'import-in-the-middle' // Sentry 10+ instrumentation dependencies
|
||||||
],
|
],
|
||||||
images: {
|
images: {
|
||||||
remotePatterns: [
|
remotePatterns: [
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
"framer-motion": "^12.29.2",
|
"framer-motion": "^12.29.2",
|
||||||
"graphql": "^16.12.0",
|
"graphql": "^16.12.0",
|
||||||
"html-to-image": "^1.11.13",
|
"html-to-image": "^1.11.13",
|
||||||
|
"import-in-the-middle": "^1.11.0",
|
||||||
"ioredis": "^5.9.1",
|
"ioredis": "^5.9.1",
|
||||||
"lucide-react": "^0.468.0",
|
"lucide-react": "^0.468.0",
|
||||||
"mermaid": "^11.12.2",
|
"mermaid": "^11.12.2",
|
||||||
@@ -92,6 +93,7 @@
|
|||||||
"react-tweet": "^3.3.0",
|
"react-tweet": "^3.3.0",
|
||||||
"recharts": "^3.7.0",
|
"recharts": "^3.7.0",
|
||||||
"remotion": "^4.0.414",
|
"remotion": "^4.0.414",
|
||||||
|
"require-in-the-middle": "^8.0.1",
|
||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.5",
|
||||||
"shiki": "^1.24.2",
|
"shiki": "^1.24.2",
|
||||||
"tailwind-merge": "^3.4.0",
|
"tailwind-merge": "^3.4.0",
|
||||||
|
|||||||
@@ -1,49 +1,95 @@
|
|||||||
import puppeteer from "puppeteer";
|
import puppeteer from "puppeteer";
|
||||||
|
|
||||||
const targetUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000";
|
const targetUrl = process.env.TEST_URL || "http://localhost:3000";
|
||||||
const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || "secret"; // Use ENV or default
|
const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || "secret";
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
console.log(`\n🚀 Starting E2E Form Submission Check for: ${targetUrl}`);
|
console.log(`\n🚀 Starting E2E Form Submission Check for: ${targetUrl}`);
|
||||||
|
|
||||||
|
// Launch browser with KLZ pattern: use system chromium via env
|
||||||
const browser = await puppeteer.launch({
|
const browser = await puppeteer.launch({
|
||||||
headless: true,
|
headless: true,
|
||||||
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
executablePath:
|
||||||
|
process.env.PUPPETEER_EXECUTABLE_PATH ||
|
||||||
|
process.env.CHROME_PATH ||
|
||||||
|
undefined,
|
||||||
|
args: [
|
||||||
|
"--no-sandbox",
|
||||||
|
"--disable-setuid-sandbox",
|
||||||
|
"--disable-dev-shm-usage",
|
||||||
|
"--disable-gpu",
|
||||||
|
"--ignore-certificate-errors",
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
|
|
||||||
|
// Enable console logging from the page for debugging
|
||||||
|
page.on("console", (msg) => console.log(` [PAGE] ${msg.text()}`));
|
||||||
|
page.on("pageerror", (err: Error) =>
|
||||||
|
console.error(` [PAGE ERROR] ${err.message}`),
|
||||||
|
);
|
||||||
|
page.on("requestfailed", (req) =>
|
||||||
|
console.error(
|
||||||
|
` [REQUEST FAILED] ${req.url()} - ${req.failure()?.errorText}`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Authenticate through Gatekeeper
|
||||||
console.log(`\n🛡️ Authenticating through Gatekeeper...`);
|
console.log(`\n🛡️ Authenticating through Gatekeeper...`);
|
||||||
await page.goto(targetUrl, { waitUntil: "networkidle0" });
|
console.log(` Navigating to: ${targetUrl}`);
|
||||||
|
|
||||||
|
const response = await page.goto(targetUrl, {
|
||||||
|
waitUntil: "domcontentloaded",
|
||||||
|
timeout: 60000,
|
||||||
|
});
|
||||||
|
console.log(` Response status: ${response?.status()}`);
|
||||||
|
console.log(` Response URL: ${response?.url()}`);
|
||||||
|
|
||||||
const isGatekeeperPage = await page.$('input[name="password"]');
|
const isGatekeeperPage = await page.$('input[name="password"]');
|
||||||
if (isGatekeeperPage) {
|
if (isGatekeeperPage) {
|
||||||
await page.type('input[name="password"]', gatekeeperPassword);
|
await page.type('input[name="password"]', gatekeeperPassword);
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
page.waitForNavigation({ waitUntil: "networkidle2" }),
|
page.waitForNavigation({
|
||||||
|
waitUntil: "domcontentloaded",
|
||||||
|
timeout: 60000,
|
||||||
|
}),
|
||||||
page.click('button[type="submit"]'),
|
page.click('button[type="submit"]'),
|
||||||
]);
|
]);
|
||||||
console.log(`✅ Gatekeeper authentication successful!`);
|
console.log(`✅ Gatekeeper authentication successful!`);
|
||||||
|
} else {
|
||||||
|
console.log(`✅ Already authenticated (no Gatekeeper gate detected).`);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`\n🧪 Testing Contact Form submission...`);
|
// Basic smoke test
|
||||||
// Note: This needs to be adapted to the actual selectors on mintel.me
|
console.log(`\n🧪 Testing page load...`);
|
||||||
// For now, we perform a simple smoke test of the home page
|
|
||||||
const title = await page.title();
|
const title = await page.title();
|
||||||
console.log(`✅ Page Title: ${title}`);
|
console.log(`✅ Page Title: ${title}`);
|
||||||
|
|
||||||
if (title.toLowerCase().includes("mintel")) {
|
if (title.toLowerCase().includes("mintel")) {
|
||||||
console.log(`✅ Basic smoke test passed!`);
|
console.log(`✅ Basic smoke test passed!`);
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Page title mismatch");
|
throw new Error(`Page title mismatch: "${title}"`);
|
||||||
}
|
}
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
console.error(`❌ Test Failed: ${err.message}`);
|
console.error(`❌ Test Failed: ${err.message}`);
|
||||||
process.exit(1);
|
// Take a screenshot for debugging
|
||||||
} finally {
|
try {
|
||||||
|
const screenshotPath = "/tmp/e2e-failure.png";
|
||||||
|
await page.screenshot({ path: screenshotPath, fullPage: true });
|
||||||
|
console.log(`📸 Screenshot saved to ${screenshotPath}`);
|
||||||
|
} catch {
|
||||||
|
/* ignore screenshot errors */
|
||||||
|
}
|
||||||
|
console.log(` Current URL: ${page.url()}`);
|
||||||
await browser.close();
|
await browser.close();
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await browser.close();
|
||||||
|
console.log(`\n🎉 SUCCESS: E2E smoke test passed!`);
|
||||||
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|||||||
@@ -1,20 +1,53 @@
|
|||||||
const BASE_URL = process.env.TEST_URL || "http://localhost:3000";
|
const BASE_URL = process.env.TEST_URL || "http://localhost:3000";
|
||||||
|
|
||||||
console.log(`\n🚀 Starting OG Image Verification for ${BASE_URL}\n`);
|
console.log(`\n🚀 Starting Dynamic OG Image Verification for ${BASE_URL}\n`);
|
||||||
|
|
||||||
const routes = [
|
const pages = ["/", "/about", "/contact"];
|
||||||
"/api/og/meme", // Adjusted for mintel.me endpoints if they exist
|
|
||||||
];
|
|
||||||
|
|
||||||
async function verifyImage(path: string): Promise<boolean> {
|
|
||||||
const url = `${BASE_URL}${path}`;
|
|
||||||
const start = Date.now();
|
|
||||||
|
|
||||||
|
async function getOgImageUrl(pagePath: string): Promise<string | null> {
|
||||||
|
const url = `${BASE_URL}${pagePath}`;
|
||||||
try {
|
try {
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to fetch page: ${response.status}`);
|
||||||
|
}
|
||||||
|
const html = await response.text();
|
||||||
|
|
||||||
|
// Extract og:image content
|
||||||
|
const match = html.match(/property="og:image"\s+content="([^"]+)"/);
|
||||||
|
if (!match || !match[1]) {
|
||||||
|
// Try name="twitter:image" as fallback or check if it's there
|
||||||
|
const twitterMatch = html.match(
|
||||||
|
/name="twitter:image"\s+content="([^"]+)"/,
|
||||||
|
);
|
||||||
|
return twitterMatch ? twitterMatch[1] : null;
|
||||||
|
}
|
||||||
|
return match[1];
|
||||||
|
} catch (error) {
|
||||||
|
console.error(` ❌ Failed to discover OG image for ${pagePath}:`, error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyImage(
|
||||||
|
imageUrl: string,
|
||||||
|
pagePath: string,
|
||||||
|
): Promise<boolean> {
|
||||||
|
// If the image URL is absolute and contains mintel.me (base domain),
|
||||||
|
// we replace it with our BASE_URL to test the current environment's generated image
|
||||||
|
let testUrl = imageUrl;
|
||||||
|
if (imageUrl.startsWith("https://mintel.me")) {
|
||||||
|
testUrl = imageUrl.replace("https://mintel.me", BASE_URL);
|
||||||
|
} else if (imageUrl.startsWith("/")) {
|
||||||
|
testUrl = `${BASE_URL}${imageUrl}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = Date.now();
|
||||||
|
try {
|
||||||
|
const response = await fetch(testUrl);
|
||||||
const duration = Date.now() - start;
|
const duration = Date.now() - start;
|
||||||
|
|
||||||
console.log(`Checking ${url}...`);
|
console.log(`Checking OG Image for ${pagePath}: ${testUrl}...`);
|
||||||
|
|
||||||
const body = await response.clone().text();
|
const body = await response.clone().text();
|
||||||
const contentType = response.headers.get("content-type");
|
const contentType = response.headers.get("content-type");
|
||||||
@@ -44,19 +77,27 @@ async function verifyImage(path: string): Promise<boolean> {
|
|||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
let allOk = true;
|
let allOk = true;
|
||||||
for (const route of routes) {
|
|
||||||
const ok = await verifyImage(route);
|
for (const page of pages) {
|
||||||
|
console.log(`Discovering OG image for ${page}...`);
|
||||||
|
const ogUrl = await getOgImageUrl(page);
|
||||||
|
|
||||||
|
if (!ogUrl) {
|
||||||
|
console.error(` ❌ No OG image meta tag found for ${page}`);
|
||||||
|
allOk = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ok = await verifyImage(ogUrl, page);
|
||||||
if (!ok) allOk = false;
|
if (!ok) allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allOk) {
|
if (allOk) {
|
||||||
console.log("\n✨ OG images verified successfully!\n");
|
console.log("\n✨ All OG images verified successfully!\n");
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
} else {
|
} else {
|
||||||
console.warn(
|
console.error("\n❌ Some OG images failed verification.\n");
|
||||||
"\n⚠️ Some OG images failed verification (Non-blocking for now).\n",
|
process.exit(1);
|
||||||
);
|
|
||||||
process.exit(0); // Make it non-blocking if endpoints aren't fully ready
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ resolve_target() {
|
|||||||
testing)
|
testing)
|
||||||
REMOTE_PROJECT="mintel-me-testing"
|
REMOTE_PROJECT="mintel-me-testing"
|
||||||
REMOTE_DB_CONTAINER="mintel-me-testing-postgres-db-1"
|
REMOTE_DB_CONTAINER="mintel-me-testing-postgres-db-1"
|
||||||
REMOTE_APP_CONTAINER="mintel-me-testing-app-1"
|
REMOTE_APP_CONTAINER="mintel-me-testing-mintel-me-app-1"
|
||||||
REMOTE_SITE_DIR="/home/deploy/sites/testing.mintel.me"
|
REMOTE_SITE_DIR="/home/deploy/sites/testing.mintel.me"
|
||||||
;;
|
;;
|
||||||
staging)
|
staging)
|
||||||
@@ -108,8 +108,8 @@ resolve_target() {
|
|||||||
|
|
||||||
# Auto-detect remote DB credentials from the env file on the server
|
# Auto-detect remote DB credentials from the env file on the server
|
||||||
echo "🔍 Detecting $TARGET database credentials..."
|
echo "🔍 Detecting $TARGET database credentials..."
|
||||||
REMOTE_DB_USER=$(ssh "$SSH_HOST" "grep -h '^postgres_DB_USER=' $REMOTE_SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "")
|
REMOTE_DB_USER="directus"
|
||||||
REMOTE_DB_NAME=$(ssh "$SSH_HOST" "grep -h '^postgres_DB_NAME=' $REMOTE_SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "")
|
REMOTE_DB_NAME="directus"
|
||||||
REMOTE_DB_USER="${REMOTE_DB_USER:-payload}"
|
REMOTE_DB_USER="${REMOTE_DB_USER:-payload}"
|
||||||
REMOTE_DB_NAME="${REMOTE_DB_NAME:-payload}"
|
REMOTE_DB_NAME="${REMOTE_DB_NAME:-payload}"
|
||||||
echo " User: $REMOTE_DB_USER | DB: $REMOTE_DB_NAME"
|
echo " User: $REMOTE_DB_USER | DB: $REMOTE_DB_NAME"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { getPayload } from "payload";
|
|||||||
import configPromise from "../payload.config";
|
import configPromise from "../payload.config";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { parseMarkdownToLexical } from "../src/payload/utils/lexicalParser";
|
import { parseMarkdownToLexical } from "@mintel/payload-ai";
|
||||||
|
|
||||||
function parseMatter(content: string) {
|
function parseMatter(content: string) {
|
||||||
const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
||||||
|
|||||||
@@ -2,121 +2,129 @@ import { getPayload } from "payload";
|
|||||||
import configPromise from "../payload.config";
|
import configPromise from "../payload.config";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { parseMarkdownToLexical } from "../src/payload/utils/lexicalParser";
|
import { parseMarkdownToLexical } from "@mintel/payload-ai";
|
||||||
|
|
||||||
function extractFrontmatter(content: string) {
|
function extractFrontmatter(content: string) {
|
||||||
const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
||||||
if (!fmMatch) return {};
|
if (!fmMatch) return {};
|
||||||
const fm = fmMatch[1];
|
const fm = fmMatch[1];
|
||||||
const titleMatch = fm.match(/title:\s*"?([^"\n]+)"?/);
|
const titleMatch = fm.match(/title:\s*"?([^"\n]+)"?/);
|
||||||
const descMatch = fm.match(/description:\s*"?([^"\n]+)"?/);
|
const descMatch = fm.match(/description:\s*"?([^"\n]+)"?/);
|
||||||
const tagsMatch = fm.match(/tags:\s*\[(.*?)\]/);
|
const tagsMatch = fm.match(/tags:\s*\[(.*?)\]/);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: titleMatch ? titleMatch[1] : "Untitled Draft",
|
title: titleMatch ? titleMatch[1] : "Untitled Draft",
|
||||||
description: descMatch ? descMatch[1] : "No description",
|
description: descMatch ? descMatch[1] : "No description",
|
||||||
tags: tagsMatch ? tagsMatch[1].split(",").map(s => s.trim().replace(/"/g, "")) : []
|
tags: tagsMatch
|
||||||
};
|
? tagsMatch[1].split(",").map((s) => s.trim().replace(/"/g, ""))
|
||||||
|
: [],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
try {
|
try {
|
||||||
const payload = await getPayload({ config: configPromise });
|
const payload = await getPayload({ config: configPromise });
|
||||||
console.log("Payload initialized.");
|
console.log("Payload initialized.");
|
||||||
|
|
||||||
const draftsDir = path.resolve(process.cwd(), "content/drafts");
|
const draftsDir = path.resolve(process.cwd(), "content/drafts");
|
||||||
const publicBlogDir = path.resolve(process.cwd(), "public/blog");
|
const publicBlogDir = path.resolve(process.cwd(), "public/blog");
|
||||||
|
|
||||||
if (!fs.existsSync(draftsDir)) {
|
if (!fs.existsSync(draftsDir)) {
|
||||||
console.log(`Drafts directory not found at ${draftsDir}`);
|
console.log(`Drafts directory not found at ${draftsDir}`);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
|
||||||
|
|
||||||
const files = fs.readdirSync(draftsDir).filter(f => f.endsWith(".md"));
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
console.log(`Processing ${file}...`);
|
|
||||||
const filePath = path.join(draftsDir, file);
|
|
||||||
const content = fs.readFileSync(filePath, "utf8");
|
|
||||||
|
|
||||||
const fm = extractFrontmatter(content);
|
|
||||||
const lexicalNodes = parseMarkdownToLexical(content);
|
|
||||||
const lexicalContent = {
|
|
||||||
root: {
|
|
||||||
type: "root",
|
|
||||||
format: "" as const,
|
|
||||||
indent: 0,
|
|
||||||
version: 1,
|
|
||||||
direction: "ltr" as const,
|
|
||||||
children: lexicalNodes
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Upload thumbnail if exists
|
|
||||||
let featuredImageId = null;
|
|
||||||
const thumbPath = path.join(publicBlogDir, `${file}.png`);
|
|
||||||
if (fs.existsSync(thumbPath)) {
|
|
||||||
console.log(`Uploading thumbnail ${file}.png...`);
|
|
||||||
const fileData = fs.readFileSync(thumbPath);
|
|
||||||
const stat = fs.statSync(thumbPath);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const newMedia = await payload.create({
|
|
||||||
collection: "media",
|
|
||||||
data: {
|
|
||||||
alt: `Thumbnail for ${fm.title}`,
|
|
||||||
},
|
|
||||||
file: {
|
|
||||||
data: fileData,
|
|
||||||
name: `optimized-${file}.png`,
|
|
||||||
mimetype: "image/png",
|
|
||||||
size: stat.size,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
featuredImageId = newMedia.id;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("Failed to upload thumbnail", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const tagsArray = fm.tags.map(tag => ({ tag }));
|
|
||||||
|
|
||||||
const slug = fm.title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "").substring(0, 60);
|
|
||||||
|
|
||||||
// Check if already exists
|
|
||||||
const existing = await payload.find({
|
|
||||||
collection: "posts",
|
|
||||||
where: { slug: { equals: slug } },
|
|
||||||
});
|
|
||||||
|
|
||||||
if (existing.totalDocs === 0) {
|
|
||||||
await payload.create({
|
|
||||||
collection: "posts",
|
|
||||||
data: {
|
|
||||||
title: fm.title,
|
|
||||||
slug: slug,
|
|
||||||
description: fm.description,
|
|
||||||
date: new Date().toISOString(),
|
|
||||||
tags: tagsArray,
|
|
||||||
featuredImage: featuredImageId,
|
|
||||||
content: lexicalContent,
|
|
||||||
_status: "published"
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(`Created CMS entry for ${file}.`);
|
|
||||||
count++;
|
|
||||||
} else {
|
|
||||||
console.log(`Post with slug ${slug} already exists. Skipping.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`Migration successful! Added ${count} new optimized posts to the database.`);
|
|
||||||
process.exit(0);
|
|
||||||
} catch (e) {
|
|
||||||
console.error("Migration failed:", e);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const files = fs.readdirSync(draftsDir).filter((f) => f.endsWith(".md"));
|
||||||
|
let count = 0;
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
console.log(`Processing ${file}...`);
|
||||||
|
const filePath = path.join(draftsDir, file);
|
||||||
|
const content = fs.readFileSync(filePath, "utf8");
|
||||||
|
|
||||||
|
const fm = extractFrontmatter(content);
|
||||||
|
const lexicalNodes = parseMarkdownToLexical(content);
|
||||||
|
const lexicalContent = {
|
||||||
|
root: {
|
||||||
|
type: "root",
|
||||||
|
format: "" as const,
|
||||||
|
indent: 0,
|
||||||
|
version: 1,
|
||||||
|
direction: "ltr" as const,
|
||||||
|
children: lexicalNodes,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Upload thumbnail if exists
|
||||||
|
let featuredImageId = null;
|
||||||
|
const thumbPath = path.join(publicBlogDir, `${file}.png`);
|
||||||
|
if (fs.existsSync(thumbPath)) {
|
||||||
|
console.log(`Uploading thumbnail ${file}.png...`);
|
||||||
|
const fileData = fs.readFileSync(thumbPath);
|
||||||
|
const stat = fs.statSync(thumbPath);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const newMedia = await payload.create({
|
||||||
|
collection: "media",
|
||||||
|
data: {
|
||||||
|
alt: `Thumbnail for ${fm.title}`,
|
||||||
|
},
|
||||||
|
file: {
|
||||||
|
data: fileData,
|
||||||
|
name: `optimized-${file}.png`,
|
||||||
|
mimetype: "image/png",
|
||||||
|
size: stat.size,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
featuredImageId = newMedia.id;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("Failed to upload thumbnail", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const tagsArray = fm.tags.map((tag) => ({ tag }));
|
||||||
|
|
||||||
|
const slug = fm.title
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z0-9]+/g, "-")
|
||||||
|
.replace(/(^-|-$)/g, "")
|
||||||
|
.substring(0, 60);
|
||||||
|
|
||||||
|
// Check if already exists
|
||||||
|
const existing = await payload.find({
|
||||||
|
collection: "posts",
|
||||||
|
where: { slug: { equals: slug } },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (existing.totalDocs === 0) {
|
||||||
|
await payload.create({
|
||||||
|
collection: "posts",
|
||||||
|
data: {
|
||||||
|
title: fm.title,
|
||||||
|
slug: slug,
|
||||||
|
description: fm.description,
|
||||||
|
date: new Date().toISOString(),
|
||||||
|
tags: tagsArray,
|
||||||
|
featuredImage: featuredImageId,
|
||||||
|
content: lexicalContent,
|
||||||
|
_status: "published",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(`Created CMS entry for ${file}.`);
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
console.log(`Post with slug ${slug} already exists. Skipping.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
`Migration successful! Added ${count} new optimized posts to the database.`,
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Migration failed:", e);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
@@ -215,8 +215,6 @@ export const AgbsPDF = ({
|
|||||||
companyData={companyData}
|
companyData={companyData}
|
||||||
bankData={bankData}
|
bankData={bankData}
|
||||||
footerLogo={footerLogo}
|
footerLogo={footerLogo}
|
||||||
icon={headerIcon}
|
|
||||||
pageNumber="10"
|
|
||||||
showPageNumber={false}
|
showPageNumber={false}
|
||||||
>
|
>
|
||||||
{content}
|
{content}
|
||||||
@@ -227,7 +225,12 @@ export const AgbsPDF = ({
|
|||||||
return (
|
return (
|
||||||
<PDFPage size="A4" style={pdfStyles.page}>
|
<PDFPage size="A4" style={pdfStyles.page}>
|
||||||
<FoldingMarks />
|
<FoldingMarks />
|
||||||
<Header icon={headerIcon} showAddress={false} />
|
<Header
|
||||||
|
icon={headerIcon}
|
||||||
|
showAddress={false}
|
||||||
|
sender={companyData as any}
|
||||||
|
recipient={{} as any}
|
||||||
|
/>
|
||||||
{content}
|
{content}
|
||||||
<Footer
|
<Footer
|
||||||
logo={footerLogo}
|
logo={footerLogo}
|
||||||
|
|||||||
@@ -47,8 +47,7 @@ export const CombinedQuotePDF = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const layoutProps = {
|
const layoutProps = {
|
||||||
date,
|
headerIcon: estimationProps.headerIcon,
|
||||||
icon: estimationProps.headerIcon,
|
|
||||||
footerLogo: estimationProps.footerLogo,
|
footerLogo: estimationProps.footerLogo,
|
||||||
companyData,
|
companyData,
|
||||||
bankData,
|
bankData,
|
||||||
@@ -73,7 +72,7 @@ export const CombinedQuotePDF = ({
|
|||||||
footerLogo={estimationProps.footerLogo}
|
footerLogo={estimationProps.footerLogo}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<SimpleLayout {...layoutProps} pageNumber="END" showPageNumber={false}>
|
<SimpleLayout {...layoutProps} showPageNumber={false}>
|
||||||
<ClosingModule />
|
<ClosingModule />
|
||||||
</SimpleLayout>
|
</SimpleLayout>
|
||||||
</PDFDocument>
|
</PDFDocument>
|
||||||
|
|||||||
@@ -77,12 +77,17 @@ export const LocalEstimationPDF = ({
|
|||||||
ustId: "DE367588065",
|
ustId: "DE367588065",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const bankData = {
|
||||||
|
name: "N26",
|
||||||
|
bic: "NTSBDEB1XXX",
|
||||||
|
iban: "DE50 1001 1001 2620 4328 65",
|
||||||
|
};
|
||||||
|
|
||||||
const commonProps = {
|
const commonProps = {
|
||||||
state,
|
headerIcon: headerIcon,
|
||||||
date,
|
|
||||||
icon: headerIcon,
|
|
||||||
footerLogo,
|
footerLogo,
|
||||||
companyData,
|
companyData,
|
||||||
|
bankData,
|
||||||
};
|
};
|
||||||
|
|
||||||
let pageCounter = 1;
|
let pageCounter = 1;
|
||||||
@@ -103,12 +108,12 @@ export const LocalEstimationPDF = ({
|
|||||||
{/* BriefingModule Page REMOVED as per user request ("die zweite seite ist leer, weg damit") */}
|
{/* BriefingModule Page REMOVED as per user request ("die zweite seite ist leer, weg damit") */}
|
||||||
|
|
||||||
{state.sitemap && state.sitemap.length > 0 && (
|
{state.sitemap && state.sitemap.length > 0 && (
|
||||||
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
|
<SimpleLayout {...commonProps} showPageNumber={false}>
|
||||||
<SitemapModule state={state} />
|
<SitemapModule state={state} />
|
||||||
</SimpleLayout>
|
</SimpleLayout>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
|
<SimpleLayout {...commonProps} showPageNumber={false}>
|
||||||
<EstimationModule
|
<EstimationModule
|
||||||
state={state}
|
state={state}
|
||||||
positions={positions}
|
positions={positions}
|
||||||
@@ -117,11 +122,11 @@ export const LocalEstimationPDF = ({
|
|||||||
/>
|
/>
|
||||||
</SimpleLayout>
|
</SimpleLayout>
|
||||||
|
|
||||||
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
|
<SimpleLayout {...commonProps} showPageNumber={false}>
|
||||||
<TransparenzModule pricing={pricing} />
|
<TransparenzModule pricing={pricing} />
|
||||||
</SimpleLayout>
|
</SimpleLayout>
|
||||||
|
|
||||||
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
|
<SimpleLayout {...commonProps} showPageNumber={false}>
|
||||||
<ClosingModule />
|
<ClosingModule />
|
||||||
</SimpleLayout>
|
</SimpleLayout>
|
||||||
</PDFDocument>
|
</PDFDocument>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { calculatePositions as logicCalculatePositions } from "@mintel/pdf";
|
import { calculatePositions as logicCalculatePositions } from "@mintel/pdf";
|
||||||
import { FormState } from "./types";
|
import { FormState } from "./types";
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
export type { Position } from "@mintel/pdf";
|
export type { Position } from "@mintel/pdf";
|
||||||
|
|
||||||
export const calculatePositions = (state: FormState, pricing: any) =>
|
export const calculatePositions = (state: FormState, pricing: any) =>
|
||||||
|
|||||||
3671
apps/web/src/migrations/20260301_151838.json
Normal file
3671
apps/web/src/migrations/20260301_151838.json
Normal file
File diff suppressed because it is too large
Load Diff
155
apps/web/src/migrations/20260301_151838.ts
Normal file
155
apps/web/src/migrations/20260301_151838.ts
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
import { MigrateUpArgs, MigrateDownArgs, sql } from "@payloadcms/db-postgres";
|
||||||
|
|
||||||
|
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
||||||
|
await db.execute(sql`
|
||||||
|
CREATE TYPE "public"."enum_crm_topics_status" AS ENUM('active', 'paused', 'won', 'lost');
|
||||||
|
CREATE TYPE "public"."enum_crm_topics_stage" AS ENUM('discovery', 'proposal', 'negotiation', 'implementation');
|
||||||
|
CREATE TYPE "public"."enum_projects_milestones_status" AS ENUM('todo', 'in_progress', 'done');
|
||||||
|
CREATE TYPE "public"."enum_projects_milestones_priority" AS ENUM('low', 'medium', 'high');
|
||||||
|
CREATE TYPE "public"."enum_projects_status" AS ENUM('draft', 'in_progress', 'review', 'completed');
|
||||||
|
ALTER TYPE "public"."enum_crm_accounts_status" ADD VALUE 'partner' BEFORE 'lost';
|
||||||
|
ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'whatsapp' BEFORE 'note';
|
||||||
|
ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'social' BEFORE 'note';
|
||||||
|
ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'document' BEFORE 'note';
|
||||||
|
CREATE TABLE "crm_topics" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"title" varchar NOT NULL,
|
||||||
|
"account_id" integer NOT NULL,
|
||||||
|
"status" "enum_crm_topics_status" DEFAULT 'active' NOT NULL,
|
||||||
|
"stage" "enum_crm_topics_stage",
|
||||||
|
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
||||||
|
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "crm_interactions_rels" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"order" integer,
|
||||||
|
"parent_id" integer NOT NULL,
|
||||||
|
"path" varchar NOT NULL,
|
||||||
|
"media_id" integer
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "projects_milestones" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" integer NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"name" varchar NOT NULL,
|
||||||
|
"status" "enum_projects_milestones_status" DEFAULT 'todo' NOT NULL,
|
||||||
|
"priority" "enum_projects_milestones_priority" DEFAULT 'medium',
|
||||||
|
"start_date" timestamp(3) with time zone,
|
||||||
|
"target_date" timestamp(3) with time zone,
|
||||||
|
"assignee_id" integer
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "projects" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"title" varchar NOT NULL,
|
||||||
|
"account_id" integer NOT NULL,
|
||||||
|
"status" "enum_projects_status" DEFAULT 'draft' NOT NULL,
|
||||||
|
"start_date" timestamp(3) with time zone,
|
||||||
|
"target_date" timestamp(3) with time zone,
|
||||||
|
"value_min" numeric,
|
||||||
|
"value_max" numeric,
|
||||||
|
"briefing" jsonb,
|
||||||
|
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
||||||
|
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "projects_rels" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"order" integer,
|
||||||
|
"parent_id" integer NOT NULL,
|
||||||
|
"path" varchar NOT NULL,
|
||||||
|
"crm_contacts_id" integer,
|
||||||
|
"media_id" integer
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'note';
|
||||||
|
ALTER TABLE "inquiries" ADD COLUMN "processed" boolean DEFAULT false;
|
||||||
|
ALTER TABLE "crm_contacts" ADD COLUMN "full_name" varchar;
|
||||||
|
ALTER TABLE "crm_interactions" ADD COLUMN "topic_id" integer;
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "crm_topics_id" integer;
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "projects_id" integer;
|
||||||
|
ALTER TABLE "crm_topics" ADD CONSTRAINT "crm_topics_account_id_crm_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."crm_accounts"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
ALTER TABLE "crm_interactions_rels" ADD CONSTRAINT "crm_interactions_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."crm_interactions"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "crm_interactions_rels" ADD CONSTRAINT "crm_interactions_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects_milestones" ADD CONSTRAINT "projects_milestones_assignee_id_users_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects_milestones" ADD CONSTRAINT "projects_milestones_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects" ADD CONSTRAINT "projects_account_id_crm_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."crm_accounts"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_crm_contacts_fk" FOREIGN KEY ("crm_contacts_id") REFERENCES "public"."crm_contacts"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
CREATE INDEX "crm_topics_account_idx" ON "crm_topics" USING btree ("account_id");
|
||||||
|
CREATE INDEX "crm_topics_updated_at_idx" ON "crm_topics" USING btree ("updated_at");
|
||||||
|
CREATE INDEX "crm_topics_created_at_idx" ON "crm_topics" USING btree ("created_at");
|
||||||
|
CREATE INDEX "crm_interactions_rels_order_idx" ON "crm_interactions_rels" USING btree ("order");
|
||||||
|
CREATE INDEX "crm_interactions_rels_parent_idx" ON "crm_interactions_rels" USING btree ("parent_id");
|
||||||
|
CREATE INDEX "crm_interactions_rels_path_idx" ON "crm_interactions_rels" USING btree ("path");
|
||||||
|
CREATE INDEX "crm_interactions_rels_media_id_idx" ON "crm_interactions_rels" USING btree ("media_id");
|
||||||
|
CREATE INDEX "projects_milestones_order_idx" ON "projects_milestones" USING btree ("_order");
|
||||||
|
CREATE INDEX "projects_milestones_parent_id_idx" ON "projects_milestones" USING btree ("_parent_id");
|
||||||
|
CREATE INDEX "projects_milestones_assignee_idx" ON "projects_milestones" USING btree ("assignee_id");
|
||||||
|
CREATE INDEX "projects_account_idx" ON "projects" USING btree ("account_id");
|
||||||
|
CREATE INDEX "projects_updated_at_idx" ON "projects" USING btree ("updated_at");
|
||||||
|
CREATE INDEX "projects_created_at_idx" ON "projects" USING btree ("created_at");
|
||||||
|
CREATE INDEX "projects_rels_order_idx" ON "projects_rels" USING btree ("order");
|
||||||
|
CREATE INDEX "projects_rels_parent_idx" ON "projects_rels" USING btree ("parent_id");
|
||||||
|
CREATE INDEX "projects_rels_path_idx" ON "projects_rels" USING btree ("path");
|
||||||
|
CREATE INDEX "projects_rels_crm_contacts_id_idx" ON "projects_rels" USING btree ("crm_contacts_id");
|
||||||
|
CREATE INDEX "projects_rels_media_id_idx" ON "projects_rels" USING btree ("media_id");
|
||||||
|
ALTER TABLE "crm_interactions" ADD CONSTRAINT "crm_interactions_topic_id_crm_topics_id_fk" FOREIGN KEY ("topic_id") REFERENCES "public"."crm_topics"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_crm_topics_fk" FOREIGN KEY ("crm_topics_id") REFERENCES "public"."crm_topics"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_projects_fk" FOREIGN KEY ("projects_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
CREATE INDEX "crm_interactions_topic_idx" ON "crm_interactions" USING btree ("topic_id");
|
||||||
|
CREATE INDEX "payload_locked_documents_rels_crm_topics_id_idx" ON "payload_locked_documents_rels" USING btree ("crm_topics_id");
|
||||||
|
CREATE INDEX "payload_locked_documents_rels_projects_id_idx" ON "payload_locked_documents_rels" USING btree ("projects_id");`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down({
|
||||||
|
db,
|
||||||
|
payload,
|
||||||
|
req,
|
||||||
|
}: MigrateDownArgs): Promise<void> {
|
||||||
|
await db.execute(sql`
|
||||||
|
ALTER TABLE "crm_topics" DISABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE "crm_interactions_rels" DISABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE "projects_milestones" DISABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE "projects" DISABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE "projects_rels" DISABLE ROW LEVEL SECURITY;
|
||||||
|
DROP TABLE "crm_topics" CASCADE;
|
||||||
|
DROP TABLE "crm_interactions_rels" CASCADE;
|
||||||
|
DROP TABLE "projects_milestones" CASCADE;
|
||||||
|
DROP TABLE "projects" CASCADE;
|
||||||
|
DROP TABLE "projects_rels" CASCADE;
|
||||||
|
ALTER TABLE "crm_interactions" DROP CONSTRAINT "crm_interactions_topic_id_crm_topics_id_fk";
|
||||||
|
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_crm_topics_fk";
|
||||||
|
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_projects_fk";
|
||||||
|
|
||||||
|
ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DATA TYPE text;
|
||||||
|
ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DEFAULT 'lead'::text;
|
||||||
|
DROP TYPE "public"."enum_crm_accounts_status";
|
||||||
|
CREATE TYPE "public"."enum_crm_accounts_status" AS ENUM('lead', 'client', 'lost');
|
||||||
|
ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DEFAULT 'lead'::"public"."enum_crm_accounts_status";
|
||||||
|
ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DATA TYPE "public"."enum_crm_accounts_status" USING "status"::"public"."enum_crm_accounts_status";
|
||||||
|
ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DATA TYPE text;
|
||||||
|
ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'email'::text;
|
||||||
|
DROP TYPE "public"."enum_crm_interactions_type";
|
||||||
|
CREATE TYPE "public"."enum_crm_interactions_type" AS ENUM('email', 'call', 'meeting', 'note');
|
||||||
|
ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'email'::"public"."enum_crm_interactions_type";
|
||||||
|
ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DATA TYPE "public"."enum_crm_interactions_type" USING "type"::"public"."enum_crm_interactions_type";
|
||||||
|
DROP INDEX "crm_interactions_topic_idx";
|
||||||
|
DROP INDEX "payload_locked_documents_rels_crm_topics_id_idx";
|
||||||
|
DROP INDEX "payload_locked_documents_rels_projects_id_idx";
|
||||||
|
ALTER TABLE "inquiries" DROP COLUMN "processed";
|
||||||
|
ALTER TABLE "crm_contacts" DROP COLUMN "full_name";
|
||||||
|
ALTER TABLE "crm_interactions" DROP COLUMN "topic_id";
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "crm_topics_id";
|
||||||
|
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "projects_id";
|
||||||
|
DROP TYPE "public"."enum_crm_topics_status";
|
||||||
|
DROP TYPE "public"."enum_crm_topics_stage";
|
||||||
|
DROP TYPE "public"."enum_projects_milestones_status";
|
||||||
|
DROP TYPE "public"."enum_projects_milestones_priority";
|
||||||
|
DROP TYPE "public"."enum_projects_status";`);
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import * as migration_20260227_171023_crm_collections from "./20260227_171023_crm_collections";
|
import * as migration_20260227_171023_crm_collections from "./20260227_171023_crm_collections";
|
||||||
|
import * as migration_20260301_151838 from "./20260301_151838";
|
||||||
|
|
||||||
export const migrations = [
|
export const migrations = [
|
||||||
{
|
{
|
||||||
@@ -6,4 +7,9 @@ export const migrations = [
|
|||||||
down: migration_20260227_171023_crm_collections.down,
|
down: migration_20260227_171023_crm_collections.down,
|
||||||
name: "20260227_171023_crm_collections",
|
name: "20260227_171023_crm_collections",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
up: migration_20260301_151838.up,
|
||||||
|
down: migration_20260301_151838.down,
|
||||||
|
name: "20260301_151838",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -3,11 +3,9 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import { useDocumentInfo } from "@payloadcms/ui";
|
import { useDocumentInfo } from "@payloadcms/ui";
|
||||||
import { toast } from "@payloadcms/ui";
|
import { toast } from "@payloadcms/ui";
|
||||||
import { useRouter } from "next/navigation";
|
|
||||||
|
|
||||||
export const AiAnalyzeButton: React.FC = () => {
|
export const AiAnalyzeButton: React.FC = () => {
|
||||||
const { id, title } = useDocumentInfo();
|
const { id } = useDocumentInfo();
|
||||||
const router = useRouter();
|
|
||||||
const [isAnalyzing, setIsAnalyzing] = useState(false);
|
const [isAnalyzing, setIsAnalyzing] = useState(false);
|
||||||
const [hasWebsite, setHasWebsite] = useState(false);
|
const [hasWebsite, setHasWebsite] = useState(false);
|
||||||
|
|
||||||
|
|||||||
@@ -10,51 +10,51 @@ services:
|
|||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
# HTTP ⇒ HTTPS redirect
|
# HTTP ⇒ HTTPS redirect
|
||||||
- 'traefik.http.routers.mintel-me-web.rule=${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}'
|
- 'traefik.http.routers.${PROJECT_NAME}-web.rule=${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}'
|
||||||
- "traefik.http.routers.mintel-me-web.entrypoints=web"
|
- "traefik.http.routers.${PROJECT_NAME}-web.entrypoints=web"
|
||||||
# - "traefik.http.routers.mintel-me-web.middlewares=redirect-https"
|
# - "traefik.http.routers.${PROJECT_NAME}-web.middlewares=redirect-https"
|
||||||
# HTTPS router (Standard)
|
# HTTPS router (Standard)
|
||||||
- 'traefik.http.routers.mintel-me.rule=${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}'
|
- 'traefik.http.routers.${PROJECT_NAME}.rule=${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}'
|
||||||
- "traefik.http.routers.mintel-me.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
- "traefik.http.routers.${PROJECT_NAME}.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
||||||
- "traefik.http.routers.mintel-me.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
- "traefik.http.routers.${PROJECT_NAME}.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
||||||
- "traefik.http.routers.mintel-me.tls=${TRAEFIK_TLS:-false}"
|
- "traefik.http.routers.${PROJECT_NAME}.tls=${TRAEFIK_TLS:-false}"
|
||||||
- "traefik.http.routers.mintel-me.service=mintel-me-app-svc"
|
- "traefik.http.routers.${PROJECT_NAME}.service=${PROJECT_NAME}-app-svc"
|
||||||
- "traefik.http.routers.mintel-me.middlewares=${AUTH_MIDDLEWARE:-mintel-me-ratelimit,mintel-me-forward}"
|
- "traefik.http.routers.${PROJECT_NAME}.middlewares=${AUTH_MIDDLEWARE:-${PROJECT_NAME}-ratelimit,${PROJECT_NAME}-forward}"
|
||||||
- "traefik.http.services.mintel-me-app-svc.loadbalancer.server.port=3000"
|
- "traefik.http.services.${PROJECT_NAME}-app-svc.loadbalancer.server.port=3000"
|
||||||
- "traefik.docker.network=infra"
|
- "traefik.docker.network=infra"
|
||||||
- "caddy=${TRAEFIK_HOST:-mintel.localhost}"
|
- "caddy=${TRAEFIK_HOST:-mintel.localhost}"
|
||||||
- "caddy.reverse_proxy={{upstreams 3000}}"
|
- "caddy.reverse_proxy={{upstreams 3000}}"
|
||||||
|
|
||||||
# Public Router (Whitelist for OG Images, Sitemaps, Health)
|
# Public Router (Whitelist for OG Images, Sitemaps, Health)
|
||||||
- 'traefik.http.routers.mintel-me-public.rule=(${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}) && (PathPrefix("/health") || PathPrefix("/sitemap.xml") || PathPrefix("/robots.txt") || PathPrefix("/manifest.webmanifest") || PathPrefix("/api/og") || PathRegexp(".*opengraph-image.*") || PathRegexp(".*sitemap.*"))'
|
- 'traefik.http.routers.${PROJECT_NAME}-public.rule=(${TRAEFIK_HOST_RULE:-Host("${TRAEFIK_HOST:-mintel.localhost}")}) && (PathPrefix("/health") || PathPrefix("/api/health") || PathPrefix("/sitemap.xml") || PathPrefix("/robots.txt") || PathPrefix("/manifest.webmanifest") || PathPrefix("/api/og") || PathRegexp(".*opengraph-image.*") || PathRegexp(".*sitemap.*"))'
|
||||||
- "traefik.http.routers.mintel-me-public.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
- "traefik.http.routers.${PROJECT_NAME}-public.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
||||||
- "traefik.http.routers.mintel-me-public.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
- "traefik.http.routers.${PROJECT_NAME}-public.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
||||||
- "traefik.http.routers.mintel-me-public.tls=${TRAEFIK_TLS:-false}"
|
- "traefik.http.routers.${PROJECT_NAME}-public.tls=${TRAEFIK_TLS:-false}"
|
||||||
- "traefik.http.routers.mintel-me-public.service=mintel-me-app-svc"
|
- "traefik.http.routers.${PROJECT_NAME}-public.service=${PROJECT_NAME}-app-svc"
|
||||||
- "traefik.http.routers.mintel-me-public.middlewares=${AUTH_MIDDLEWARE_UNPROTECTED:-mintel-me-ratelimit,mintel-me-forward}"
|
- "traefik.http.routers.${PROJECT_NAME}-public.middlewares=${AUTH_MIDDLEWARE_UNPROTECTED:-${PROJECT_NAME}-ratelimit,${PROJECT_NAME}-forward}"
|
||||||
- "traefik.http.routers.mintel-me-public.priority=2000"
|
- "traefik.http.routers.${PROJECT_NAME}-public.priority=2000"
|
||||||
|
|
||||||
# Middlewares
|
# Middlewares
|
||||||
- "traefik.http.middlewares.mintel-me-ratelimit.ratelimit.average=100"
|
- "traefik.http.middlewares.${PROJECT_NAME}-ratelimit.ratelimit.average=100"
|
||||||
- "traefik.http.middlewares.mintel-me-ratelimit.ratelimit.burst=50"
|
- "traefik.http.middlewares.${PROJECT_NAME}-ratelimit.ratelimit.burst=50"
|
||||||
|
|
||||||
# Gatekeeper Router (Path-based)
|
# Gatekeeper Router (Path-based)
|
||||||
- 'traefik.http.routers.mintel-me-gatekeeper.rule=(Host("${TRAEFIK_HOST:-mintel.localhost}") && PathPrefix("/gatekeeper"))'
|
- 'traefik.http.routers.${PROJECT_NAME}-gatekeeper.rule=(Host("${TRAEFIK_HOST:-mintel.localhost}") && PathPrefix("/gatekeeper"))'
|
||||||
- "traefik.http.routers.mintel-me-gatekeeper.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
- "traefik.http.routers.${PROJECT_NAME}-gatekeeper.entrypoints=${TRAEFIK_ENTRYPOINT:-web}"
|
||||||
- "traefik.http.routers.mintel-me-gatekeeper.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
- "traefik.http.routers.${PROJECT_NAME}-gatekeeper.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}"
|
||||||
- "traefik.http.routers.mintel-me-gatekeeper.tls=${TRAEFIK_TLS:-false}"
|
- "traefik.http.routers.${PROJECT_NAME}-gatekeeper.tls=${TRAEFIK_TLS:-false}"
|
||||||
- "traefik.http.routers.mintel-me-gatekeeper.service=mintel-me-gatekeeper-svc"
|
- "traefik.http.routers.${PROJECT_NAME}-gatekeeper.service=${PROJECT_NAME}-gatekeeper-svc"
|
||||||
|
|
||||||
- "traefik.http.middlewares.mintel-me-auth.forwardauth.address=http://mintel-me-gatekeeper:3000/gatekeeper/api/verify"
|
- "traefik.http.middlewares.${PROJECT_NAME}-auth.forwardauth.address=http://${PROJECT_NAME}-gatekeeper:3000/gatekeeper/api/verify"
|
||||||
- "traefik.http.middlewares.mintel-me-auth.forwardauth.trustForwardHeader=true"
|
- "traefik.http.middlewares.${PROJECT_NAME}-auth.forwardauth.trustForwardHeader=true"
|
||||||
- "traefik.http.middlewares.mintel-me-auth.forwardauth.authRequestHeaders=X-Forwarded-Host,X-Forwarded-Proto,X-Forwarded-For,Cookie"
|
- "traefik.http.middlewares.${PROJECT_NAME}-auth.forwardauth.authRequestHeaders=X-Forwarded-Host,X-Forwarded-Proto,X-Forwarded-For,Cookie"
|
||||||
- "traefik.http.middlewares.mintel-me-auth.forwardauth.authResponseHeaders=X-Auth-User"
|
- "traefik.http.middlewares.${PROJECT_NAME}-auth.forwardauth.authResponseHeaders=X-Auth-User"
|
||||||
|
|
||||||
# Forwarded Headers
|
# Forwarded Headers
|
||||||
- "traefik.http.middlewares.mintel-me-forward.headers.customrequestheaders.X-Forwarded-Proto=https"
|
- "traefik.http.middlewares.${PROJECT_NAME}-forward.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||||
- "traefik.http.middlewares.mintel-me-forward.headers.customrequestheaders.X-Forwarded-Ssl=on"
|
- "traefik.http.middlewares.${PROJECT_NAME}-forward.headers.customrequestheaders.X-Forwarded-Ssl=on"
|
||||||
|
|
||||||
mintel-me-gatekeeper:
|
gatekeeper:
|
||||||
profiles: ["gatekeeper"]
|
profiles: ["gatekeeper"]
|
||||||
image: registry.infra.mintel.me/mintel/gatekeeper:v1.7.12
|
image: registry.infra.mintel.me/mintel/gatekeeper:v1.7.12
|
||||||
container_name: ${PROJECT_NAME:-mintel-me}-gatekeeper
|
container_name: ${PROJECT_NAME:-mintel-me}-gatekeeper
|
||||||
@@ -62,7 +62,7 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
infra:
|
infra:
|
||||||
aliases:
|
aliases:
|
||||||
- mintel-me-gatekeeper
|
- ${PROJECT_NAME}-gatekeeper
|
||||||
env_file:
|
env_file:
|
||||||
- ${ENV_FILE:-.env}
|
- ${ENV_FILE:-.env}
|
||||||
environment:
|
environment:
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
GATEKEEPER_PASSWORD: ${GATEKEEPER_PASSWORD:-mintel}
|
GATEKEEPER_PASSWORD: ${GATEKEEPER_PASSWORD:-mintel}
|
||||||
NEXT_PUBLIC_BASE_URL: ${GATEKEEPER_ORIGIN}
|
NEXT_PUBLIC_BASE_URL: ${GATEKEEPER_ORIGIN}
|
||||||
labels:
|
labels:
|
||||||
- "traefik.http.services.mintel-me-gatekeeper-svc.loadbalancer.server.port=3000"
|
- "traefik.http.services.${PROJECT_NAME}-gatekeeper-svc.loadbalancer.server.port=3000"
|
||||||
- "traefik.docker.network=infra"
|
- "traefik.docker.network=infra"
|
||||||
- "caddy=gatekeeper.${TRAEFIK_HOST:-mintel.localhost}"
|
- "caddy=gatekeeper.${TRAEFIK_HOST:-mintel.localhost}"
|
||||||
- "caddy.reverse_proxy={{upstreams 3000}}"
|
- "caddy.reverse_proxy={{upstreams 3000}}"
|
||||||
|
|||||||
Reference in New Issue
Block a user