create-win-project 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/ci/expo.yml +28 -0
- package/ci/laravel.yml +49 -0
- package/ci/nextjs.yml +29 -0
- package/ci/springboot.yml +33 -0
- package/ci/vite.yml +36 -0
- package/compatibility/profiles.json +237 -0
- package/docs/ARCHITECTURE.md +118 -0
- package/docs/CONTENT_MODEL.md +36 -0
- package/docs/DEPENDENCY_MAINTENANCE.md +31 -0
- package/index.js +431 -0
- package/lib/application-shapes.js +95 -0
- package/lib/banner.js +45 -0
- package/lib/catalog.js +343 -0
- package/lib/compatibility.js +116 -0
- package/lib/constants.js +3 -0
- package/lib/doctor.js +45 -0
- package/lib/files.js +158 -0
- package/lib/generator.js +366 -0
- package/lib/interview.js +77 -0
- package/lib/laravel-scaffold.js +3 -0
- package/lib/playbooks.js +172 -0
- package/lib/project-location.js +18 -0
- package/lib/scaffold.js +467 -0
- package/lib/stacks/context.js +27 -0
- package/lib/stacks/contract.js +142 -0
- package/lib/stacks/index.js +8 -0
- package/lib/stacks/laravel/architecture.js +27 -0
- package/lib/stacks/laravel/auth/oidc.js +13 -0
- package/lib/stacks/laravel/auth/public.js +28 -0
- package/lib/stacks/laravel/auth/sanctum.js +14 -0
- package/lib/stacks/laravel/auth/session.js +17 -0
- package/lib/stacks/laravel/composer.js +50 -0
- package/lib/stacks/laravel/generate.js +362 -0
- package/lib/stacks/laravel/index.js +18 -0
- package/lib/stacks/laravel/ui/blade.js +15 -0
- package/lib/stacks/laravel/ui/index.js +29 -0
- package/lib/stacks/laravel/ui/inertia-react.js +35 -0
- package/lib/stacks/laravel/ui/livewire.js +39 -0
- package/lib/stacks/laravel/ui/shared.js +14 -0
- package/lib/stacks/registry.js +42 -0
- package/lib/stacks/shared/contributions.js +25 -0
- package/lib/template.js +62 -0
- package/package.json +49 -0
- package/playbooks/INDEX.md +58 -0
- package/playbooks/capabilities/auth/oidc-resource-server.md +15 -0
- package/playbooks/capabilities/auth/spring-session.md +15 -0
- package/playbooks/capabilities/ci/github-actions.manifest.json +10 -0
- package/playbooks/capabilities/ci/github-actions.md +61 -0
- package/playbooks/capabilities/docker/docker.manifest.json +11 -0
- package/playbooks/capabilities/docker/overview.md +55 -0
- package/playbooks/capabilities/flyway/environments.md +5 -0
- package/playbooks/capabilities/flyway/flyway.manifest.json +12 -0
- package/playbooks/capabilities/flyway/migrations.md +7 -0
- package/playbooks/capabilities/flyway/testing.md +5 -0
- package/playbooks/capabilities/laravel/database.md +8 -0
- package/playbooks/capabilities/laravel/migrations.md +15 -0
- package/playbooks/capabilities/laravel/observability.md +8 -0
- package/playbooks/capabilities/laravel/oidc-resource-server.md +10 -0
- package/playbooks/capabilities/laravel/queues.md +8 -0
- package/playbooks/capabilities/laravel/sanctum-spa.md +8 -0
- package/playbooks/capabilities/laravel/scheduler.md +7 -0
- package/playbooks/capabilities/laravel/session-auth.md +8 -0
- package/playbooks/capabilities/laravel/storage-uploads.md +7 -0
- package/playbooks/capabilities/postgresql/architecture.md +5 -0
- package/playbooks/capabilities/postgresql/migrations.md +5 -0
- package/playbooks/capabilities/postgresql/postgresql.manifest.json +15 -0
- package/playbooks/capabilities/postgresql/schema-design.md +7 -0
- package/playbooks/capabilities/postgresql/security.md +5 -0
- package/playbooks/capabilities/postgresql/testing.md +5 -0
- package/playbooks/capabilities/prisma/architecture.md +5 -0
- package/playbooks/capabilities/prisma/migrations.md +11 -0
- package/playbooks/capabilities/prisma/prisma.manifest.json +14 -0
- package/playbooks/capabilities/prisma/runtime.md +5 -0
- package/playbooks/capabilities/prisma/schema.md +5 -0
- package/playbooks/capabilities/prisma/testing.md +5 -0
- package/playbooks/capabilities/supabase/architecture.md +5 -0
- package/playbooks/capabilities/supabase/authentication.md +5 -0
- package/playbooks/capabilities/supabase/expo.md +16 -0
- package/playbooks/capabilities/supabase/migrations.md +7 -0
- package/playbooks/capabilities/supabase/nextjs.md +24 -0
- package/playbooks/capabilities/supabase/rls.md +7 -0
- package/playbooks/capabilities/supabase/supabase.manifest.json +32 -0
- package/playbooks/capabilities/supabase/testing.md +5 -0
- package/playbooks/capabilities/supabase/vite.md +14 -0
- package/playbooks/concerns/axios.md +123 -0
- package/playbooks/concerns/next-safe-action.md +66 -0
- package/playbooks/concerns/next-themes.md +87 -0
- package/playbooks/concerns/nuqs.md +59 -0
- package/playbooks/concerns/t3-env.md +48 -0
- package/playbooks/concerns/tanstack-query.md +145 -0
- package/playbooks/concerns/zod.md +174 -0
- package/playbooks/concerns/zustand.md +93 -0
- package/playbooks/devops/makefile.manifest.json +10 -0
- package/playbooks/devops/makefile.md +556 -0
- package/playbooks/devops/pr-template.manifest.json +10 -0
- package/playbooks/devops/pr-template.md +106 -0
- package/playbooks/platform/laravel-ui/blade/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/blade/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/blade/security.md +5 -0
- package/playbooks/platform/laravel-ui/blade/structure.md +5 -0
- package/playbooks/platform/laravel-ui/blade/testing.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/security.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/structure.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/testing.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/security.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/structure.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/testing.md +5 -0
- package/playbooks/platform/mobile.manifest.json +17 -0
- package/playbooks/platform/mobile.md +15 -0
- package/playbooks/platform/web.manifest.json +17 -0
- package/playbooks/platform/web.md +17 -0
- package/playbooks/stack/expo/architecture.md +27 -0
- package/playbooks/stack/expo/runtime.md +14 -0
- package/playbooks/stack/expo/security.md +18 -0
- package/playbooks/stack/expo/structure.md +26 -0
- package/playbooks/stack/expo/testing.md +13 -0
- package/playbooks/stack/laravel/architecture.md +34 -0
- package/playbooks/stack/laravel/runtime.md +27 -0
- package/playbooks/stack/laravel/security.md +23 -0
- package/playbooks/stack/laravel/structure.md +29 -0
- package/playbooks/stack/laravel/testing.md +22 -0
- package/playbooks/stack/laravel-ui.manifest.json +42 -0
- package/playbooks/stack/laravel.manifest.json +35 -0
- package/playbooks/stack/nextjs/architecture.md +62 -0
- package/playbooks/stack/nextjs/runtime.md +31 -0
- package/playbooks/stack/nextjs/security.md +32 -0
- package/playbooks/stack/nextjs/structure.md +50 -0
- package/playbooks/stack/nextjs/testing.md +20 -0
- package/playbooks/stack/nextjs.manifest.json +49 -0
- package/playbooks/stack/no-frontend.manifest.json +25 -0
- package/playbooks/stack/none.manifest.json +21 -0
- package/playbooks/stack/react-native.manifest.json +49 -0
- package/playbooks/stack/react-vite/architecture.md +33 -0
- package/playbooks/stack/react-vite/runtime.md +13 -0
- package/playbooks/stack/react-vite/security.md +16 -0
- package/playbooks/stack/react-vite/structure.md +23 -0
- package/playbooks/stack/react-vite/testing.md +12 -0
- package/playbooks/stack/react-vite.manifest.json +46 -0
- package/playbooks/stack/springboot/architecture.md +40 -0
- package/playbooks/stack/springboot/runtime.md +28 -0
- package/playbooks/stack/springboot/security.md +28 -0
- package/playbooks/stack/springboot/structure.md +30 -0
- package/playbooks/stack/springboot/testing.md +22 -0
- package/playbooks/stack/springboot.manifest.json +38 -0
- package/playbooks/styling/css-modules-extensions.md +267 -0
- package/playbooks/styling/css-modules.manifest.json +11 -0
- package/playbooks/styling/native-styles.manifest.json +9 -0
- package/playbooks/styling/native-styles.md +29 -0
- package/playbooks/styling/tailwind-extensions.md +182 -0
- package/playbooks/styling/tailwind.manifest.json +11 -0
- package/playbooks/universal/accessibility.manifest.json +11 -0
- package/playbooks/universal/accessibility.md +45 -0
- package/playbooks/universal/coding-rules.manifest.json +12 -0
- package/playbooks/universal/coding-rules.md +281 -0
- package/playbooks/universal/error-handling.manifest.json +10 -0
- package/playbooks/universal/error-handling.md +21 -0
- package/playbooks/universal/git-conventions.manifest.json +10 -0
- package/playbooks/universal/git-conventions.md +186 -0
- package/playbooks/universal/observability.manifest.json +10 -0
- package/playbooks/universal/observability.md +29 -0
- package/playbooks/universal/security.manifest.json +11 -0
- package/playbooks/universal/security.md +30 -0
- package/playbooks/universal/typescript.manifest.json +11 -0
- package/playbooks/universal/typescript.md +272 -0
- package/scripts/compatibility-matrix.mjs +48 -0
- package/scripts/validate-content.mjs +76 -0
- package/scripts/verify-generated.mjs +153 -0
- package/templates/agents/nextjs.md +47 -0
- package/templates/agents/react-native.md +48 -0
- package/templates/agents/react-vite.md +48 -0
- package/templates/docker/compose/postgres.yml +29 -0
- package/templates/docker/compose/springboot.yml +69 -0
- package/templates/docker/compose/supabase.yml +18 -0
- package/templates/docker/compose-prod/springboot.yml +64 -0
- package/templates/docker/dockerfile/laravel-inertia.dev.dockerfile +21 -0
- package/templates/docker/dockerfile/laravel.dev.dockerfile +12 -0
- package/templates/docker/dockerfile/laravel.prod.dockerfile +13 -0
- package/templates/docker/dockerfile/nextjs.dev.dockerfile +6 -0
- package/templates/docker/dockerfile/nextjs.prod.dockerfile +18 -0
- package/templates/docker/dockerfile/springboot.dev.dockerfile +5 -0
- package/templates/docker/dockerfile/springboot.prod.dockerfile +10 -0
- package/templates/docker/dockerfile/vite.dev.dockerfile +6 -0
- package/templates/docker/dockerfile/vite.prod.dockerfile +12 -0
- package/templates/gitignore/base.gitignore +32 -0
- package/templates/gitignore/nextjs.gitignore +40 -0
- package/templates/gitignore/react-native.gitignore +43 -0
- package/templates/gitignore/react-vite.gitignore +39 -0
- package/templates/makefile/frontend.mk +31 -0
- package/templates/makefile/laravel.mk +47 -0
- package/templates/makefile/postgres.mk +40 -0
- package/templates/makefile/springboot.mk +125 -0
- package/templates/makefile/supabase.mk +42 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> Small operating contract for agents. Project intent lives in `CONTEXT.md`; task guidance is routed through `RULES.md`.
|
|
4
|
+
|
|
5
|
+
## Project
|
|
6
|
+
|
|
7
|
+
{{PROJECT_NAME}} — {{PROJECT_DESCRIPTION}}
|
|
8
|
+
|
|
9
|
+
- Stack: `{{STACK}}`
|
|
10
|
+
- Platform: `{{PLATFORM}}`
|
|
11
|
+
|
|
12
|
+
## Commands
|
|
13
|
+
|
|
14
|
+
Run frontend commands from `frontend/`.
|
|
15
|
+
|
|
16
|
+
- Install: `npm install` initially; use `npm ci` after committing the lockfile.
|
|
17
|
+
- Develop: `npm run dev`
|
|
18
|
+
- Validate: `npm run lint && npm run typecheck && npm run test --if-present && npm run build`
|
|
19
|
+
- End-to-end: `npm run test:e2e --if-present`
|
|
20
|
+
- Spring backend, when present: `cd backend && ./mvnw --batch-mode test` (`mvnw.cmd` on Windows)
|
|
21
|
+
|
|
22
|
+
## Required workflow
|
|
23
|
+
|
|
24
|
+
1. Read `CONTEXT.md` and inspect neighboring implementation and tests.
|
|
25
|
+
2. Find the concern in `RULES.md`; open only its linked playbook section.
|
|
26
|
+
3. State assumptions when behavior is ambiguous.
|
|
27
|
+
4. Make the smallest coherent change and add risk-appropriate tests.
|
|
28
|
+
5. Run lint, typecheck, relevant tests, and a production build.
|
|
29
|
+
|
|
30
|
+
## Always-on constraints
|
|
31
|
+
|
|
32
|
+
{{CONSTRAINTS}}
|
|
33
|
+
|
|
34
|
+
- Treat all SPA code and public-prefixed environment values as user-visible.
|
|
35
|
+
- Validate input and authorize on the server; route guards are only user experience.
|
|
36
|
+
- Never put session IDs or access/refresh tokens in browser web storage.
|
|
37
|
+
|
|
38
|
+
## Authority boundaries
|
|
39
|
+
|
|
40
|
+
- Do not deploy, publish, merge, push, or modify production data unless explicitly asked.
|
|
41
|
+
- Do not delete user work or weaken checks to make a task pass.
|
|
42
|
+
|
|
43
|
+
## Definition of done
|
|
44
|
+
|
|
45
|
+
- Acceptance behavior and risk-appropriate tests are present.
|
|
46
|
+
- Validation commands pass, or the exact blocker is reported.
|
|
47
|
+
- Loading, empty, error, keyboard, and narrow-screen behavior are considered.
|
|
48
|
+
- Relevant docs are updated.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# docker-compose.yml — {{PROJECT_NAME}} ({{STACK}}) — Dev (Postgres only)
|
|
2
|
+
services:
|
|
3
|
+
|
|
4
|
+
db:
|
|
5
|
+
container_name: {{PROJECT_NAME}}-db
|
|
6
|
+
image: {{POSTGRES_IMAGE}}
|
|
7
|
+
ports:
|
|
8
|
+
- "5432:5432"
|
|
9
|
+
environment:
|
|
10
|
+
- POSTGRES_USER=${POSTGRES_USER}
|
|
11
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
12
|
+
- POSTGRES_DB=${POSTGRES_DB}
|
|
13
|
+
volumes:
|
|
14
|
+
- postgres-data:/var/lib/postgresql/data
|
|
15
|
+
networks:
|
|
16
|
+
- app-network
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
|
19
|
+
interval: 10s
|
|
20
|
+
timeout: 5s
|
|
21
|
+
retries: 5
|
|
22
|
+
|
|
23
|
+
volumes:
|
|
24
|
+
postgres-data:
|
|
25
|
+
name: {{PROJECT_NAME}}-postgres-data
|
|
26
|
+
|
|
27
|
+
networks:
|
|
28
|
+
app-network:
|
|
29
|
+
name: {{PROJECT_NAME}}-network
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# docker-compose.yml — {{PROJECT_NAME}} ({{STACK}}) — Dev
|
|
2
|
+
services:
|
|
3
|
+
|
|
4
|
+
frontend:
|
|
5
|
+
container_name: {{PROJECT_NAME}}-frontend
|
|
6
|
+
build:
|
|
7
|
+
context: {{FRONTEND_DIR}}
|
|
8
|
+
dockerfile: {{FRONTEND_DOCKERFILE}}
|
|
9
|
+
ports:
|
|
10
|
+
- "{{FRONTEND_PORT}}:{{FRONTEND_PORT}}"
|
|
11
|
+
volumes:
|
|
12
|
+
- ./{{FRONTEND_DIR}}:/app
|
|
13
|
+
- /app/node_modules
|
|
14
|
+
environment:
|
|
15
|
+
- {{ENV_PREFIX}}API_URL=${{ENV_PREFIX}}API_URL
|
|
16
|
+
depends_on:
|
|
17
|
+
- backend
|
|
18
|
+
networks:
|
|
19
|
+
- app-network
|
|
20
|
+
|
|
21
|
+
backend:
|
|
22
|
+
container_name: {{PROJECT_NAME}}-backend
|
|
23
|
+
build:
|
|
24
|
+
context: ./backend
|
|
25
|
+
dockerfile: Dockerfile.dev
|
|
26
|
+
ports:
|
|
27
|
+
- "8080:8080"
|
|
28
|
+
volumes:
|
|
29
|
+
- ./backend:/app
|
|
30
|
+
- maven-cache:/root/.m2
|
|
31
|
+
environment:
|
|
32
|
+
- SPRING_PROFILES_ACTIVE=dev
|
|
33
|
+
- DATABASE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
|
|
34
|
+
- POSTGRES_USER=${POSTGRES_USER}
|
|
35
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
36
|
+
depends_on:
|
|
37
|
+
db:
|
|
38
|
+
condition: service_healthy
|
|
39
|
+
networks:
|
|
40
|
+
- app-network
|
|
41
|
+
|
|
42
|
+
db:
|
|
43
|
+
container_name: {{PROJECT_NAME}}-db
|
|
44
|
+
image: {{POSTGRES_IMAGE}}
|
|
45
|
+
ports:
|
|
46
|
+
- "5432:5432"
|
|
47
|
+
environment:
|
|
48
|
+
- POSTGRES_USER=${POSTGRES_USER}
|
|
49
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
50
|
+
- POSTGRES_DB=${POSTGRES_DB}
|
|
51
|
+
volumes:
|
|
52
|
+
- postgres-data:/var/lib/postgresql/data
|
|
53
|
+
networks:
|
|
54
|
+
- app-network
|
|
55
|
+
healthcheck:
|
|
56
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
|
57
|
+
interval: 10s
|
|
58
|
+
timeout: 5s
|
|
59
|
+
retries: 5
|
|
60
|
+
|
|
61
|
+
volumes:
|
|
62
|
+
postgres-data:
|
|
63
|
+
name: {{PROJECT_NAME}}-postgres-data
|
|
64
|
+
maven-cache:
|
|
65
|
+
name: {{PROJECT_NAME}}-maven-cache
|
|
66
|
+
|
|
67
|
+
networks:
|
|
68
|
+
app-network:
|
|
69
|
+
name: {{PROJECT_NAME}}-network
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# docker-compose.yml — {{PROJECT_NAME}} ({{STACK}}) — application + managed Supabase
|
|
2
|
+
services:
|
|
3
|
+
frontend:
|
|
4
|
+
container_name: {{PROJECT_NAME}}-frontend
|
|
5
|
+
build:
|
|
6
|
+
context: {{FRONTEND_DIR}}
|
|
7
|
+
dockerfile: {{FRONTEND_DOCKERFILE}}
|
|
8
|
+
ports:
|
|
9
|
+
- "{{FRONTEND_PORT}}:{{FRONTEND_PORT}}"
|
|
10
|
+
volumes:
|
|
11
|
+
- ./{{FRONTEND_DIR}}:/app
|
|
12
|
+
- /app/node_modules
|
|
13
|
+
environment:
|
|
14
|
+
- {{ENV_PREFIX}}SUPABASE_URL=${{ENV_PREFIX}}SUPABASE_URL
|
|
15
|
+
- {{ENV_PREFIX}}SUPABASE_PUBLISHABLE_KEY=${{ENV_PREFIX}}SUPABASE_PUBLISHABLE_KEY
|
|
16
|
+
|
|
17
|
+
# The Supabase platform is managed separately. Use `supabase start` for the
|
|
18
|
+
# official local stack instead of approximating it with a bare PostgreSQL image.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# docker-compose.prod.yml — {{PROJECT_NAME}} ({{STACK}}) — Prod
|
|
2
|
+
services:
|
|
3
|
+
|
|
4
|
+
frontend:
|
|
5
|
+
container_name: {{PROJECT_NAME}}-frontend-prod
|
|
6
|
+
build:
|
|
7
|
+
context: {{FRONTEND_DIR}}
|
|
8
|
+
dockerfile: {{FRONTEND_DOCKERFILE_PROD}}
|
|
9
|
+
target: production
|
|
10
|
+
ports:
|
|
11
|
+
- "{{FRONTEND_PROD_PORT}}"
|
|
12
|
+
environment:
|
|
13
|
+
- {{ENV_PREFIX}}API_URL=${{ENV_PREFIX}}API_URL
|
|
14
|
+
depends_on:
|
|
15
|
+
- backend
|
|
16
|
+
networks:
|
|
17
|
+
- app-network
|
|
18
|
+
restart: always
|
|
19
|
+
|
|
20
|
+
backend:
|
|
21
|
+
container_name: {{PROJECT_NAME}}-backend-prod
|
|
22
|
+
build:
|
|
23
|
+
context: ./backend
|
|
24
|
+
dockerfile: Dockerfile
|
|
25
|
+
target: production
|
|
26
|
+
ports:
|
|
27
|
+
- "8080:8080"
|
|
28
|
+
environment:
|
|
29
|
+
- SPRING_PROFILES_ACTIVE=prod
|
|
30
|
+
- DATABASE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
|
|
31
|
+
- POSTGRES_USER=${POSTGRES_USER}
|
|
32
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
33
|
+
depends_on:
|
|
34
|
+
db:
|
|
35
|
+
condition: service_healthy
|
|
36
|
+
networks:
|
|
37
|
+
- app-network
|
|
38
|
+
restart: always
|
|
39
|
+
|
|
40
|
+
db:
|
|
41
|
+
container_name: {{PROJECT_NAME}}-db-prod
|
|
42
|
+
image: {{POSTGRES_IMAGE}}
|
|
43
|
+
environment:
|
|
44
|
+
- POSTGRES_USER=${POSTGRES_USER}
|
|
45
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
46
|
+
- POSTGRES_DB=${POSTGRES_DB}
|
|
47
|
+
volumes:
|
|
48
|
+
- postgres-data-prod:/var/lib/postgresql/data
|
|
49
|
+
networks:
|
|
50
|
+
- app-network
|
|
51
|
+
restart: always
|
|
52
|
+
healthcheck:
|
|
53
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
|
54
|
+
interval: 10s
|
|
55
|
+
timeout: 5s
|
|
56
|
+
retries: 5
|
|
57
|
+
|
|
58
|
+
volumes:
|
|
59
|
+
postgres-data-prod:
|
|
60
|
+
name: {{PROJECT_NAME}}-postgres-data-prod
|
|
61
|
+
|
|
62
|
+
networks:
|
|
63
|
+
app-network:
|
|
64
|
+
name: {{PROJECT_NAME}}-network-prod
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
FROM {{NODE_IMAGE}} AS assets
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
COPY package*.json ./
|
|
4
|
+
RUN npm install
|
|
5
|
+
COPY resources ./resources
|
|
6
|
+
COPY vite.config.js ./
|
|
7
|
+
RUN npm run build
|
|
8
|
+
|
|
9
|
+
FROM {{COMPOSER_IMAGE}} AS composer
|
|
10
|
+
|
|
11
|
+
FROM {{PHP_IMAGE}}
|
|
12
|
+
RUN apk add --no-cache libpq-dev && docker-php-ext-install pdo_pgsql
|
|
13
|
+
WORKDIR /app
|
|
14
|
+
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
|
|
15
|
+
COPY composer.json ./
|
|
16
|
+
RUN composer install --no-interaction --prefer-dist --no-scripts
|
|
17
|
+
COPY . .
|
|
18
|
+
COPY --from=assets /app/public/build ./public/build
|
|
19
|
+
RUN composer dump-autoload --optimize
|
|
20
|
+
EXPOSE 8000
|
|
21
|
+
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
FROM {{COMPOSER_IMAGE}} AS composer
|
|
2
|
+
|
|
3
|
+
FROM {{PHP_IMAGE}}
|
|
4
|
+
RUN apk add --no-cache libpq-dev && docker-php-ext-install pdo_pgsql
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
|
|
7
|
+
COPY composer.json ./
|
|
8
|
+
RUN composer install --no-interaction --prefer-dist --no-scripts
|
|
9
|
+
COPY . .
|
|
10
|
+
RUN composer dump-autoload --optimize
|
|
11
|
+
EXPOSE 8000
|
|
12
|
+
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
FROM {{COMPOSER_IMAGE}} AS composer
|
|
2
|
+
|
|
3
|
+
FROM {{PHP_IMAGE}} AS production
|
|
4
|
+
RUN apk add --no-cache libpq-dev && docker-php-ext-install pdo_pgsql
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
|
|
7
|
+
COPY composer.json ./
|
|
8
|
+
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-scripts
|
|
9
|
+
COPY . .
|
|
10
|
+
RUN composer dump-autoload --classmap-authoritative
|
|
11
|
+
USER www-data
|
|
12
|
+
EXPOSE 8000
|
|
13
|
+
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
FROM {{NODE_IMAGE}} AS builder
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
COPY package*.json ./
|
|
4
|
+
RUN npm ci
|
|
5
|
+
RUN mkdir -p public
|
|
6
|
+
COPY . .
|
|
7
|
+
ARG DATABASE_URL=postgresql://dummy:dummy@localhost:5432/dummy
|
|
8
|
+
ENV DATABASE_URL=$DATABASE_URL
|
|
9
|
+
RUN npm run build
|
|
10
|
+
|
|
11
|
+
FROM {{NODE_IMAGE}} AS production
|
|
12
|
+
WORKDIR /app
|
|
13
|
+
ENV NODE_ENV=production
|
|
14
|
+
COPY --from=builder /app/.next/standalone ./
|
|
15
|
+
COPY --from=builder /app/.next/static ./.next/static
|
|
16
|
+
COPY --from=builder /app/public ./public
|
|
17
|
+
EXPOSE {{FRONTEND_PORT}}
|
|
18
|
+
CMD ["node", "server.js"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
FROM {{NODE_IMAGE}} AS builder
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
COPY package*.json ./
|
|
4
|
+
RUN npm ci
|
|
5
|
+
COPY . .
|
|
6
|
+
RUN npm run build
|
|
7
|
+
|
|
8
|
+
FROM {{NGINX_IMAGE}} AS production
|
|
9
|
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
10
|
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
11
|
+
EXPOSE 80
|
|
12
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Environment
|
|
2
|
+
.env
|
|
3
|
+
.env.local
|
|
4
|
+
.env.production
|
|
5
|
+
.env.*.local
|
|
6
|
+
|
|
7
|
+
# Dependencies
|
|
8
|
+
node_modules/
|
|
9
|
+
|
|
10
|
+
# IDE
|
|
11
|
+
.idea/
|
|
12
|
+
.vscode/
|
|
13
|
+
*.iml
|
|
14
|
+
*.suo
|
|
15
|
+
*.user
|
|
16
|
+
|
|
17
|
+
# OS
|
|
18
|
+
.DS_Store
|
|
19
|
+
Thumbs.db
|
|
20
|
+
|
|
21
|
+
# Logs
|
|
22
|
+
*.log
|
|
23
|
+
logs/
|
|
24
|
+
npm-debug.log*
|
|
25
|
+
|
|
26
|
+
# Testing
|
|
27
|
+
coverage/
|
|
28
|
+
playwright-report/
|
|
29
|
+
test-results/
|
|
30
|
+
|
|
31
|
+
# Docker volumes
|
|
32
|
+
postgres-data/
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Environment
|
|
2
|
+
.env
|
|
3
|
+
.env.local
|
|
4
|
+
.env.production
|
|
5
|
+
.env.*.local
|
|
6
|
+
|
|
7
|
+
# Dependencies
|
|
8
|
+
node_modules/
|
|
9
|
+
|
|
10
|
+
# Build outputs
|
|
11
|
+
.next/
|
|
12
|
+
out/
|
|
13
|
+
src/generated/prisma/
|
|
14
|
+
|
|
15
|
+
# IDE
|
|
16
|
+
.idea/
|
|
17
|
+
.vscode/
|
|
18
|
+
*.iml
|
|
19
|
+
*.suo
|
|
20
|
+
*.user
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
Thumbs.db
|
|
25
|
+
|
|
26
|
+
# Logs
|
|
27
|
+
*.log
|
|
28
|
+
logs/
|
|
29
|
+
npm-debug.log*
|
|
30
|
+
|
|
31
|
+
# Testing
|
|
32
|
+
coverage/
|
|
33
|
+
playwright-report/
|
|
34
|
+
test-results/
|
|
35
|
+
|
|
36
|
+
# Docker volumes
|
|
37
|
+
postgres-data/
|
|
38
|
+
|
|
39
|
+
# Supabase
|
|
40
|
+
.supabase/
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Environment
|
|
2
|
+
.env
|
|
3
|
+
.env.local
|
|
4
|
+
.env.production
|
|
5
|
+
.env.*.local
|
|
6
|
+
|
|
7
|
+
# Dependencies
|
|
8
|
+
node_modules/
|
|
9
|
+
|
|
10
|
+
# Expo
|
|
11
|
+
.expo/
|
|
12
|
+
dist/
|
|
13
|
+
web-build/
|
|
14
|
+
|
|
15
|
+
# Native
|
|
16
|
+
*.orig.*
|
|
17
|
+
*.jks
|
|
18
|
+
*.p8
|
|
19
|
+
*.p12
|
|
20
|
+
*.key
|
|
21
|
+
*.mobileprovision
|
|
22
|
+
|
|
23
|
+
# Metro
|
|
24
|
+
.metro-health-check*
|
|
25
|
+
|
|
26
|
+
# IDE
|
|
27
|
+
.idea/
|
|
28
|
+
.vscode/
|
|
29
|
+
*.iml
|
|
30
|
+
*.suo
|
|
31
|
+
*.user
|
|
32
|
+
|
|
33
|
+
# OS
|
|
34
|
+
.DS_Store
|
|
35
|
+
Thumbs.db
|
|
36
|
+
|
|
37
|
+
# Logs
|
|
38
|
+
*.log
|
|
39
|
+
logs/
|
|
40
|
+
npm-debug.log*
|
|
41
|
+
|
|
42
|
+
# Testing
|
|
43
|
+
coverage/
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Environment
|
|
2
|
+
.env
|
|
3
|
+
.env.local
|
|
4
|
+
.env.production
|
|
5
|
+
.env.*.local
|
|
6
|
+
|
|
7
|
+
# Dependencies
|
|
8
|
+
node_modules/
|
|
9
|
+
|
|
10
|
+
# Build outputs
|
|
11
|
+
dist/
|
|
12
|
+
build/
|
|
13
|
+
|
|
14
|
+
# IDE
|
|
15
|
+
.idea/
|
|
16
|
+
.vscode/
|
|
17
|
+
*.iml
|
|
18
|
+
*.suo
|
|
19
|
+
*.user
|
|
20
|
+
|
|
21
|
+
# OS
|
|
22
|
+
.DS_Store
|
|
23
|
+
Thumbs.db
|
|
24
|
+
|
|
25
|
+
# Logs
|
|
26
|
+
*.log
|
|
27
|
+
logs/
|
|
28
|
+
npm-debug.log*
|
|
29
|
+
|
|
30
|
+
# Testing
|
|
31
|
+
coverage/
|
|
32
|
+
playwright-report/
|
|
33
|
+
test-results/
|
|
34
|
+
|
|
35
|
+
# Docker volumes
|
|
36
|
+
postgres-data/
|
|
37
|
+
|
|
38
|
+
# Supabase
|
|
39
|
+
.supabase/
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Makefile — {{PROJECT_NAME}} frontend-only convenience aliases
|
|
2
|
+
# Make is optional; every target delegates to cross-platform npm scripts.
|
|
3
|
+
|
|
4
|
+
NPM_DIR := {{FRONTEND_DIR}}
|
|
5
|
+
|
|
6
|
+
.DEFAULT_GOAL := help
|
|
7
|
+
.PHONY: help install dev build lint format check test
|
|
8
|
+
|
|
9
|
+
help: ## Show available commands
|
|
10
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-16s\033[0m %s\n", $$1, $$2}'
|
|
11
|
+
|
|
12
|
+
install: ## Install exact dependencies from the lockfile
|
|
13
|
+
npm --prefix $(NPM_DIR) ci
|
|
14
|
+
|
|
15
|
+
dev: ## Start the frontend development server
|
|
16
|
+
npm --prefix $(NPM_DIR) run dev
|
|
17
|
+
|
|
18
|
+
build: ## Build for production
|
|
19
|
+
npm --prefix $(NPM_DIR) run build
|
|
20
|
+
|
|
21
|
+
lint: ## Run ESLint when supported
|
|
22
|
+
npm --prefix $(NPM_DIR) run lint --if-present
|
|
23
|
+
|
|
24
|
+
format: ## Format files with the project-local Prettier
|
|
25
|
+
npm --prefix $(NPM_DIR) run format
|
|
26
|
+
|
|
27
|
+
check: ## Run the generated quality checks
|
|
28
|
+
npm --prefix $(NPM_DIR) run check
|
|
29
|
+
|
|
30
|
+
test: ## Run tests when configured
|
|
31
|
+
npm --prefix $(NPM_DIR) run test --if-present
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
COMPOSE := docker compose
|
|
2
|
+
LARAVEL := $(COMPOSE) exec backend
|
|
3
|
+
|
|
4
|
+
.DEFAULT_GOAL := help
|
|
5
|
+
|
|
6
|
+
.PHONY: help setup build run dev stop logs test format analyse migrate shell clean
|
|
7
|
+
help: ## Show available commands
|
|
8
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-16s\033[0m %s\n", $$1, $$2}'
|
|
9
|
+
|
|
10
|
+
setup: ## First run: build, start, create key, and migrate
|
|
11
|
+
$(COMPOSE) build
|
|
12
|
+
$(COMPOSE) up -d
|
|
13
|
+
$(LARAVEL) php artisan key:generate
|
|
14
|
+
$(LARAVEL) php artisan migrate
|
|
15
|
+
|
|
16
|
+
build: ## Build development container images
|
|
17
|
+
$(COMPOSE) build
|
|
18
|
+
|
|
19
|
+
run: ## Start existing images without rebuilding
|
|
20
|
+
$(COMPOSE) up -d
|
|
21
|
+
|
|
22
|
+
dev: ## Start existing images and follow logs
|
|
23
|
+
$(COMPOSE) up
|
|
24
|
+
|
|
25
|
+
stop: ## Stop containers without deleting data
|
|
26
|
+
$(COMPOSE) down
|
|
27
|
+
|
|
28
|
+
logs: ## Follow application logs
|
|
29
|
+
$(COMPOSE) logs -f
|
|
30
|
+
|
|
31
|
+
test: ## Run Laravel tests in the container
|
|
32
|
+
$(LARAVEL) php artisan test
|
|
33
|
+
|
|
34
|
+
format: ## Format PHP source
|
|
35
|
+
$(LARAVEL) ./vendor/bin/pint
|
|
36
|
+
|
|
37
|
+
analyse: ## Run Larastan
|
|
38
|
+
$(LARAVEL) ./vendor/bin/phpstan analyse --memory-limit=1G
|
|
39
|
+
|
|
40
|
+
migrate: ## Apply pending Laravel migrations
|
|
41
|
+
$(LARAVEL) php artisan migrate
|
|
42
|
+
|
|
43
|
+
shell: ## Open a shell in the Laravel container
|
|
44
|
+
$(LARAVEL) sh
|
|
45
|
+
|
|
46
|
+
clean: ## Remove containers and project volumes (destructive)
|
|
47
|
+
$(COMPOSE) down -v --remove-orphans
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Makefile — {{PROJECT_NAME}} ({{STACK}} + Prisma)
|
|
3
|
+
# =============================================================================
|
|
4
|
+
|
|
5
|
+
COMPOSE := docker compose
|
|
6
|
+
|
|
7
|
+
.DEFAULT_GOAL := help
|
|
8
|
+
|
|
9
|
+
.PHONY: help dev build lint test db-start db-stop db-migrate db-reset db-studio
|
|
10
|
+
|
|
11
|
+
help: ## Show all commands
|
|
12
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
|
|
13
|
+
| awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
14
|
+
|
|
15
|
+
dev: db-start ## Start PostgreSQL + Next.js dev server
|
|
16
|
+
npm run dev
|
|
17
|
+
|
|
18
|
+
build: ## Build for production
|
|
19
|
+
npm run build
|
|
20
|
+
|
|
21
|
+
lint: ## Run ESLint
|
|
22
|
+
npm run lint
|
|
23
|
+
|
|
24
|
+
test: ## Run Vitest
|
|
25
|
+
npm run test
|
|
26
|
+
|
|
27
|
+
db-start: ## Start PostgreSQL container
|
|
28
|
+
$(COMPOSE) up -d db
|
|
29
|
+
|
|
30
|
+
db-stop: ## Stop PostgreSQL container
|
|
31
|
+
$(COMPOSE) down
|
|
32
|
+
|
|
33
|
+
db-migrate: ## Run Prisma migrations
|
|
34
|
+
npm run db:migrate
|
|
35
|
+
|
|
36
|
+
db-reset: ## Reset DB + migrate + seed
|
|
37
|
+
npm run db:reset
|
|
38
|
+
|
|
39
|
+
db-studio: ## Open Prisma Studio
|
|
40
|
+
npm run db:studio
|