project-initializer 0.2.1__tar.gz → 0.3.2__tar.gz
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.
- {project_initializer-0.2.1 → project_initializer-0.3.2}/MANIFEST.in +10 -0
- {project_initializer-0.2.1/project_initializer.egg-info → project_initializer-0.3.2}/PKG-INFO +46 -9
- {project_initializer-0.2.1 → project_initializer-0.3.2}/README.md +39 -6
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/__init__.py +1 -1
- project_initializer-0.3.2/project_initializer/cli.py +398 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/env_generator.py +14 -3
- project_initializer-0.3.2/project_initializer/file_transforms.py +130 -0
- project_initializer-0.3.2/project_initializer/templates/.gitattributes +34 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.github/workflows/test-package.yml +1 -1
- project_initializer-0.3.2/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/.tsbuildinfo +1 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/angular-compiler.db +0 -0
- project_initializer-0.2.1/project_initializer/templates/frontend/.DS_Store → project_initializer-0.3.2/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/angular-compiler.db-lock +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.claude/CLAUDE.md +6 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/Dockerfile +1 -1
- project_initializer-0.3.2/project_initializer/templates/frontend/README.md +101 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/angular.json +7 -3
- {project_initializer-0.2.1/project_initializer/templates-api-fastapi → project_initializer-0.3.2/project_initializer/templates}/frontend/nginx.conf +3 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package-lock.json +1431 -1478
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package.json +4 -8
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/app.config.ts +26 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/app.routes.ts +35 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.spec.ts +0 -2
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/icons.spec.ts +70 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/icons.ts +63 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/interceptors/error.interceptor.spec.ts +77 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/interceptors/error.interceptor.ts +14 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.ts +3 -3
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.html +27 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.spec.ts +38 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.ts +22 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/home/home.html +33 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/home/home.spec.ts +38 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/home/home.ts +26 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/settings/settings.html +27 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/settings/settings.spec.ts +60 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/pages/settings/settings.ts +34 -0
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/services/chat.service.ts → project_initializer-0.3.2/project_initializer/templates/frontend/src/app/services/chat.ts +1 -1
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/services/theme.spec.ts +135 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/services/theme.ts +71 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.html +15 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.spec.ts +87 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.ts +15 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/layout.css +18 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/layout.html +36 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/layout.spec.ts +115 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.ts +40 -3
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/responsive-shell.integration.spec.ts +111 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/nav-item.ts +22 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.html +57 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.spec.ts +71 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.ts +36 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/sidebar/theme-toggle.integration.spec.ts +90 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/assets/favicon.ico +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/index.html +2 -2
- project_initializer-0.3.2/project_initializer/templates/frontend/src/styles.css +201 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/src/test-providers.ts +3 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.spec.json +3 -2
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/CLAUDE.md +61 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.claude/CLAUDE.md +6 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/Dockerfile +3 -2
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/env.py +7 -8
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/alembic/versions/0001_create_items_table.py +54 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/alembic/versions/0002_create_users_table.py +63 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/__init__.py +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/chatbot.py +9 -12
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/api/v1/items.py +125 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/router.py +4 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/api/v1/test.py +63 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/api/v1/users.py +19 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/config.py +7 -10
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/database.py +4 -4
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/dependencies.py +48 -52
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/exceptions.py +1 -2
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/main.py +51 -13
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/logging.py +37 -28
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/rate_limiting.py +24 -22
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/security.py +11 -19
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/__init__.py +2 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/base.py +7 -2
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/models/item.py +41 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/__init__.py +4 -4
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/base.py +1 -1
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/repositories/item.py +14 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/__init__.py +35 -44
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/chatbot.py +15 -24
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/schemas/item.py +49 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/schemas/user.py +39 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/__init__.py +2 -4
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/chatbot_service.py +3 -10
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/services/item_service.py +56 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/utils/__init__.py +2 -12
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/app/utils/audit.py +25 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/__init__.py +48 -48
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/async_client.py +182 -182
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/baml_client/inlinedbaml.py +21 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/parser.py +46 -46
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/runtime.py +349 -349
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/sync_client.py +192 -192
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_builder.py +43 -42
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/watchers.py +33 -32
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/generators.baml +1 -1
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/requirements.txt +39 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/conftest.py +3 -4
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/e2e/test_app_boot.py +42 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/e2e/test_openapi_metadata.py +95 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/integration/test_health.py +25 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/integration/test_items_auth.py +64 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/integration/test_items_router.py +232 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/integration/test_test_routes.py +79 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/integration/test_users_me.py +74 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/unit/test_item_model.py +74 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/unit/test_item_service.py +95 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/unit/test_schemas.py +51 -0
- project_initializer-0.3.2/project_initializer/templates-api-fastapi/api/tests/unit/test_user_schemas.py +129 -0
- {project_initializer-0.2.1/project_initializer/templates-api-nestjs → project_initializer-0.3.2/project_initializer/templates-api-fastapi}/frontend/nginx.conf +3 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/.claude/CLAUDE.md +232 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.env.example +11 -2
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.gitignore +3 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/Dockerfile +7 -5
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/README.md +2 -2
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/generators.baml +1 -1
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/package-lock.json +12314 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/package.json +101 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/app.module.spec.ts +99 -0
- {project_initializer-0.2.1/project_initializer/templates-supabase-nestjs → project_initializer-0.3.2/project_initializer/templates-api-nestjs}/api/src/app.module.ts +25 -19
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/env.validation.spec.ts +60 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/env.validation.ts +25 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/logger.config.ts +26 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/main.ts +5 -10
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.controller.ts +2 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/auth/dto/user.dto.ts +22 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat-job.service.spec.ts +115 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat-job.service.ts +23 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat.processor.spec.ts +84 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat.processor.ts +20 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.controller.spec.ts +72 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.controller.ts +30 -3
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.module.ts +23 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.service.spec.ts +69 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/dto/chat.dto.ts +14 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.spec.ts +73 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.ts +53 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/health/health.module.ts +2 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/monitoring/monitoring.module.spec.ts +70 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/monitoring/monitoring.module.ts +34 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/serialization.spec.ts +43 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/test.controller.spec.ts +84 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.controller.ts +7 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/test.service.spec.ts +99 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/prisma/prisma-ssl.util.spec.ts +41 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/prisma/prisma-ssl.util.ts +37 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.service.ts +8 -2
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/test/app.e2e-spec.ts +81 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/test/jest-e2e.json +16 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.json +3 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/docker-compose.yml +24 -1
- {project_initializer-0.2.1/project_initializer/templates → project_initializer-0.3.2/project_initializer/templates-api-nestjs}/frontend/nginx.conf +3 -0
- project_initializer-0.3.2/project_initializer/templates-asyncdb-fastapi/api/app/database_async.py +74 -0
- project_initializer-0.3.2/project_initializer/templates-asyncdb-fastapi/api/app/repositories/base_async.py +84 -0
- project_initializer-0.3.2/project_initializer/templates-asyncdb-fastapi/api/tests/unit/test_async_db.py +114 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/.env.example +5 -5
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/alembic/env.py +7 -8
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/auth.py +6 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/router.py +4 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/config.py +19 -28
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/database.py +3 -3
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/dependencies.py +22 -13
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/models/__init__.py +2 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/models/user.py +7 -13
- project_initializer-0.3.2/project_initializer/templates-supabase-fastapi/api/requirements.txt +33 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-fastapi/api/tests/integration/test_auth.py +60 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-frontend/frontend/src/app/app.config.ts +15 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/forgot-password/forgot-password.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/update-password/update-password.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
- {project_initializer-0.2.1/project_initializer/templates-token-frontend → project_initializer-0.3.2/project_initializer/templates-supabase-frontend}/frontend/src/app/shared/sidebar/sidebar.html +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/shared/sidebar/sidebar.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/.env.example +19 -9
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/package-lock.json +12408 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/package.json +112 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/app.module.spec.ts +79 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/app.module.ts +84 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/config/env.validation.spec.ts +81 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/config/env.validation.ts +28 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.controller.ts +3 -3
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.guard.spec.ts +82 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/test/app.e2e-spec.ts +115 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/test/jest-e2e.json +16 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/tsconfig.json +33 -0
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/docker-compose.yml +59 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/.env.example +3 -0
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/app/api/v1/auth.py +169 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/api/v1/router.py +4 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/config.py +25 -23
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/app/core/security.py +68 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/dependencies.py +87 -29
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/tests/integration/test_auth.py +76 -0
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/tests/integration/test_jwt_auth.py +200 -0
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/tests/unit/test_jwt_dependencies.py +120 -0
- project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/tests/unit/test_security.py +131 -0
- project_initializer-0.3.2/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +15 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
- {project_initializer-0.2.1/project_initializer/templates-supabase-frontend → project_initializer-0.3.2/project_initializer/templates-token-frontend}/frontend/src/app/shared/sidebar/sidebar.html +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/shared/sidebar/sidebar.ts +1 -1
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/.env.example +5 -2
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/package-lock.json +6 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/app.module.spec.ts +66 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/app.module.ts +84 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/config/env.validation.spec.ts +62 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/config/env.validation.ts +26 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.controller.ts +2 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.guard.spec.ts +75 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/test/app.e2e-spec.ts +111 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/test/jest-e2e.json +16 -0
- project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/tsconfig.json +33 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2/project_initializer.egg-info}/PKG-INFO +46 -9
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer.egg-info/SOURCES.txt +135 -8
- project_initializer-0.3.2/project_initializer.egg-info/requires.txt +6 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/pyproject.toml +32 -4
- project_initializer-0.3.2/tests/test_async_db_flag.py +155 -0
- project_initializer-0.3.2/tests/test_asyncdb_overlay.py +80 -0
- project_initializer-0.3.2/tests/test_ci_workflow_scope.py +111 -0
- project_initializer-0.3.2/tests/test_cli_parser.py +74 -0
- project_initializer-0.3.2/tests/test_cli_validation.py +42 -0
- project_initializer-0.3.2/tests/test_docs_scope.py +38 -0
- project_initializer-0.3.2/tests/test_docs_sync_async.py +59 -0
- project_initializer-0.3.2/tests/test_docs_token_validate.py +44 -0
- project_initializer-0.3.2/tests/test_docs_tutorial_mapping.py +45 -0
- project_initializer-0.3.2/tests/test_entrypoint_line_endings.py +130 -0
- project_initializer-0.3.2/tests/test_env_generator_jwt.py +52 -0
- project_initializer-0.3.2/tests/test_env_generator_log_level.py +71 -0
- project_initializer-0.3.2/tests/test_file_transforms.py +186 -0
- project_initializer-0.3.2/tests/test_integration_build.py +165 -0
- project_initializer-0.3.2/tests/test_issue5_nestjs_docker_healthcheck.py +196 -0
- project_initializer-0.3.2/tests/test_issue5_nestjs_global_criteria.py +240 -0
- project_initializer-0.3.2/tests/test_issue_003_zod_serialization.py +383 -0
- project_initializer-0.3.2/tests/test_issue_10_bull_board.py +292 -0
- project_initializer-0.3.2/tests/test_issue_12_chat_job_status.py +242 -0
- project_initializer-0.3.2/tests/test_issue_13_nestjs_production_readiness.py +274 -0
- project_initializer-0.3.2/tests/test_issue_14.py +315 -0
- project_initializer-0.3.2/tests/test_issue_15_app_filter_docs.py +224 -0
- project_initializer-0.3.2/tests/test_issue_2_nestjs_guard_wiring.py +463 -0
- project_initializer-0.3.2/tests/test_issue_6_nestjs_hardening.py +301 -0
- project_initializer-0.3.2/tests/test_issue_9_nestjs_acceptance.py +277 -0
- project_initializer-0.3.2/tests/test_nestjs_build_config.py +70 -0
- project_initializer-0.3.2/tests/test_nestjs_issue8_acceptance.py +314 -0
- project_initializer-0.3.2/tests/test_nestjs_redis_bullmq.py +244 -0
- project_initializer-0.3.2/tests/test_scope_routing.py +80 -0
- project_initializer-0.3.2/tests/test_scope_scaffold.py +178 -0
- project_initializer-0.3.2/tests/test_select_layers.py +62 -0
- project_initializer-0.2.1/project_initializer/cli.py +0 -196
- project_initializer-0.2.1/project_initializer/templates/.DS_Store +0 -0
- project_initializer-0.2.1/project_initializer/templates/frontend/README.md +0 -59
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/app.config.ts +0 -14
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/app.routes.ts +0 -19
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/shared/layout/layout.css +0 -1
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/shared/layout/layout.html +0 -25
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.html +0 -38
- project_initializer-0.2.1/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.ts +0 -32
- project_initializer-0.2.1/project_initializer/templates/frontend/src/styles.css +0 -41
- project_initializer-0.2.1/project_initializer/templates-api-fastapi/CLAUDE.md +0 -49
- project_initializer-0.2.1/project_initializer/templates-api-fastapi/api/app/api/v1/test.py +0 -242
- project_initializer-0.2.1/project_initializer/templates-api-fastapi/api/baml_client/inlinedbaml.py +0 -21
- project_initializer-0.2.1/project_initializer/templates-api-fastapi/api/requirements.txt +0 -34
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/.claude/CLAUDE.md +0 -87
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/package.json +0 -77
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/src/app.module.ts +0 -56
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/src/common/middleware/logging.middleware.ts +0 -23
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.module.ts +0 -9
- project_initializer-0.2.1/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.ts +0 -21
- project_initializer-0.2.1/project_initializer/templates-supabase-fastapi/api/requirements.txt +0 -33
- project_initializer-0.2.1/project_initializer/templates-supabase-frontend/frontend/src/app/app.config.ts +0 -15
- project_initializer-0.2.1/project_initializer/templates-supabase-nestjs/api/package.json +0 -78
- project_initializer-0.2.1/project_initializer/templates-supabase-nestjs/docker-compose.yml +0 -34
- project_initializer-0.2.1/project_initializer/templates-token-fastapi/api/app/api/v1/auth.py +0 -44
- project_initializer-0.2.1/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +0 -15
- project_initializer-0.2.1/project_initializer/templates-token-nestjs/api/src/app.module.ts +0 -61
- {project_initializer-0.2.1 → project_initializer-0.3.2}/LICENSE +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/py.typed +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.env.example +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.gitignore +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/extensions.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/launch.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/settings.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/tasks.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/CLAUDE.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/LICENSE +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/MANIFEST.in +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.editorconfig +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.gitignore +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.postcssrc.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/extensions.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/launch.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/tasks.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/public/favicon.ico +0 -0
- /project_initializer-0.2.1/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.css → /project_initializer-0.3.2/project_initializer/templates/frontend/src/app/app.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.html +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.ts +0 -0
- /project_initializer-0.2.1/project_initializer/templates/frontend/src/app/models/chat.model.ts → /project_initializer-0.3.2/project_initializer/templates/frontend/src/app/models/chat.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.html +0 -0
- /project_initializer-0.2.1/project_initializer/templates/frontend/src/assets/favicon.ico → /project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.model.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.prod.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/main.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.app.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates/pyproject.toml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/extensions.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/launch.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/settings.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/tasks.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.dockerignore +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.env.example +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/README +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/script.py.mako +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/versions/.gitkeep +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic.ini +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/core/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/user.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/config.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/globals.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/stream_types.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/tracing.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_map.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/types.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/chatbot.baml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/clients.baml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/entrypoint.sh +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/pytest.ini +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/scripts/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/docker-compose.yml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/extensions.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/launch.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/settings.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/tasks.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/CLAUDE.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.dockerignore +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_client.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_request.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/config.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/globals.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/index.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/inlinedbaml.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/parser.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/partial_types.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_client.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_request.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/tracing.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/type_builder.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/types.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/watchers.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/chatbot.baml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/clients.baml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/entrypoint.sh +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/nest-cli.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/migrations/.gitkeep +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/schema.prisma +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma.config.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/decorators/current-user.decorator.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/decorators/public.decorator.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/exceptions/api.exceptions.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/http-exception.filter.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/index.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/prisma-exception.filter.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/interceptors/transform.interceptor.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.service.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/dto/echo.dto.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/dto/item.dto.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.module.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.service.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.module.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.build.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/entrypoint.sh +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/docker-compose.yml +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/package.json +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/app.routes.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/forgot-password/forgot-password.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/forgot-password/forgot-password.html +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.html +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/update-password/update-password.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/update-password/update-password.html +0 -0
- /project_initializer-0.2.1/project_initializer/templates-supabase-frontend/frontend/src/app/services/auth.service.ts → /project_initializer-0.3.2/project_initializer/templates-supabase-frontend/frontend/src/app/services/auth.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.model.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.prod.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/README.md +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/entrypoint.sh +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/prisma/schema.prisma +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- /project_initializer-0.2.1/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.css → /project_initializer-0.3.2/project_initializer/templates-token-fastapi/api/tests/unit/__init__.py +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/app.routes.ts +0 -0
- /project_initializer-0.2.1/project_initializer/templates/frontend/src/app/app.css → /project_initializer-0.3.2/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.css +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.html +0 -0
- /project_initializer-0.2.1/project_initializer/templates-token-frontend/frontend/src/app/services/auth.service.ts → /project_initializer-0.3.2/project_initializer/templates-token-frontend/frontend/src/app/services/auth.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer.egg-info/dependency_links.txt +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer.egg-info/entry_points.txt +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer.egg-info/top_level.txt +0 -0
- {project_initializer-0.2.1 → project_initializer-0.3.2}/setup.cfg +0 -0
|
@@ -16,8 +16,11 @@ recursive-include project_initializer/templates-token-frontend *
|
|
|
16
16
|
recursive-include project_initializer/templates-token-frontend .*
|
|
17
17
|
recursive-include project_initializer/templates-supabase-frontend *
|
|
18
18
|
recursive-include project_initializer/templates-supabase-frontend .*
|
|
19
|
+
recursive-include project_initializer/templates-asyncdb-fastapi *
|
|
20
|
+
recursive-include project_initializer/templates-asyncdb-fastapi .*
|
|
19
21
|
include project_initializer/py.typed
|
|
20
22
|
include project_initializer/templates/.gitignore
|
|
23
|
+
include project_initializer/templates/.gitattributes
|
|
21
24
|
include project_initializer/templates/.env.example
|
|
22
25
|
include project_initializer/templates/api/.env.example
|
|
23
26
|
include project_initializer/templates/api/.dockerignore
|
|
@@ -28,3 +31,10 @@ global-exclude __pycache__
|
|
|
28
31
|
global-exclude *.py[cod]
|
|
29
32
|
global-exclude .git
|
|
30
33
|
global-exclude node_modules
|
|
34
|
+
prune project_initializer/templates-api-nestjs/api/node_modules
|
|
35
|
+
prune project_initializer/templates-token-nestjs/api/node_modules
|
|
36
|
+
prune project_initializer/templates-supabase-nestjs/api/node_modules
|
|
37
|
+
prune project_initializer/templates/frontend/node_modules
|
|
38
|
+
# Prisma/zod generated client — regenerated by `npx prisma generate` (postinstall)
|
|
39
|
+
prune project_initializer/templates-api-nestjs/api/generated
|
|
40
|
+
prune project_initializer/templates-supabase-nestjs/api/generated
|
{project_initializer-0.2.1/project_initializer.egg-info → project_initializer-0.3.2}/PKG-INFO
RENAMED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: project-initializer
|
|
3
|
-
Version: 0.2
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: CLI tool to scaffold full-stack projects with FastAPI or NestJS, Angular, and Docker
|
|
5
5
|
Author: Silvio Baratto
|
|
6
|
-
License: MIT
|
|
6
|
+
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/silviobaratto/project-initializer
|
|
8
8
|
Project-URL: Repository, https://github.com/silviobaratto/project-initializer
|
|
9
9
|
Keywords: cli,scaffold,fastapi,nestjs,angular,docker,project-generator
|
|
10
10
|
Classifier: Development Status :: 3 - Alpha
|
|
11
11
|
Classifier: Environment :: Console
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
13
|
Classifier: Operating System :: OS Independent
|
|
15
14
|
Classifier: Programming Language :: Python :: 3
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -20,6 +19,11 @@ Classifier: Topic :: Software Development :: Code Generators
|
|
|
20
19
|
Requires-Python: >=3.10
|
|
21
20
|
Description-Content-Type: text/markdown
|
|
22
21
|
License-File: LICENSE
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: ruff>=0.15; extra == "dev"
|
|
24
|
+
Requires-Dist: pytest>=9; extra == "dev"
|
|
25
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
26
|
+
Requires-Dist: pyyaml>=6; extra == "dev"
|
|
23
27
|
Dynamic: license-file
|
|
24
28
|
|
|
25
29
|
# project-initializer
|
|
@@ -28,7 +32,7 @@ Dynamic: license-file
|
|
|
28
32
|
[](https://www.python.org/downloads/)
|
|
29
33
|
[](https://github.com/silviobaratto/project-initializer/actions)
|
|
30
34
|
|
|
31
|
-
CLI tool to scaffold full-stack projects with **FastAPI** or **NestJS**, **Angular**, and **Docker** — with optional authentication via token or Supabase.
|
|
35
|
+
CLI tool to scaffold full-stack projects with **FastAPI** or **NestJS**, **Angular**, and **Docker** — with optional authentication via token or Supabase. Scaffold the full stack, or just the **backend** or **frontend** with `--scope`.
|
|
32
36
|
|
|
33
37
|
## Installation
|
|
34
38
|
|
|
@@ -83,6 +87,35 @@ project-initializer my-app --auth supabase # Supabase JWT auth + RLS
|
|
|
83
87
|
- **Token auth** (`--auth token`) — Bearer-token middleware on the API. Frontend gets a login guard and an HTTP interceptor that attaches the token.
|
|
84
88
|
- **Supabase auth** (`--auth supabase`) — Supabase JWT validation on the API. Frontend integrates `@supabase/supabase-js` for login/signup. Docker Compose omits the local `db` service since Supabase hosts the database.
|
|
85
89
|
|
|
90
|
+
## Project Scope (full-stack / backend-only / frontend-only)
|
|
91
|
+
|
|
92
|
+
By default the CLI scaffolds both halves (`api/` + `frontend/`). Use `--scope` to generate only one:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
project-initializer my-app # fullstack (default): api + frontend
|
|
96
|
+
project-initializer my-app --scope api # backend only — no frontend/, no frontend service
|
|
97
|
+
project-initializer my-app --scope frontend # frontend only — Angular app, no api/
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- **`--scope api`** — emits `api/` + `docker-compose.yml` (without the `frontend` service) + `api/.env`. Combine with `--fastapi`/`--nestjs`/`--auth` as usual.
|
|
101
|
+
- **`--scope frontend`** — emits just the Angular `frontend/` (nginx `/api/` proxy stripped). Cannot be combined with `--fastapi`/`--nestjs`/`--auth` (those are backend concerns).
|
|
102
|
+
- **`--scope fullstack`** (default) — both halves, current behavior.
|
|
103
|
+
|
|
104
|
+
## Async Database (opt-in)
|
|
105
|
+
|
|
106
|
+
FastAPI backends scaffold the **sync** SQLAlchemy path by default — sync `def` path operations run in Starlette's threadpool, so a blocking `Session` never stalls the event loop. This is the recommended default per the FastAPI tutorial.
|
|
107
|
+
|
|
108
|
+
Pass `--async-db` to additionally lay down the **async** SQLAlchemy overlay (async engine + `AsyncSession` + `get_async_db` dependency, asyncpg driver):
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
project-initializer my-app --async-db # fullstack + async DB path
|
|
112
|
+
project-initializer my-app --scope api --async-db # backend only + async DB path
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- FastAPI only — rejected with `--nestjs` and with `--scope frontend`.
|
|
116
|
+
- Additive: the sync path stays the default; the async modules are an isolated overlay you wire in explicitly.
|
|
117
|
+
- See the generated `api/.claude/CLAUDE.md` for the sync-vs-async convention (pick the keyword from the I/O, not by style).
|
|
118
|
+
|
|
86
119
|
## All 6 Variants
|
|
87
120
|
|
|
88
121
|
| Command | Backend | Auth |
|
|
@@ -97,9 +130,12 @@ project-initializer my-app --auth supabase # Supabase JWT auth + RLS
|
|
|
97
130
|
Additional flags:
|
|
98
131
|
|
|
99
132
|
```bash
|
|
100
|
-
project-initializer my-project --
|
|
101
|
-
project-initializer
|
|
102
|
-
project-initializer --
|
|
133
|
+
project-initializer my-project --scope api # Backend only
|
|
134
|
+
project-initializer my-project --scope frontend # Frontend only
|
|
135
|
+
project-initializer my-project --async-db # FastAPI async SQLAlchemy path (opt-in)
|
|
136
|
+
project-initializer my-project --force # Overwrite existing files
|
|
137
|
+
project-initializer . # Scaffold in current directory
|
|
138
|
+
project-initializer --version # Show version
|
|
103
139
|
```
|
|
104
140
|
|
|
105
141
|
## Generated Project Structure
|
|
@@ -135,7 +171,8 @@ The CLI auto-generates `api/.env` based on the chosen variant. A root `.env.exam
|
|
|
135
171
|
For Supabase variants, configure these in `api/.env`:
|
|
136
172
|
```
|
|
137
173
|
SUPABASE_URL=https://your-project.supabase.co
|
|
138
|
-
SUPABASE_PUBLISHABLE_KEY=
|
|
174
|
+
SUPABASE_PUBLISHABLE_KEY=sb_publishable_... # client-side (replaces legacy anon key)
|
|
175
|
+
SUPABASE_SECRET_KEY=sb_secret_... # server-side, bypasses RLS (replaces service_role)
|
|
139
176
|
```
|
|
140
177
|
|
|
141
178
|
## Development
|
|
@@ -164,7 +201,7 @@ npm run test # Run tests
|
|
|
164
201
|
|
|
165
202
|
```bash
|
|
166
203
|
cd frontend
|
|
167
|
-
npm install
|
|
204
|
+
npm install --legacy-peer-deps
|
|
168
205
|
ng serve # Dev server on :4200
|
|
169
206
|
ng build # Production build
|
|
170
207
|
ng test # Unit tests
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://www.python.org/downloads/)
|
|
5
5
|
[](https://github.com/silviobaratto/project-initializer/actions)
|
|
6
6
|
|
|
7
|
-
CLI tool to scaffold full-stack projects with **FastAPI** or **NestJS**, **Angular**, and **Docker** — with optional authentication via token or Supabase.
|
|
7
|
+
CLI tool to scaffold full-stack projects with **FastAPI** or **NestJS**, **Angular**, and **Docker** — with optional authentication via token or Supabase. Scaffold the full stack, or just the **backend** or **frontend** with `--scope`.
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
@@ -59,6 +59,35 @@ project-initializer my-app --auth supabase # Supabase JWT auth + RLS
|
|
|
59
59
|
- **Token auth** (`--auth token`) — Bearer-token middleware on the API. Frontend gets a login guard and an HTTP interceptor that attaches the token.
|
|
60
60
|
- **Supabase auth** (`--auth supabase`) — Supabase JWT validation on the API. Frontend integrates `@supabase/supabase-js` for login/signup. Docker Compose omits the local `db` service since Supabase hosts the database.
|
|
61
61
|
|
|
62
|
+
## Project Scope (full-stack / backend-only / frontend-only)
|
|
63
|
+
|
|
64
|
+
By default the CLI scaffolds both halves (`api/` + `frontend/`). Use `--scope` to generate only one:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
project-initializer my-app # fullstack (default): api + frontend
|
|
68
|
+
project-initializer my-app --scope api # backend only — no frontend/, no frontend service
|
|
69
|
+
project-initializer my-app --scope frontend # frontend only — Angular app, no api/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- **`--scope api`** — emits `api/` + `docker-compose.yml` (without the `frontend` service) + `api/.env`. Combine with `--fastapi`/`--nestjs`/`--auth` as usual.
|
|
73
|
+
- **`--scope frontend`** — emits just the Angular `frontend/` (nginx `/api/` proxy stripped). Cannot be combined with `--fastapi`/`--nestjs`/`--auth` (those are backend concerns).
|
|
74
|
+
- **`--scope fullstack`** (default) — both halves, current behavior.
|
|
75
|
+
|
|
76
|
+
## Async Database (opt-in)
|
|
77
|
+
|
|
78
|
+
FastAPI backends scaffold the **sync** SQLAlchemy path by default — sync `def` path operations run in Starlette's threadpool, so a blocking `Session` never stalls the event loop. This is the recommended default per the FastAPI tutorial.
|
|
79
|
+
|
|
80
|
+
Pass `--async-db` to additionally lay down the **async** SQLAlchemy overlay (async engine + `AsyncSession` + `get_async_db` dependency, asyncpg driver):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
project-initializer my-app --async-db # fullstack + async DB path
|
|
84
|
+
project-initializer my-app --scope api --async-db # backend only + async DB path
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- FastAPI only — rejected with `--nestjs` and with `--scope frontend`.
|
|
88
|
+
- Additive: the sync path stays the default; the async modules are an isolated overlay you wire in explicitly.
|
|
89
|
+
- See the generated `api/.claude/CLAUDE.md` for the sync-vs-async convention (pick the keyword from the I/O, not by style).
|
|
90
|
+
|
|
62
91
|
## All 6 Variants
|
|
63
92
|
|
|
64
93
|
| Command | Backend | Auth |
|
|
@@ -73,9 +102,12 @@ project-initializer my-app --auth supabase # Supabase JWT auth + RLS
|
|
|
73
102
|
Additional flags:
|
|
74
103
|
|
|
75
104
|
```bash
|
|
76
|
-
project-initializer my-project --
|
|
77
|
-
project-initializer
|
|
78
|
-
project-initializer --
|
|
105
|
+
project-initializer my-project --scope api # Backend only
|
|
106
|
+
project-initializer my-project --scope frontend # Frontend only
|
|
107
|
+
project-initializer my-project --async-db # FastAPI async SQLAlchemy path (opt-in)
|
|
108
|
+
project-initializer my-project --force # Overwrite existing files
|
|
109
|
+
project-initializer . # Scaffold in current directory
|
|
110
|
+
project-initializer --version # Show version
|
|
79
111
|
```
|
|
80
112
|
|
|
81
113
|
## Generated Project Structure
|
|
@@ -111,7 +143,8 @@ The CLI auto-generates `api/.env` based on the chosen variant. A root `.env.exam
|
|
|
111
143
|
For Supabase variants, configure these in `api/.env`:
|
|
112
144
|
```
|
|
113
145
|
SUPABASE_URL=https://your-project.supabase.co
|
|
114
|
-
SUPABASE_PUBLISHABLE_KEY=
|
|
146
|
+
SUPABASE_PUBLISHABLE_KEY=sb_publishable_... # client-side (replaces legacy anon key)
|
|
147
|
+
SUPABASE_SECRET_KEY=sb_secret_... # server-side, bypasses RLS (replaces service_role)
|
|
115
148
|
```
|
|
116
149
|
|
|
117
150
|
## Development
|
|
@@ -140,7 +173,7 @@ npm run test # Run tests
|
|
|
140
173
|
|
|
141
174
|
```bash
|
|
142
175
|
cd frontend
|
|
143
|
-
npm install
|
|
176
|
+
npm install --legacy-peer-deps
|
|
144
177
|
ng serve # Dev server on :4200
|
|
145
178
|
ng build # Production build
|
|
146
179
|
ng test # Unit tests
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"""CLI entry point for project-initializer."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import shutil
|
|
5
|
+
import sys
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from . import __version__
|
|
10
|
+
from .env_generator import generate_env, parse_env
|
|
11
|
+
from .file_transforms import (
|
|
12
|
+
append_async_requirements,
|
|
13
|
+
filter_compose,
|
|
14
|
+
generate_frontend_compose,
|
|
15
|
+
strip_nginx_proxy_block,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
FRAMEWORKS = ("fastapi", "nestjs")
|
|
19
|
+
AUTH_MODES = ("token", "supabase")
|
|
20
|
+
SCOPES = ("fullstack", "api", "frontend")
|
|
21
|
+
|
|
22
|
+
TEMPLATES_ROOT = Path(__file__).parent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_templates_dir() -> Path:
|
|
26
|
+
return TEMPLATES_ROOT / "templates"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_api_templates_dir(framework: str) -> Path:
|
|
30
|
+
return TEMPLATES_ROOT / f"templates-api-{framework}"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_auth_overlay_dir(auth_mode: str, framework: str) -> Path:
|
|
34
|
+
return TEMPLATES_ROOT / f"templates-{auth_mode}-{framework}"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_auth_frontend_overlay_dir(auth_mode: str) -> Path:
|
|
38
|
+
return TEMPLATES_ROOT / f"templates-{auth_mode}-frontend"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_asyncdb_overlay_dir() -> Path:
|
|
42
|
+
"""Opt-in async SQLAlchemy overlay (FastAPI only), merged by --async-db."""
|
|
43
|
+
return TEMPLATES_ROOT / "templates-asyncdb-fastapi"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _compose_handler(scope: str) -> Callable:
|
|
47
|
+
"""File handler that filters docker-compose.yml for the given scope."""
|
|
48
|
+
|
|
49
|
+
def handle(path: Path) -> str | None:
|
|
50
|
+
if path.name == "docker-compose.yml":
|
|
51
|
+
return filter_compose(path.read_text(encoding="utf-8"), scope)
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
return handle
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _nginx_handler() -> Callable:
|
|
58
|
+
"""File handler that strips the /api/ proxy block from nginx.conf."""
|
|
59
|
+
|
|
60
|
+
def handle(path: Path) -> str | None:
|
|
61
|
+
if path.name == "nginx.conf":
|
|
62
|
+
return strip_nginx_proxy_block(path.read_text(encoding="utf-8"))
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
return handle
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _requirements_handler() -> Callable:
|
|
69
|
+
"""File handler that appends the async DB deps to api/requirements.txt."""
|
|
70
|
+
|
|
71
|
+
def handle(path: Path) -> str | None:
|
|
72
|
+
if path.name == "requirements.txt":
|
|
73
|
+
return append_async_requirements(path.read_text(encoding="utf-8"))
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
return handle
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _combine(*handlers: Callable | None) -> Callable | None:
|
|
80
|
+
"""Compose filename handlers into one transform; None if all are None.
|
|
81
|
+
|
|
82
|
+
Returning None when nothing applies preserves byte-identical pass-through
|
|
83
|
+
(the default scaffold). Handlers target disjoint filenames, so first
|
|
84
|
+
non-None wins is an unambiguous dispatch.
|
|
85
|
+
"""
|
|
86
|
+
active = [handler for handler in handlers if handler is not None]
|
|
87
|
+
if not active:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
def transform(path: Path) -> str | None:
|
|
91
|
+
for handler in active:
|
|
92
|
+
result = handler(path)
|
|
93
|
+
if result is not None:
|
|
94
|
+
return result
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
return transform
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def select_layers(
|
|
101
|
+
scope: str,
|
|
102
|
+
framework: str,
|
|
103
|
+
auth: str | None,
|
|
104
|
+
async_db: bool = False,
|
|
105
|
+
) -> list[tuple[Path, frozenset[str], Callable | None]]:
|
|
106
|
+
"""Return the ordered merge layers for the requested scope.
|
|
107
|
+
|
|
108
|
+
Each tuple is (src_dir, skip_subdirs, file_transform). The frontend branch
|
|
109
|
+
MUST NOT consult ``framework`` — it is scope-only. When ``async_db`` is set
|
|
110
|
+
(FastAPI only), a requirements transform is composed onto the layers that
|
|
111
|
+
carry ``requirements.txt`` (the async overlay ships none), and the async
|
|
112
|
+
overlay is appended last.
|
|
113
|
+
|
|
114
|
+
Declarative data construction — exempt from the <10-line rule.
|
|
115
|
+
"""
|
|
116
|
+
base = get_templates_dir()
|
|
117
|
+
api = get_api_templates_dir(framework)
|
|
118
|
+
want_async = async_db and framework == "fastapi"
|
|
119
|
+
reqs = _requirements_handler() if want_async else None
|
|
120
|
+
|
|
121
|
+
if scope == "fullstack":
|
|
122
|
+
layers: list[tuple[Path, frozenset[str], Callable | None]] = [
|
|
123
|
+
(base, frozenset(), None),
|
|
124
|
+
(api, frozenset(), _combine(reqs)),
|
|
125
|
+
]
|
|
126
|
+
if auth:
|
|
127
|
+
layers.append(
|
|
128
|
+
(get_auth_overlay_dir(auth, framework), frozenset(), _combine(reqs))
|
|
129
|
+
)
|
|
130
|
+
layers.append((get_auth_frontend_overlay_dir(auth), frozenset(), None))
|
|
131
|
+
if want_async:
|
|
132
|
+
layers.append((get_asyncdb_overlay_dir(), frozenset(), None))
|
|
133
|
+
return layers
|
|
134
|
+
|
|
135
|
+
if scope == "api":
|
|
136
|
+
compose = _compose_handler("api")
|
|
137
|
+
layers = [
|
|
138
|
+
(base, frozenset({"frontend"}), None),
|
|
139
|
+
(api, frozenset({"frontend"}), _combine(compose, reqs)),
|
|
140
|
+
]
|
|
141
|
+
if auth:
|
|
142
|
+
layers.append(
|
|
143
|
+
(
|
|
144
|
+
get_auth_overlay_dir(auth, framework),
|
|
145
|
+
frozenset(),
|
|
146
|
+
_combine(compose, reqs),
|
|
147
|
+
)
|
|
148
|
+
)
|
|
149
|
+
if want_async:
|
|
150
|
+
layers.append((get_asyncdb_overlay_dir(), frozenset(), None))
|
|
151
|
+
return layers
|
|
152
|
+
|
|
153
|
+
# scope == "frontend"
|
|
154
|
+
layers = [(base, frozenset(), _nginx_handler())]
|
|
155
|
+
if auth:
|
|
156
|
+
layers.append((get_auth_frontend_overlay_dir(auth), frozenset(), None))
|
|
157
|
+
return layers
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _copy_file(src: Path, dst: Path, file_transform: Callable | None) -> None:
|
|
161
|
+
"""Copy src to dst, optionally transforming text content.
|
|
162
|
+
|
|
163
|
+
The transform receives the source Path and returns transformed text for
|
|
164
|
+
files it targets, or None to pass through to shutil.copy2 (binary-safe).
|
|
165
|
+
"""
|
|
166
|
+
if file_transform is not None:
|
|
167
|
+
transformed = file_transform(src)
|
|
168
|
+
if transformed is not None:
|
|
169
|
+
dst.write_text(transformed, encoding="utf-8")
|
|
170
|
+
return
|
|
171
|
+
shutil.copy2(src, dst)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def copy_template(
|
|
175
|
+
dest_dir: Path,
|
|
176
|
+
project_name: str | None = None,
|
|
177
|
+
auth: str | None = None,
|
|
178
|
+
framework: str = "fastapi",
|
|
179
|
+
scope: str = "fullstack",
|
|
180
|
+
async_db: bool = False,
|
|
181
|
+
) -> None:
|
|
182
|
+
"""Copy template files to destination directory."""
|
|
183
|
+
skip_patterns = {
|
|
184
|
+
"__pycache__",
|
|
185
|
+
".pyc",
|
|
186
|
+
"node_modules",
|
|
187
|
+
".git",
|
|
188
|
+
".env",
|
|
189
|
+
"*.egg-info",
|
|
190
|
+
"dist",
|
|
191
|
+
"build",
|
|
192
|
+
"test-stubs",
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
def should_skip(name: str) -> bool:
|
|
196
|
+
return any(
|
|
197
|
+
name == pattern or name.endswith(pattern.lstrip("*"))
|
|
198
|
+
for pattern in skip_patterns
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
def copy_tree(
|
|
202
|
+
src: Path,
|
|
203
|
+
dst: Path,
|
|
204
|
+
skip_subdirs: frozenset[str] = frozenset(),
|
|
205
|
+
file_transform: Callable | None = None,
|
|
206
|
+
) -> None:
|
|
207
|
+
"""Recursively copy directory tree, merging into existing dirs."""
|
|
208
|
+
dst.mkdir(parents=True, exist_ok=True)
|
|
209
|
+
|
|
210
|
+
for item in src.iterdir():
|
|
211
|
+
if should_skip(item.name):
|
|
212
|
+
continue
|
|
213
|
+
if item.is_dir() and item.name in skip_subdirs:
|
|
214
|
+
continue
|
|
215
|
+
|
|
216
|
+
dest_item = dst / item.name
|
|
217
|
+
|
|
218
|
+
if item.is_dir():
|
|
219
|
+
copy_tree(item, dest_item, frozenset(), file_transform)
|
|
220
|
+
else:
|
|
221
|
+
_copy_file(item, dest_item, file_transform)
|
|
222
|
+
print(f" Created: {dest_item.relative_to(dest_dir)}")
|
|
223
|
+
|
|
224
|
+
def require_dir(path: Path) -> None:
|
|
225
|
+
if not path.exists():
|
|
226
|
+
print(f"Error: Templates directory not found at {path}")
|
|
227
|
+
sys.exit(1)
|
|
228
|
+
|
|
229
|
+
auth_label = f" + {auth} auth" if auth else ""
|
|
230
|
+
print(f"Creating project in: {dest_dir}")
|
|
231
|
+
print(f"Framework: {framework}{auth_label}")
|
|
232
|
+
print("-" * 40)
|
|
233
|
+
|
|
234
|
+
for src, skip, transform in select_layers(scope, framework, auth, async_db):
|
|
235
|
+
require_dir(src)
|
|
236
|
+
copy_tree(src, dest_dir, skip, transform)
|
|
237
|
+
|
|
238
|
+
# Generate .env for the API (only when the api layer is present)
|
|
239
|
+
if scope in ("fullstack", "api"):
|
|
240
|
+
env_example_path = TEMPLATES_ROOT / "env_defaults.env"
|
|
241
|
+
source = parse_env(env_example_path) if env_example_path.exists() else {}
|
|
242
|
+
env_content = generate_env(framework, auth, source, use_placeholders=True)
|
|
243
|
+
api_env_path = dest_dir / "api" / ".env"
|
|
244
|
+
api_env_path.write_text(env_content, encoding="utf-8")
|
|
245
|
+
print(f" Created: {api_env_path.relative_to(dest_dir)}")
|
|
246
|
+
|
|
247
|
+
if scope == "frontend":
|
|
248
|
+
compose_path = dest_dir / "docker-compose.yml"
|
|
249
|
+
compose_path.write_text(generate_frontend_compose(), encoding="utf-8")
|
|
250
|
+
print(f" Created: {compose_path.relative_to(dest_dir)}")
|
|
251
|
+
|
|
252
|
+
print("-" * 40)
|
|
253
|
+
print("Project created successfully!")
|
|
254
|
+
print("\nNext steps:")
|
|
255
|
+
print(f" cd {dest_dir.name}")
|
|
256
|
+
print(" # Edit api/.env with your real keys")
|
|
257
|
+
if auth == "supabase":
|
|
258
|
+
print(" # Configure SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY in api/.env")
|
|
259
|
+
print(" docker-compose up -d")
|
|
260
|
+
if framework == "nestjs":
|
|
261
|
+
print("\n # NestJS API development:")
|
|
262
|
+
print(" cd api && npm install && npm run start:dev")
|
|
263
|
+
else:
|
|
264
|
+
print("\n # FastAPI development:")
|
|
265
|
+
print(
|
|
266
|
+
" cd api && pip install -r requirements.txt && uvicorn app.main:app --reload"
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
271
|
+
"""Construct the CLI argument parser.
|
|
272
|
+
|
|
273
|
+
Declarative builder: registers all flags in a flat sequence and is
|
|
274
|
+
therefore exempt from the per-method line limit. ``framework`` defaults
|
|
275
|
+
to ``None`` (no ``set_defaults``) so callers can distinguish an explicit
|
|
276
|
+
``--fastapi``/``--nestjs`` from the absent case; the ``"fastapi"`` default
|
|
277
|
+
is resolved in ``main()`` after parsing.
|
|
278
|
+
"""
|
|
279
|
+
parser = argparse.ArgumentParser(
|
|
280
|
+
prog="project-initializer",
|
|
281
|
+
description="Initialize a new full-stack project with FastAPI or NestJS, Angular, and Docker",
|
|
282
|
+
)
|
|
283
|
+
parser.add_argument(
|
|
284
|
+
"project_name",
|
|
285
|
+
nargs="?",
|
|
286
|
+
default=".",
|
|
287
|
+
help="Name of the project directory to create (default: current directory)",
|
|
288
|
+
)
|
|
289
|
+
parser.add_argument(
|
|
290
|
+
"-v",
|
|
291
|
+
"--version",
|
|
292
|
+
action="version",
|
|
293
|
+
version=f"%(prog)s {__version__}",
|
|
294
|
+
)
|
|
295
|
+
parser.add_argument(
|
|
296
|
+
"-f",
|
|
297
|
+
"--force",
|
|
298
|
+
action="store_true",
|
|
299
|
+
help="Overwrite existing files without prompting",
|
|
300
|
+
)
|
|
301
|
+
parser.add_argument(
|
|
302
|
+
"--auth",
|
|
303
|
+
nargs="?",
|
|
304
|
+
const="token",
|
|
305
|
+
default=None,
|
|
306
|
+
choices=AUTH_MODES,
|
|
307
|
+
help="Auth mode: 'token' (simple token, default) or 'supabase'",
|
|
308
|
+
)
|
|
309
|
+
parser.add_argument(
|
|
310
|
+
"--scope",
|
|
311
|
+
choices=SCOPES,
|
|
312
|
+
default="fullstack",
|
|
313
|
+
help="Layers to scaffold: 'fullstack' (default), 'api', or 'frontend'",
|
|
314
|
+
)
|
|
315
|
+
parser.add_argument(
|
|
316
|
+
"--async-db",
|
|
317
|
+
dest="async_db",
|
|
318
|
+
action="store_true",
|
|
319
|
+
help="Add the opt-in async SQLAlchemy path (FastAPI only)",
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
framework_group = parser.add_mutually_exclusive_group()
|
|
323
|
+
framework_group.add_argument(
|
|
324
|
+
"--fastapi",
|
|
325
|
+
action="store_const",
|
|
326
|
+
const="fastapi",
|
|
327
|
+
dest="framework",
|
|
328
|
+
help="Use FastAPI backend (default)",
|
|
329
|
+
)
|
|
330
|
+
framework_group.add_argument(
|
|
331
|
+
"--nestjs",
|
|
332
|
+
action="store_const",
|
|
333
|
+
const="nestjs",
|
|
334
|
+
dest="framework",
|
|
335
|
+
help="Use NestJS backend",
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
return parser
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def validate_scope(
|
|
342
|
+
scope: str,
|
|
343
|
+
framework: str | None,
|
|
344
|
+
auth: str | None,
|
|
345
|
+
async_db: bool = False,
|
|
346
|
+
) -> list[str]:
|
|
347
|
+
"""Return error messages for invalid --scope / framework / auth combos.
|
|
348
|
+
|
|
349
|
+
Pure function (no I/O); empty list means valid. ``framework``/``auth`` are
|
|
350
|
+
``None`` when their flags were omitted, so ``--scope frontend`` alone is
|
|
351
|
+
accepted. ``--async-db`` is a FastAPI api concern: rejected for ``--nestjs``
|
|
352
|
+
and for ``--scope frontend``; ``api``/``fullstack`` accept all API options.
|
|
353
|
+
"""
|
|
354
|
+
if scope == "frontend" and framework is not None:
|
|
355
|
+
return ["--scope frontend cannot be combined with --fastapi/--nestjs"]
|
|
356
|
+
if scope == "frontend" and auth is not None:
|
|
357
|
+
return ["--scope frontend cannot be combined with --auth"]
|
|
358
|
+
if async_db and framework == "nestjs":
|
|
359
|
+
return ["--async-db is a FastAPI option and cannot be combined with --nestjs"]
|
|
360
|
+
if async_db and scope == "frontend":
|
|
361
|
+
return ["--async-db cannot be combined with --scope frontend"]
|
|
362
|
+
return []
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def main() -> None:
|
|
366
|
+
"""Main entry point for the CLI."""
|
|
367
|
+
parser = build_parser()
|
|
368
|
+
args = parser.parse_args()
|
|
369
|
+
errors = validate_scope(args.scope, args.framework, args.auth, args.async_db)
|
|
370
|
+
if errors:
|
|
371
|
+
parser.error(errors[0])
|
|
372
|
+
framework = args.framework if args.framework is not None else "fastapi"
|
|
373
|
+
|
|
374
|
+
# Determine destination directory
|
|
375
|
+
if args.project_name == ".":
|
|
376
|
+
dest_dir = Path.cwd()
|
|
377
|
+
else:
|
|
378
|
+
dest_dir = Path.cwd() / args.project_name
|
|
379
|
+
|
|
380
|
+
# Check if directory exists and has content
|
|
381
|
+
if dest_dir.exists() and any(dest_dir.iterdir()) and not args.force:
|
|
382
|
+
response = input(f"Directory '{dest_dir}' is not empty. Continue? [y/N]: ")
|
|
383
|
+
if response.lower() != "y":
|
|
384
|
+
print("Aborted.")
|
|
385
|
+
sys.exit(0)
|
|
386
|
+
|
|
387
|
+
copy_template(
|
|
388
|
+
dest_dir,
|
|
389
|
+
args.project_name,
|
|
390
|
+
auth=args.auth,
|
|
391
|
+
framework=framework,
|
|
392
|
+
scope=args.scope,
|
|
393
|
+
async_db=args.async_db,
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
if __name__ == "__main__":
|
|
398
|
+
main()
|
{project_initializer-0.2.1 → project_initializer-0.3.2}/project_initializer/env_generator.py
RENAMED
|
@@ -38,7 +38,6 @@ def generate_env(
|
|
|
38
38
|
is_supabase = auth == "supabase"
|
|
39
39
|
is_token = auth == "token"
|
|
40
40
|
is_fastapi = framework == "fastapi"
|
|
41
|
-
is_nestjs = framework == "nestjs"
|
|
42
41
|
|
|
43
42
|
def val(key: str, fallback: str = "") -> str:
|
|
44
43
|
return source_env.get(key, fallback)
|
|
@@ -71,6 +70,9 @@ def generate_env(
|
|
|
71
70
|
lines.append("")
|
|
72
71
|
lines.append("# Authentication")
|
|
73
72
|
lines.append(f"AUTH_TOKEN={val('AUTH_TOKEN')}")
|
|
73
|
+
lines.append(f"JWT_SECRET_KEY={val('JWT_SECRET_KEY', 'changeme')}")
|
|
74
|
+
lines.append("JWT_ALGORITHM=HS256")
|
|
75
|
+
lines.append("ACCESS_TOKEN_EXPIRE_MINUTES=30")
|
|
74
76
|
|
|
75
77
|
# --- Server ---
|
|
76
78
|
lines.append("")
|
|
@@ -82,9 +84,16 @@ def generate_env(
|
|
|
82
84
|
else:
|
|
83
85
|
lines.append("NODE_ENV=development")
|
|
84
86
|
lines.append("PORT=8000")
|
|
85
|
-
lines.append(f"LOG_LEVEL={val('LOG_LEVEL', '
|
|
87
|
+
lines.append(f"LOG_LEVEL={val('LOG_LEVEL', 'info').lower()}")
|
|
86
88
|
lines.append(f"CORS_ORIGINS={val('CORS_ORIGINS', 'http://localhost:4200')}")
|
|
87
89
|
|
|
90
|
+
# --- Redis (NestJS BullMQ queue backend) ---
|
|
91
|
+
if not is_fastapi:
|
|
92
|
+
lines.append("")
|
|
93
|
+
lines.append("# Redis")
|
|
94
|
+
lines.append(f"REDIS_HOST={val('REDIS_HOST', 'localhost')}")
|
|
95
|
+
lines.append(f"REDIS_PORT={val('REDIS_PORT', '6379')}")
|
|
96
|
+
|
|
88
97
|
# --- Azure OpenAI ---
|
|
89
98
|
lines.append("")
|
|
90
99
|
lines.append("# Azure OpenAI (BAML)")
|
|
@@ -98,7 +107,9 @@ def generate_env(
|
|
|
98
107
|
lines.append(f"ANTHROPIC_API_KEY={val('ANTHROPIC_API_KEY')}")
|
|
99
108
|
lines.append(f"OPENAI_API_KEY={val('OPENAI_API_KEY')}")
|
|
100
109
|
lines.append(f"GOOGLE_API_KEY={val('GOOGLE_API_KEY')}")
|
|
101
|
-
lines.append(
|
|
110
|
+
lines.append(
|
|
111
|
+
f"OLLAMA_BASE_URL={val('OLLAMA_BASE_URL', 'http://localhost:11434/v1')}"
|
|
112
|
+
)
|
|
102
113
|
|
|
103
114
|
lines.append("")
|
|
104
115
|
return "\n".join(lines)
|