diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ca6afe7..3c43fd06 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,8 +38,8 @@ jobs: - uses: oven-sh/setup-bun@v2 with: bun-version: latest - - run: make setup-ci - - run: make build + - run: bun install + - run: bun run build biome: name: Code style check via Biome @@ -53,8 +53,8 @@ jobs: with: version: latest - - run: make setup - - run: biome check + - run: bun install --frozen-lockfile + - run: bun style:check type-check: name: Type Check @@ -64,12 +64,8 @@ jobs: - uses: oven-sh/setup-bun@v2 with: bun-version: latest - - run: make setup-ci - - - run: bunx tsc --noEmit - working-directory: web - - run: bunx tsc --noEmit - working-directory: server + - run: bun install --frozen-lockfile + - run: bun type spell-check: name: Spell Check @@ -80,8 +76,8 @@ jobs: with: bun-version: latest - - run: make setup-ci - - run: bunx cspell --quiet . + - run: bun install --frozen-lockfile + - run: bun spell . test: name: Bun Test @@ -90,17 +86,16 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 - - run: make setup-ci - - run: make test + - run: bun install --frozen-lockfile + - run: bun run test deploy-test-web: name: Deploy Test (web) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - uses: oven-sh/setup-bun@v2 - - run: make prepare-deploy-web + - run: bun prepare:deploy:web - run: test `ls web/.next | wc -l` != 0 deploy-test-server: @@ -108,6 +103,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - uses: oven-sh/setup-bun@v2 - - run: make prepare-deploy-server + - run: bun prepare:deploy:server diff --git a/.gitignore b/.gitignore index 9754c10c..7f38bba3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +/node_modules +.env +/.direnv +/.husky + # Logs logs *.log @@ -7,11 +12,6 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* -node_modules -dist -dist-ssr -*.local - # Editor directories and files .vscode/* !.vscode/extensions.json @@ -22,7 +22,3 @@ dist-ssr *.njsproj *.sln *.sw? - -.env -/.direnv -.husky diff --git a/Makefile b/Makefile index de50a3db..08b771ca 100644 --- a/Makefile +++ b/Makefile @@ -2,64 +2,15 @@ default: start LOCAL_DB := postgres://user:password@localhost:5432/database -setup: - if [ ! `command -v bun` ]; then echo 'ERR: Bun is required!'; exit 1; fi - make sync - @echo "auto setup is done. now do:" - @echo "- edit server/.env.dev" - @echo "- edit web/.env" - @echo "- run make sync" - -setup-ci: - if [ "" == ${DATABASE_URL} ]; then echo 'Please set DATABASE_URL_FOR_SQL_GENERATION!'; exit 1; fi - make sync - make generate-sql - -sync: sync-server sync-web sync-root sync-common - @echo '----------------------------------------------------------------------------------------------------------' - @echo '| Most work is done. now running prisma-generate-sql (which might fail if .env.dev is not set configured)|' - @echo '----------------------------------------------------------------------------------------------------------' - make generate-sql || true - -generate-sql: - @cd server; bunx dotenv -e .env.dev -- bunx prisma generate --sql - -start: start-all # build -> serve -build: build-server build-web -serve: serve-all # serve only. does not build. -watch: - (trap 'kill 0' EXIT; make watch-web & make watch-server & wait) - - test: export DATABASE_URL=$(LOCAL_DB) -test: export NEVER_LOAD_DOTENV=1 test: export UNSAFE_SKIP_AUTH=1 test: export FIREBASE_PROJECT_ID=mock-proj test: export CORS_ALLOW_ORIGINS=http://localhost:3000,https://localhost:5173 test: dev-db - cd server/src; ENV_FILE=../.env.dev bun test - cd ./test; ENV_FILE=../server/.env.dev bun test + cd server/src; ENV_FILE=none bun test + cd ./test; ENV_FILE=none bun test docker stop postgres -prepare-deploy-web: sync-common - cd web; bun install; bun run build -deploy-web: - @if [ "${PORT}" == "" ]; then echo 'env PORT not found!'; exit 1; fi - cd web; bun next start --port ${PORT} -prepare-deploy-server: sync-common sync-server generate-sql -deploy-server: - cd server; bun src/main.ts - -docker: - @# deferring `docker compose down`. https://qiita.com/KEINOS/items/532dc395fe0f89c2b574 - trap 'docker compose down' EXIT; docker compose up --build - -docker-watch: - docker compose up --build --watch - -seed: - cd server; bunx prisma db seed - ## server/.envをDATABASE_URL=postgres://user:password@localhost:5432/databaseにしてから行う dev-db: export DATABASE_URL=$(LOCAL_DB) dev-db: export NEVER_LOAD_DOTENV=1 @@ -79,79 +30,6 @@ dev-db: done @echo "PostgreSQL is ready. Running seed..." @cd server; bunx prisma generate; bunx prisma db push - @make seed + @bun run seed @echo "Seeding completed." -# Sync (install/update packages, generate prisma, etc) - -sync-web: - cd web; bun install - # copy .env.sample -> .env only if .env is not there - -sync-server: - cd server; bun install --frozen-lockfile - cd server; bun prisma generate - # copy .env.sample -> .env only if .env is not there - -sync-root: - bun install -sync-common: - cd common; bun install - - -# Static checks - -## code style -style: - if command -v biome; then biome check --write; else bunx @biomejs/biome check --write; fi -style-check: - if command -v biome; then biome check; else bunx @biomejs/biome check; fi - -## Deprecated commands, there warnings will be deleted in the future -lint: - @echo 'DEPRECATED: `make lint` is deprecated. run `make style` instead.' - @exit 1 - -format: - @echo 'DEPRECATED: `make format` is deprecated. run `make style` instead.' - @exit 1 - -format-check: - @echo 'DEPRECATED: `make format-check` is deprecated. run `make style-check` instead.' - @exit 1 - -# type checks -type-check: - make type-check-server - make type-check-web - -type-check-server: - cd server; bunx tsc --noEmit - -type-check-web: - cd web; bunx tsc --noEmit - - -# Runner - -start-all: build-web build-server - make serve-all - -build-web: - cd web; bun run build -build-server: - cd server; bun run build - -serve-all: - (trap 'kill 0' EXIT; make serve-web & make serve-server & wait) -serve-web: - cd web; bun run preview # todo: make serve function -serve-server: - cd server; bun run serve - -watch-web: - cd web; bun run dev -watch-server: - cd server; bun run dev - -.PHONY: test diff --git a/bun.lock b/bun.lock index 7d4b964d..212d05aa 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,6 @@ "name": "course-mate", "devDependencies": { "@biomejs/biome": "^1.9.1", - "husky": "^9.1.4", "lefthook": "^1.10.10", "lint-staged": "^15.2.10", }, @@ -824,8 +823,6 @@ "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], - "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], - "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], diff --git a/lefthook.yml b/lefthook.yml index 59f2fdfa..58f9e35e 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -13,4 +13,4 @@ pre-commit: run: if [ "$(git branch --show-current)" == "main" ]; then echo "Cannot make commit on main! aborting..."; exit 1; fi cspell: glob: "*" - run: bunx cspell --quiet . + run: bun run spell diff --git a/package.json b/package.json index b3db12dd..cbab030d 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,28 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "prepare": "lefthook install" + "prepare": "lefthook install && (cd server; bun run prepare)", + "check": "bun type && bun style:check", + "style": "biome check . --fix", + "style:check": "biome check .", + "type": "bun type:web && bun type:server && bun type:common", + "type:web": "cd web; bun run tsc", + "type:server": "cd server; bun run tsc", + "type:common": "cd common; bun run tsc", + "build": "bun run build:server && bun run build:web", + "build:web": "cd web; bun run build", + "build:server": "cd server; bun run build", + "watch": "trap 'kill 0' EXIT; bun run watch:web & bun run watch:server & wait", + "watch:web": "cd web; bun run dev", + "watch:server": "cd server; bun run dev", + "seed": "cd server; bun prisma db seed", + "prepare:deploy:web": "bun install --frozen-lockfile && bun run build:web", + "prepare:deploy:server": "bun install --frozen-lockfile", + "deploy:web": "cd web; bun run start --port $PORT", + "deploy:server": "cd server; bun run src/main.ts", + "dev-db": "make dev-db", + "test": "make test", + "spell": "bunx cspell --quiet ." }, "keywords": [], "author": "", @@ -13,7 +33,6 @@ "workspaces": ["common", "web", "server"], "devDependencies": { "@biomejs/biome": "^1.9.1", - "husky": "^9.1.4", "lefthook": "^1.10.10", "lint-staged": "^15.2.10" }, diff --git a/server/package.json b/server/package.json index c3a1cbf1..7fe354f0 100644 --- a/server/package.json +++ b/server/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "prepare": "bun --env-file=./.env.dev prisma generate --sql || (echo 'please set DATABASE_URL in server/.env.dev' && exit 1)", "dev": "bun --watch src/main.ts", "build": "tsc", "serve": "bun target/main.js" diff --git a/server/src/seeds/seed-test.ts b/server/src/seeds/seed-test.ts index ac5b96f9..28cf368b 100644 --- a/server/src/seeds/seed-test.ts +++ b/server/src/seeds/seed-test.ts @@ -9,18 +9,17 @@ import { } from "./test-data/data"; async function main() { - await Promise.all( - subjects.map(async ({ group, subjects }) => { - for (const [name] of subjects) { - await prisma.interestSubject.create({ - data: { - name, - group, - }, - }); - } - }), - ); + // avoid flaky tests. don't replace this with Promise.all + for (const { group, subjects: subject } of subjects) { + for (const [name] of subject) { + await prisma.interestSubject.create({ + data: { + name, + group, + }, + }); + } + } await Promise.all( users.map(async (user) => { diff --git a/server/src/seeds/seed.ts b/server/src/seeds/seed.ts index bf98d1a6..fcf36f18 100644 --- a/server/src/seeds/seed.ts +++ b/server/src/seeds/seed.ts @@ -1,18 +1,15 @@ import { prisma } from "../database/client"; import { subjects } from "./data/subjects"; -const promises: Array> = []; for (const subjectGroup of subjects) { const group = subjectGroup.group; for (const name of subjectGroup.subjects) { - promises.push( - prisma.interestSubject.upsert({ - where: { - name_group: { name, group }, - }, - update: { name, group }, - create: { name, group }, - }), - ); + await prisma.interestSubject.upsert({ + where: { + name_group: { name, group }, + }, + update: { name, group }, + create: { name, group }, + }); } }