From 369c95489225396bbc2453bd8dbd6a79a3ebaa42 Mon Sep 17 00:00:00 2001 From: CarterPerez-dev Date: Sun, 10 May 2026 05:25:27 -0400 Subject: [PATCH] feat(canary): unified Justfile with frontend + backend + compose groups Replaces template Justfile (which referenced ./react-scss/). Groups: [frontend] pnpm install/dev/build/preview, biome, stylelint, tsc Targets at fe-install/fe-dev/fe-build/fe-preview prefixed for clarity [backend] go mod tidy, vet, golangci-lint, test (unit + integration tags), coverage HTML, run, static build, air hot reload [lint] lint = be-lint + biome + stylelint + tsc; ci = lint + test [compose] docker compose lifecycle for prod (up/start/down/stop/build/logs/ps) [tunnel] overlay with cloudflared.compose.yml for prod+tunnel [dev] docker compose lifecycle for dev.compose.yml [util] init (gen secrets + fetch GeoLite2), ports, info, clean Justfile parses cleanly via 'just --list'. Frontend dir reference fixed (now ./frontend, not ./react-scss). --- .../beginner/canary-token-generator/justfile | 234 ++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 PROJECTS/beginner/canary-token-generator/justfile diff --git a/PROJECTS/beginner/canary-token-generator/justfile b/PROJECTS/beginner/canary-token-generator/justfile new file mode 100644 index 00000000..3f370127 --- /dev/null +++ b/PROJECTS/beginner/canary-token-generator/justfile @@ -0,0 +1,234 @@ +# ============================================================================= +# ©AngelaMos | 2026 +# justfile +# ============================================================================= + +set dotenv-filename := ".env.development" +set dotenv-load +set export +set shell := ["bash", "-uc"] +set windows-shell := ["powershell.exe", "-NoLogo", "-Command"] + +project := file_name(justfile_directory()) +version := `git describe --tags --always 2>/dev/null || echo "dev"` + +# ============================================================================= +# Default +# ============================================================================= + +default: + @just --list --unsorted + +# ============================================================================= +# Frontend (React + Vite + Biome + Stylelint) +# ============================================================================= + +[group('frontend')] +fe-install: + cd frontend && pnpm install --frozen-lockfile + +[group('frontend')] +fe-dev: + cd frontend && pnpm dev + +[group('frontend')] +fe-build: + cd frontend && pnpm build + +[group('frontend')] +fe-preview: + cd frontend && pnpm preview + +[group('frontend')] +biome *ARGS: + cd frontend && pnpm biome check . {{ARGS}} + +[group('frontend')] +biome-fix: + cd frontend && pnpm biome check --write . + +[group('frontend')] +stylelint *ARGS: + cd frontend && pnpm stylelint '**/*.scss' {{ARGS}} + +[group('frontend')] +stylelint-fix: + cd frontend && pnpm stylelint '**/*.scss' --fix + +[group('frontend')] +tsc *ARGS: + cd frontend && pnpm tsc --noEmit {{ARGS}} + +# ============================================================================= +# Backend (Go + golangci-lint + air) +# ============================================================================= + +[group('backend')] +be-tidy: + cd backend && go mod tidy + +[group('backend')] +be-vet: + cd backend && go vet ./... + +[group('backend')] +be-lint *ARGS: + cd backend && golangci-lint run --timeout=5m {{ARGS}} + +[group('backend')] +be-lint-fix: + cd backend && golangci-lint run --timeout=5m --fix + +[group('backend')] +be-test *ARGS: + cd backend && go test -race ./... {{ARGS}} + +[group('backend')] +be-test-int *ARGS: + cd backend && go test -race -tags=integration ./... {{ARGS}} + +[group('backend')] +be-cover: + cd backend && go test -race -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html + +[group('backend')] +be-run: + cd backend && go run ./cmd/canary + +[group('backend')] +be-build: + cd backend && CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/canary ./cmd/canary + +[group('backend')] +be-air: + cd backend && air -c .air.toml + +# ============================================================================= +# Combined lint + test (CI gate) +# ============================================================================= + +[group('lint')] +lint: be-lint biome stylelint tsc + +[group('lint')] +test: be-test + +[group('lint')] +ci: lint test + +# ============================================================================= +# Docker Compose (Production) +# ============================================================================= + +[group('compose')] +up *ARGS: + docker compose --env-file .env up {{ARGS}} + +[group('compose')] +start *ARGS: + docker compose --env-file .env up -d {{ARGS}} + +[group('compose')] +down *ARGS: + docker compose --env-file .env down {{ARGS}} + +[group('compose')] +stop: + docker compose --env-file .env stop + +[group('compose')] +build *ARGS: + docker compose --env-file .env build {{ARGS}} + +[group('compose')] +rebuild: + docker compose --env-file .env build --no-cache + +[group('compose')] +logs *SERVICE: + docker compose --env-file .env logs -f {{SERVICE}} + +[group('compose')] +ps: + docker compose --env-file .env ps + +# ============================================================================= +# Docker Compose (Production + Cloudflare Tunnel) +# ============================================================================= + +[group('tunnel')] +tunnel-up *ARGS: + docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml up {{ARGS}} + +[group('tunnel')] +tunnel-start *ARGS: + docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml up -d {{ARGS}} + +[group('tunnel')] +tunnel-down *ARGS: + docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml down {{ARGS}} + +[group('tunnel')] +tunnel-logs: + docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml logs -f cloudflared + +# ============================================================================= +# Docker Compose (Development) +# ============================================================================= + +[group('dev')] +dev-up *ARGS: + docker compose -f dev.compose.yml up {{ARGS}} + +[group('dev')] +dev-start *ARGS: + docker compose -f dev.compose.yml up -d {{ARGS}} + +[group('dev')] +dev-down *ARGS: + docker compose -f dev.compose.yml down {{ARGS}} + +[group('dev')] +dev-stop: + docker compose -f dev.compose.yml stop + +[group('dev')] +dev-build *ARGS: + docker compose -f dev.compose.yml build {{ARGS}} + +[group('dev')] +dev-rebuild: + docker compose -f dev.compose.yml build --no-cache + +[group('dev')] +dev-logs *SERVICE: + docker compose -f dev.compose.yml logs -f {{SERVICE}} + +[group('dev')] +dev-ps: + docker compose -f dev.compose.yml ps + +# ============================================================================= +# Utilities +# ============================================================================= + +[group('util')] +init: + bash scripts/init.sh + +[group('util')] +ports: + bash scripts/randomize-ports.sh + +[group('util')] +info: + @echo "Project: {{project}}" + @echo "Version: {{version}}" + @echo "OS: {{os()}} ({{arch()}})" + @echo "Module: $(head -1 backend/go.mod | cut -d' ' -f2)" + +[group('util')] +clean: + -rm -rf frontend/.biome_cache frontend/dist frontend/.vite frontend/.vite-temp + -rm -rf backend/bin backend/tmp backend/coverage.out backend/coverage.html + @echo "Build caches cleaned."