From 8ba46e96a65e0299cd42171665ab03c94794acba Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Sat, 17 Jan 2026 00:28:25 +0100 Subject: [PATCH] website refactor --- .dockerignore | 4 ++++ README.docker.md | 5 +++-- apps/website/Dockerfile.e2e | 6 +++++- .../typeorm/entities/AdminUserOrmEntity.ts | 6 +++--- package.json | 11 +++-------- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.dockerignore b/.dockerignore index 119ae8b76..266bf5742 100644 --- a/.dockerignore +++ b/.dockerignore @@ -52,6 +52,10 @@ Thumbs.db coverage .nyc_output test-results +tests/ +playwright*.config.ts +*.spec.ts +*.test.ts # Logs *.log diff --git a/README.docker.md b/README.docker.md index 4d73da6a0..64a734204 100644 --- a/README.docker.md +++ b/README.docker.md @@ -101,14 +101,15 @@ The new unified e2e test environment runs **everything in Docker** - website, AP npm run test:e2e:website # Or step-by-step: -npm run docker:e2e:up # Start all services +npm run docker:e2e:up # Start all services (fast, uses cache) +npm run docker:e2e:build # Force rebuild website image npm run docker:e2e:logs # View logs npm run docker:e2e:down # Stop services npm run docker:e2e:clean # Clean everything ``` **What this does:** -- Builds optimized website image with all SWC dependencies +- Builds optimized website image with all SWC dependencies (cached unless source changes) - Starts PostgreSQL database (port 5434) - Starts API server (port 3101) - Starts website server (port 3100) diff --git a/apps/website/Dockerfile.e2e b/apps/website/Dockerfile.e2e index 88d488662..d0aa6d9c7 100644 --- a/apps/website/Dockerfile.e2e +++ b/apps/website/Dockerfile.e2e @@ -38,7 +38,11 @@ ENV NPM_CONFIG_FUND=false \ RUN npm install --include-workspace-root --no-audit --fund=false # Copy source code -COPY . . +COPY core ./core +COPY adapters ./adapters +COPY apps/website ./apps/website +COPY scripts ./scripts +COPY *.json *.js *.ts *.md ./ # Set environment variables for build ENV NODE_ENV=${NODE_ENV} diff --git a/core/admin/infrastructure/typeorm/entities/AdminUserOrmEntity.ts b/core/admin/infrastructure/typeorm/entities/AdminUserOrmEntity.ts index cc48b410e..5640bd5fb 100644 --- a/core/admin/infrastructure/typeorm/entities/AdminUserOrmEntity.ts +++ b/core/admin/infrastructure/typeorm/entities/AdminUserOrmEntity.ts @@ -21,12 +21,12 @@ export class AdminUserOrmEntity { @Column({ type: 'text', nullable: true }) primaryDriverId?: string; - @Column({ type: 'datetime', nullable: true }) + @Column({ type: 'timestamptz', nullable: true }) lastLoginAt?: Date; - @CreateDateColumn({ type: 'datetime' }) + @CreateDateColumn({ type: 'timestamptz' }) createdAt!: Date; - @UpdateDateColumn({ type: 'datetime' }) + @UpdateDateColumn({ type: 'timestamptz' }) updatedAt!: Date; } diff --git a/package.json b/package.json index fb1f20ed8..5d67e3116 100644 --- a/package.json +++ b/package.json @@ -91,18 +91,14 @@ "docker:dev:restart": "sh -lc \"set -e; echo '[docker] Restarting services...'; if docker-compose -p gridpilot-dev -f docker-compose.dev.yml ps -q 2>/dev/null | grep -q .; then docker-compose -p gridpilot-dev -f docker-compose.dev.yml restart; echo '[docker] Restarted'; else echo '[docker] No running containers to restart'; echo '[docker] Start with: npm run docker:dev'; fi\"", "docker:dev:status": "sh -lc \"set -e; echo '[docker] Checking dev environment status...'; if docker-compose -p gridpilot-dev -f docker-compose.dev.yml ps -q 2>/dev/null | grep -q .; then echo '[docker] ✓ Environment is RUNNING'; docker-compose -p gridpilot-dev -f docker-compose.dev.yml ps; echo ''; echo '[docker] Services health:'; docker ps --filter name=gridpilot-dev --format 'table {{.Names}}\\t{{.Status}}\\t{{.RunningFor}}'; else echo '[docker] ✗ Environment is STOPPED'; echo '[docker] Start with: npm run docker:dev'; fi\"", "docker:dev:up": "sh -lc \"set -e; echo '[docker] Starting dev environment...'; if docker-compose -p gridpilot-dev -f docker-compose.dev.yml ps -q 2>/dev/null | grep -q .; then echo '[docker] Already running, attaching to logs...'; docker-compose -p gridpilot-dev -f docker-compose.dev.yml logs -f; else COMPOSE_PARALLEL_LIMIT=1 docker-compose -p gridpilot-dev -f docker-compose.dev.yml up; fi\"", + "docker:e2e:build": "sh -lc \"echo '[e2e] Building website image...'; docker build -f apps/website/Dockerfile.e2e -t gridpilot-website-e2e . && echo '[e2e] Starting full stack...'; docker-compose -f docker-compose.e2e.yml up -d --build\"", "docker:e2e:down": "sh -lc \"echo '[e2e] Stopping e2e environment...'; docker-compose -f docker-compose.e2e.yml down --remove-orphans; echo '[e2e] Stopped'\"", - "docker:e2e:up": "sh -lc \"echo '[e2e] Building website image...'; docker build -f apps/website/Dockerfile.e2e -t gridpilot-website-e2e . && echo '[e2e] Starting full stack...'; docker-compose -f docker-compose.e2e.yml up -d --build\"", + "docker:e2e:up": "sh -lc \"echo '[e2e] Starting full stack...'; docker-compose -f docker-compose.e2e.yml up -d --build\"", "docker:prod": "docker-compose -p gridpilot-prod -f docker-compose.prod.yml up -d", "docker:prod:build": "docker-compose -p gridpilot-prod -f docker-compose.prod.yml up -d --build", "docker:prod:clean": "docker-compose -p gridpilot-prod -f docker-compose.prod.yml down -v", "docker:prod:down": "docker-compose -p gridpilot-prod -f docker-compose.prod.yml down", "docker:prod:logs": "docker-compose -p gridpilot-prod -f docker-compose.prod.yml logs -f", - "docker:test:clean": "sh -lc \"docker-compose -p gridpilot-test -f docker-compose.test.yml down -v --remove-orphans || true; docker-compose -p gridpilot-test -f docker-compose.test.yml rm -fsv || true\"", - "docker:test:deps": "echo '[docker] Checking dependencies...'; test -d node_modules && test -f node_modules/.package-lock.json && echo '[docker] ✓ Dependencies ready' || (echo '[docker] ✗ Dependencies missing - run: npm install' && exit 1)", - "docker:test:down": "sh -lc \"echo '[docker] Stopping test environment...'; docker-compose -p gridpilot-test -f docker-compose.test.yml down --remove-orphans || true; docker-compose -p gridpilot-test -f docker-compose.test.yml rm -fs || true; echo '[docker] Test environment stopped'\"", - "docker:test:up": "sh -lc \"echo '[docker] Starting test environment...'; COMPOSE_PARALLEL_LIMIT=1 docker-compose -p gridpilot-test -f docker-compose.test.yml up -d ready api; echo '[docker] Services starting... (this may take a moment)'\"", - "docker:test:wait": "node -e \"const sleep=(ms)=>new Promise(r=>setTimeout(r,ms)); const wait=async(url,label)=>{console.log('[docker] Waiting for '+label+'...'); for(let i=0;i<90;i++){try{const r=await fetch(url); if(r.ok){console.log('[docker] ✓ '+label+' ready'); return;} }catch{} await sleep(1000);} console.error('[docker] ✗ '+label+' not ready: '+url); process.exit(1);}; (async()=>{await wait('http://localhost:3101/health','API');})();\"", "dom:process": "npx tsx scripts/dom-export/processWorkflows.ts", "env:website:merge": "node scripts/merge-website-env.js", "generate-templates": "npx tsx scripts/generate-templates/index.ts", @@ -120,8 +116,7 @@ "test:companion-hosted": "vitest run --config vitest.e2e.config.ts tests/e2e/companion/companion-ui-full-workflow.e2e.test.ts", "test:contract:compatibility": "tsx scripts/contract-compatibility.ts", "test:contracts": "tsx scripts/run-contract-tests.ts", - "test:docker:website": "sh -lc \"set -e; trap 'npm run docker:e2e:down' EXIT; echo '[e2e] Building website image...'; docker build -f apps/website/Dockerfile.e2e -t gridpilot-website-e2e . && echo '[e2e] Starting full stack...'; docker-compose -f docker-compose.e2e.yml up -d --build && echo '[e2e] Waiting for services...'; sleep 10 && echo '[e2e] Running Playwright tests...'; docker-compose -f docker-compose.e2e.yml run --rm playwright\"", - "test:e2e:website": "sh -lc \"echo '🚀 Starting fully containerized e2e tests...'; npm run test:docker:website\"", + "test:e2e:website": "sh -lc \"set -e; trap 'npm run docker:e2e:down' EXIT; npm run docker:e2e:up && echo '[e2e] Waiting for services...'; sleep 10 && echo '[e2e] Running Playwright tests...'; docker-compose -f docker-compose.e2e.yml run --rm playwright\"", "test:api:smoke": "sh -lc \"echo '🚀 Running API smoke tests...'; npx playwright test tests/e2e/api/api-smoke.test.ts --reporter=json,html\"", "test:api:smoke:docker": "sh -lc \"echo '🚀 Running API smoke tests in Docker...'; docker-compose -f docker-compose.e2e.yml run --rm playwright npx playwright test tests/e2e/api/api-smoke.test.ts --reporter=json,html\"", "docker:e2e:logs": "sh -lc \"docker-compose -f docker-compose.e2e.yml logs -f\"",