project-initializer 0.3.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.3.1 → project_initializer-0.3.2}/MANIFEST.in +8 -0
- {project_initializer-0.3.1/project_initializer.egg-info → project_initializer-0.3.2}/PKG-INFO +3 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/__init__.py +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/cli.py +9 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/env_generator.py +11 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/file_transforms.py +2 -0
- project_initializer-0.3.2/project_initializer/templates/.gitattributes +34 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.claude/CLAUDE.md +6 -0
- project_initializer-0.3.2/project_initializer/templates/frontend/README.md +101 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/angular.json +7 -3
- {project_initializer-0.3.1/project_initializer/templates-api-fastapi → project_initializer-0.3.2/project_initializer/templates}/frontend/nginx.conf +3 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package.json +3 -8
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/app.config.ts +26 -0
- {project_initializer-0.3.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/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.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.ts +2 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.spec.ts +0 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.spec.ts +0 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.spec.ts +7 -6
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.ts +1 -1
- project_initializer-0.3.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.1/project_initializer/templates/frontend/src/app/services/theme.service.spec.ts → project_initializer-0.3.2/project_initializer/templates/frontend/src/app/services/theme.spec.ts +10 -10
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.html +1 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.spec.ts +31 -3
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/bottom-tab-bar/bottom-tab-bar.ts +1 -1
- project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/layout.css +18 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.spec.ts +41 -3
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.ts +13 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/responsive-shell.integration.spec.ts +3 -4
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.spec.ts +7 -6
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.ts +2 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/theme-toggle.integration.spec.ts +3 -4
- project_initializer-0.3.2/project_initializer/templates/frontend/src/test-providers.ts +3 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.spec.json +3 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/Dockerfile +3 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/versions/0001_create_items_table.py +1 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/versions/0002_create_users_table.py +19 -4
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/__init__.py +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/chatbot.py +9 -12
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/test.py +3 -8
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/config.py +7 -10
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/database.py +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/dependencies.py +29 -24
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/exceptions.py +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/main.py +20 -5
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/logging.py +37 -27
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/rate_limiting.py +24 -22
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/security.py +10 -18
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/base.py +7 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/base.py +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/__init__.py +7 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/chatbot.py +15 -22
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/user.py +3 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/chatbot_service.py +3 -10
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/conftest.py +2 -3
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_items_auth.py +8 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_items_router.py +3 -3
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_test_routes.py +5 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_users_me.py +3 -1
- {project_initializer-0.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.env.example +11 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.gitignore +3 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/Dockerfile +7 -5
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/README.md +2 -2
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/package-lock.json +12314 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/package.json +23 -0
- project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/app.module.spec.ts +99 -0
- {project_initializer-0.3.1/project_initializer/templates-token-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.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/main.ts +5 -10
- {project_initializer-0.3.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.3.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.3.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.3.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.3.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/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.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/docker-compose.yml +24 -1
- {project_initializer-0.3.1/project_initializer/templates → project_initializer-0.3.2/project_initializer/templates-api-nestjs}/frontend/nginx.conf +3 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/app/database_async.py +8 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/tests/unit/test_async_db.py +4 -4
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/config.py +18 -27
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/dependencies.py +10 -2
- {project_initializer-0.3.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-frontend/frontend/src/app/app.config.ts +15 -0
- {project_initializer-0.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.ts +1 -1
- {project_initializer-0.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/shared/sidebar/sidebar.html +1 -1
- {project_initializer-0.3.1/project_initializer/templates-token-frontend → project_initializer-0.3.2/project_initializer/templates-supabase-frontend}/frontend/src/app/shared/sidebar/sidebar.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/.env.example +14 -4
- project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/package-lock.json +12408 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/package.json +33 -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.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/api/v1/auth.py +10 -3
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/config.py +20 -23
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/dependencies.py +17 -5
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/integration/test_auth.py +6 -2
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/integration/test_jwt_auth.py +11 -3
- project_initializer-0.3.2/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +15 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/shared/sidebar/sidebar.html +1 -1
- {project_initializer-0.3.1/project_initializer/templates-supabase-frontend → project_initializer-0.3.2/project_initializer/templates-token-frontend}/frontend/src/app/shared/sidebar/sidebar.ts +1 -1
- {project_initializer-0.3.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.3.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.3.1 → project_initializer-0.3.2/project_initializer.egg-info}/PKG-INFO +3 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/SOURCES.txt +62 -8
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/requires.txt +2 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/pyproject.toml +11 -1
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_asyncdb_overlay.py +25 -1
- project_initializer-0.3.2/tests/test_entrypoint_line_endings.py +130 -0
- project_initializer-0.3.2/tests/test_env_generator_log_level.py +71 -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.1 → project_initializer-0.3.2}/tests/test_nestjs_build_config.py +16 -4
- 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.1/project_initializer/templates/frontend/README.md +0 -59
- project_initializer-0.3.1/project_initializer/templates/frontend/src/app/app.config.ts +0 -26
- project_initializer-0.3.1/project_initializer/templates/frontend/src/app/shared/layout/layout.css +0 -1
- project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/.claude/CLAUDE.md +0 -87
- project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/app.module.ts +0 -56
- project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/common/middleware/logging.middleware.ts +0 -23
- project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.module.ts +0 -9
- project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.ts +0 -21
- project_initializer-0.3.1/project_initializer/templates-supabase-frontend/frontend/src/app/app.config.ts +0 -15
- project_initializer-0.3.1/project_initializer/templates-supabase-nestjs/api/src/app.module.ts +0 -61
- project_initializer-0.3.1/project_initializer/templates-supabase-nestjs/docker-compose.yml +0 -34
- project_initializer-0.3.1/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +0 -15
- {project_initializer-0.3.1 → project_initializer-0.3.2}/LICENSE +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/py.typed +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.env.example +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.github/workflows/test-package.yml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.gitignore +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/extensions.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/launch.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/settings.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/tasks.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/CLAUDE.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/LICENSE +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/MANIFEST.in +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/.tsbuildinfo +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/angular-compiler.db +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/angular-compiler.db-lock +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.editorconfig +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.gitignore +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.postcssrc.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/extensions.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/launch.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/tasks.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/Dockerfile +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package-lock.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/public/favicon.ico +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.css +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.routes.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/icons.spec.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/icons.ts +0 -0
- /project_initializer-0.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.html +0 -0
- /project_initializer-0.3.1/project_initializer/templates/frontend/src/app/services/theme.service.ts → /project_initializer-0.3.2/project_initializer/templates/frontend/src/app/services/theme.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.html +0 -0
- /project_initializer-0.3.1/project_initializer/templates/frontend/src/app/shared/nav-item.model.ts → /project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/nav-item.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.css +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/assets/favicon.ico +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.model.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.prod.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/index.html +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/main.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/styles.css +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.app.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/pyproject.toml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/extensions.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/launch.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/settings.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/tasks.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/CLAUDE.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.claude/CLAUDE.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.dockerignore +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.env.example +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/README +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/env.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/script.py.mako +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/versions/.gitkeep +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic.ini +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/items.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/router.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/users.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/core/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/item.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/user.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/item.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/item.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/item_service.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/utils/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/utils/audit.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/async_client.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/config.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/globals.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/inlinedbaml.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/parser.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/runtime.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/stream_types.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/sync_client.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/tracing.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_builder.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_map.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/types.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/watchers.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/chatbot.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/clients.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/generators.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/entrypoint.sh +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/pytest.ini +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/requirements.txt +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/scripts/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/test_app_boot.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/test_openapi_metadata.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_health.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_item_model.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_item_service.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_schemas.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_user_schemas.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/docker-compose.yml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/extensions.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/launch.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/settings.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/tasks.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/CLAUDE.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.dockerignore +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_client.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_request.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/config.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/globals.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/index.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/inlinedbaml.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/parser.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/partial_types.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_client.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_request.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/tracing.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/type_builder.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/types.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/watchers.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/chatbot.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/clients.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/generators.baml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/entrypoint.sh +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/nest-cli.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/migrations/.gitkeep +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/schema.prisma +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma.config.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/decorators/current-user.decorator.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/decorators/public.decorator.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/exceptions/api.exceptions.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/http-exception.filter.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/index.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/prisma-exception.filter.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/interceptors/transform.interceptor.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/dto/echo.dto.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/dto/item.dto.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.module.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma-ssl.util.spec.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma-ssl.util.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.module.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.build.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/app/repositories/base_async.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/.env.example +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/alembic/env.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/auth.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/router.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/database.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/models/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/entrypoint.sh +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/requirements.txt +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/tests/integration/test_auth.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/docker-compose.yml +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/package.json +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/app.routes.ts +0 -0
- {project_initializer-0.3.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.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.css +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.html +0 -0
- {project_initializer-0.3.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.3.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.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.model.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.prod.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/README.md +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/entrypoint.sh +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/prisma/schema.prisma +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/.env.example +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/api/v1/router.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/core/security.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/__init__.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/test_jwt_dependencies.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/test_security.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/app.routes.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.css +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.html +0 -0
- /project_initializer-0.3.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.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.module.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.service.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/dto/auth.dto.ts +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/dependency_links.txt +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/entry_points.txt +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/top_level.txt +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/setup.cfg +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_async_db_flag.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_ci_workflow_scope.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_cli_parser.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_cli_validation.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_scope.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_sync_async.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_token_validate.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_tutorial_mapping.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_env_generator_jwt.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_file_transforms.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_integration_build.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_scope_routing.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_scope_scaffold.py +0 -0
- {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_select_layers.py +0 -0
|
@@ -20,6 +20,7 @@ recursive-include project_initializer/templates-asyncdb-fastapi *
|
|
|
20
20
|
recursive-include project_initializer/templates-asyncdb-fastapi .*
|
|
21
21
|
include project_initializer/py.typed
|
|
22
22
|
include project_initializer/templates/.gitignore
|
|
23
|
+
include project_initializer/templates/.gitattributes
|
|
23
24
|
include project_initializer/templates/.env.example
|
|
24
25
|
include project_initializer/templates/api/.env.example
|
|
25
26
|
include project_initializer/templates/api/.dockerignore
|
|
@@ -30,3 +31,10 @@ global-exclude __pycache__
|
|
|
30
31
|
global-exclude *.py[cod]
|
|
31
32
|
global-exclude .git
|
|
32
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.3.1/project_initializer.egg-info → project_initializer-0.3.2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: project-initializer
|
|
3
|
-
Version: 0.3.
|
|
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
6
|
License-Expression: MIT
|
|
@@ -22,6 +22,8 @@ License-File: LICENSE
|
|
|
22
22
|
Provides-Extra: dev
|
|
23
23
|
Requires-Dist: ruff>=0.15; extra == "dev"
|
|
24
24
|
Requires-Dist: pytest>=9; extra == "dev"
|
|
25
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
26
|
+
Requires-Dist: pyyaml>=6; extra == "dev"
|
|
25
27
|
Dynamic: license-file
|
|
26
28
|
|
|
27
29
|
# project-initializer
|
|
@@ -124,7 +124,9 @@ def select_layers(
|
|
|
124
124
|
(api, frozenset(), _combine(reqs)),
|
|
125
125
|
]
|
|
126
126
|
if auth:
|
|
127
|
-
layers.append(
|
|
127
|
+
layers.append(
|
|
128
|
+
(get_auth_overlay_dir(auth, framework), frozenset(), _combine(reqs))
|
|
129
|
+
)
|
|
128
130
|
layers.append((get_auth_frontend_overlay_dir(auth), frozenset(), None))
|
|
129
131
|
if want_async:
|
|
130
132
|
layers.append((get_asyncdb_overlay_dir(), frozenset(), None))
|
|
@@ -138,7 +140,11 @@ def select_layers(
|
|
|
138
140
|
]
|
|
139
141
|
if auth:
|
|
140
142
|
layers.append(
|
|
141
|
-
(
|
|
143
|
+
(
|
|
144
|
+
get_auth_overlay_dir(auth, framework),
|
|
145
|
+
frozenset(),
|
|
146
|
+
_combine(compose, reqs),
|
|
147
|
+
)
|
|
142
148
|
)
|
|
143
149
|
if want_async:
|
|
144
150
|
layers.append((get_asyncdb_overlay_dir(), frozenset(), None))
|
|
@@ -183,6 +189,7 @@ def copy_template(
|
|
|
183
189
|
"*.egg-info",
|
|
184
190
|
"dist",
|
|
185
191
|
"build",
|
|
192
|
+
"test-stubs",
|
|
186
193
|
}
|
|
187
194
|
|
|
188
195
|
def should_skip(name: str) -> bool:
|
{project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/env_generator.py
RENAMED
|
@@ -84,9 +84,16 @@ def generate_env(
|
|
|
84
84
|
else:
|
|
85
85
|
lines.append("NODE_ENV=development")
|
|
86
86
|
lines.append("PORT=8000")
|
|
87
|
-
lines.append(f"LOG_LEVEL={val('LOG_LEVEL', '
|
|
87
|
+
lines.append(f"LOG_LEVEL={val('LOG_LEVEL', 'info').lower()}")
|
|
88
88
|
lines.append(f"CORS_ORIGINS={val('CORS_ORIGINS', 'http://localhost:4200')}")
|
|
89
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
|
+
|
|
90
97
|
# --- Azure OpenAI ---
|
|
91
98
|
lines.append("")
|
|
92
99
|
lines.append("# Azure OpenAI (BAML)")
|
|
@@ -100,7 +107,9 @@ def generate_env(
|
|
|
100
107
|
lines.append(f"ANTHROPIC_API_KEY={val('ANTHROPIC_API_KEY')}")
|
|
101
108
|
lines.append(f"OPENAI_API_KEY={val('OPENAI_API_KEY')}")
|
|
102
109
|
lines.append(f"GOOGLE_API_KEY={val('GOOGLE_API_KEY')}")
|
|
103
|
-
lines.append(
|
|
110
|
+
lines.append(
|
|
111
|
+
f"OLLAMA_BASE_URL={val('OLLAMA_BASE_URL', 'http://localhost:11434/v1')}"
|
|
112
|
+
)
|
|
104
113
|
|
|
105
114
|
lines.append("")
|
|
106
115
|
return "\n".join(lines)
|
{project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/file_transforms.py
RENAMED
|
@@ -110,10 +110,12 @@ def generate_frontend_compose() -> str:
|
|
|
110
110
|
|
|
111
111
|
# Pinned to match SQLAlchemy==2.0.50 already in the base requirements; the
|
|
112
112
|
# extras form pulls greenlet for the async path. asyncpg is the async driver.
|
|
113
|
+
# aiosqlite is used for unit testing with in-memory SQLite.
|
|
113
114
|
_ASYNC_REQUIREMENTS = (
|
|
114
115
|
"\n# Async DB path (--async-db) — opt-in asyncpg driver + asyncio extras\n"
|
|
115
116
|
"asyncpg==0.31.0\n"
|
|
116
117
|
"sqlalchemy[asyncio]==2.0.50\n"
|
|
118
|
+
"aiosqlite==0.20.0\n"
|
|
117
119
|
)
|
|
118
120
|
|
|
119
121
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Line-ending normalization.
|
|
2
|
+
#
|
|
3
|
+
# Without this file, a Windows clone (Git default core.autocrlf=true) rewrites
|
|
4
|
+
# checked-out text files to CRLF. Shell scripts then carry a trailing \r on
|
|
5
|
+
# their shebang line, so the Linux container looks for the interpreter
|
|
6
|
+
# "/bin/bash\r" and Docker fails the ENTRYPOINT with the misleading error
|
|
7
|
+
# "exec /entrypoint.sh: no such file or directory".
|
|
8
|
+
#
|
|
9
|
+
# `text=auto` stores every text file with LF inside the repo; `eol=lf` on shell
|
|
10
|
+
# scripts forces LF on checkout for EVERYONE regardless of their git config, so
|
|
11
|
+
# the scripts that run inside Linux containers can never be mangled.
|
|
12
|
+
|
|
13
|
+
* text=auto
|
|
14
|
+
|
|
15
|
+
# Scripts executed inside Linux containers — always LF.
|
|
16
|
+
*.sh text eol=lf
|
|
17
|
+
entrypoint.sh text eol=lf
|
|
18
|
+
|
|
19
|
+
# Windows-only scripts — keep CRLF.
|
|
20
|
+
*.bat text eol=crlf
|
|
21
|
+
*.cmd text eol=crlf
|
|
22
|
+
|
|
23
|
+
# Binary assets — never normalize.
|
|
24
|
+
*.png binary
|
|
25
|
+
*.jpg binary
|
|
26
|
+
*.jpeg binary
|
|
27
|
+
*.gif binary
|
|
28
|
+
*.ico binary
|
|
29
|
+
*.svg text
|
|
30
|
+
*.woff binary
|
|
31
|
+
*.woff2 binary
|
|
32
|
+
*.ttf binary
|
|
33
|
+
*.eot binary
|
|
34
|
+
*.pdf binary
|
|
@@ -33,6 +33,8 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
33
33
|
- Use `computed()` for derived state
|
|
34
34
|
- Keep state transformations pure and predictable
|
|
35
35
|
- Do NOT use `mutate` on signals, use `update` or `set` instead
|
|
36
|
+
- Capture signal values into locals BEFORE `await`; reads after an async boundary are not tracked (reactive context is synchronous only)
|
|
37
|
+
- `effect()` is for side effects only (logging, third-party sync via `afterNextRender`); never copy signal→signal in an effect — use `computed()` or `linkedSignal()`
|
|
36
38
|
|
|
37
39
|
## Templates
|
|
38
40
|
|
|
@@ -45,3 +47,7 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
45
47
|
- Design services around a single responsibility
|
|
46
48
|
- Use the `providedIn: 'root'` option for singleton services
|
|
47
49
|
- Use the `inject()` function instead of constructor injection
|
|
50
|
+
|
|
51
|
+
## Security
|
|
52
|
+
|
|
53
|
+
- Never use `bypassSecurityTrust*` APIs or bind untrusted data to `[innerHTML]`; Angular's built-in sanitization is the only safe path
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Frontend
|
|
2
|
+
|
|
3
|
+
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.3.
|
|
4
|
+
|
|
5
|
+
## Development server
|
|
6
|
+
|
|
7
|
+
To start a local development server, run:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ng serve
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
|
|
14
|
+
|
|
15
|
+
## Code scaffolding
|
|
16
|
+
|
|
17
|
+
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
ng generate component component-name
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
ng generate --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Building
|
|
30
|
+
|
|
31
|
+
To build the project run:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
ng build
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
|
|
38
|
+
|
|
39
|
+
## Running unit tests
|
|
40
|
+
|
|
41
|
+
To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
ng test
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Running end-to-end tests
|
|
48
|
+
|
|
49
|
+
For end-to-end (e2e) testing, run:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
ng e2e
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
|
|
56
|
+
|
|
57
|
+
## Router features
|
|
58
|
+
|
|
59
|
+
The scaffold enables two `provideRouter` features in `app.config.ts`:
|
|
60
|
+
|
|
61
|
+
| Feature | What it does |
|
|
62
|
+
|---|---|
|
|
63
|
+
| **`withComponentInputBinding()`** | Binds route parameters, query params, and data directly to signal `input()` properties on routed components — no `ActivatedRoute` injection needed. |
|
|
64
|
+
| **`withViewTransitions()`** | Wraps route navigations in the [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API), producing smooth cross-page animations in supporting browsers (gracefully no-ops in others). |
|
|
65
|
+
|
|
66
|
+
### Using `withComponentInputBinding`
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// In a routed component — no ActivatedRoute needed
|
|
70
|
+
export class ItemDetailComponent {
|
|
71
|
+
readonly id = input<string>(); // bound from :id route param automatically
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Using `withViewTransitions`
|
|
76
|
+
|
|
77
|
+
Navigations automatically use the browser's default cross-fade. To customise the transition, add CSS `view-transition-name` rules and a `@keyframes` block for `::view-transition-*` pseudo-elements.
|
|
78
|
+
|
|
79
|
+
## Production security hardening — CSP nonces
|
|
80
|
+
|
|
81
|
+
The scaffold ships a `Content-Security-Policy: default-src 'self'` baseline from nginx. For production, tighten the policy with per-request nonces so inline scripts injected by third-party libraries are blocked unless they carry the server-issued nonce.
|
|
82
|
+
|
|
83
|
+
### Options
|
|
84
|
+
|
|
85
|
+
| Approach | Where to configure |
|
|
86
|
+
|---|---|
|
|
87
|
+
| **`autoCsp: true`** in `angular.json` build options | Instructs the Angular build to inject `ngCspNonce` meta tags automatically during SSR/server rendering. |
|
|
88
|
+
| **`ngCspNonce` attribute** on the `<app-root>` element | Pass a unique, unpredictable nonce per request from your server template into the bootstrap token `CSP_NONCE`. Angular reads this token and stamps it on all inline styles/scripts it generates. |
|
|
89
|
+
| **`CSP_NONCE` injection token** | Provide the token in `app.config.ts`: `{ provide: CSP_NONCE, useValue: getRequestNonce() }`. Angular uses it for runtime-generated inline elements. |
|
|
90
|
+
|
|
91
|
+
### Rules
|
|
92
|
+
|
|
93
|
+
- Nonces **must be unique and unpredictable per HTTP response** — a static nonce is equivalent to no nonce.
|
|
94
|
+
- Generate nonces server-side (e.g. `secrets.token_hex(16)`) and pass them in both the `Content-Security-Policy` header and the HTML template.
|
|
95
|
+
- Update the nginx `add_header Content-Security-Policy` line to include `'nonce-<VALUE>'` in `script-src` and `style-src`.
|
|
96
|
+
|
|
97
|
+
Reference: [angular.dev/best-practices/security](https://angular.dev/best-practices/security)
|
|
98
|
+
|
|
99
|
+
## Additional Resources
|
|
100
|
+
|
|
101
|
+
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"type": "anyComponentStyle",
|
|
45
|
-
"maximumWarning": "
|
|
46
|
-
"maximumError": "
|
|
45
|
+
"maximumWarning": "2kB",
|
|
46
|
+
"maximumError": "4kB"
|
|
47
47
|
}
|
|
48
48
|
],
|
|
49
49
|
"outputHashing": "all"
|
|
@@ -72,9 +72,13 @@
|
|
|
72
72
|
"builder": "@angular/build:extract-i18n"
|
|
73
73
|
},
|
|
74
74
|
"test": {
|
|
75
|
-
"builder": "@angular/build:
|
|
75
|
+
"builder": "@angular/build:unit-test",
|
|
76
76
|
"options": {
|
|
77
77
|
"tsConfig": "tsconfig.spec.json",
|
|
78
|
+
"providersFile": "src/test-providers.ts",
|
|
79
|
+
"include": [
|
|
80
|
+
"src/**/*.spec.ts"
|
|
81
|
+
],
|
|
78
82
|
"assets": [
|
|
79
83
|
{
|
|
80
84
|
"glob": "**/*",
|
|
@@ -4,6 +4,9 @@ server {
|
|
|
4
4
|
root /usr/share/nginx/html;
|
|
5
5
|
index index.html;
|
|
6
6
|
|
|
7
|
+
# Content Security Policy baseline — tighten for production (add nonces; see README)
|
|
8
|
+
add_header Content-Security-Policy "default-src 'self'" always;
|
|
9
|
+
|
|
7
10
|
# Gzip compression
|
|
8
11
|
gzip on;
|
|
9
12
|
gzip_vary on;
|
|
@@ -37,14 +37,9 @@
|
|
|
37
37
|
"@angular/cli": "^21.1.0",
|
|
38
38
|
"@angular/compiler-cli": "^21.1.0",
|
|
39
39
|
"@tailwindcss/postcss": "^4.1.18",
|
|
40
|
-
"
|
|
41
|
-
"jasmine-core": "~5.9.0",
|
|
42
|
-
"karma": "~6.4.0",
|
|
43
|
-
"karma-chrome-launcher": "~3.2.0",
|
|
44
|
-
"karma-coverage": "~2.2.0",
|
|
45
|
-
"karma-jasmine": "~5.1.0",
|
|
46
|
-
"karma-jasmine-html-reporter": "~2.1.0",
|
|
40
|
+
"jsdom": "^26.1.0",
|
|
47
41
|
"tailwindcss": "^4.1.18",
|
|
48
|
-
"typescript": "~5.9.2"
|
|
42
|
+
"typescript": "~5.9.2",
|
|
43
|
+
"vitest": "^3.2.0"
|
|
49
44
|
}
|
|
50
45
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
|
|
2
|
+
import { provideRouter, withComponentInputBinding, withViewTransitions } from '@angular/router';
|
|
3
|
+
import { provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
|
|
4
|
+
import { LucideIconConfig } from 'lucide-angular';
|
|
5
|
+
|
|
6
|
+
import { routes } from './app.routes';
|
|
7
|
+
import { ICON_PROVIDER } from './icons';
|
|
8
|
+
import { errorInterceptor } from './interceptors/error.interceptor';
|
|
9
|
+
|
|
10
|
+
export const appConfig: ApplicationConfig = {
|
|
11
|
+
providers: [
|
|
12
|
+
provideBrowserGlobalErrorListeners(),
|
|
13
|
+
provideRouter(routes, withComponentInputBinding(), withViewTransitions()),
|
|
14
|
+
provideHttpClient(withFetch(), withInterceptors([errorInterceptor])),
|
|
15
|
+
ICON_PROVIDER,
|
|
16
|
+
{
|
|
17
|
+
provide: LucideIconConfig,
|
|
18
|
+
useFactory: () => {
|
|
19
|
+
const cfg = new LucideIconConfig();
|
|
20
|
+
cfg.size = 16;
|
|
21
|
+
cfg.strokeWidth = 1.5;
|
|
22
|
+
return cfg;
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
]
|
|
26
|
+
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { provideZonelessChangeDetection } from '@angular/core';
|
|
2
1
|
import { TestBed } from '@angular/core/testing';
|
|
3
2
|
import { App } from './app';
|
|
4
3
|
|
|
@@ -6,7 +5,6 @@ describe('App', () => {
|
|
|
6
5
|
beforeEach(async () => {
|
|
7
6
|
await TestBed.configureTestingModule({
|
|
8
7
|
imports: [App],
|
|
9
|
-
providers: [provideZonelessChangeDetection()]
|
|
10
8
|
}).compileComponents();
|
|
11
9
|
});
|
|
12
10
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import {
|
|
3
|
+
HttpClient,
|
|
4
|
+
HttpErrorResponse,
|
|
5
|
+
provideHttpClient,
|
|
6
|
+
withFetch,
|
|
7
|
+
withInterceptors,
|
|
8
|
+
} from '@angular/common/http';
|
|
9
|
+
import {
|
|
10
|
+
HttpTestingController,
|
|
11
|
+
provideHttpClientTesting,
|
|
12
|
+
} from '@angular/common/http/testing';
|
|
13
|
+
import { firstValueFrom } from 'rxjs';
|
|
14
|
+
|
|
15
|
+
import { errorInterceptor } from './error.interceptor';
|
|
16
|
+
|
|
17
|
+
describe('errorInterceptor', () => {
|
|
18
|
+
let http: HttpClient;
|
|
19
|
+
let controller: HttpTestingController;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
TestBed.configureTestingModule({
|
|
23
|
+
providers: [
|
|
24
|
+
provideHttpClient(withFetch(), withInterceptors([errorInterceptor])),
|
|
25
|
+
provideHttpClientTesting(),
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
http = TestBed.inject(HttpClient);
|
|
29
|
+
controller = TestBed.inject(HttpTestingController);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
afterEach(() => controller.verify());
|
|
33
|
+
|
|
34
|
+
it('when a request fails, the error is rethrown to the caller', async () => {
|
|
35
|
+
let caughtError: HttpErrorResponse | undefined;
|
|
36
|
+
|
|
37
|
+
const request$ = firstValueFrom(
|
|
38
|
+
http.get('/api/test').pipe(
|
|
39
|
+
// swallow for the assertion — we only care that the error propagates
|
|
40
|
+
),
|
|
41
|
+
).catch((err: HttpErrorResponse) => {
|
|
42
|
+
caughtError = err;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
controller.expectOne('/api/test').flush('Server error', {
|
|
46
|
+
status: 500,
|
|
47
|
+
statusText: 'Internal Server Error',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await request$;
|
|
51
|
+
|
|
52
|
+
expect(caughtError).toBeInstanceOf(HttpErrorResponse);
|
|
53
|
+
expect(caughtError!.status).toBe(500);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('when a request fails, the interceptor does not swallow the error', async () => {
|
|
57
|
+
let resolved = false;
|
|
58
|
+
let rejected = false;
|
|
59
|
+
|
|
60
|
+
firstValueFrom(http.get('/api/test')).then(
|
|
61
|
+
() => { resolved = true; },
|
|
62
|
+
() => { rejected = true; },
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
controller.expectOne('/api/test').flush('Not Found', {
|
|
66
|
+
status: 404,
|
|
67
|
+
statusText: 'Not Found',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await TestBed.inject(Promise as never, { optional: true });
|
|
71
|
+
// allow microtask queue to drain
|
|
72
|
+
await new Promise<void>((r) => setTimeout(r, 0));
|
|
73
|
+
|
|
74
|
+
expect(resolved).toBe(false);
|
|
75
|
+
expect(rejected).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ErrorHandler, inject } from '@angular/core';
|
|
2
|
+
import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';
|
|
3
|
+
import { catchError, throwError } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
export const errorInterceptor: HttpInterceptorFn = (req, next) => {
|
|
6
|
+
const errorHandler = inject(ErrorHandler);
|
|
7
|
+
|
|
8
|
+
return next(req).pipe(
|
|
9
|
+
catchError((err: HttpErrorResponse) => {
|
|
10
|
+
errorHandler.handleError(err);
|
|
11
|
+
return throwError(() => err);
|
|
12
|
+
}),
|
|
13
|
+
);
|
|
14
|
+
};
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
ChangeDetectionStrategy,
|
|
9
9
|
} from '@angular/core';
|
|
10
10
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
|
-
import { ChatService } from '../../services/chat
|
|
12
|
-
import { ChatMessage } from '../../models/chat
|
|
11
|
+
import { ChatService } from '../../services/chat';
|
|
12
|
+
import { ChatMessage } from '../../models/chat';
|
|
13
13
|
|
|
14
14
|
@Component({
|
|
15
15
|
selector: 'app-chatbot',
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { provideZonelessChangeDetection } from '@angular/core';
|
|
2
1
|
import { TestBed } from '@angular/core/testing';
|
|
3
2
|
import { LucideIconConfig } from 'lucide-angular';
|
|
4
3
|
|
|
@@ -10,7 +9,6 @@ describe('DashboardComponent', () => {
|
|
|
10
9
|
await TestBed.configureTestingModule({
|
|
11
10
|
imports: [DashboardComponent],
|
|
12
11
|
providers: [
|
|
13
|
-
provideZonelessChangeDetection(),
|
|
14
12
|
ICON_PROVIDER,
|
|
15
13
|
{
|
|
16
14
|
provide: LucideIconConfig,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { provideZonelessChangeDetection } from '@angular/core';
|
|
2
1
|
import { TestBed } from '@angular/core/testing';
|
|
3
2
|
import { LucideIconConfig } from 'lucide-angular';
|
|
4
3
|
|
|
@@ -10,7 +9,6 @@ describe('HomeComponent', () => {
|
|
|
10
9
|
await TestBed.configureTestingModule({
|
|
11
10
|
imports: [HomeComponent],
|
|
12
11
|
providers: [
|
|
13
|
-
provideZonelessChangeDetection(),
|
|
14
12
|
ICON_PROVIDER,
|
|
15
13
|
{
|
|
16
14
|
provide: LucideIconConfig,
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { signal } from '@angular/core';
|
|
2
2
|
import { TestBed } from '@angular/core/testing';
|
|
3
|
+
import { vi } from 'vitest';
|
|
3
4
|
import { LucideIconConfig } from 'lucide-angular';
|
|
4
5
|
|
|
5
6
|
import { ICON_PROVIDER } from '../../icons';
|
|
6
|
-
import { ThemeService } from '../../services/theme
|
|
7
|
+
import { ThemeService } from '../../services/theme';
|
|
7
8
|
import { SettingsComponent } from './settings';
|
|
8
9
|
|
|
9
10
|
describe('SettingsComponent', () => {
|
|
10
|
-
let themeSpy:
|
|
11
|
+
let themeSpy: { setTheme: ReturnType<typeof vi.fn>; theme: ReturnType<typeof signal> };
|
|
11
12
|
|
|
12
13
|
beforeEach(async () => {
|
|
13
|
-
themeSpy =
|
|
14
|
+
themeSpy = {
|
|
15
|
+
setTheme: vi.fn(),
|
|
14
16
|
theme: signal('system'),
|
|
15
|
-
}
|
|
17
|
+
};
|
|
16
18
|
|
|
17
19
|
await TestBed.configureTestingModule({
|
|
18
20
|
imports: [SettingsComponent],
|
|
19
21
|
providers: [
|
|
20
|
-
provideZonelessChangeDetection(),
|
|
21
22
|
ICON_PROVIDER,
|
|
22
23
|
{ provide: ThemeService, useValue: themeSpy },
|
|
23
24
|
{
|
|
@@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
|
2
2
|
import { LucideAngularModule } from 'lucide-angular';
|
|
3
3
|
|
|
4
4
|
import { IconName } from '../../icons';
|
|
5
|
-
import { ThemeMode, ThemeService } from '../../services/theme
|
|
5
|
+
import { ThemeMode, ThemeService } from '../../services/theme';
|
|
6
6
|
|
|
7
7
|
interface ThemeOption {
|
|
8
8
|
mode: ThemeMode;
|
|
@@ -2,7 +2,7 @@ import { Injectable, inject } from '@angular/core';
|
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import { environment } from '../../environments/environment';
|
|
5
|
-
import { ChatRequest, ChatResponse } from '../models/chat
|
|
5
|
+
import { ChatRequest, ChatResponse } from '../models/chat';
|
|
6
6
|
|
|
7
7
|
@Injectable({
|
|
8
8
|
providedIn: 'root',
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { provideZonelessChangeDetection } from '@angular/core';
|
|
2
1
|
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { vi } from 'vitest';
|
|
3
3
|
|
|
4
|
-
import { ThemeService } from './theme
|
|
4
|
+
import { ThemeService } from './theme';
|
|
5
5
|
|
|
6
6
|
const STORAGE_KEY = 'app-theme';
|
|
7
7
|
|
|
8
8
|
describe('ThemeService', () => {
|
|
9
9
|
let matchMediaMock: {
|
|
10
10
|
matches: boolean;
|
|
11
|
-
addEventListener:
|
|
12
|
-
removeEventListener:
|
|
11
|
+
addEventListener: ReturnType<typeof vi.fn>;
|
|
12
|
+
removeEventListener: ReturnType<typeof vi.fn>;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
function setupMatchMedia(prefersDark: boolean): void {
|
|
16
16
|
matchMediaMock = {
|
|
17
17
|
matches: prefersDark,
|
|
18
|
-
addEventListener:
|
|
19
|
-
removeEventListener:
|
|
18
|
+
addEventListener: vi.fn(),
|
|
19
|
+
removeEventListener: vi.fn(),
|
|
20
20
|
};
|
|
21
|
-
spyOn(window, 'matchMedia').
|
|
21
|
+
vi.spyOn(window, 'matchMedia').mockReturnValue(matchMediaMock as unknown as MediaQueryList);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function createService(): ThemeService {
|
|
25
|
-
TestBed.configureTestingModule({
|
|
25
|
+
TestBed.configureTestingModule({});
|
|
26
26
|
return TestBed.inject(ThemeService);
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -94,7 +94,7 @@ describe('ThemeService', () => {
|
|
|
94
94
|
it('when setTheme is called, the choice is written to localStorage', () => {
|
|
95
95
|
setupMatchMedia(false);
|
|
96
96
|
const service = createService();
|
|
97
|
-
const setItem = spyOn(localStorage, 'setItem');
|
|
97
|
+
const setItem = vi.spyOn(localStorage, 'setItem');
|
|
98
98
|
service.setTheme('dark');
|
|
99
99
|
expect(setItem).toHaveBeenCalledWith(STORAGE_KEY, 'dark');
|
|
100
100
|
});
|
|
@@ -122,7 +122,7 @@ describe('ThemeService', () => {
|
|
|
122
122
|
it('when the service initializes, a matchMedia change listener is registered', () => {
|
|
123
123
|
setupMatchMedia(false);
|
|
124
124
|
createService();
|
|
125
|
-
expect(matchMediaMock.addEventListener).toHaveBeenCalledWith('change',
|
|
125
|
+
expect(matchMediaMock.addEventListener).toHaveBeenCalledWith('change', expect.any(Function));
|
|
126
126
|
});
|
|
127
127
|
});
|
|
128
128
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
@for (tab of tabs; track tab.route) {
|
|
5
5
|
<a [routerLink]="tab.route"
|
|
6
6
|
routerLinkActive="text-primary"
|
|
7
|
+
ariaCurrentWhenActive="page"
|
|
7
8
|
[routerLinkActiveOptions]="{ exact: tab.route === '/home' }"
|
|
8
9
|
[attr.aria-label]="tab.name"
|
|
9
10
|
class="flex flex-1 flex-col items-center justify-center gap-0.5 text-text-secondary transition-colors">
|