@ngxtm/devkit 3.3.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/index.js +59 -13
- package/cli/rules.js +248 -0
- package/package.json +2 -1
- package/rules/README.md +141 -0
- package/rules/dart/best-practices/SKILL.md +23 -0
- package/rules/dart/language/SKILL.md +52 -0
- package/rules/dart/tooling/SKILL.md +43 -0
- package/rules/dotnet/aspnet-core/SKILL.md +92 -0
- package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
- package/rules/dotnet/best-practices/SKILL.md +101 -0
- package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
- package/rules/dotnet/blazor/SKILL.md +146 -0
- package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
- package/rules/dotnet/language/SKILL.md +82 -0
- package/rules/dotnet/language/references/REFERENCE.md +222 -0
- package/rules/dotnet/patterns.rule.md +388 -0
- package/rules/dotnet/razor-pages/SKILL.md +124 -0
- package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
- package/rules/dotnet/security/SKILL.md +89 -0
- package/rules/dotnet/security/references/REFERENCE.md +295 -0
- package/rules/dotnet/tooling/SKILL.md +92 -0
- package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
- package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
- package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
- package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
- package/rules/flutter/bloc-state-management/SKILL.md +64 -0
- package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
- package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
- package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
- package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
- package/rules/flutter/bloc.rule.md +76 -0
- package/rules/flutter/cicd/SKILL.md +48 -0
- package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
- package/rules/flutter/cicd/references/fastlane.md +139 -0
- package/rules/flutter/cicd/references/github-actions.md +59 -0
- package/rules/flutter/dependency-injection/SKILL.md +42 -0
- package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
- package/rules/flutter/dependency-injection/references/modules.md +37 -0
- package/rules/flutter/error-handling/SKILL.md +32 -0
- package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
- package/rules/flutter/error-handling/references/error-mapping.md +31 -0
- package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
- package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
- package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
- package/rules/flutter/getx-navigation/SKILL.md +70 -0
- package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
- package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
- package/rules/flutter/getx-state-management/SKILL.md +76 -0
- package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
- package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
- package/rules/flutter/go-router-navigation/SKILL.md +57 -0
- package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
- package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
- package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
- package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
- package/rules/flutter/localization/SKILL.md +50 -0
- package/rules/flutter/localization/references/REFERENCE.md +48 -0
- package/rules/flutter/localization/references/sheet-loader.md +33 -0
- package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
- package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
- package/rules/flutter/performance/SKILL.md +24 -0
- package/rules/flutter/retrofit-networking/SKILL.md +51 -0
- package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
- package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
- package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
- package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
- package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
- package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
- package/rules/flutter/riverpod.rule.md +78 -0
- package/rules/flutter/security/SKILL.md +33 -0
- package/rules/flutter/security/references/REFERENCE.md +15 -0
- package/rules/flutter/security/references/network-security.md +28 -0
- package/rules/flutter/testing/SKILL.md +44 -0
- package/rules/flutter/testing/references/REFERENCE.md +21 -0
- package/rules/flutter/testing/references/bloc-testing.md +38 -0
- package/rules/flutter/testing/references/integration-testing.md +128 -0
- package/rules/flutter/testing/references/robot-pattern.md +82 -0
- package/rules/flutter/testing/references/unit-testing.md +130 -0
- package/rules/flutter/testing/references/widget-testing.md +120 -0
- package/rules/flutter/widgets/SKILL.md +37 -0
- package/rules/golang/chi-router/SKILL.md +219 -0
- package/rules/golang/chi-router/references/REFERENCE.md +13 -0
- package/rules/golang/chi-router/references/routing-patterns.md +205 -0
- package/rules/golang/cobra-cli/SKILL.md +227 -0
- package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
- package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
- package/rules/golang/core/SKILL.md +210 -0
- package/rules/golang/core/references/REFERENCE.md +14 -0
- package/rules/golang/core/references/concurrency-patterns.md +114 -0
- package/rules/golang/core/references/error-handling.md +87 -0
- package/rules/golang/echo-framework/SKILL.md +215 -0
- package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
- package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
- package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
- package/rules/golang/ent-orm/SKILL.md +239 -0
- package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
- package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
- package/rules/golang/fiber-framework/SKILL.md +196 -0
- package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
- package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
- package/rules/golang/gin-framework/SKILL.md +205 -0
- package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
- package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
- package/rules/golang/gorm-orm/SKILL.md +196 -0
- package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
- package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
- package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
- package/rules/golang/grpc/SKILL.md +231 -0
- package/rules/golang/grpc/references/REFERENCE.md +13 -0
- package/rules/golang/grpc/references/service-patterns.md +276 -0
- package/rules/golang/testify/SKILL.md +239 -0
- package/rules/golang/testify/references/REFERENCE.md +13 -0
- package/rules/golang/testify/references/assert-patterns.md +170 -0
- package/rules/golang/validator/SKILL.md +234 -0
- package/rules/golang/validator/references/REFERENCE.md +13 -0
- package/rules/golang/validator/references/validation-tags.md +211 -0
- package/rules/golang/viper-config/SKILL.md +244 -0
- package/rules/golang/viper-config/references/REFERENCE.md +13 -0
- package/rules/golang/viper-config/references/config-loading.md +181 -0
- package/rules/golang/wire-di/SKILL.md +243 -0
- package/rules/golang/wire-di/references/REFERENCE.md +13 -0
- package/rules/golang/wire-di/references/provider-patterns.md +193 -0
- package/rules/golang/zap-logging/SKILL.md +203 -0
- package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
- package/rules/golang/zap-logging/references/logger-config.md +165 -0
- package/rules/java/build-gradle/SKILL.md +92 -0
- package/rules/java/build-gradle/references/REFERENCE.md +14 -0
- package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
- package/rules/java/build-gradle/references/task-configuration.md +132 -0
- package/rules/java/build-maven/SKILL.md +86 -0
- package/rules/java/build-maven/references/REFERENCE.md +14 -0
- package/rules/java/build-maven/references/dependency-management.md +111 -0
- package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
- package/rules/java/graalvm-native/SKILL.md +105 -0
- package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
- package/rules/java/java-collections-streams/SKILL.md +148 -0
- package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
- package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
- package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
- package/rules/java/java-concurrency/SKILL.md +187 -0
- package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
- package/rules/java/java-concurrency/references/completable-future.md +165 -0
- package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
- package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
- package/rules/java/java-core-language/SKILL.md +121 -0
- package/rules/java/java-core-language/references/REFERENCE.md +15 -0
- package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
- package/rules/java/java-core-language/references/modern-java-features.md +168 -0
- package/rules/java/java-project-structure/SKILL.md +195 -0
- package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
- package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
- package/rules/java/java-project-structure/references/module-system.md +159 -0
- package/rules/java/micronaut-core/SKILL.md +99 -0
- package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
- package/rules/java/micronaut-reactive/SKILL.md +68 -0
- package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-core/SKILL.md +85 -0
- package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-reactive/SKILL.md +67 -0
- package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
- package/rules/java/spring-batch/SKILL.md +102 -0
- package/rules/java/spring-batch/references/REFERENCE.md +12 -0
- package/rules/java/spring-boot-architecture/SKILL.md +206 -0
- package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
- package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
- package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
- package/rules/java/spring-boot-web/SKILL.md +217 -0
- package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
- package/rules/java/spring-cloud/SKILL.md +109 -0
- package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
- package/rules/java/spring-data-jpa/SKILL.md +241 -0
- package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/SKILL.md +161 -0
- package/rules/java/spring-security/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
- package/rules/java/testing-junit-mockito/SKILL.md +135 -0
- package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
- package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
- package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
- package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
- package/rules/javascript/best-practices/SKILL.md +64 -0
- package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
- package/rules/javascript/language/SKILL.md +71 -0
- package/rules/javascript/language/references/REFERENCE.md +106 -0
- package/rules/javascript/tooling/SKILL.md +60 -0
- package/rules/javascript/tooling/references/REFERENCE.md +107 -0
- package/rules/metadata.json +54 -0
- package/rules/nestjs/api-standards/SKILL.md +47 -0
- package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
- package/rules/nestjs/architecture/SKILL.md +68 -0
- package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
- package/rules/nestjs/caching/SKILL.md +51 -0
- package/rules/nestjs/caching/references/REFERENCE.md +13 -0
- package/rules/nestjs/caching/references/cache-patterns.md +183 -0
- package/rules/nestjs/configuration/SKILL.md +41 -0
- package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
- package/rules/nestjs/configuration/references/config-patterns.md +184 -0
- package/rules/nestjs/controllers-services/SKILL.md +63 -0
- package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
- package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
- package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
- package/rules/nestjs/database/SKILL.md +102 -0
- package/rules/nestjs/database/references/REFERENCE.md +14 -0
- package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
- package/rules/nestjs/deployment/SKILL.md +36 -0
- package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
- package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
- package/rules/nestjs/documentation/SKILL.md +64 -0
- package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
- package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
- package/rules/nestjs/error-handling/SKILL.md +55 -0
- package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
- package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
- package/rules/nestjs/file-uploads/SKILL.md +35 -0
- package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
- package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
- package/rules/nestjs/observability/SKILL.md +39 -0
- package/rules/nestjs/observability/references/REFERENCE.md +13 -0
- package/rules/nestjs/observability/references/logging-metrics.md +175 -0
- package/rules/nestjs/performance/SKILL.md +60 -0
- package/rules/nestjs/performance/references/REFERENCE.md +13 -0
- package/rules/nestjs/performance/references/performance-patterns.md +107 -0
- package/rules/nestjs/real-time/SKILL.md +45 -0
- package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
- package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
- package/rules/nestjs/scheduling/SKILL.md +39 -0
- package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
- package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
- package/rules/nestjs/search/SKILL.md +41 -0
- package/rules/nestjs/search/references/REFERENCE.md +13 -0
- package/rules/nestjs/search/references/search-patterns.md +137 -0
- package/rules/nestjs/security/SKILL.md +87 -0
- package/rules/nestjs/security/references/REFERENCE.md +14 -0
- package/rules/nestjs/security/references/authentication.md +151 -0
- package/rules/nestjs/testing/SKILL.md +40 -0
- package/rules/nestjs/testing/references/REFERENCE.md +14 -0
- package/rules/nestjs/testing/references/unit-testing.md +179 -0
- package/rules/nestjs/transport/SKILL.md +45 -0
- package/rules/nestjs/transport/references/REFERENCE.md +13 -0
- package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
- package/rules/nextjs/app-router/SKILL.md +46 -0
- package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
- package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
- package/rules/nextjs/architecture/SKILL.md +44 -0
- package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
- package/rules/nextjs/authentication/SKILL.md +29 -0
- package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
- package/rules/nextjs/caching/SKILL.md +66 -0
- package/rules/nextjs/caching/references/REFERENCE.md +13 -0
- package/rules/nextjs/caching/references/cache-strategies.md +168 -0
- package/rules/nextjs/data-access-layer/SKILL.md +33 -0
- package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
- package/rules/nextjs/data-fetching/SKILL.md +59 -0
- package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
- package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
- package/rules/nextjs/internationalization/SKILL.md +105 -0
- package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
- package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
- package/rules/nextjs/optimization/SKILL.md +64 -0
- package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
- package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
- package/rules/nextjs/rendering/SKILL.md +91 -0
- package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
- package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
- package/rules/nextjs/server-actions/SKILL.md +46 -0
- package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
- package/rules/nextjs/server-components/SKILL.md +52 -0
- package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-components/references/component-patterns.md +175 -0
- package/rules/nextjs/state-management/SKILL.md +73 -0
- package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
- package/rules/nextjs/state-management/references/state-patterns.md +218 -0
- package/rules/nextjs/styling/SKILL.md +31 -0
- package/rules/nextjs/styling/references/implementation.md +56 -0
- package/rules/react/component-patterns/SKILL.md +66 -0
- package/rules/react/component-patterns/references/REFERENCE.md +126 -0
- package/rules/react/hooks/SKILL.md +60 -0
- package/rules/react/hooks/references/REFERENCE.md +132 -0
- package/rules/react/hooks.rule.md +79 -0
- package/rules/react/performance/SKILL.md +69 -0
- package/rules/react/performance/references/REFERENCE.md +143 -0
- package/rules/react/security/SKILL.md +46 -0
- package/rules/react/security/references/REFERENCE.md +170 -0
- package/rules/react/state-management/SKILL.md +56 -0
- package/rules/react/state-management/references/REFERENCE.md +137 -0
- package/rules/react/testing/SKILL.md +45 -0
- package/rules/react/testing/references/REFERENCE.md +149 -0
- package/rules/react/tooling/SKILL.md +39 -0
- package/rules/react/typescript/SKILL.md +53 -0
- package/rules/rust/actix-web/SKILL.md +160 -0
- package/rules/rust/actix-web/references/REFERENCE.md +13 -0
- package/rules/rust/actix-web/references/handler-patterns.md +198 -0
- package/rules/rust/async-graphql/SKILL.md +228 -0
- package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
- package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
- package/rules/rust/axum/SKILL.md +161 -0
- package/rules/rust/axum/references/REFERENCE.md +14 -0
- package/rules/rust/axum/references/handler-patterns.md +97 -0
- package/rules/rust/bevy/SKILL.md +206 -0
- package/rules/rust/bevy/references/REFERENCE.md +13 -0
- package/rules/rust/bevy/references/ecs-patterns.md +226 -0
- package/rules/rust/clap/SKILL.md +217 -0
- package/rules/rust/clap/references/REFERENCE.md +13 -0
- package/rules/rust/clap/references/derive-patterns.md +205 -0
- package/rules/rust/core/SKILL.md +154 -0
- package/rules/rust/core/references/REFERENCE.md +14 -0
- package/rules/rust/core/references/error-handling.md +92 -0
- package/rules/rust/diesel-orm/SKILL.md +176 -0
- package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
- package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
- package/rules/rust/rocket/SKILL.md +182 -0
- package/rules/rust/rocket/references/REFERENCE.md +13 -0
- package/rules/rust/rocket/references/handler-patterns.md +209 -0
- package/rules/rust/sea-orm/SKILL.md +230 -0
- package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
- package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
- package/rules/rust/serde-serialization/SKILL.md +150 -0
- package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
- package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
- package/rules/rust/sqlx-database/SKILL.md +140 -0
- package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
- package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
- package/rules/rust/tauri/SKILL.md +180 -0
- package/rules/rust/tauri/references/REFERENCE.md +13 -0
- package/rules/rust/tauri/references/command-patterns.md +209 -0
- package/rules/rust/tokio-runtime/SKILL.md +167 -0
- package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
- package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
- package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
- package/rules/rust/tonic/SKILL.md +231 -0
- package/rules/rust/tonic/references/REFERENCE.md +13 -0
- package/rules/rust/tonic/references/service-patterns.md +213 -0
- package/rules/rust/tracing/SKILL.md +214 -0
- package/rules/rust/tracing/references/REFERENCE.md +13 -0
- package/rules/rust/tracing/references/instrumentation.md +187 -0
- package/rules/typescript/best-practices/SKILL.md +108 -0
- package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
- package/rules/typescript/language/SKILL.md +72 -0
- package/rules/typescript/language/references/REFERENCE.md +67 -0
- package/rules/typescript/patterns.rule.md +85 -0
- package/rules/typescript/security/SKILL.md +59 -0
- package/rules/typescript/security/references/REFERENCE.md +113 -0
- package/rules/typescript/tooling/SKILL.md +52 -0
- package/rules/typescript/tooling/references/REFERENCE.md +110 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Feature-Based Clean Architecture
|
|
3
|
+
description: Standards for organizing code by feature at the root level to improve scalability and maintainability.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [architecture, clean-architecture, feature-driven, ddd, modularity]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/features/**']
|
|
8
|
+
keywords: [feature, domain, infrastructure, application, presentation, modular]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Feature-Based Clean Architecture
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Standard for modular Clean Architecture organized by business features in `lib/features/`.
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
lib/
|
|
21
|
+
├── features/ <feature_name>/
|
|
22
|
+
│ ├── domain/ # Business Logic (Pure Dart): entities, interfaces, use_cases
|
|
23
|
+
│ ├── data/ # Implementation: data_sources, dtos, repositories
|
|
24
|
+
│ └── presentation/ # UI & State: blocs, pages, widgets
|
|
25
|
+
├── core/ # Shared infrastructure & utilities
|
|
26
|
+
└── shared/ # Common UI components & shared entities
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Implementation Guidelines
|
|
30
|
+
|
|
31
|
+
- **Feature Encapsulation**: Keep logic, models, and UI internal to the feature directory.
|
|
32
|
+
- **Strict Layering**: Maintain 3-layer separation (Domain/Data/Presentation) within each feature.
|
|
33
|
+
- **Dependency Rule**: `Presentation -> Domain <- Data`. Domain must have zero external dependencies.
|
|
34
|
+
- **Cross-Feature Communication**: Features only depend on the **Domain** layer of other features.
|
|
35
|
+
- **Flat features**: Keep `lib/features/` flat; avoid nested features.
|
|
36
|
+
- **No DTO Leakage**: Never expose DTOs or Data Sources to UI or other features; return Domain Entities.
|
|
37
|
+
- **Shared logic**: Move cross-cutting concerns to `lib/shared/` or `lib/core/`.
|
|
38
|
+
|
|
39
|
+
## Reference & Examples
|
|
40
|
+
|
|
41
|
+
For feature folder blueprints and cross-layer dependency templates:
|
|
42
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
43
|
+
|
|
44
|
+
## Related Topics
|
|
45
|
+
|
|
46
|
+
layer-based-clean-architecture | retrofit-networking | go-router-navigation | bloc-state-management | dependency-injection
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Feature-Based Architecture Reference
|
|
2
|
+
|
|
3
|
+
Detailed examples for organizing large-scale Flutter apps by business domain.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Standard Folder Structure**](folder-structure.md) - Deep dive into feature-level directory nesting.
|
|
8
|
+
- [**Shared vs Core**](shared-core.md) - When to put code in `lib/core` versus `lib/shared`.
|
|
9
|
+
- [**Modular Injection**](modular-injection.md) - How to register dependencies per feature.
|
|
10
|
+
|
|
11
|
+
## **Quick Implementation Rule**
|
|
12
|
+
|
|
13
|
+
- Never import from `lib/features/x/data/` or `lib/features/x/presentation/` from outside `feature/x`.
|
|
14
|
+
- Only `lib/features/x/domain/` is "public" to other features.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Feature Folder Structure
|
|
2
|
+
|
|
3
|
+
A complete blueprint for a single feature directory (e.g., `lib/features/authentication/`).
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
lib/features/authentication/
|
|
7
|
+
├── domain/
|
|
8
|
+
│ ├── entities/
|
|
9
|
+
│ │ └── auth_user.dart
|
|
10
|
+
│ ├── repositories/
|
|
11
|
+
│ │ └── i_auth_repository.dart
|
|
12
|
+
│ └── use_cases/
|
|
13
|
+
│ └── login_use_case.dart
|
|
14
|
+
├── data/
|
|
15
|
+
│ ├── data_sources/
|
|
16
|
+
│ │ ├── auth_remote_data_source.dart
|
|
17
|
+
│ │ └── auth_local_data_source.dart
|
|
18
|
+
│ ├── dtos/
|
|
19
|
+
│ │ └── user_dto.dart
|
|
20
|
+
│ └── repositories/
|
|
21
|
+
│ └── auth_repository_impl.dart
|
|
22
|
+
└── presentation/
|
|
23
|
+
├── blocs/
|
|
24
|
+
│ └── auth/
|
|
25
|
+
├── pages/
|
|
26
|
+
│ ├── login_page.dart
|
|
27
|
+
│ └── profile_page.dart
|
|
28
|
+
└── widgets/
|
|
29
|
+
└── auth_form.dart
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## **Key Constraints**
|
|
33
|
+
|
|
34
|
+
1. **Barrel Files**: Use `authentication.dart` at the feature root to export ONLY the domain layer.
|
|
35
|
+
2. **Sub-directories**: Do not create more levels than shown above unless the feature has 20+ files.
|
|
36
|
+
3. **Mappers**: Should be kept in the `data/` layer, typically as extensions on DTOs.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter GetX Navigation
|
|
3
|
+
description: Context-less navigation, named routes, and middleware using GetX.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [navigation, getx, routing, middleware]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/app_pages.dart', '**/app_routes.dart']
|
|
8
|
+
keywords: [GetPage, Get.to, Get.off, Get.offAll, Get.toNamed, GetMiddleware]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# GetX Navigation
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Decoupled navigation system allowing UI transitions without `BuildContext`.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Prefer Named Routes**: Use `Get.toNamed('/path')` for better maintainability. Define routes in a centralized `AppPages` class.
|
|
20
|
+
- **No Context Navigation**: Leverage `Get.to()`, `Get.back()`, etc., directly from controllers.
|
|
21
|
+
- **Navigation Methods**:
|
|
22
|
+
- `Get.to()`: Navigate to next screen.
|
|
23
|
+
- `Get.off()`: Navigate and replace current screen (e.g., Splash -> Home).
|
|
24
|
+
- `Get.offAll()`: Clear stack and navigate (e.g., Logout -> Login).
|
|
25
|
+
- `Get.back()`: Close current screen, dialog, or bottom sheet.
|
|
26
|
+
- **Bindings Everywhere**: Always link routes with `Bindings` to manage controller lifecycles.
|
|
27
|
+
- **Middleware**: Use `GetMiddleware` for route guards (Auth, Permissions) instead of logic inside views.
|
|
28
|
+
|
|
29
|
+
## Code Example
|
|
30
|
+
|
|
31
|
+
```dart
|
|
32
|
+
// Route Definition
|
|
33
|
+
static final routes = [
|
|
34
|
+
GetPage(
|
|
35
|
+
name: _Paths.HOME,
|
|
36
|
+
page: () => HomeView(),
|
|
37
|
+
binding: HomeBinding(),
|
|
38
|
+
middlewares: [AuthMiddleware()],
|
|
39
|
+
),
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// Usage in Controller
|
|
43
|
+
void logout() {
|
|
44
|
+
_authService.clear();
|
|
45
|
+
Get.offAllNamed(Routes.LOGIN);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Route Guard
|
|
49
|
+
class AuthMiddleware extends GetMiddleware {
|
|
50
|
+
@override
|
|
51
|
+
RouteSettings? redirect(String? route) {
|
|
52
|
+
return isAuthenticated ? null : RouteSettings(name: Routes.LOGIN);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Anti-Patterns
|
|
58
|
+
|
|
59
|
+
- **Mixing Context and GetX**: Do not use `Navigator.of(context)` when GetX is the primary router.
|
|
60
|
+
- **Hardcoded Strings**: Always use a `Routes` constant class for names.
|
|
61
|
+
- **Dialogs without GetX**: Use `Get.dialog()` and `Get.snackbar()` for consistency.
|
|
62
|
+
|
|
63
|
+
## Reference & Examples
|
|
64
|
+
|
|
65
|
+
For centralized route configuration and middleware guards:
|
|
66
|
+
See [references/app-pages.md](references/app-pages.md) and [references/middleware-example.md](references/middleware-example.md).
|
|
67
|
+
|
|
68
|
+
## Related Topics
|
|
69
|
+
|
|
70
|
+
getx-state-management | feature-based-clean-architecture
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Centralized Route Management
|
|
2
|
+
|
|
3
|
+
Organizing routes in a single location for scalability.
|
|
4
|
+
|
|
5
|
+
```dart
|
|
6
|
+
// app_routes.dart
|
|
7
|
+
abstract class Routes {
|
|
8
|
+
static const HOME = _Paths.HOME;
|
|
9
|
+
static const LOGIN = _Paths.LOGIN;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
abstract class _Paths {
|
|
13
|
+
static const HOME = '/home';
|
|
14
|
+
static const LOGIN = '/login';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// app_pages.dart
|
|
18
|
+
class AppPages {
|
|
19
|
+
static const INITIAL = Routes.LOGIN;
|
|
20
|
+
|
|
21
|
+
static final routes = [
|
|
22
|
+
GetPage(
|
|
23
|
+
name: _Paths.HOME,
|
|
24
|
+
page: () => HomeView(),
|
|
25
|
+
binding: HomeBinding(),
|
|
26
|
+
),
|
|
27
|
+
GetPage(
|
|
28
|
+
name: _Paths.LOGIN,
|
|
29
|
+
page: () => LoginView(),
|
|
30
|
+
binding: LoginBinding(),
|
|
31
|
+
),
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// main.dart
|
|
36
|
+
GetMaterialApp(
|
|
37
|
+
initialRoute: AppPages.INITIAL,
|
|
38
|
+
getPages: AppPages.routes,
|
|
39
|
+
)
|
|
40
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Route Middleware (Guards)
|
|
2
|
+
|
|
3
|
+
Use middleware to protect routes from unauthorized access or handle redirections.
|
|
4
|
+
|
|
5
|
+
```dart
|
|
6
|
+
class AuthMiddleware extends GetMiddleware {
|
|
7
|
+
@override
|
|
8
|
+
int? get priority => 1;
|
|
9
|
+
|
|
10
|
+
@override
|
|
11
|
+
RouteSettings? redirect(String? route) {
|
|
12
|
+
bool isAuthenticated = AuthService.to.isLoggedInValue;
|
|
13
|
+
|
|
14
|
+
if (isAuthenticated) {
|
|
15
|
+
return null; // Continue to target route
|
|
16
|
+
} else {
|
|
17
|
+
// Redirect to login if user is not authenticated
|
|
18
|
+
return const RouteSettings(name: Routes.LOGIN);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Usage in AppPages
|
|
24
|
+
GetPage(
|
|
25
|
+
name: Routes.PROFILE,
|
|
26
|
+
page: () => ProfileView(),
|
|
27
|
+
middlewares: [AuthMiddleware()],
|
|
28
|
+
)
|
|
29
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter GetX State Management
|
|
3
|
+
description: Simple and powerful reactive state management using GetX.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [state-management, getx, controller, reactive]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**_controller.dart', '**/bindings/*.dart']
|
|
8
|
+
keywords:
|
|
9
|
+
[GetxController, Obx, GetBuilder, .obs, Get.put, Get.find, Get.lazyPut]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# GetX State Management
|
|
13
|
+
|
|
14
|
+
## **Priority: P0 (CRITICAL)**
|
|
15
|
+
|
|
16
|
+
Reactive and lightweight state management separating business logic from UI using `GetX`.
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
lib/app/modules/home/
|
|
22
|
+
├── controllers/
|
|
23
|
+
│ └── home_controller.dart
|
|
24
|
+
├── bindings/
|
|
25
|
+
│ └── home_binding.dart
|
|
26
|
+
└── views/
|
|
27
|
+
└── home_view.dart
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Implementation Guidelines
|
|
31
|
+
|
|
32
|
+
- **Controllers**: Extend `GetxController`. Store logic and state variables here.
|
|
33
|
+
- **Reactivity**:
|
|
34
|
+
- Use `.obs` for observable variables (e.g., `final count = 0.obs;`).
|
|
35
|
+
- Wrap UI in `Obx(() => ...)` to listen for changes.
|
|
36
|
+
- For simple state, use `update()` in controller and `GetBuilder` in UI.
|
|
37
|
+
- **Dependency Injection**:
|
|
38
|
+
- **Bindings**: Use `Bindings` class to decouple DI from UI.
|
|
39
|
+
- **Lazy Load**: Prefer `Get.lazyPut(() => Controller())` in Bindings.
|
|
40
|
+
- **Lifecycle**: Let GetX handle disposal. Avoid `permanent: true`.
|
|
41
|
+
- **Hooks**: Use `onInit()`, `onReady()`, `onClose()` instead of `initState`/`dispose`.
|
|
42
|
+
- **Architecture**: Use `get_cli` for modular MVVM (data, models, modules).
|
|
43
|
+
|
|
44
|
+
## Anti-Patterns
|
|
45
|
+
|
|
46
|
+
- **Ctx in Logic**: Pass no `BuildContext` to controllers.
|
|
47
|
+
- **Inline DI**: Avoid `Get.put()` in widgets; use Bindings + `Get.find`.
|
|
48
|
+
- **Fat Views**: Keep views pure UI; delegate all logic to controller.
|
|
49
|
+
|
|
50
|
+
## Code Example
|
|
51
|
+
|
|
52
|
+
```dart
|
|
53
|
+
class UserController extends GetxController {
|
|
54
|
+
final name = "User".obs;
|
|
55
|
+
void updateName(String val) => name.value = val;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class UserView extends GetView<UserController> {
|
|
59
|
+
@override
|
|
60
|
+
Widget build(ctx) => Scaffold(
|
|
61
|
+
body: Obx(() => Text(controller.name.value)),
|
|
62
|
+
floatingActionButton: FloatingActionButton(
|
|
63
|
+
onPressed: () => controller.updateName("New"),
|
|
64
|
+
),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Reference & Examples
|
|
70
|
+
|
|
71
|
+
For DI Bindings and Reactive patterns:
|
|
72
|
+
See [references/binding-example.md](references/binding-example.md) and [references/reactive-vs-simple.md](references/reactive-vs-simple.md).
|
|
73
|
+
|
|
74
|
+
## Related Topics
|
|
75
|
+
|
|
76
|
+
getx-navigation | feature-based-clean-architecture | dependency-injection
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# GetX Binding Example
|
|
2
|
+
|
|
3
|
+
Using Bindings ensures that dependencies are only in memory when the associated route is active.
|
|
4
|
+
|
|
5
|
+
```dart
|
|
6
|
+
// 1. Define the Binding
|
|
7
|
+
class HomeBinding extends Bindings {
|
|
8
|
+
@override
|
|
9
|
+
void dependencies() {
|
|
10
|
+
// lazyPut only initializes the controller when it's first used (Get.find)
|
|
11
|
+
Get.lazyPut<HomeController>(() => HomeController());
|
|
12
|
+
Get.lazyPut<HomeRepository>(() => HomeRepositoryImpl());
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 2. Attach to Route
|
|
17
|
+
GetPage(
|
|
18
|
+
name: '/home',
|
|
19
|
+
page: () => HomeView(),
|
|
20
|
+
binding: HomeBinding(),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
// 3. Use in View via GetView (automatically finds the controller)
|
|
24
|
+
class HomeView extends GetView<HomeController> {
|
|
25
|
+
@override
|
|
26
|
+
Widget build(BuildContext context) {
|
|
27
|
+
return Scaffold(
|
|
28
|
+
body: Obx(() => Text(controller.title.value)),
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Reactive vs. Simple State Management
|
|
2
|
+
|
|
3
|
+
GetX provides two ways to manage state. Choose based on complexity and performance needs.
|
|
4
|
+
|
|
5
|
+
## 1. Reactive (.obs + Obx)
|
|
6
|
+
|
|
7
|
+
Best for: Highly interactive UIs, streams, and granular updates.
|
|
8
|
+
|
|
9
|
+
```dart
|
|
10
|
+
class UserController extends GetxController {
|
|
11
|
+
final name = "Guest".obs;
|
|
12
|
+
final age = 18.obs;
|
|
13
|
+
|
|
14
|
+
void updateName(String newName) => name.value = newName;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// UI
|
|
18
|
+
Obx(() => Text(controller.name.value));
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. Simple state management
|
|
22
|
+
|
|
23
|
+
Best for: Large objects, low-frequency updates, or reducing memory overhead of many streams.
|
|
24
|
+
|
|
25
|
+
```dart
|
|
26
|
+
class UserController extends GetxController {
|
|
27
|
+
String name = "Guest";
|
|
28
|
+
|
|
29
|
+
void updateName(String newName) {
|
|
30
|
+
name = newName;
|
|
31
|
+
update(); // Manually notify listeners
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// UI
|
|
36
|
+
GetBuilder<UserController>(
|
|
37
|
+
builder: (controller) => Text(controller.name),
|
|
38
|
+
);
|
|
39
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter GoRouter Navigation
|
|
3
|
+
description: Typed routes, route state, and redirection using go_router.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [navigation, go-router, routing]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/router.dart', '**/app_router.dart']
|
|
8
|
+
keywords: [GoRouter, GoRoute, StatefulShellRoute, redirection, typed-routes]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# GoRouter Navigation
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Type-safe deep linking and routing system using `go_router` and `go_router_builder`.
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
core/router/
|
|
21
|
+
├── app_router.dart # Router configuration
|
|
22
|
+
└── routes.dart # Typed route definitions (GoRouteData)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Implementation Guidelines
|
|
26
|
+
|
|
27
|
+
- **Typed Routes**: Always use `GoRouteData` from `go_router_builder`. Never use raw path strings.
|
|
28
|
+
- **Root Router**: One global `GoRouter` instance registered in DI.
|
|
29
|
+
- **Sub-Routes**: Nest related routes using `TypedGoRoute` and children lists.
|
|
30
|
+
- **Redirection**: Handle Auth (Login check) in the `redirect` property of the `GoRouter` config.
|
|
31
|
+
- **Parameters**: Use `@TypedGoRoute` to define paths with `:id` parameters.
|
|
32
|
+
- **Transitions**: Define standard transitions (Fade, Slide) in `buildPage`.
|
|
33
|
+
- **Navigation**: Use `MyRoute().go(context)` or `MyRoute().push(context)`.
|
|
34
|
+
|
|
35
|
+
## Code
|
|
36
|
+
|
|
37
|
+
```dart
|
|
38
|
+
// Route Definition
|
|
39
|
+
@TypedGoRoute<HomeRoute>(path: '/')
|
|
40
|
+
class HomeRoute extends GoRouteData {
|
|
41
|
+
@override
|
|
42
|
+
Widget build(context, state) => const HomePage();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Router Config
|
|
46
|
+
final router = GoRouter(
|
|
47
|
+
routes: $appRoutes,
|
|
48
|
+
redirect: (context, state) {
|
|
49
|
+
if (notAuthenticated) return '/login';
|
|
50
|
+
return null;
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Related Topics
|
|
56
|
+
|
|
57
|
+
layer-based-clean-architecture | auto-route-navigation | security
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Idiomatic Flutter
|
|
3
|
+
description: Modern layout and widget composition standards.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [flutter, clean-code, widgets]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/presentation/**/*.dart']
|
|
8
|
+
keywords: [context.mounted, SizedBox, Gap, composition, shrink]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Idiomatic Flutter (P1)
|
|
12
|
+
|
|
13
|
+
- **Async Gaps**: Check `if (context.mounted)` before using `BuildContext` after `await`.
|
|
14
|
+
- **Composition**: Extract complex UI into small widgets. Avoid deep nesting or large helper methods.
|
|
15
|
+
- **Layout**:
|
|
16
|
+
- Spacing: Use `Gap(n)` or `SizedBox` over `Padding` for simple gaps.
|
|
17
|
+
- Empty UI: Use `const SizedBox.shrink()`.
|
|
18
|
+
- Intrinsic: Avoid `IntrinsicWidth/Height`; use `Stack` + `FractionallySizedBox` for overlays.
|
|
19
|
+
- **Optimization**: Use `ColoredBox`/`Padding`/`DecoratedBox` instead of `Container` when possible.
|
|
20
|
+
- **Themes**: Use extensions for `Theme.of(context)` access.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Layer-based Clean Architecture + DDD
|
|
3
|
+
description: Standards for separation of concerns, layer dependency rules, and DDD in Flutter.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [architecture, clean-architecture, layers, ddd]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/domain/**', 'lib/infrastructure/**', 'lib/application/**']
|
|
8
|
+
keywords: [domain, infrastructure, application, presentation, layers, dto, mapper]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Layer-Based Clean Architecture
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Standardized separation of concerns and dependency flow using DDD principles.
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
lib/
|
|
21
|
+
├── domain/ # Pure Dart: entities (@freezed), failures, repository interfaces
|
|
22
|
+
├── infrastructure/ # Implementation: DTOs, data sources, mappers, repo impls
|
|
23
|
+
├── application/ # Orchestration: BLoCs / Cubits
|
|
24
|
+
└── presentation/ # UI: Screens, reusable components
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Implementation Guidelines
|
|
28
|
+
|
|
29
|
+
- **Dependency Flow**: `Presentation -> Application -> Domain <- Infrastructure`. Dependencies point inward.
|
|
30
|
+
- **Pure Domain**: No Flutter (Material/Store) or Infrastructure (Dio/Hive) dependencies in `Domain`.
|
|
31
|
+
- **Functional Error Handling**: Repositories must return `Either<Failure, Success>`.
|
|
32
|
+
- **Always Map**: Infrastructure must map DTOs to Domain Entities; do not leak DTOs to UI.
|
|
33
|
+
- **Immutability**: Use `@freezed` for all entities and failures.
|
|
34
|
+
- **Logic Placement**: No business logic in UI; widgets only display state and emit events.
|
|
35
|
+
- **Inversion of Control**: Use `get_it` to inject repository implementations into BLoCs.
|
|
36
|
+
|
|
37
|
+
## Anti-Patterns
|
|
38
|
+
|
|
39
|
+
- **No DTOs in UI**: Never import a `.g.dart` or Data class directly in a Widget.
|
|
40
|
+
- **No Material in Domain**: Do not import `package:flutter/material.dart` in the `domain` layer.
|
|
41
|
+
- **No Shared Prefs in Repo**: Do not use `shared_preferences` directly in a Repository; use a Data Source.
|
|
42
|
+
|
|
43
|
+
## Reference & Examples
|
|
44
|
+
|
|
45
|
+
For full implementation templates and DTO-to-Domain mapping examples:
|
|
46
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
47
|
+
|
|
48
|
+
## Related Topics
|
|
49
|
+
|
|
50
|
+
feature-based-clean-architecture | bloc-state-management | dependency-injection | error-handling
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Reference: Layer-based Clean Architecture Examples
|
|
2
|
+
|
|
3
|
+
## **Full Layer Implementation**
|
|
4
|
+
|
|
5
|
+
### 1. Domain Layer (Entity)
|
|
6
|
+
|
|
7
|
+
```dart
|
|
8
|
+
@freezed
|
|
9
|
+
class Bank with _$Bank {
|
|
10
|
+
const factory Bank({
|
|
11
|
+
required String id,
|
|
12
|
+
required String name,
|
|
13
|
+
required String branchCode,
|
|
14
|
+
}) = _Bank;
|
|
15
|
+
|
|
16
|
+
factory Bank.fromJson(Map<String, dynamic> json) => _$BankFromJson(json);
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 2. Infrastructure Layer (DTO & Mapper)
|
|
21
|
+
|
|
22
|
+
```dart
|
|
23
|
+
@freezed
|
|
24
|
+
class BankDto with _$BankDto {
|
|
25
|
+
const factory BankDto({
|
|
26
|
+
@JsonKey(name: 'bank_id') required String id,
|
|
27
|
+
@JsonKey(name: 'bank_name') required String name,
|
|
28
|
+
@JsonKey(name: 'code') required String branchCode,
|
|
29
|
+
}) = _BankDto;
|
|
30
|
+
|
|
31
|
+
factory BankDto.fromJson(Map<String, dynamic> json) => _$BankDtoFromJson(json);
|
|
32
|
+
|
|
33
|
+
Bank toDomain() => Bank(
|
|
34
|
+
id: id,
|
|
35
|
+
name: name,
|
|
36
|
+
branchCode: branchCode,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. Application Layer (BLoC)
|
|
42
|
+
|
|
43
|
+
```dart
|
|
44
|
+
class BankBloc extends Bloc<BankEvent, BankState> {
|
|
45
|
+
final IBankRepository repository;
|
|
46
|
+
|
|
47
|
+
BankBloc(this.repository) : super(const BankState.initial()) {
|
|
48
|
+
on<_Fetch>(_onFetch);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Future<void> _onFetch(_Fetch event, Emitter<BankState> emit) async {
|
|
52
|
+
emit(const BankState.loading());
|
|
53
|
+
final failureOrBanks = await repository.fetchBanks();
|
|
54
|
+
emit(failureOrBanks.fold(
|
|
55
|
+
(f) => BankState.error(f.message),
|
|
56
|
+
(banks) => BankState.loaded(banks),
|
|
57
|
+
));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Repositories & DTO Mapping Reference
|
|
2
|
+
|
|
3
|
+
## **Data Transfer Object (DTO)**
|
|
4
|
+
|
|
5
|
+
DTOs live in the **Infrastructure** layer and represent the raw JSON response.
|
|
6
|
+
|
|
7
|
+
```dart
|
|
8
|
+
@freezed
|
|
9
|
+
class BankDto with _$BankDto {
|
|
10
|
+
const BankDto._();
|
|
11
|
+
|
|
12
|
+
const factory BankDto({
|
|
13
|
+
@JsonKey(name: 'bank_id') required String id,
|
|
14
|
+
@JsonKey(name: 'bank_name') required String name,
|
|
15
|
+
@JsonKey(name: 'code') required String branchCode,
|
|
16
|
+
}) = _BankDto;
|
|
17
|
+
|
|
18
|
+
factory BankDto.fromJson(Map<String, dynamic> json) => _$BankDtoFromJson(json);
|
|
19
|
+
|
|
20
|
+
// Mapping to Domain Entity
|
|
21
|
+
Bank toDomain() => Bank(
|
|
22
|
+
id: id,
|
|
23
|
+
name: name,
|
|
24
|
+
branchCode: branchCode,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## **Repository Implementation**
|
|
30
|
+
|
|
31
|
+
The implementation handles the actual data fetching (Remote/Local) and mapping.
|
|
32
|
+
|
|
33
|
+
```dart
|
|
34
|
+
class BankRepository implements IBankRepository {
|
|
35
|
+
final BankRemoteDataSource remoteDataSource;
|
|
36
|
+
|
|
37
|
+
BankRepository(this.remoteDataSource);
|
|
38
|
+
|
|
39
|
+
@override
|
|
40
|
+
Future<Either<ApiFailure, List<Bank>>> fetchBanks() async {
|
|
41
|
+
try {
|
|
42
|
+
final dtoList = await remoteDataSource.getBanks();
|
|
43
|
+
// Perform the mapping here
|
|
44
|
+
return right(dtoList.map((dto) => dto.toDomain()).toList());
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return left(ApiFailure.fromException(e));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Localization
|
|
3
|
+
description: Standards for multi-language support using easy_localization and JSON/CSV assets.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [localization, l10n, i18n, easy_localization]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/assets/translations/*.json', 'main.dart']
|
|
8
|
+
keywords:
|
|
9
|
+
[localization, multi-language, translation, tr(), easy_localization]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Localization
|
|
13
|
+
|
|
14
|
+
## **Priority: P1 (STANDARD)**
|
|
15
|
+
|
|
16
|
+
Consistent multi-language support using `easy_localization`.
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
assets/
|
|
22
|
+
└── translations/
|
|
23
|
+
├── en.json
|
|
24
|
+
└── vi.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Implementation Guidelines
|
|
28
|
+
|
|
29
|
+
- **Bootstrap**: Wrap root with `EasyLocalization`. Always use `await EasyLocalization.ensureInitialized()`.
|
|
30
|
+
- **Format**: Default to JSON. Store in `assets/translations/`.
|
|
31
|
+
- **Lookup**: Use `.tr()` extension on strings.
|
|
32
|
+
- **Locale**: Change via `context.setLocale(Locale('code'))`.
|
|
33
|
+
- **Params**: Use `{}` in JSON; pass via `tr(args: [...])`.
|
|
34
|
+
- **Counting**: Use `plural()` for quantities.
|
|
35
|
+
- **Sheets**: Sync via `sheet_loader_localization` from Google Sheets for Online file storage to JSON/CSV.
|
|
36
|
+
|
|
37
|
+
## Anti-Patterns
|
|
38
|
+
|
|
39
|
+
- **Hardcoding**: No raw strings in UI; use keys.
|
|
40
|
+
- **Manual L10n**: Avoid standard `Localizations.of`; use GetX or `easy_localization` context methods.
|
|
41
|
+
- **Desync**: Keep keys identical across all locale files.
|
|
42
|
+
|
|
43
|
+
## Reference & Examples
|
|
44
|
+
|
|
45
|
+
For setup and Google Sheets automation:
|
|
46
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
47
|
+
|
|
48
|
+
## Related Topics
|
|
49
|
+
|
|
50
|
+
idiomatic-flutter | widgets
|