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.
Files changed (411) hide show
  1. {project_initializer-0.3.1 → project_initializer-0.3.2}/MANIFEST.in +8 -0
  2. {project_initializer-0.3.1/project_initializer.egg-info → project_initializer-0.3.2}/PKG-INFO +3 -1
  3. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/__init__.py +1 -1
  4. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/cli.py +9 -2
  5. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/env_generator.py +11 -2
  6. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/file_transforms.py +2 -0
  7. project_initializer-0.3.2/project_initializer/templates/.gitattributes +34 -0
  8. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.claude/CLAUDE.md +6 -0
  9. project_initializer-0.3.2/project_initializer/templates/frontend/README.md +101 -0
  10. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/angular.json +7 -3
  11. {project_initializer-0.3.1/project_initializer/templates-api-fastapi → project_initializer-0.3.2/project_initializer/templates}/frontend/nginx.conf +3 -0
  12. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package.json +3 -8
  13. project_initializer-0.3.2/project_initializer/templates/frontend/src/app/app.config.ts +26 -0
  14. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.spec.ts +0 -2
  15. project_initializer-0.3.2/project_initializer/templates/frontend/src/app/interceptors/error.interceptor.spec.ts +77 -0
  16. project_initializer-0.3.2/project_initializer/templates/frontend/src/app/interceptors/error.interceptor.ts +14 -0
  17. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.ts +2 -2
  18. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.spec.ts +0 -2
  19. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.spec.ts +0 -2
  20. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.spec.ts +7 -6
  21. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.ts +1 -1
  22. 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
  23. 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
  24. {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
  25. {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
  26. {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
  27. project_initializer-0.3.2/project_initializer/templates/frontend/src/app/shared/layout/layout.css +18 -0
  28. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.spec.ts +41 -3
  29. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.ts +13 -1
  30. {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
  31. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.spec.ts +7 -6
  32. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.ts +2 -2
  33. {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
  34. project_initializer-0.3.2/project_initializer/templates/frontend/src/test-providers.ts +3 -0
  35. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.spec.json +3 -2
  36. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/Dockerfile +3 -2
  37. {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
  38. {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
  39. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/__init__.py +1 -1
  40. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/chatbot.py +9 -12
  41. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/test.py +3 -8
  42. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/config.py +7 -10
  43. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/database.py +1 -1
  44. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/dependencies.py +29 -24
  45. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/exceptions.py +1 -1
  46. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/main.py +20 -5
  47. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/logging.py +37 -27
  48. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/rate_limiting.py +24 -22
  49. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/security.py +10 -18
  50. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/base.py +7 -2
  51. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/base.py +1 -1
  52. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/__init__.py +7 -0
  53. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/chatbot.py +15 -22
  54. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/user.py +3 -1
  55. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/chatbot_service.py +3 -10
  56. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/conftest.py +2 -3
  57. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_items_auth.py +8 -2
  58. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_items_router.py +3 -3
  59. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_test_routes.py +5 -2
  60. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_users_me.py +3 -1
  61. {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
  62. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/.claude/CLAUDE.md +232 -0
  63. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.env.example +11 -2
  64. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.gitignore +3 -0
  65. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/Dockerfile +7 -5
  66. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/README.md +2 -2
  67. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/package-lock.json +12314 -0
  68. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/package.json +23 -0
  69. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/app.module.spec.ts +99 -0
  70. {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
  71. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/env.validation.spec.ts +60 -0
  72. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/env.validation.ts +25 -0
  73. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/config/logger.config.ts +26 -0
  74. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/main.ts +5 -10
  75. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.controller.ts +2 -0
  76. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/auth/dto/user.dto.ts +22 -0
  77. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat-job.service.spec.ts +115 -0
  78. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat-job.service.ts +23 -0
  79. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat.processor.spec.ts +84 -0
  80. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chat.processor.ts +20 -0
  81. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.controller.spec.ts +72 -0
  82. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.controller.ts +30 -3
  83. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.module.ts +23 -0
  84. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.service.spec.ts +69 -0
  85. {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
  86. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.spec.ts +73 -0
  87. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.ts +53 -0
  88. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/health/health.module.ts +2 -0
  89. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/monitoring/monitoring.module.spec.ts +70 -0
  90. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/monitoring/monitoring.module.ts +34 -0
  91. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/serialization.spec.ts +43 -0
  92. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/test.controller.spec.ts +84 -0
  93. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.controller.ts +7 -0
  94. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/src/modules/test/test.service.spec.ts +99 -0
  95. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/test/app.e2e-spec.ts +81 -0
  96. project_initializer-0.3.2/project_initializer/templates-api-nestjs/api/test/jest-e2e.json +16 -0
  97. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/docker-compose.yml +24 -1
  98. {project_initializer-0.3.1/project_initializer/templates → project_initializer-0.3.2/project_initializer/templates-api-nestjs}/frontend/nginx.conf +3 -0
  99. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/app/database_async.py +8 -1
  100. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/tests/unit/test_async_db.py +4 -4
  101. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/config.py +18 -27
  102. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/dependencies.py +10 -2
  103. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/models/user.py +7 -13
  104. project_initializer-0.3.2/project_initializer/templates-supabase-frontend/frontend/src/app/app.config.ts +15 -0
  105. {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
  106. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.ts +1 -1
  107. {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
  108. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
  109. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
  110. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/shared/sidebar/sidebar.html +1 -1
  111. {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
  112. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/.env.example +14 -4
  113. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/package-lock.json +12408 -0
  114. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/package.json +33 -0
  115. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/app.module.spec.ts +79 -0
  116. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/app.module.ts +84 -0
  117. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/config/env.validation.spec.ts +81 -0
  118. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/config/env.validation.ts +28 -0
  119. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.controller.ts +3 -3
  120. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.guard.spec.ts +82 -0
  121. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/test/app.e2e-spec.ts +115 -0
  122. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/test/jest-e2e.json +16 -0
  123. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/api/tsconfig.json +33 -0
  124. project_initializer-0.3.2/project_initializer/templates-supabase-nestjs/docker-compose.yml +59 -0
  125. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/api/v1/auth.py +10 -3
  126. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/config.py +20 -23
  127. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/dependencies.py +17 -5
  128. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/integration/test_auth.py +6 -2
  129. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/integration/test_jwt_auth.py +11 -3
  130. project_initializer-0.3.2/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +15 -0
  131. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.ts +1 -1
  132. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/guards/auth.guard.ts +1 -1
  133. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/interceptors/auth.interceptor.ts +1 -1
  134. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/shared/sidebar/sidebar.html +1 -1
  135. {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
  136. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/.env.example +5 -2
  137. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/package-lock.json +6 -0
  138. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/app.module.spec.ts +66 -0
  139. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/app.module.ts +84 -0
  140. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/config/env.validation.spec.ts +62 -0
  141. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/config/env.validation.ts +26 -0
  142. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.controller.ts +2 -0
  143. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.guard.spec.ts +75 -0
  144. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/test/app.e2e-spec.ts +111 -0
  145. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/test/jest-e2e.json +16 -0
  146. project_initializer-0.3.2/project_initializer/templates-token-nestjs/api/tsconfig.json +33 -0
  147. {project_initializer-0.3.1 → project_initializer-0.3.2/project_initializer.egg-info}/PKG-INFO +3 -1
  148. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/SOURCES.txt +62 -8
  149. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/requires.txt +2 -0
  150. {project_initializer-0.3.1 → project_initializer-0.3.2}/pyproject.toml +11 -1
  151. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_asyncdb_overlay.py +25 -1
  152. project_initializer-0.3.2/tests/test_entrypoint_line_endings.py +130 -0
  153. project_initializer-0.3.2/tests/test_env_generator_log_level.py +71 -0
  154. project_initializer-0.3.2/tests/test_issue5_nestjs_docker_healthcheck.py +196 -0
  155. project_initializer-0.3.2/tests/test_issue5_nestjs_global_criteria.py +240 -0
  156. project_initializer-0.3.2/tests/test_issue_003_zod_serialization.py +383 -0
  157. project_initializer-0.3.2/tests/test_issue_10_bull_board.py +292 -0
  158. project_initializer-0.3.2/tests/test_issue_12_chat_job_status.py +242 -0
  159. project_initializer-0.3.2/tests/test_issue_13_nestjs_production_readiness.py +274 -0
  160. project_initializer-0.3.2/tests/test_issue_14.py +315 -0
  161. project_initializer-0.3.2/tests/test_issue_15_app_filter_docs.py +224 -0
  162. project_initializer-0.3.2/tests/test_issue_2_nestjs_guard_wiring.py +463 -0
  163. project_initializer-0.3.2/tests/test_issue_6_nestjs_hardening.py +301 -0
  164. project_initializer-0.3.2/tests/test_issue_9_nestjs_acceptance.py +277 -0
  165. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_nestjs_build_config.py +16 -4
  166. project_initializer-0.3.2/tests/test_nestjs_issue8_acceptance.py +314 -0
  167. project_initializer-0.3.2/tests/test_nestjs_redis_bullmq.py +244 -0
  168. project_initializer-0.3.1/project_initializer/templates/frontend/README.md +0 -59
  169. project_initializer-0.3.1/project_initializer/templates/frontend/src/app/app.config.ts +0 -26
  170. project_initializer-0.3.1/project_initializer/templates/frontend/src/app/shared/layout/layout.css +0 -1
  171. project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/.claude/CLAUDE.md +0 -87
  172. project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/app.module.ts +0 -56
  173. project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/common/middleware/logging.middleware.ts +0 -23
  174. project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.module.ts +0 -9
  175. project_initializer-0.3.1/project_initializer/templates-api-nestjs/api/src/modules/health/health.controller.ts +0 -21
  176. project_initializer-0.3.1/project_initializer/templates-supabase-frontend/frontend/src/app/app.config.ts +0 -15
  177. project_initializer-0.3.1/project_initializer/templates-supabase-nestjs/api/src/app.module.ts +0 -61
  178. project_initializer-0.3.1/project_initializer/templates-supabase-nestjs/docker-compose.yml +0 -34
  179. project_initializer-0.3.1/project_initializer/templates-token-frontend/frontend/src/app/app.config.ts +0 -15
  180. {project_initializer-0.3.1 → project_initializer-0.3.2}/LICENSE +0 -0
  181. {project_initializer-0.3.1 → project_initializer-0.3.2}/README.md +0 -0
  182. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/py.typed +0 -0
  183. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.env.example +0 -0
  184. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.github/workflows/test-package.yml +0 -0
  185. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.gitignore +0 -0
  186. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/extensions.json +0 -0
  187. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/launch.json +0 -0
  188. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/settings.json +0 -0
  189. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/.vscode/tasks.json +0 -0
  190. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/CLAUDE.md +0 -0
  191. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/LICENSE +0 -0
  192. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/MANIFEST.in +0 -0
  193. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/README.md +0 -0
  194. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.angular/cache/21.1.1/frontend/.tsbuildinfo +0 -0
  195. {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
  196. {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
  197. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.editorconfig +0 -0
  198. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.gitignore +0 -0
  199. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.postcssrc.json +0 -0
  200. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/extensions.json +0 -0
  201. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/launch.json +0 -0
  202. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/.vscode/tasks.json +0 -0
  203. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/Dockerfile +0 -0
  204. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/package-lock.json +0 -0
  205. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/public/favicon.ico +0 -0
  206. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.css +0 -0
  207. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.html +0 -0
  208. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.routes.ts +0 -0
  209. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/app.ts +0 -0
  210. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/icons.spec.ts +0 -0
  211. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/icons.ts +0 -0
  212. /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
  213. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/chatbot/chatbot.html +0 -0
  214. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.html +0 -0
  215. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/dashboard/dashboard.ts +0 -0
  216. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.html +0 -0
  217. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/home/home.ts +0 -0
  218. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/pages/settings/settings.html +0 -0
  219. /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
  220. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/layout/layout.html +0 -0
  221. /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
  222. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.css +0 -0
  223. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/app/shared/sidebar/sidebar.html +0 -0
  224. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/assets/favicon.ico +0 -0
  225. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.model.ts +0 -0
  226. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.prod.ts +0 -0
  227. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/environments/environment.ts +0 -0
  228. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/index.html +0 -0
  229. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/main.ts +0 -0
  230. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/src/styles.css +0 -0
  231. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.app.json +0 -0
  232. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/frontend/tsconfig.json +0 -0
  233. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates/pyproject.toml +0 -0
  234. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/extensions.json +0 -0
  235. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/launch.json +0 -0
  236. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/settings.json +0 -0
  237. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/.vscode/tasks.json +0 -0
  238. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/CLAUDE.md +0 -0
  239. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/README.md +0 -0
  240. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.claude/CLAUDE.md +0 -0
  241. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.dockerignore +0 -0
  242. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/.env.example +0 -0
  243. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/README.md +0 -0
  244. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/README +0 -0
  245. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/env.py +0 -0
  246. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/script.py.mako +0 -0
  247. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic/versions/.gitkeep +0 -0
  248. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/alembic.ini +0 -0
  249. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/__init__.py +0 -0
  250. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/__init__.py +0 -0
  251. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/items.py +0 -0
  252. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/router.py +0 -0
  253. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/api/v1/users.py +0 -0
  254. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/core/__init__.py +0 -0
  255. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/middleware/__init__.py +0 -0
  256. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/__init__.py +0 -0
  257. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/item.py +0 -0
  258. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/models/user.py +0 -0
  259. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/__init__.py +0 -0
  260. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/repositories/item.py +0 -0
  261. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/schemas/item.py +0 -0
  262. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/__init__.py +0 -0
  263. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/services/item_service.py +0 -0
  264. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/utils/__init__.py +0 -0
  265. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/app/utils/audit.py +0 -0
  266. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/__init__.py +0 -0
  267. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/async_client.py +0 -0
  268. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/config.py +0 -0
  269. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/globals.py +0 -0
  270. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/inlinedbaml.py +0 -0
  271. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/parser.py +0 -0
  272. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/runtime.py +0 -0
  273. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/stream_types.py +0 -0
  274. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/sync_client.py +0 -0
  275. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/tracing.py +0 -0
  276. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_builder.py +0 -0
  277. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/type_map.py +0 -0
  278. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/types.py +0 -0
  279. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_client/watchers.py +0 -0
  280. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/chatbot.baml +0 -0
  281. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/clients.baml +0 -0
  282. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/baml_src/generators.baml +0 -0
  283. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/entrypoint.sh +0 -0
  284. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/pytest.ini +0 -0
  285. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/requirements.txt +0 -0
  286. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/scripts/__init__.py +0 -0
  287. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/__init__.py +0 -0
  288. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/__init__.py +0 -0
  289. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/test_app_boot.py +0 -0
  290. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/e2e/test_openapi_metadata.py +0 -0
  291. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/__init__.py +0 -0
  292. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/integration/test_health.py +0 -0
  293. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/__init__.py +0 -0
  294. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_item_model.py +0 -0
  295. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_item_service.py +0 -0
  296. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_schemas.py +0 -0
  297. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/api/tests/unit/test_user_schemas.py +0 -0
  298. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-fastapi/docker-compose.yml +0 -0
  299. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/extensions.json +0 -0
  300. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/launch.json +0 -0
  301. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/settings.json +0 -0
  302. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/.vscode/tasks.json +0 -0
  303. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/CLAUDE.md +0 -0
  304. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/README.md +0 -0
  305. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/.dockerignore +0 -0
  306. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_client.ts +0 -0
  307. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/async_request.ts +0 -0
  308. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/config.ts +0 -0
  309. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/globals.ts +0 -0
  310. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/index.ts +0 -0
  311. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/inlinedbaml.ts +0 -0
  312. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/parser.ts +0 -0
  313. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/partial_types.ts +0 -0
  314. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_client.ts +0 -0
  315. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/sync_request.ts +0 -0
  316. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/tracing.ts +0 -0
  317. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/type_builder.ts +0 -0
  318. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/types.ts +0 -0
  319. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_client/watchers.ts +0 -0
  320. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/chatbot.baml +0 -0
  321. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/clients.baml +0 -0
  322. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/baml_src/generators.baml +0 -0
  323. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/entrypoint.sh +0 -0
  324. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/nest-cli.json +0 -0
  325. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/migrations/.gitkeep +0 -0
  326. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma/schema.prisma +0 -0
  327. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/prisma.config.ts +0 -0
  328. {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
  329. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/decorators/public.decorator.ts +0 -0
  330. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/exceptions/api.exceptions.ts +0 -0
  331. {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
  332. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/filters/index.ts +0 -0
  333. {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
  334. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/common/interceptors/transform.interceptor.ts +0 -0
  335. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.module.ts +0 -0
  336. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/auth/auth.service.ts +0 -0
  337. {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
  338. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/chatbot/chatbot.service.ts +0 -0
  339. {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
  340. {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
  341. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.module.ts +0 -0
  342. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/modules/test/test.service.ts +0 -0
  343. {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
  344. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma-ssl.util.ts +0 -0
  345. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.module.ts +0 -0
  346. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/src/prisma/prisma.service.ts +0 -0
  347. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.build.json +0 -0
  348. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-api-nestjs/api/tsconfig.json +0 -0
  349. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-asyncdb-fastapi/api/app/repositories/base_async.py +0 -0
  350. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/README.md +0 -0
  351. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/.env.example +0 -0
  352. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/alembic/env.py +0 -0
  353. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/auth.py +0 -0
  354. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/api/v1/router.py +0 -0
  355. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/database.py +0 -0
  356. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/app/models/__init__.py +0 -0
  357. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/entrypoint.sh +0 -0
  358. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/requirements.txt +0 -0
  359. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/api/tests/integration/test_auth.py +0 -0
  360. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-fastapi/docker-compose.yml +0 -0
  361. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/package.json +0 -0
  362. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/app.routes.ts +0 -0
  363. {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
  364. {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
  365. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.css +0 -0
  366. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/app/auth/login/login.html +0 -0
  367. {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
  368. {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
  369. /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
  370. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.model.ts +0 -0
  371. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.prod.ts +0 -0
  372. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-frontend/frontend/src/environments/environment.ts +0 -0
  373. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/README.md +0 -0
  374. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/entrypoint.sh +0 -0
  375. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/prisma/schema.prisma +0 -0
  376. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
  377. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.module.ts +0 -0
  378. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-supabase-nestjs/api/src/modules/auth/auth.service.ts +0 -0
  379. {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
  380. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/.env.example +0 -0
  381. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/api/v1/router.py +0 -0
  382. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/app/core/security.py +0 -0
  383. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/__init__.py +0 -0
  384. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/test_jwt_dependencies.py +0 -0
  385. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-fastapi/api/tests/unit/test_security.py +0 -0
  386. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/app.routes.ts +0 -0
  387. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.css +0 -0
  388. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-frontend/frontend/src/app/auth/login/login.html +0 -0
  389. /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
  390. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.guard.ts +0 -0
  391. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.module.ts +0 -0
  392. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer/templates-token-nestjs/api/src/modules/auth/auth.service.ts +0 -0
  393. {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
  394. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/dependency_links.txt +0 -0
  395. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/entry_points.txt +0 -0
  396. {project_initializer-0.3.1 → project_initializer-0.3.2}/project_initializer.egg-info/top_level.txt +0 -0
  397. {project_initializer-0.3.1 → project_initializer-0.3.2}/setup.cfg +0 -0
  398. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_async_db_flag.py +0 -0
  399. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_ci_workflow_scope.py +0 -0
  400. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_cli_parser.py +0 -0
  401. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_cli_validation.py +0 -0
  402. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_scope.py +0 -0
  403. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_sync_async.py +0 -0
  404. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_token_validate.py +0 -0
  405. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_docs_tutorial_mapping.py +0 -0
  406. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_env_generator_jwt.py +0 -0
  407. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_file_transforms.py +0 -0
  408. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_integration_build.py +0 -0
  409. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_scope_routing.py +0 -0
  410. {project_initializer-0.3.1 → project_initializer-0.3.2}/tests/test_scope_scaffold.py +0 -0
  411. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: project-initializer
3
- Version: 0.3.1
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
@@ -1,3 +1,3 @@
1
1
  """Project Initializer - CLI tool to scaffold full-stack projects."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.3.2"
@@ -124,7 +124,9 @@ def select_layers(
124
124
  (api, frozenset(), _combine(reqs)),
125
125
  ]
126
126
  if auth:
127
- layers.append((get_auth_overlay_dir(auth, framework), frozenset(), _combine(reqs)))
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
- (get_auth_overlay_dir(auth, framework), frozenset(), _combine(compose, reqs))
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:
@@ -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', 'INFO')}")
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(f"OLLAMA_BASE_URL={val('OLLAMA_BASE_URL', 'http://localhost:11434/v1')}")
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)
@@ -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": "4kB",
46
- "maximumError": "8kB"
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:karma",
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
- "@types/jasmine": "~5.1.0",
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.service';
12
- import { ChatMessage } from '../../models/chat.model';
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 { provideZonelessChangeDetection, signal } from '@angular/core';
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.service';
7
+ import { ThemeService } from '../../services/theme';
7
8
  import { SettingsComponent } from './settings';
8
9
 
9
10
  describe('SettingsComponent', () => {
10
- let themeSpy: jasmine.SpyObj<Pick<ThemeService, 'setTheme'>> & { theme: ReturnType<typeof signal> };
11
+ let themeSpy: { setTheme: ReturnType<typeof vi.fn>; theme: ReturnType<typeof signal> };
11
12
 
12
13
  beforeEach(async () => {
13
- themeSpy = Object.assign(jasmine.createSpyObj('ThemeService', ['setTheme']), {
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.service';
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.model';
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.service';
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: jasmine.Spy;
12
- removeEventListener: jasmine.Spy;
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: jasmine.createSpy('addEventListener'),
19
- removeEventListener: jasmine.createSpy('removeEventListener'),
18
+ addEventListener: vi.fn(),
19
+ removeEventListener: vi.fn(),
20
20
  };
21
- spyOn(window, 'matchMedia').and.returnValue(matchMediaMock as unknown as MediaQueryList);
21
+ vi.spyOn(window, 'matchMedia').mockReturnValue(matchMediaMock as unknown as MediaQueryList);
22
22
  }
23
23
 
24
24
  function createService(): ThemeService {
25
- TestBed.configureTestingModule({ providers: [provideZonelessChangeDetection()] });
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', jasmine.any(Function));
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">