create-flutterinit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/bin/index.ts +3 -0
  2. package/package.json +46 -0
  3. package/templates/base/.cursor/rules/flutter-project.mdc.hbs +132 -0
  4. package/templates/base/AGENTS.md.hbs +137 -0
  5. package/templates/base/DESIGN.md.hbs +149 -0
  6. package/templates/base/README.md.hbs +19 -0
  7. package/templates/base/SETUP.md.hbs +253 -0
  8. package/templates/base/analysis_options.yaml +88 -0
  9. package/templates/base/assets/.keep +1 -0
  10. package/templates/base/assets/icons/apple.svg +1 -0
  11. package/templates/base/assets/icons/facebook.svg +1 -0
  12. package/templates/base/assets/icons/google.svg +1 -0
  13. package/templates/base/assets/images/.gitkeep +0 -0
  14. package/templates/base/flutter_native_splash.yaml.hbs +8 -0
  15. package/templates/base/lib/main.dart.hbs +43 -0
  16. package/templates/base/lib/src/app.dart.hbs +105 -0
  17. package/templates/base/lib/src/config/app_config.dart.hbs +112 -0
  18. package/templates/base/lib/src/extensions/collection_extension.dart.hbs +55 -0
  19. package/templates/base/lib/src/extensions/context_extension.dart.hbs +167 -0
  20. package/templates/base/lib/src/extensions/date_time_extension.dart.hbs +40 -0
  21. package/templates/base/lib/src/extensions/extensions.dart.hbs +6 -0
  22. package/templates/base/lib/src/extensions/num_extension.dart.hbs +14 -0
  23. package/templates/base/lib/src/extensions/string_extension.dart.hbs +91 -0
  24. package/templates/base/lib/src/extensions/widget_extension.dart.hbs +47 -0
  25. package/templates/base/lib/src/imports/core_imports.dart.hbs +50 -0
  26. package/templates/base/lib/src/imports/imports.dart.hbs +2 -0
  27. package/templates/base/lib/src/imports/packages_imports.dart.hbs +110 -0
  28. package/templates/base/lib/src/routing/(isGetX)@app_bindings.dart.hbs +23 -0
  29. package/templates/base/lib/src/routing/app_router.dart.hbs +252 -0
  30. package/templates/base/lib/src/routing/app_routes.dart.hbs +46 -0
  31. package/templates/base/lib/src/routing/global_navigator.dart.hbs +15 -0
  32. package/templates/base/lib/src/services/auth_service.dart.hbs +78 -0
  33. package/templates/base/lib/src/services/copy_service.dart.hbs +16 -0
  34. package/templates/base/lib/src/services/internet_connection_service.dart.hbs +10 -0
  35. package/templates/base/lib/src/services/services.dart.hbs +45 -0
  36. package/templates/base/lib/src/shared/app_assets.dart.hbs +15 -0
  37. package/templates/base/lib/src/shared/enums/app_status.dart.hbs +40 -0
  38. package/templates/base/lib/src/shared/enums/button_enums.dart.hbs +22 -0
  39. package/templates/base/lib/src/shared/enums/enums.dart.hbs +3 -0
  40. package/templates/base/lib/src/shared/enums/snack_bar_type.dart.hbs +22 -0
  41. package/templates/base/lib/src/shared/helpers/format_number.dart.hbs +18 -0
  42. package/templates/base/lib/src/shared/helpers/imports.dart.hbs +3 -0
  43. package/templates/base/lib/src/shared/helpers/show_app_sheet.dart.hbs +42 -0
  44. package/templates/base/lib/src/shared/helpers/show_dialog.dart.hbs +49 -0
  45. package/templates/base/lib/src/shared/helpers/show_toast.dart.hbs +92 -0
  46. package/templates/base/lib/src/shared/hooks/hooks.dart.hbs +13 -0
  47. package/templates/base/lib/src/shared/hooks/use_copy.dart.hbs +41 -0
  48. package/templates/base/lib/src/shared/hooks/use_timer.dart.hbs +158 -0
  49. package/templates/base/lib/src/shared/shared.dart.hbs +12 -0
  50. package/templates/base/lib/src/shared/widgets/app_button.dart.hbs +144 -0
  51. package/templates/base/lib/src/shared/widgets/app_card.dart.hbs +126 -0
  52. package/templates/base/lib/src/shared/widgets/app_divider.dart.hbs +88 -0
  53. package/templates/base/lib/src/shared/widgets/app_empty_state.dart.hbs +73 -0
  54. package/templates/base/lib/src/shared/widgets/app_error_widget.dart.hbs +69 -0
  55. package/templates/base/lib/src/shared/widgets/app_icon.dart.hbs +25 -0
  56. package/templates/base/lib/src/shared/widgets/app_loading.dart.hbs +54 -0
  57. package/templates/base/lib/src/shared/widgets/app_text_field.dart.hbs +89 -0
  58. package/templates/base/lib/src/shared/widgets/app_top_bar.dart.hbs +105 -0
  59. package/templates/base/lib/src/shared/widgets/common_image.dart.hbs +120 -0
  60. package/templates/base/lib/src/shared/widgets/toast/imports.dart.hbs +4 -0
  61. package/templates/base/lib/src/shared/widgets/toast/raw_toast.dart.hbs +109 -0
  62. package/templates/base/lib/src/shared/widgets/toast/toast.dart.hbs +142 -0
  63. package/templates/base/lib/src/shared/widgets/toast/toast_card.dart.hbs +57 -0
  64. package/templates/base/lib/src/shared/widgets/widgets.dart.hbs +14 -0
  65. package/templates/base/lib/src/shared/wrappers/(isRiverpod,isProvider,isBloc,isGetX,isMobX)@state_wrapper.dart.hbs +51 -0
  66. package/templates/base/lib/src/shared/wrappers/(supportsLocalization)@localization_wrapper.dart.hbs +25 -0
  67. package/templates/base/lib/src/shared/wrappers/(usesScreenutil)@screen_util_wrapper.dart.hbs +27 -0
  68. package/templates/base/lib/src/shared/wrappers/(usesSkeletonizer)@skeleton_wrapper.dart.hbs +81 -0
  69. package/templates/base/lib/src/shared/wrappers/session_listener_wrapper.dart.hbs +258 -0
  70. package/templates/base/lib/src/shared/wrappers/wrappers.dart.hbs +15 -0
  71. package/templates/base/lib/src/theme/app_borders.dart.hbs +70 -0
  72. package/templates/base/lib/src/theme/app_curves.dart.hbs +69 -0
  73. package/templates/base/lib/src/theme/app_durations.dart.hbs +48 -0
  74. package/templates/base/lib/src/theme/app_shadows.dart.hbs +73 -0
  75. package/templates/base/lib/src/theme/app_spacing.dart.hbs +80 -0
  76. package/templates/base/lib/src/theme/color_schemes.dart.hbs +126 -0
  77. package/templates/base/lib/src/theme/text_theme.dart.hbs +167 -0
  78. package/templates/base/lib/src/theme/theme.dart.hbs +431 -0
  79. package/templates/base/lib/src/theme/theme_constants.dart.hbs +20 -0
  80. package/templates/base/lib/src/utils/app_utils.dart.hbs +46 -0
  81. package/templates/base/lib/src/utils/debouncer.dart.hbs +31 -0
  82. package/templates/base/lib/src/utils/error_handler.dart.hbs +14 -0
  83. package/templates/base/lib/src/utils/failure.dart.hbs +30 -0
  84. package/templates/base/lib/src/utils/input_formatters.dart.hbs +27 -0
  85. package/templates/base/lib/src/utils/logger.dart.hbs +37 -0
  86. package/templates/base/lib/src/utils/platform_info.dart.hbs +13 -0
  87. package/templates/base/lib/src/utils/task_runner.dart.hbs +42 -0
  88. package/templates/base/lib/src/utils/typedefs.dart.hbs +6 -0
  89. package/templates/base/lib/src/utils/utils.dart.hbs +9 -0
  90. package/templates/base/pubspec.yaml.hbs +256 -0
  91. package/templates/base/test/widget_test.dart.hbs +56 -0
  92. package/templates/overlays/architecture/clean/architecture.md +6 -0
  93. package/templates/overlays/architecture/clean/lib/src/features/auth/data/models/user_model.dart.hbs +1 -0
  94. package/templates/overlays/architecture/clean/lib/src/features/auth/data/repositories/auth_repository_impl.dart.hbs +1 -0
  95. package/templates/overlays/architecture/clean/lib/src/features/auth/domain/entities/user.dart.hbs +1 -0
  96. package/templates/overlays/architecture/clean/lib/src/features/auth/domain/repositories/auth_repository.dart.hbs +1 -0
  97. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isBloc)@auth_bloc.dart.hbs +1 -0
  98. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isBloc)@session_bloc.dart.hbs +1 -0
  99. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isGetX)@auth_controller.dart.hbs +1 -0
  100. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isGetX)@session_controller.dart.hbs +1 -0
  101. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isMobX)@auth_store.dart.hbs +1 -0
  102. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isMobX)@session_store.dart.hbs +1 -0
  103. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isNoneState)@session_manager.dart.hbs +1 -0
  104. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isProvider,isRiverpod)@auth_provider.dart.hbs +1 -0
  105. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/providers/(isProvider,isRiverpod)@session_provider.dart.hbs +1 -0
  106. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/screens/forgot_password_screen.dart.hbs +1 -0
  107. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/screens/login_screen.dart.hbs +1 -0
  108. package/templates/overlays/architecture/clean/lib/src/features/auth/presentation/screens/signup_screen.dart.hbs +1 -0
  109. package/templates/overlays/architecture/clean/lib/src/features/home/presentation/screens/home_page.dart.hbs +1 -0
  110. package/templates/overlays/architecture/clean/lib/src/features/onboarding/presentation/screens/onboarding_page.dart.hbs +1 -0
  111. package/templates/overlays/architecture/feature-first/architecture.md +5 -0
  112. package/templates/overlays/architecture/feature-first/lib/src/features/auth/data/models/user_model.dart.hbs +1 -0
  113. package/templates/overlays/architecture/feature-first/lib/src/features/auth/data/repositories/auth_repository_impl.dart.hbs +1 -0
  114. package/templates/overlays/architecture/feature-first/lib/src/features/auth/domain/entities/user.dart.hbs +1 -0
  115. package/templates/overlays/architecture/feature-first/lib/src/features/auth/domain/repositories/auth_repository.dart.hbs +1 -0
  116. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isBloc)@auth_bloc.dart.hbs +1 -0
  117. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isBloc)@session_bloc.dart.hbs +1 -0
  118. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isGetX)@auth_controller.dart.hbs +1 -0
  119. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isGetX)@session_controller.dart.hbs +1 -0
  120. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isMobX)@auth_store.dart.hbs +1 -0
  121. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isMobX)@session_store.dart.hbs +1 -0
  122. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isNoneState)@session_manager.dart.hbs +1 -0
  123. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isProvider,isRiverpod)@auth_provider.dart.hbs +1 -0
  124. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/providers/(isProvider,isRiverpod)@session_provider.dart.hbs +1 -0
  125. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/screens/forgot_password_screen.dart.hbs +1 -0
  126. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/screens/login_screen.dart.hbs +1 -0
  127. package/templates/overlays/architecture/feature-first/lib/src/features/auth/presentation/screens/signup_screen.dart.hbs +1 -0
  128. package/templates/overlays/architecture/feature-first/lib/src/features/home/presentation/screens/home_page.dart.hbs +1 -0
  129. package/templates/overlays/architecture/feature-first/lib/src/features/onboarding/presentation/screens/onboarding_page.dart.hbs +1 -0
  130. package/templates/overlays/architecture/layer-first/architecture.md +6 -0
  131. package/templates/overlays/architecture/layer-first/lib/src/data/datasources/local/.gitkeep +0 -0
  132. package/templates/overlays/architecture/layer-first/lib/src/data/datasources/remote/.gitkeep +0 -0
  133. package/templates/overlays/architecture/layer-first/lib/src/data/models/user_model.dart.hbs +1 -0
  134. package/templates/overlays/architecture/layer-first/lib/src/data/repositories/auth_repository_impl.dart.hbs +1 -0
  135. package/templates/overlays/architecture/layer-first/lib/src/domain/entities/user.dart.hbs +1 -0
  136. package/templates/overlays/architecture/layer-first/lib/src/domain/repositories/auth_repository.dart.hbs +1 -0
  137. package/templates/overlays/architecture/layer-first/lib/src/domain/usecases/auth/.gitkeep +0 -0
  138. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isBloc)@auth_bloc.dart.hbs +1 -0
  139. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isBloc)@session_bloc.dart.hbs +1 -0
  140. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isGetX)@auth_controller.dart.hbs +1 -0
  141. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isGetX)@session_controller.dart.hbs +1 -0
  142. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isMobX)@auth_store.dart.hbs +1 -0
  143. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isMobX)@session_store.dart.hbs +1 -0
  144. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isNoneState)@auth_view_model.dart.hbs +1 -0
  145. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isNoneState)@session_manager.dart.hbs +1 -0
  146. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isProvider,isRiverpod)@auth_provider.dart.hbs +1 -0
  147. package/templates/overlays/architecture/layer-first/lib/src/presentation/providers/(isProvider,isRiverpod)@session_provider.dart.hbs +1 -0
  148. package/templates/overlays/architecture/layer-first/lib/src/presentation/screens/auth/forgot_password_screen.dart.hbs +1 -0
  149. package/templates/overlays/architecture/layer-first/lib/src/presentation/screens/auth/login_screen.dart.hbs +1 -0
  150. package/templates/overlays/architecture/layer-first/lib/src/presentation/screens/auth/signup_screen.dart.hbs +1 -0
  151. package/templates/overlays/architecture/layer-first/lib/src/presentation/screens/home/home_page.dart.hbs +1 -0
  152. package/templates/overlays/architecture/layer-first/lib/src/presentation/screens/onboarding/onboarding_page.dart.hbs +1 -0
  153. package/templates/overlays/architecture/layer-first/lib/src/presentation/widgets/.gitkeep +0 -0
  154. package/templates/overlays/architecture/mvc/architecture.md +5 -0
  155. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isBloc)@auth_bloc.dart.hbs +1 -0
  156. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isBloc)@session_bloc.dart.hbs +1 -0
  157. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isGetX)@auth_controller.dart.hbs +1 -0
  158. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isGetX)@session_controller.dart.hbs +1 -0
  159. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isMobX)@auth_store.dart.hbs +1 -0
  160. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isMobX)@session_store.dart.hbs +1 -0
  161. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isNoneState)@session_manager.dart.hbs +1 -0
  162. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isProvider,isRiverpod)@auth_provider.dart.hbs +1 -0
  163. package/templates/overlays/architecture/mvc/lib/src/controllers/auth/(isProvider,isRiverpod)@session_provider.dart.hbs +1 -0
  164. package/templates/overlays/architecture/mvc/lib/src/models/user_model.dart.hbs +1 -0
  165. package/templates/overlays/architecture/mvc/lib/src/services/auth_repository.dart.hbs +1 -0
  166. package/templates/overlays/architecture/mvc/lib/src/services/auth_repository_impl.dart.hbs +1 -0
  167. package/templates/overlays/architecture/mvc/lib/src/views/auth/forgot_password_screen.dart.hbs +1 -0
  168. package/templates/overlays/architecture/mvc/lib/src/views/auth/login_screen.dart.hbs +1 -0
  169. package/templates/overlays/architecture/mvc/lib/src/views/auth/signup_screen.dart.hbs +1 -0
  170. package/templates/overlays/architecture/mvc/lib/src/views/home/home_page.dart.hbs +1 -0
  171. package/templates/overlays/architecture/mvc/lib/src/views/onboarding/onboarding_page.dart.hbs +1 -0
  172. package/templates/overlays/architecture/mvvm/architecture.md +6 -0
  173. package/templates/overlays/architecture/mvvm/lib/src/data/models/user_model.dart.hbs +1 -0
  174. package/templates/overlays/architecture/mvvm/lib/src/data/repositories/auth_repository.dart.hbs +1 -0
  175. package/templates/overlays/architecture/mvvm/lib/src/data/repositories/auth_repository_impl.dart.hbs +1 -0
  176. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isBloc)@bloc/auth_bloc.dart.hbs +1 -0
  177. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isBloc)@bloc/session_bloc.dart.hbs +1 -0
  178. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isGetX)@controllers/auth_controller.dart.hbs +1 -0
  179. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isGetX)@controllers/session_controller.dart.hbs +1 -0
  180. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isMobX)@stores/auth_store.dart.hbs +1 -0
  181. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isMobX)@stores/session_store.dart.hbs +1 -0
  182. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isNoneState)@view_models/auth_view_model.dart.hbs +1 -0
  183. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isNoneState)@view_models/session_manager.dart.hbs +1 -0
  184. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isProvider,isRiverpod)@providers/auth_provider.dart.hbs +1 -0
  185. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/(isProvider,isRiverpod)@providers/session_provider.dart.hbs +1 -0
  186. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/forgot_password_screen.dart.hbs +1 -0
  187. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/login_screen.dart.hbs +1 -0
  188. package/templates/overlays/architecture/mvvm/lib/src/ui/auth/signup_screen.dart.hbs +1 -0
  189. package/templates/overlays/architecture/mvvm/lib/src/ui/home/home_page.dart.hbs +1 -0
  190. package/templates/overlays/architecture/mvvm/lib/src/ui/onboarding/onboarding_page.dart.hbs +1 -0
  191. package/templates/overlays/backend/appwrite/lib/src/services/(usesAppwriteAuth)@auth_service.dart.hbs +101 -0
  192. package/templates/overlays/backend/custom/lib/src/services/auth_service.dart.hbs +158 -0
  193. package/templates/overlays/backend/firebase/lib/src/services/(usesFirebaseAuth)@auth_service.dart.hbs +96 -0
  194. package/templates/overlays/backend/supabase/lib/src/services/(usesSupabaseAuth)@auth_service.dart.hbs +97 -0
  195. package/templates/overlays/device/app_version_update/lib/src/services/(usesAppVersionUpdate)@version_update_service.dart.hbs +118 -0
  196. package/templates/overlays/device/device_info/lib/src/services/(usesDeviceInfoPlus)@device_info_service.dart.hbs +54 -0
  197. package/templates/overlays/extras/dotenv/.env.hbs +33 -0
  198. package/templates/overlays/extras/flavors/lib/src/flavors.dart.hbs +15 -0
  199. package/templates/overlays/extras/localization/assets/translations/en.json.hbs +47 -0
  200. package/templates/overlays/media/lib/src/services/(usesImagePicker,usesFilePicker)@media_service.dart.hbs +148 -0
  201. package/templates/overlays/networking/cached_image/lib/src/shared/widgets/app_cached_image.dart.hbs +160 -0
  202. package/templates/overlays/networking/dio/lib/src/services/(usesDio)@dio_service.dart.hbs +50 -0
  203. package/templates/overlays/networking/http/lib/src/services/(usesHttp)@http_service.dart.hbs +82 -0
  204. package/templates/overlays/storage/hive/lib/src/services/(usesHive)@hive_service.dart.hbs +59 -0
  205. package/templates/overlays/storage/secure_storage/lib/src/services/(usesSecureStorage)@secure_storage_service.dart.hbs +39 -0
  206. package/templates/overlays/storage/shared_preferences/lib/src/services/(usesSharedPreferences)@storage_service.dart.hbs +53 -0
  207. package/templates/overlays/utilities/geolocator/lib/src/services/(usesGeolocator)@location_service.dart.hbs +78 -0
  208. package/templates/overlays/utilities/path_provider/lib/src/services/(usesPathProvider)@path_service.dart.hbs +30 -0
  209. package/templates/overlays/utilities/permission_handler/lib/src/services/(usesPermissionHandler)@permission_service.dart.hbs +28 -0
  210. package/templates/overlays/utilities/permission_handler/lib/src/shared/hooks/use_permission.dart.hbs +44 -0
  211. package/templates/overlays/utilities/share_plus/lib/src/services/(usesSharePlus)@share_service.dart.hbs +22 -0
  212. package/templates/overlays/utilities/share_plus/lib/src/shared/hooks/use_share.dart.hbs +26 -0
  213. package/templates/overlays/utilities/url_launcher/lib/src/services/(usesUrlLauncher)@url_launcher_service.dart.hbs +37 -0
  214. package/templates/overlays/utilities/url_launcher/lib/src/shared/hooks/use_launch_url.dart.hbs +52 -0
  215. package/templates/partials/features/auth/auth_logic.hbs +611 -0
  216. package/templates/partials/features/auth/auth_repository.hbs +32 -0
  217. package/templates/partials/features/auth/auth_repository_impl.hbs +116 -0
  218. package/templates/partials/features/auth/forgot_password_screen.hbs +368 -0
  219. package/templates/partials/features/auth/login_screen.hbs +540 -0
  220. package/templates/partials/features/auth/session_provider.hbs +437 -0
  221. package/templates/partials/features/auth/signup_screen.hbs +511 -0
  222. package/templates/partials/features/auth/user_model.hbs +23 -0
  223. package/templates/partials/features/home/home_page.hbs +156 -0
  224. package/templates/partials/features/onboarding/onboarding_page.hbs +264 -0
  225. package/templates/partials/llm/add-feature-workflow.hbs +38 -0
  226. package/templates/partials/llm/architecture-rules.hbs +92 -0
  227. package/templates/partials/llm/backend-rules.hbs +30 -0
  228. package/templates/partials/llm/build-runner-note.hbs +15 -0
  229. package/templates/partials/llm/design-quick-ref.hbs +14 -0
  230. package/templates/partials/llm/design-quick-reference.hbs +14 -0
  231. package/templates/partials/llm/navigation-rules.hbs +27 -0
  232. package/templates/partials/llm/networking-rules.hbs +16 -0
  233. package/templates/partials/llm/packages-list.hbs +26 -0
  234. package/templates/partials/llm/services-conventions.hbs +20 -0
  235. package/templates/partials/llm/stack-summary.hbs +22 -0
  236. package/templates/partials/llm/state-management-rules.hbs +40 -0
  237. package/templates/partials/state_label.hbs +1 -0
