@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,91 @@
|
|
|
1
|
+
# JavaScript Best Practices Reference
|
|
2
|
+
|
|
3
|
+
Module patterns and project organization.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Module Patterns**](module-patterns.md) - ES6 modules and organization.
|
|
8
|
+
- [**Project Structure**](project-structure.md) - Directory organization.
|
|
9
|
+
|
|
10
|
+
## Module Patterns
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
// Public API with index.js
|
|
14
|
+
// src/users/index.js
|
|
15
|
+
export { UserService } from './user-service.js';
|
|
16
|
+
export { UserRepository } from './user-repository.js';
|
|
17
|
+
export { createUser, updateUser } from './user-operations.js';
|
|
18
|
+
|
|
19
|
+
// Private implementation
|
|
20
|
+
// src/users/user-service.js
|
|
21
|
+
import { UserRepository } from './user-repository.js';
|
|
22
|
+
import { validateUser } from './validators.js';
|
|
23
|
+
|
|
24
|
+
export class UserService {
|
|
25
|
+
constructor(repository = new UserRepository()) {
|
|
26
|
+
this.repository = repository;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async createUser(data) {
|
|
30
|
+
validateUser(data);
|
|
31
|
+
return this.repository.save(data);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Singleton pattern
|
|
36
|
+
// src/utils/logger.js
|
|
37
|
+
class Logger {
|
|
38
|
+
#instance;
|
|
39
|
+
|
|
40
|
+
constructor() {
|
|
41
|
+
if (Logger.#instance) {
|
|
42
|
+
return Logger.#instance;
|
|
43
|
+
}
|
|
44
|
+
Logger.#instance = this;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
log(message) {
|
|
48
|
+
console.log(`[${new Date().toISOString()}] ${message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const logger = new Logger();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Project Structure
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
src/
|
|
59
|
+
├── domain/ # Business logic
|
|
60
|
+
│ └── user/
|
|
61
|
+
│ ├── user.js
|
|
62
|
+
│ └── user-repository.js
|
|
63
|
+
├── services/ # Application services
|
|
64
|
+
│ └── user-service.js
|
|
65
|
+
├── utils/ # Utilities
|
|
66
|
+
│ ├── logger.js
|
|
67
|
+
│ └── validation.js
|
|
68
|
+
├── config/ # Configuration
|
|
69
|
+
│ └── database.js
|
|
70
|
+
└── index.js # Entry point
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Configuration Management
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// config/index.js
|
|
77
|
+
const config = {
|
|
78
|
+
development: {
|
|
79
|
+
apiUrl: 'http://localhost:3000',
|
|
80
|
+
logLevel: 'debug',
|
|
81
|
+
},
|
|
82
|
+
production: {
|
|
83
|
+
apiUrl: process.env.API_URL,
|
|
84
|
+
logLevel: 'error',
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const env = process.env.NODE_ENV || 'development';
|
|
89
|
+
|
|
90
|
+
export default config[env];
|
|
91
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: JavaScript Language Patterns
|
|
3
|
+
description: Modern JavaScript (ES2022+) patterns for clean, maintainable code.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [javascript, language, es6, modern-js]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.js', '**/*.mjs', '**/*.cjs']
|
|
8
|
+
keywords:
|
|
9
|
+
[const, let, arrow, async, await, promise, destructuring, spread, class]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# JavaScript Language Patterns
|
|
13
|
+
|
|
14
|
+
## **Priority: P0 (CRITICAL)**
|
|
15
|
+
|
|
16
|
+
Modern JavaScript standards for clean, maintainable code.
|
|
17
|
+
|
|
18
|
+
## Implementation Guidelines
|
|
19
|
+
|
|
20
|
+
- **Variables**: `const` default. `let` if needed. No `var`.
|
|
21
|
+
- **Functions**: Arrows for callbacks. Declarations for top-level.
|
|
22
|
+
- **Async**: `async/await` + `try/catch`.
|
|
23
|
+
- **Objects**: Destructuring, Spread `...`, Optional Chain `?.`, Nullish `??`.
|
|
24
|
+
- **Strings**: Template literals `${}`.
|
|
25
|
+
- **Arrays**: `map`, `filter`, `reduce`. No loops.
|
|
26
|
+
- **Modules**: ESM `import`/`export`.
|
|
27
|
+
- **Classes**: Use `#private` fields.
|
|
28
|
+
|
|
29
|
+
## Anti-Patterns
|
|
30
|
+
|
|
31
|
+
- **No `var`**: Block scope only.
|
|
32
|
+
- **No `==`**: Strict `===`.
|
|
33
|
+
- **No `new Object()`**: Use literals `{}`.
|
|
34
|
+
- **No Callbacks**: Promisify everything.
|
|
35
|
+
- **No Mutation**: Immutability first.
|
|
36
|
+
|
|
37
|
+
## Code
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
// Modern Syntax
|
|
41
|
+
const [x, ...rest] = items;
|
|
42
|
+
const name = user?.profile?.name ?? 'Guest';
|
|
43
|
+
|
|
44
|
+
// Async
|
|
45
|
+
async function getUser(id) {
|
|
46
|
+
try {
|
|
47
|
+
const res = await fetch(`/api/${id}`);
|
|
48
|
+
return res.json();
|
|
49
|
+
} catch (err) {
|
|
50
|
+
console.error(err);
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Class + Private
|
|
56
|
+
class Service {
|
|
57
|
+
#key;
|
|
58
|
+
constructor(k) {
|
|
59
|
+
this.#key = k;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Reference & Examples
|
|
65
|
+
|
|
66
|
+
For advanced patterns and functional programming:
|
|
67
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
68
|
+
|
|
69
|
+
## Related Topics
|
|
70
|
+
|
|
71
|
+
best-practices | tooling
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# JavaScript Language Patterns Reference
|
|
2
|
+
|
|
3
|
+
Advanced patterns and functional programming techniques.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Functional Programming**](functional-programming.md) - Immutability and pure functions.
|
|
8
|
+
- [**Promises & Async**](promises-async.md) - Advanced async patterns.
|
|
9
|
+
|
|
10
|
+
## Functional Programming Patterns
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
// Pure functions
|
|
14
|
+
const add = (a, b) => a + b;
|
|
15
|
+
const multiply = (a, b) => a * b;
|
|
16
|
+
|
|
17
|
+
// Function composition
|
|
18
|
+
const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
|
|
19
|
+
const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
|
|
20
|
+
|
|
21
|
+
// Example usage
|
|
22
|
+
const addOne = x => x + 1;
|
|
23
|
+
const double = x => x * 2;
|
|
24
|
+
const addOneThenDouble = pipe(addOne, double);
|
|
25
|
+
console.log(addOneThenDouble(3)); // 8
|
|
26
|
+
|
|
27
|
+
// Immutable data updates
|
|
28
|
+
const updateUser = (user, updates) => ({
|
|
29
|
+
...user,
|
|
30
|
+
...updates,
|
|
31
|
+
updatedAt: new Date(),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Deep cloning
|
|
35
|
+
const deepClone = obj => structuredClone(obj);
|
|
36
|
+
|
|
37
|
+
// Currying
|
|
38
|
+
const curry = (fn) => {
|
|
39
|
+
return function curried(...args) {
|
|
40
|
+
if (args.length >= fn.length) {
|
|
41
|
+
return fn.apply(this, args);
|
|
42
|
+
}
|
|
43
|
+
return (...args2) => curried.apply(this, args.concat(args2));
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const add3 = curry((a, b, c) => a + b + c);
|
|
48
|
+
console.log(add3(1)(2)(3)); // 6
|
|
49
|
+
console.log(add3(1, 2)(3)); // 6
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Advanced Async Patterns
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
// Promise.all for parallel execution
|
|
56
|
+
async function fetchAllUsers(ids) {
|
|
57
|
+
const promises = ids.map(id => fetch(`/api/users/${id}`));
|
|
58
|
+
const responses = await Promise.all(promises);
|
|
59
|
+
return Promise.all(responses.map(r => r.json()));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Promise.allSettled for handling partial failures
|
|
63
|
+
async function fetchWithFallback(urls) {
|
|
64
|
+
const results = await Promise.allSettled(
|
|
65
|
+
urls.map(url => fetch(url))
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return results
|
|
69
|
+
.filter(result => result.status === 'fulfilled')
|
|
70
|
+
.map(result => result.value);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Retry with exponential backoff
|
|
74
|
+
async function retryWithBackoff(fn, maxRetries = 3, baseDelay = 1000) {
|
|
75
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
76
|
+
try {
|
|
77
|
+
return await fn();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
if (i === maxRetries - 1) throw error;
|
|
80
|
+
const delay = baseDelay * Math.pow(2, i);
|
|
81
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Debounce
|
|
87
|
+
function debounce(fn, delay) {
|
|
88
|
+
let timeoutId;
|
|
89
|
+
return (...args) => {
|
|
90
|
+
clearTimeout(timeoutId);
|
|
91
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Throttle
|
|
96
|
+
function throttle(fn, limit) {
|
|
97
|
+
let inThrottle;
|
|
98
|
+
return (...args) => {
|
|
99
|
+
if (!inThrottle) {
|
|
100
|
+
fn(...args);
|
|
101
|
+
inThrottle = true;
|
|
102
|
+
setTimeout(() => inThrottle = false, limit);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: JavaScript Tooling
|
|
3
|
+
description: Development tools, linting, and testing for JavaScript projects.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [tooling, javascript, eslint, prettier, testing]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['.eslintrc.*', 'jest.config.*', 'package.json']
|
|
8
|
+
keywords: [eslint, prettier, jest, test, lint, build]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# JavaScript Tooling
|
|
12
|
+
|
|
13
|
+
## **Priority: P1 (OPERATIONAL)**
|
|
14
|
+
|
|
15
|
+
Essential tooling for JavaScript development.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Linting**: ESLint (Rec + Prettier). Fix on save.
|
|
20
|
+
- **Formatting**: Prettier. Run on save/commit.
|
|
21
|
+
- **Testing**: Jest/Vitest. Co-locate tests. >80% cov.
|
|
22
|
+
- **Build**: Vite (Apps), Rollup (Libs).
|
|
23
|
+
- **Pkg Manager**: Sync versions (`npm`/`yarn`/`pnpm`).
|
|
24
|
+
|
|
25
|
+
## Anti-Patterns
|
|
26
|
+
|
|
27
|
+
- **No Formatting Wars**: Prettier rules.
|
|
28
|
+
- **No Untested Code**: TDD/Post-code tests.
|
|
29
|
+
- **No Dirty Commits**: Lint before push.
|
|
30
|
+
|
|
31
|
+
## Configuration
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
// .eslintrc.js
|
|
35
|
+
module.exports = {
|
|
36
|
+
extends: ['eslint:recommended', 'prettier'],
|
|
37
|
+
rules: { 'no-console': 'warn', 'prefer-const': 'error' },
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
// .prettierrc
|
|
43
|
+
{ "semi": true, "singleQuote": true, "printWidth": 80 }
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
// jest.config.js
|
|
48
|
+
export default {
|
|
49
|
+
coverageThreshold: { global: { lines: 80 } },
|
|
50
|
+
};
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Reference & Examples
|
|
54
|
+
|
|
55
|
+
For testing patterns and CI/CD:
|
|
56
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
57
|
+
|
|
58
|
+
## Related Topics
|
|
59
|
+
|
|
60
|
+
best-practices | language
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# JavaScript Tooling Reference
|
|
2
|
+
|
|
3
|
+
Testing patterns and CI/CD configuration.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Testing Patterns**](testing-patterns.md) - Unit and integration testing.
|
|
8
|
+
- [**CI/CD**](ci-cd.md) - Continuous integration setup.
|
|
9
|
+
|
|
10
|
+
## Jest Testing Patterns
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
// user-service.test.js
|
|
14
|
+
import { UserService } from './user-service.js';
|
|
15
|
+
|
|
16
|
+
describe('UserService', () => {
|
|
17
|
+
let service;
|
|
18
|
+
let mockRepository;
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
mockRepository = {
|
|
22
|
+
findById: jest.fn(),
|
|
23
|
+
save: jest.fn(),
|
|
24
|
+
};
|
|
25
|
+
service = new UserService(mockRepository);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe('createUser', () => {
|
|
29
|
+
it('should create a user with valid data', async () => {
|
|
30
|
+
const userData = { name: 'John', email: 'john@example.com' };
|
|
31
|
+
mockRepository.save.mockResolvedValue({ id: '1', ...userData });
|
|
32
|
+
|
|
33
|
+
const result = await service.createUser(userData);
|
|
34
|
+
|
|
35
|
+
expect(result).toEqual({ id: '1', ...userData });
|
|
36
|
+
expect(mockRepository.save).toHaveBeenCalledWith(userData);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should throw error for invalid data', async () => {
|
|
40
|
+
const invalidData = { name: '' };
|
|
41
|
+
|
|
42
|
+
await expect(service.createUser(invalidData))
|
|
43
|
+
.rejects
|
|
44
|
+
.toThrow('Name is required');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Integration Testing
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
// api.integration.test.js
|
|
54
|
+
import request from 'supertest';
|
|
55
|
+
import { app } from '../app.js';
|
|
56
|
+
|
|
57
|
+
describe('User API', () => {
|
|
58
|
+
it('GET /api/users/:id returns user', async () => {
|
|
59
|
+
const response = await request(app)
|
|
60
|
+
.get('/api/users/1')
|
|
61
|
+
.expect(200);
|
|
62
|
+
|
|
63
|
+
expect(response.body).toHaveProperty('id', '1');
|
|
64
|
+
expect(response.body).toHaveProperty('name');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('POST /api/users creates user', async () => {
|
|
68
|
+
const newUser = { name: 'Jane', email: 'jane@example.com' };
|
|
69
|
+
|
|
70
|
+
const response = await request(app)
|
|
71
|
+
.post('/api/users')
|
|
72
|
+
.send(newUser)
|
|
73
|
+
.expect(201);
|
|
74
|
+
|
|
75
|
+
expect(response.body).toHaveProperty('id');
|
|
76
|
+
expect(response.body.name).toBe(newUser.name);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## GitHub Actions CI
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
# .github/workflows/ci.yml
|
|
85
|
+
name: CI
|
|
86
|
+
|
|
87
|
+
on: [push, pull_request]
|
|
88
|
+
|
|
89
|
+
jobs:
|
|
90
|
+
test:
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
|
|
93
|
+
strategy:
|
|
94
|
+
matrix:
|
|
95
|
+
node-version: [18, 20]
|
|
96
|
+
|
|
97
|
+
steps:
|
|
98
|
+
- uses: actions/checkout@v3
|
|
99
|
+
- uses: actions/setup-node@v3
|
|
100
|
+
with:
|
|
101
|
+
node-version: ${{ matrix.node-version }}
|
|
102
|
+
cache: 'npm'
|
|
103
|
+
- run: npm ci
|
|
104
|
+
- run: npm run lint
|
|
105
|
+
- run: npm test -- --coverage
|
|
106
|
+
- run: npm run build
|
|
107
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"global": {
|
|
3
|
+
"author": "Minh",
|
|
4
|
+
"repository": "https://github.com/ngxtm/ags"
|
|
5
|
+
},
|
|
6
|
+
"categories": {
|
|
7
|
+
"flutter": {
|
|
8
|
+
"version": "1.1.0",
|
|
9
|
+
"last_updated": "2026-01-19",
|
|
10
|
+
"tag_prefix": "flutter-v"
|
|
11
|
+
},
|
|
12
|
+
"dart": {
|
|
13
|
+
"version": "1.0.1",
|
|
14
|
+
"last_updated": "2026-01-17",
|
|
15
|
+
"tag_prefix": "dart-v"
|
|
16
|
+
},
|
|
17
|
+
"typescript": {
|
|
18
|
+
"version": "1.0.0",
|
|
19
|
+
"last_updated": "2026-01-17",
|
|
20
|
+
"tag_prefix": "typescript-v"
|
|
21
|
+
},
|
|
22
|
+
"javascript": {
|
|
23
|
+
"version": "1.0.0",
|
|
24
|
+
"last_updated": "2026-01-17",
|
|
25
|
+
"tag_prefix": "javascript-v"
|
|
26
|
+
},
|
|
27
|
+
"react": {
|
|
28
|
+
"version": "1.0.0",
|
|
29
|
+
"last_updated": "2026-01-17",
|
|
30
|
+
"tag_prefix": "react-v"
|
|
31
|
+
},
|
|
32
|
+
"nestjs": {
|
|
33
|
+
"version": "1.0.0",
|
|
34
|
+
"last_updated": "2026-01-17",
|
|
35
|
+
"tag_prefix": "nestjs-v"
|
|
36
|
+
},
|
|
37
|
+
"rust": {
|
|
38
|
+
"version": "1.1.0",
|
|
39
|
+
"last_updated": "2026-01-20",
|
|
40
|
+
"tag_prefix": "rust-v"
|
|
41
|
+
},
|
|
42
|
+
"golang": {
|
|
43
|
+
"version": "1.1.0",
|
|
44
|
+
"last_updated": "2026-01-20",
|
|
45
|
+
"tag_prefix": "golang-v"
|
|
46
|
+
},
|
|
47
|
+
"nextjs": {
|
|
48
|
+
"version": "1.0.0",
|
|
49
|
+
"last_updated": "2026-01-18",
|
|
50
|
+
"tag_prefix": "nextjs-v"
|
|
51
|
+
},
|
|
52
|
+
"angular": {}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: NestJS API Standards
|
|
3
|
+
description: Response wrapping, pagination, and error standardization.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [nestjs, api, pagination, response]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.controller.ts', '**/*.dto.ts']
|
|
8
|
+
keywords: [ApiResponse, Pagination, TransformInterceptor]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# NestJS API Standards & Common Patterns
|
|
12
|
+
|
|
13
|
+
## Generic Response Wrapper
|
|
14
|
+
|
|
15
|
+
- **Concept**: Standardize all successful API responses.
|
|
16
|
+
- **Implementation**: Use `TransformInterceptor` to wrap data in `{ statusCode, data, meta }`.
|
|
17
|
+
|
|
18
|
+
## Pagination Standards (Pro)
|
|
19
|
+
|
|
20
|
+
- **DTOs**: Use strict `PageOptionsDto` (page/take/order) and `PageDto<T>` (data/meta).
|
|
21
|
+
- **Swagger Logic**: Generics require `ApiExtraModels` and schema path resolution.
|
|
22
|
+
- **Reference**: See [Pagination Wrapper Implementation](references/pagination-wrapper.md) for the complete `ApiPaginatedResponse` decorator code.
|
|
23
|
+
|
|
24
|
+
## Custom Error Response
|
|
25
|
+
|
|
26
|
+
- **Standard Error Object**:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
export class ApiErrorResponse {
|
|
30
|
+
@ApiProperty()
|
|
31
|
+
statusCode: number;
|
|
32
|
+
|
|
33
|
+
@ApiProperty()
|
|
34
|
+
message: string;
|
|
35
|
+
|
|
36
|
+
@ApiProperty()
|
|
37
|
+
error: string;
|
|
38
|
+
|
|
39
|
+
@ApiProperty()
|
|
40
|
+
timestamp: string;
|
|
41
|
+
|
|
42
|
+
@ApiProperty()
|
|
43
|
+
path: string;
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- **Docs**: Apply `@ApiBadRequestResponse({ type: ApiErrorResponse })` globally or per controller.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# NestJS API Standards Patterns
|
|
2
|
+
|
|
3
|
+
## Generic Response & Pagination
|
|
4
|
+
|
|
5
|
+
This reference implements the standard `PageDto`, `PageMetaDto`, and the `ApiPaginatedResponse` decorator for Swagger.
|
|
6
|
+
|
|
7
|
+
### Page Options DTO
|
|
8
|
+
|
|
9
|
+
Standard query parameters for list endpoints.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// dtos/page-options.dto.ts
|
|
13
|
+
export class PageOptionsDto {
|
|
14
|
+
@ApiPropertyOptional({ enum: Order, default: Order.ASC })
|
|
15
|
+
@IsEnum(Order)
|
|
16
|
+
@IsOptional()
|
|
17
|
+
readonly order?: Order = Order.ASC;
|
|
18
|
+
|
|
19
|
+
@ApiPropertyOptional({ minimum: 1, default: 1 })
|
|
20
|
+
@Type(() => Number)
|
|
21
|
+
@IsInt()
|
|
22
|
+
@Min(1)
|
|
23
|
+
readonly page?: number = 1;
|
|
24
|
+
|
|
25
|
+
@ApiPropertyOptional({ minimum: 1, maximum: 50, default: 10 })
|
|
26
|
+
@Type(() => Number)
|
|
27
|
+
@IsInt()
|
|
28
|
+
@Min(1)
|
|
29
|
+
@Max(50)
|
|
30
|
+
readonly take?: number = 10;
|
|
31
|
+
|
|
32
|
+
get skip(): number {
|
|
33
|
+
return (this.page - 1) * this.take;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Page DTO
|
|
39
|
+
|
|
40
|
+
Generic wrapper for paginated data.
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// dtos/page.dto.ts
|
|
44
|
+
export class PageDto<T> {
|
|
45
|
+
@ApiProperty({ isArray: true })
|
|
46
|
+
readonly data: T[];
|
|
47
|
+
|
|
48
|
+
@ApiProperty({ type: () => PageMetaDto })
|
|
49
|
+
readonly meta: PageMetaDto;
|
|
50
|
+
|
|
51
|
+
constructor(data: T[], meta: PageMetaDto) {
|
|
52
|
+
this.data = data;
|
|
53
|
+
this.meta = meta;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Swagger Decorator
|
|
59
|
+
|
|
60
|
+
Magical decorator to expose `PageDto<UserDto>` correctly in Swagger UI.
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// decorators/api-paginated-response.decorator.ts
|
|
64
|
+
export const ApiPaginatedResponse = <TModel extends Type<any>>(
|
|
65
|
+
model: TModel,
|
|
66
|
+
) => {
|
|
67
|
+
return applyDecorators(
|
|
68
|
+
ApiExtraModels(PageDto, model),
|
|
69
|
+
ApiOkResponse({
|
|
70
|
+
description: 'Successfully received model list',
|
|
71
|
+
schema: {
|
|
72
|
+
allOf: [
|
|
73
|
+
{ $ref: getSchemaPath(PageDto) },
|
|
74
|
+
{
|
|
75
|
+
properties: {
|
|
76
|
+
data: {
|
|
77
|
+
type: 'array',
|
|
78
|
+
items: { $ref: getSchemaPath(model) },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: NestJS Architecture
|
|
3
|
+
description: Module organization, Dependency Injection patterns, and Project Structure.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [nestjs, architecture, modularity]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.module.ts', 'main.ts']
|
|
8
|
+
keywords: [Module, forRoot, forFeature, Dependency Injection]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# NestJS Architecture Standards
|
|
12
|
+
|
|
13
|
+
## Core Principles
|
|
14
|
+
|
|
15
|
+
1. **Modularity**: Every feature **must** be encapsulated in its own `@Module`.
|
|
16
|
+
- **Do**: `users.module.ts`, `auth.module.ts`.
|
|
17
|
+
- **Don't**: Everything in `app.module.ts`.
|
|
18
|
+
2. **Dependency Injection (DI)**: Invert control. Never manually instantiate classes (e.g., `new Service()`).
|
|
19
|
+
- **Use**: Constructor injection `constructor(private readonly service: Service)`.
|
|
20
|
+
3. **Scalability**: Use **Feature Modules** for domain logic and **Core/Shared Modules** for reusable utilities.
|
|
21
|
+
|
|
22
|
+
## Module Configuration
|
|
23
|
+
|
|
24
|
+
### Dynamic Modules
|
|
25
|
+
|
|
26
|
+
- **Modern Pattern**: Use `ConfigurableModuleBuilder` class to auto-generate `forRoot`/`register` methods properly.
|
|
27
|
+
- **Reference**: See [Dynamic Module Builder Implementation](references/dynamic-module.md) for the boilerplate code.
|
|
28
|
+
- **Conventions**:
|
|
29
|
+
- `forRoot`: Global configurations (Db, Config).
|
|
30
|
+
- `register`: Per-instance configurations.
|
|
31
|
+
- `forFeature`: Extending a module with specific providers/entities.
|
|
32
|
+
|
|
33
|
+
### Circular Dependencies
|
|
34
|
+
|
|
35
|
+
- **Avoid**: Re-architect to move shared logic to a common module.
|
|
36
|
+
- **Constraint**: If unavoidable, use `forwardRef(() => ModuleName)` on **both** sides of the import.
|
|
37
|
+
|
|
38
|
+
## Advanced Providers
|
|
39
|
+
|
|
40
|
+
- **Factory Providers**: Use `useFactory` heavily for providers dependent on configuration or async operations.
|
|
41
|
+
- **Aliasing**: Use `useExisting` to provide backward compatibility or abstract different implementations.
|
|
42
|
+
|
|
43
|
+
## Scopes & Lifecycle
|
|
44
|
+
|
|
45
|
+
- **Default**: **Singleton**. Best performance.
|
|
46
|
+
- **Request Scope**: Use `Scope.REQUEST` sparingly.
|
|
47
|
+
- **Performance Warning**: Request scope **bubbles up**. If a Service is request-scoped, every controller injecting it becomes request-scoped, triggering re-instantiation per request (~5-10% latency overhead).
|
|
48
|
+
- **Multi-tenancy**: If request-scope is needed (e.g. Tenant ID header), use **Durable Providers** (`durable: true`) with `ContextIdFactory` to reuse DI sub-trees.
|
|
49
|
+
- **Shutdown**: `SIGTERM` doesn't trigger cleanup by default.
|
|
50
|
+
- **Mandatory**: Call `app.enableShutdownHooks()` in `main.ts`.
|
|
51
|
+
|
|
52
|
+
## Structure & Organization
|
|
53
|
+
|
|
54
|
+
- **Feature Modules**: Domain logic (`ShopModule`, `AuthModule`). Encapsulated.
|
|
55
|
+
- **Shared Module**: Reusable providers (`DateService`, `MathService`) exported to other modules. **Stateless**.
|
|
56
|
+
- **Core Module**:
|
|
57
|
+
- **Role**: Global infrastructure setup ONE TIME (Interceptors, Filters, Loggers).
|
|
58
|
+
- **Rule**: Import `CoreModule` **only** in `AppModule`.
|
|
59
|
+
- **Contents**: `APP_INTERCEPTOR`, `APP_FILTER`, `APP_GUARD` providers.
|
|
60
|
+
|
|
61
|
+
## Reliability & Observability
|
|
62
|
+
|
|
63
|
+
- **Health Checks**: Mandatory for K8s/Docker.
|
|
64
|
+
- **Tool**: Use `@nestjs/terminus`. Expose `/health` endpoint checking DB, Cache (Redis), and Memory.
|
|
65
|
+
- **Structured Logging**:
|
|
66
|
+
- **Warning**: Default NestJS logger is unstructured text.
|
|
67
|
+
- **Standard**: Use `nestjs-pino` for JSON-formatted logs with automatic `req-id` correlation and request duration tracking.
|
|
68
|
+
- **Context**: Inject `Logger` into services to keep traces connected.
|