website refactor

This commit is contained in:
2026-01-17 00:28:25 +01:00
parent 7686aeb62d
commit 8ba46e96a6
5 changed files with 18 additions and 14 deletions

View File

@@ -52,6 +52,10 @@ Thumbs.db
coverage
.nyc_output
test-results
tests/
playwright*.config.ts
*.spec.ts
*.test.ts
# Logs
*.log

View File

@@ -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)

View File

@@ -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}

View File

@@ -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;
}

View File

@@ -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\"",