@@ -0,0 +1,437 @@
1
+ import 'dart:async';
2
+ import 'package:{{flags.appSnake}}/src/imports/imports.dart';
3
+ import 'package:{{flags.appSnake}}/src/{{#if (eq architecture "layer-first")}}domain/entities/user.dart{{else if (eq architecture "mvc")}}models/user_model.dart{{else if (eq architecture "mvvm")}}data/models/user_model.dart{{else}}features/auth/domain/entities/user.dart{{/if}}';
4
+ import 'package:{{flags.appSnake}}/src/{{#if (eq architecture "layer-first")}}domain/repositories/{{else if (eq architecture "mvc")}}services/{{else if (eq architecture "mvvm")}}data/repositories/{{else}}features/auth/domain/repositories/{{/if}}auth_repository.dart';
5
+
6
+ {{#if flags.isRiverpod}}
7
+ import 'package:{{flags.appSnake}}/src/{{#if (eq architecture "layer-first")}}data/repositories/{{else if (eq architecture "mvc")}}services/{{else if (eq architecture "mvvm")}}data/repositories/{{else}}features/auth/data/repositories/{{/if}}auth_repository_impl.dart';
8
+
9
+ /// Provides the AuthRepository instance
10
+ final authRepositoryProvider = Provider<AuthRepository>((ref) {
11
+ return AuthRepositoryImpl();
12
+ });
13
+
14
+ /// Provides a stream of auth state changes
15
+ final authStateStreamProvider = StreamProvider<AppUser?>((ref) {
16
+ final repo = ref.watch(authRepositoryProvider);
17
+ return repo.onAuthStateChanged;
18
+ });
19
+
20
+ /// Provides the current session state
21
+ final sessionProvider = StateNotifierProvider<SessionNotifier, SessionState>((ref) {
22
+ final repo = ref.read(authRepositoryProvider);
23
+ return SessionNotifier(repository: repo);
24
+ });
25
+
26
+ /// Session states
27
+ enum SessionStatus { unknown, authenticated, unauthenticated }
28
+
29
+ class SessionState {
30
+ final SessionStatus status;
31
+ final AppUser? user;
32
+
33
+ const SessionState({this.status = SessionStatus.unknown, this.user});
34
+
35
+ SessionState copyWith({SessionStatus? status, AppUser? user}) {
36
+ return SessionState(
37
+ status: status ?? this.status,
38
+ user: user ?? this.user,
39
+ );
40
+ }
41
+ }
42
+
43
+ class SessionNotifier extends StateNotifier<SessionState> {
44
+ final AuthRepository _repository;
45
+ StreamSubscription<AppUser?>? _authSub;
46
+
47
+ SessionNotifier({required AuthRepository repository})
48
+ : _repository = repository,
49
+ super(const SessionState()) {
50
+ _init();
51
+ }
52
+
53
+ Future<void> _init() async {
54
+ // Check persisted session first
55
+ final result = await _repository.checkAuthState();
56
+ result.fold(
57
+ (_) => state = const SessionState(status: SessionStatus.unauthenticated),
58
+ (user) {
59
+ if (user != null) {
60
+ state = SessionState(status: SessionStatus.authenticated, user: user);
61
+ } else {
62
+ state = const SessionState(status: SessionStatus.unauthenticated);
63
+ }
64
+ },
65
+ );
66
+
67
+ // Listen for future changes
68
+ _authSub = _repository.onAuthStateChanged.listen((user) {
69
+ if (user != null) {
70
+ state = SessionState(status: SessionStatus.authenticated, user: user);
71
+ } else {
72
+ state = const SessionState(status: SessionStatus.unauthenticated);
73
+ }
74
+ });
75
+ }
76
+
77
+ Future<void> logout() async {
78
+ await _repository.logout();
79
+ state = const SessionState(status: SessionStatus.unauthenticated);
80
+ }
81
+
82
+ @override
83
+ void dispose() {
84
+ _authSub?.cancel();
85
+ super.dispose();
86
+ }
87
+ }
88
+ {{else if flags.isBloc}}
89
+ /// Session events
90
+ abstract class SessionEvent extends Equatable {
91
+ const SessionEvent();
92
+ @override
93
+ List<Object?> get props => [];
94
+ }
95
+
96
+ class SessionCheckRequested extends SessionEvent {
97
+ const SessionCheckRequested();
98
+ }
99
+
100
+ class SessionUserChanged extends SessionEvent {
101
+ final AppUser? user;
102
+ const SessionUserChanged(this.user);
103
+ @override
104
+ List<Object?> get props => [user];
105
+ }
106
+
107
+ class SessionLogoutRequested extends SessionEvent {
108
+ const SessionLogoutRequested();
109
+ }
110
+
111
+ /// Session states
112
+ enum SessionStatus { unknown, authenticated, unauthenticated }
113
+
114
+ class SessionState extends Equatable {
115
+ final SessionStatus status;
116
+ final AppUser? user;
117
+
118
+ const SessionState({
119
+ this.status = SessionStatus.unknown,
120
+ this.user,
121
+ });
122
+
123
+ const SessionState.unknown() : this();
124
+ const SessionState.authenticated(AppUser user) : this(status: SessionStatus.authenticated, user: user);
125
+ const SessionState.unauthenticated() : this(status: SessionStatus.unauthenticated);
126
+
127
+ @override
128
+ List<Object?> get props => [status, user];
129
+ }
130
+
131
+ class SessionBloc extends Bloc<SessionEvent, SessionState> {
132
+ final AuthRepository _repository;
133
+ StreamSubscription<AppUser?>? _authSub;
134
+
135
+ SessionBloc({required AuthRepository repository})
136
+ : _repository = repository,
137
+ super(const SessionState.unknown()) {
138
+ on<SessionCheckRequested>(_onCheckRequested);
139
+ on<SessionUserChanged>(_onUserChanged);
140
+ on<SessionLogoutRequested>(_onLogoutRequested);
141
+
142
+ // Start checking
143
+ add(const SessionCheckRequested());
144
+ }
145
+
146
+ Future<void> _onCheckRequested(
147
+ SessionCheckRequested event,
148
+ Emitter<SessionState> emit,
149
+ ) async {
150
+ final result = await _repository.checkAuthState();
151
+ result.fold(
152
+ (_) => emit(const SessionState.unauthenticated()),
153
+ (user) {
154
+ if (user != null) {
155
+ emit(SessionState.authenticated(user));
156
+ } else {
157
+ emit(const SessionState.unauthenticated());
158
+ }
159
+ },
160
+ );
161
+
162
+ // Listen for future changes
163
+ await _authSub?.cancel();
164
+ _authSub = _repository.onAuthStateChanged.listen((user) {
165
+ add(SessionUserChanged(user));
166
+ });
167
+ }
168
+
169
+ void _onUserChanged(
170
+ SessionUserChanged event,
171
+ Emitter<SessionState> emit,
172
+ ) {
173
+ if (event.user != null) {
174
+ emit(SessionState.authenticated(event.user!));
175
+ } else {
176
+ emit(const SessionState.unauthenticated());
177
+ }
178
+ }
179
+
180
+ Future<void> _onLogoutRequested(
181
+ SessionLogoutRequested event,
182
+ Emitter<SessionState> emit,
183
+ ) async {
184
+ await _repository.logout();
185
+ emit(const SessionState.unauthenticated());
186
+ }
187
+
188
+ @override
189
+ Future<void> close() {
190
+ _authSub?.cancel();
191
+ return super.close();
192
+ }
193
+ }
194
+ {{else if flags.isProvider}}
195
+ enum SessionStatus { unknown, authenticated, unauthenticated }
196
+
197
+ class SessionProvider extends ChangeNotifier {
198
+ final AuthRepository _repository;
199
+ StreamSubscription<AppUser?>? _authSub;
200
+
201
+ SessionStatus _status = SessionStatus.unknown;
202
+ AppUser? _user;
203
+
204
+ SessionStatus get status => _status;
205
+ AppUser? get user => _user;
206
+ bool get isAuthenticated => _status == SessionStatus.authenticated;
207
+
208
+ SessionProvider({required AuthRepository repository}) : _repository = repository {
209
+ _init();
210
+ }
211
+
212
+ Future<void> _init() async {
213
+ final result = await _repository.checkAuthState();
214
+ result.fold(
215
+ (_) {
216
+ _status = SessionStatus.unauthenticated;
217
+ notifyListeners();
218
+ },
219
+ (user) {
220
+ if (user != null) {
221
+ _user = user;
222
+ _status = SessionStatus.authenticated;
223
+ } else {
224
+ _status = SessionStatus.unauthenticated;
225
+ }
226
+ notifyListeners();
227
+ },
228
+ );
229
+
230
+ _authSub = _repository.onAuthStateChanged.listen((user) {
231
+ if (user != null) {
232
+ _user = user;
233
+ _status = SessionStatus.authenticated;
234
+ } else {
235
+ _user = null;
236
+ _status = SessionStatus.unauthenticated;
237
+ }
238
+ notifyListeners();
239
+ });
240
+ }
241
+
242
+ Future<void> logout() async {
243
+ await _repository.logout();
244
+ _user = null;
245
+ _status = SessionStatus.unauthenticated;
246
+ notifyListeners();
247
+ }
248
+
249
+ @override
250
+ void dispose() {
251
+ _authSub?.cancel();
252
+ super.dispose();
253
+ }
254
+ }
255
+ {{else if flags.isGetX}}
256
+ enum SessionStatus { unknown, authenticated, unauthenticated }
257
+
258
+ class SessionController extends GetxController {
259
+ final AuthRepository _repository;
260
+ StreamSubscription<AppUser?>? _authSub;
261
+
262
+ final Rx<SessionStatus> status = SessionStatus.unknown.obs;
263
+ final Rx<AppUser?> user = Rx<AppUser?>(null);
264
+
265
+ bool get isAuthenticated => status.value == SessionStatus.authenticated;
266
+
267
+ SessionController({required AuthRepository repository}) : _repository = repository;
268
+
269
+ @override
270
+ void onInit() {
271
+ super.onInit();
272
+ _init();
273
+ }
274
+
275
+ Future<void> _init() async {
276
+ final result = await _repository.checkAuthState();
277
+ result.fold(
278
+ (_) => status.value = SessionStatus.unauthenticated,
279
+ (u) {
280
+ if (u != null) {
281
+ user.value = u;
282
+ status.value = SessionStatus.authenticated;
283
+ } else {
284
+ status.value = SessionStatus.unauthenticated;
285
+ }
286
+ },
287
+ );
288
+
289
+ _authSub = _repository.onAuthStateChanged.listen((u) {
290
+ if (u != null) {
291
+ user.value = u;
292
+ status.value = SessionStatus.authenticated;
293
+ } else {
294
+ user.value = null;
295
+ status.value = SessionStatus.unauthenticated;
296
+ }
297
+ });
298
+ }
299
+
300
+ Future<void> logout() async {
301
+ await _repository.logout();
302
+ user.value = null;
303
+ status.value = SessionStatus.unauthenticated;
304
+ }
305
+
306
+ @override
307
+ void onClose() {
308
+ _authSub?.cancel();
309
+ super.onClose();
310
+ }
311
+ }
312
+ {{else if flags.isMobX}}
313
+ part 'session_store.g.dart';
314
+
315
+ enum SessionStatus { unknown, authenticated, unauthenticated }
316
+
317
+ class SessionStore = SessionStoreBase with _$SessionStore;
318
+
319
+ abstract class SessionStoreBase with Store {
320
+ final AuthRepository _repository;
321
+ StreamSubscription<AppUser?>? _authSub;
322
+
323
+ SessionStoreBase({required AuthRepository repository}) : _repository = repository {
324
+ _init();
325
+ }
326
+
327
+ @observable
328
+ SessionStatus status = SessionStatus.unknown;
329
+
330
+ @observable
331
+ AppUser? user;
332
+
333
+ @computed
334
+ bool get isAuthenticated => status == SessionStatus.authenticated;
335
+
336
+ @action
337
+ Future<void> _init() async {
338
+ final result = await _repository.checkAuthState();
339
+ result.fold(
340
+ (_) => status = SessionStatus.unauthenticated,
341
+ (u) {
342
+ if (u != null) {
343
+ user = u;
344
+ status = SessionStatus.authenticated;
345
+ } else {
346
+ status = SessionStatus.unauthenticated;
347
+ }
348
+ },
349
+ );
350
+
351
+ _authSub = _repository.onAuthStateChanged.listen((u) {
352
+ runInAction(() {
353
+ if (u != null) {
354
+ user = u;
355
+ status = SessionStatus.authenticated;
356
+ } else {
357
+ user = null;
358
+ status = SessionStatus.unauthenticated;
359
+ }
360
+ });
361
+ });
362
+ }
363
+
364
+ @action
365
+ Future<void> logout() async {
366
+ await _repository.logout();
367
+ user = null;
368
+ status = SessionStatus.unauthenticated;
369
+ }
370
+
371
+ void dispose() {
372
+ _authSub?.cancel();
373
+ }
374
+ }
375
+ {{else}}
376
+ enum SessionStatus { unknown, authenticated, unauthenticated }
377
+
378
+ class SessionManager extends ChangeNotifier {
379
+ final AuthRepository _repository;
380
+ StreamSubscription<AppUser?>? _authSub;
381
+
382
+ SessionStatus _status = SessionStatus.unknown;
383
+ AppUser? _user;
384
+
385
+ SessionStatus get status => _status;
386
+ AppUser? get user => _user;
387
+ bool get isAuthenticated => _status == SessionStatus.authenticated;
388
+
389
+ SessionManager({required AuthRepository repository}) : _repository = repository {
390
+ _init();
391
+ }
392
+
393
+ Future<void> _init() async {
394
+ final result = await _repository.checkAuthState();
395
+ result.fold(
396
+ (_) {
397
+ _status = SessionStatus.unauthenticated;
398
+ notifyListeners();
399
+ },
400
+ (user) {
401
+ if (user != null) {
402
+ _user = user;
403
+ _status = SessionStatus.authenticated;
404
+ } else {
405
+ _status = SessionStatus.unauthenticated;
406
+ }
407
+ notifyListeners();
408
+ },
409
+ );
410
+
411
+ _authSub = _repository.onAuthStateChanged.listen((user) {
412
+ if (user != null) {
413
+ _user = user;
414
+ _status = SessionStatus.authenticated;
415
+ } else {
416
+ _user = null;
417
+ _status = SessionStatus.unauthenticated;
418
+ }
419
+ notifyListeners();
420
+ });
421
+ }
422
+
423
+ Future<void> logout() async {
424
+ await _repository.logout();
425
+ _user = null;
426
+ _status = SessionStatus.unauthenticated;
427
+ notifyListeners();
428
+ }
429
+
430
+ @override
431
+ void dispose() {
432
+ _authSub?.cancel();
433
+ super.dispose();
434
+ }
435
+ }
436
+ {{/if}}
437
+