@ngxtm/devkit 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
- package/skills/learn/SKILL.md +476 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: TypeScript Best Practices
|
|
3
|
+
description: Idiomatic TypeScript patterns for clean, maintainable code.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [typescript, best-practices, idioms, conventions]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.ts', '**/*.tsx']
|
|
8
|
+
keywords: [class, function, module, import, export, async, promise]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TypeScript Best Practices
|
|
12
|
+
|
|
13
|
+
## **Priority: P1 (OPERATIONAL)**
|
|
14
|
+
|
|
15
|
+
Idiomatic patterns for writing clean, maintainable TypeScript code.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Naming Conventions**:
|
|
20
|
+
- PascalCase for classes, interfaces, types, enums
|
|
21
|
+
- camelCase for variables, functions, methods, parameters
|
|
22
|
+
- UPPER_SNAKE_CASE for constants
|
|
23
|
+
- Prefix interfaces with `I` only when necessary for disambiguation
|
|
24
|
+
- **Functions**:
|
|
25
|
+
- Prefer arrow functions for callbacks and short functions
|
|
26
|
+
- Use regular functions for methods and exported functions
|
|
27
|
+
- Always specify return types for public APIs
|
|
28
|
+
- **Modules**:
|
|
29
|
+
- One export per file for major components/classes
|
|
30
|
+
- Use named exports over default exports for better refactoring
|
|
31
|
+
- Organize imports: external -> internal -> relative
|
|
32
|
+
- **Async/Await**:
|
|
33
|
+
- Prefer `async/await` over raw Promises
|
|
34
|
+
- Always handle errors with try/catch in async functions
|
|
35
|
+
- Use `Promise.all()` for parallel operations
|
|
36
|
+
- **Classes**:
|
|
37
|
+
- Use `private`/`protected`/`public` modifiers explicitly
|
|
38
|
+
- Prefer composition over inheritance
|
|
39
|
+
- Use `readonly` for properties that don't change after construction
|
|
40
|
+
- **Exhaustiveness Checking**: Use `never` type in `switch` cases.
|
|
41
|
+
- **Assertion Functions**: Use `asserts` for runtime type validation.
|
|
42
|
+
- **Optional Properties**: Use `?:`, not `| undefined`.
|
|
43
|
+
- **Type Imports**: Use `import type` for tree-shaking.
|
|
44
|
+
|
|
45
|
+
## Anti-Patterns
|
|
46
|
+
|
|
47
|
+
- **No Default Exports**: Use named exports.
|
|
48
|
+
- **No Implicit Returns**: Specify return types.
|
|
49
|
+
- **No Unused Variables**: Enable `noUnusedLocals`.
|
|
50
|
+
- **No `require`**: Use ES6 `import`.
|
|
51
|
+
- **No Empty Interfaces**: Use `type` or non-empty interface.
|
|
52
|
+
|
|
53
|
+
## Code
|
|
54
|
+
|
|
55
|
+
````typescript
|
|
56
|
+
// Named Export + Immutable Interface
|
|
57
|
+
export interface User {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Exhaustive Check
|
|
63
|
+
function getStatus(s: 'ok' | 'fail') {
|
|
64
|
+
switch (s) {
|
|
65
|
+
case 'ok': return 'OK';
|
|
66
|
+
case 'fail': return 'Fail';
|
|
67
|
+
default: const _chk: never = s; return _chk;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Assertion
|
|
72
|
+
function assertDefined<T>(val: T): asserts val is NonNullable<T> {
|
|
73
|
+
if (val == null) throw new Error("Defined expected");
|
|
74
|
+
}
|
|
75
|
+
``` private readonly repository: UserRepository;
|
|
76
|
+
|
|
77
|
+
constructor(repository: UserRepository) {
|
|
78
|
+
this.repository = repository;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async getUser(id: string): Promise<UserProfile> {
|
|
82
|
+
try {
|
|
83
|
+
return await this.repository.findById(id);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
throw new Error(`Failed to get user: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Organize imports
|
|
91
|
+
import { Injectable } from '@nestjs/common';
|
|
92
|
+
import { ConfigService } from '@nestjs/config';
|
|
93
|
+
|
|
94
|
+
import { UserRepository } from '@/repositories/user.repository';
|
|
95
|
+
import { Logger } from '@/utils/logger';
|
|
96
|
+
|
|
97
|
+
// Type-only imports
|
|
98
|
+
import type { Request, Response } from 'express';
|
|
99
|
+
````
|
|
100
|
+
|
|
101
|
+
## Reference & Examples
|
|
102
|
+
|
|
103
|
+
For project structure and module organization:
|
|
104
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
105
|
+
|
|
106
|
+
## Related Topics
|
|
107
|
+
|
|
108
|
+
language | tooling | security
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# TypeScript Best Practices Reference
|
|
2
|
+
|
|
3
|
+
Project structure and advanced patterns.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Project Structure**](project-structure.md) - Scalable directory organization.
|
|
8
|
+
- [**Configuration**](configuration.md) - TSConfig best practices.
|
|
9
|
+
|
|
10
|
+
## Project Structure
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
src/
|
|
14
|
+
├── domain/ # Business logic (entities, value objects)
|
|
15
|
+
│ ├── user/
|
|
16
|
+
│ │ ├── user.entity.ts
|
|
17
|
+
│ │ └── user.repository.interface.ts
|
|
18
|
+
├── application/ # Use cases
|
|
19
|
+
│ └── user/
|
|
20
|
+
│ └── create-user.usecase.ts
|
|
21
|
+
├── infrastructure/ # External concerns
|
|
22
|
+
│ ├── database/
|
|
23
|
+
│ └── http/
|
|
24
|
+
├── presentation/ # Controllers, DTOs
|
|
25
|
+
│ └── user/
|
|
26
|
+
│ ├── user.controller.ts
|
|
27
|
+
│ └── user.dto.ts
|
|
28
|
+
└── shared/ # Shared utilities
|
|
29
|
+
├── types/
|
|
30
|
+
└── utils/
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## TSConfig Best Practices
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"compilerOptions": {
|
|
38
|
+
"target": "ES2022",
|
|
39
|
+
"module": "commonjs",
|
|
40
|
+
"lib": ["ES2022"],
|
|
41
|
+
"strict": true,
|
|
42
|
+
"esModuleInterop": true,
|
|
43
|
+
"skipLibCheck": true,
|
|
44
|
+
"forceConsistentCasingInFileNames": true,
|
|
45
|
+
"resolveJsonModule": true,
|
|
46
|
+
"noUnusedLocals": true,
|
|
47
|
+
"noUnusedParameters": true,
|
|
48
|
+
"noImplicitReturns": true,
|
|
49
|
+
"noFallthroughCasesInSwitch": true,
|
|
50
|
+
"moduleResolution": "node",
|
|
51
|
+
"baseUrl": "./",
|
|
52
|
+
"paths": {
|
|
53
|
+
"@/*": ["src/*"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Barrel Exports (Use Sparingly)
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// index.ts - Barrel file
|
|
63
|
+
export * from './user.service';
|
|
64
|
+
export * from './user.repository';
|
|
65
|
+
export type { UserDTO } from './user.dto';
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Note: Avoid deep barrel exports as they can impact build performance.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: TypeScript Language Patterns
|
|
3
|
+
description: Modern TypeScript standards for type safety, performance, and maintainability.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [typescript, language, types, generics]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.ts', '**/*.tsx', 'tsconfig.json']
|
|
8
|
+
keywords:
|
|
9
|
+
[
|
|
10
|
+
type,
|
|
11
|
+
interface,
|
|
12
|
+
generic,
|
|
13
|
+
enum,
|
|
14
|
+
union,
|
|
15
|
+
intersection,
|
|
16
|
+
readonly,
|
|
17
|
+
const,
|
|
18
|
+
namespace,
|
|
19
|
+
]
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# TypeScript Language Patterns
|
|
23
|
+
|
|
24
|
+
## **Priority: P0 (CRITICAL)**
|
|
25
|
+
|
|
26
|
+
Modern TypeScript standards for type-safe, maintainable code.
|
|
27
|
+
|
|
28
|
+
## Implementation Guidelines
|
|
29
|
+
|
|
30
|
+
- **Type Annotations**: Explicit params/returns. Infer locals.
|
|
31
|
+
- **Interfaces vs Types**: `interface` for APIs. `type` for unions.
|
|
32
|
+
- **Strict Mode**: `strict: true`.
|
|
33
|
+
- **Null Safety**: `?.` and `??`.
|
|
34
|
+
- **Enums**: Literal unions or `as const`.
|
|
35
|
+
- **Generics**: Reusable, type-safe code.
|
|
36
|
+
- **Type Guards**: `typeof`, `instanceof`, predicates.
|
|
37
|
+
- **Utility Types**: `Partial`, `Pick`, `Omit`, `Record`.
|
|
38
|
+
- **Immutability**: `readonly` arrays/objects.
|
|
39
|
+
- **Const Assertions**: `as const` and `satisfies`.
|
|
40
|
+
- **Template Literals**: `on${Capitalize<string>}`.
|
|
41
|
+
- **Discriminated Unions**: Literal `kind` property.
|
|
42
|
+
- **Advanced**: Mapped, Conditional, Indexed types.
|
|
43
|
+
- **Branded Types**: `string & { __brand: 'Id' }`.
|
|
44
|
+
|
|
45
|
+
## Anti-Patterns
|
|
46
|
+
|
|
47
|
+
- **No `any`**: Use `unknown`.
|
|
48
|
+
- **No `Function`**: Use signature `() => void`.
|
|
49
|
+
- **No `enum`**: Runtime cost.
|
|
50
|
+
- **No `!`**: Use narrowing.
|
|
51
|
+
|
|
52
|
+
## Code
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Branded Type
|
|
56
|
+
type UserId = string & { __brand: 'Id' };
|
|
57
|
+
|
|
58
|
+
// Satisfies (Validate + Infer)
|
|
59
|
+
const cfg = { port: 3000 } satisfies Record<string, number>;
|
|
60
|
+
|
|
61
|
+
// Discriminated Union
|
|
62
|
+
type Result<T> = { kind: 'ok'; data: T } | { kind: 'err'; error: Error };
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Reference & Examples
|
|
66
|
+
|
|
67
|
+
For advanced type patterns and utility types:
|
|
68
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
69
|
+
|
|
70
|
+
## Related Topics
|
|
71
|
+
|
|
72
|
+
best-practices | security | tooling
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# TypeScript Language Patterns Reference
|
|
2
|
+
|
|
3
|
+
Advanced type patterns and utility implementations.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Advanced Types**](advanced-types.md) - Conditional types, mapped types, and template literals.
|
|
8
|
+
- [**Type Guards**](type-guards.md) - Custom type guard patterns.
|
|
9
|
+
- [**Utility Types**](utility-types.md) - Custom utility type implementations.
|
|
10
|
+
|
|
11
|
+
## Advanced Generic Patterns
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// Conditional types
|
|
15
|
+
type NonNullable<T> = T extends null | undefined ? never : T;
|
|
16
|
+
|
|
17
|
+
// Mapped types
|
|
18
|
+
type Readonly<T> = {
|
|
19
|
+
readonly [P in keyof T]: T[P];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Template literal types
|
|
23
|
+
type EventName<T extends string> = `on${Capitalize<T>}`;
|
|
24
|
+
|
|
25
|
+
// Recursive types
|
|
26
|
+
type DeepReadonly<T> = {
|
|
27
|
+
readonly [P in keyof T]: T[P] extends object
|
|
28
|
+
? DeepReadonly<T[P]>
|
|
29
|
+
: T[P];
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Branded Types for Type Safety
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
type UserId = string & { readonly __brand: 'UserId' };
|
|
37
|
+
type OrderId = string & { readonly __brand: 'OrderId' };
|
|
38
|
+
|
|
39
|
+
function createUserId(id: string): UserId {
|
|
40
|
+
return id as UserId;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Prevents mixing IDs at compile time
|
|
44
|
+
function getUser(id: UserId) { /* ... */ }
|
|
45
|
+
getUser(createUserId('123')); // OK
|
|
46
|
+
// getUser('123'); // Error: Type 'string' is not assignable to type 'UserId'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Discriminated Unions
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
type Shape =
|
|
53
|
+
| { kind: 'circle'; radius: number }
|
|
54
|
+
| { kind: 'rectangle'; width: number; height: number }
|
|
55
|
+
| { kind: 'square'; size: number };
|
|
56
|
+
|
|
57
|
+
function area(shape: Shape): number {
|
|
58
|
+
switch (shape.kind) {
|
|
59
|
+
case 'circle':
|
|
60
|
+
return Math.PI * shape.radius ** 2;
|
|
61
|
+
case 'rectangle':
|
|
62
|
+
return shape.width * shape.height;
|
|
63
|
+
case 'square':
|
|
64
|
+
return shape.size ** 2;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: typescript-patterns
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
triggers: [typescript, types, patterns]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# TypeScript Patterns
|
|
8
|
+
|
|
9
|
+
Type-safe patterns for robust code.
|
|
10
|
+
|
|
11
|
+
## Discriminated Unions
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
type Result<T, E = Error> =
|
|
15
|
+
| { ok: true; value: T }
|
|
16
|
+
| { ok: false; error: E };
|
|
17
|
+
|
|
18
|
+
function handle(result: Result<User>) {
|
|
19
|
+
if (result.ok) {
|
|
20
|
+
console.log(result.value.name);
|
|
21
|
+
} else {
|
|
22
|
+
console.error(result.error.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Branded Types
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
type UserId = string & { readonly __brand: 'UserId' };
|
|
31
|
+
|
|
32
|
+
function createUserId(id: string): UserId {
|
|
33
|
+
return id as UserId;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getUser(id: UserId) { /* ... */ }
|
|
37
|
+
|
|
38
|
+
// Prevents accidental mixing
|
|
39
|
+
const userId = createUserId('123');
|
|
40
|
+
const orderId = '456';
|
|
41
|
+
|
|
42
|
+
getUser(userId); // OK
|
|
43
|
+
getUser(orderId); // Type error
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Exhaustive Checks
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
type Status = 'pending' | 'active' | 'closed';
|
|
50
|
+
|
|
51
|
+
function assertNever(x: never): never {
|
|
52
|
+
throw new Error(`Unexpected: ${x}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getLabel(status: Status): string {
|
|
56
|
+
switch (status) {
|
|
57
|
+
case 'pending': return 'Pending';
|
|
58
|
+
case 'active': return 'Active';
|
|
59
|
+
case 'closed': return 'Closed';
|
|
60
|
+
default: return assertNever(status);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Builder Pattern
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
class QueryBuilder {
|
|
69
|
+
private filters: string[] = [];
|
|
70
|
+
|
|
71
|
+
where(field: string, value: unknown): this {
|
|
72
|
+
this.filters.push(`${field} = ${value}`);
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
build(): string {
|
|
77
|
+
return this.filters.join(' AND ');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
new QueryBuilder()
|
|
82
|
+
.where('status', 'active')
|
|
83
|
+
.where('age', 18)
|
|
84
|
+
.build();
|
|
85
|
+
```
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: TypeScript Security
|
|
3
|
+
description: Secure coding practices for building safe TypeScript applications.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [security, typescript, validation, sanitization]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.ts', '**/*.tsx']
|
|
8
|
+
keywords:
|
|
9
|
+
[validate, sanitize, xss, injection, auth, password, secret, token]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TypeScript Security
|
|
13
|
+
|
|
14
|
+
## **Priority: P0 (CRITICAL)**
|
|
15
|
+
|
|
16
|
+
Security standards for TypeScript applications based on OWASP guidelines.
|
|
17
|
+
|
|
18
|
+
## Implementation Guidelines
|
|
19
|
+
|
|
20
|
+
- **Validation**: Validate all inputs with `zod`/`joi`/`class-validator`.
|
|
21
|
+
- **Sanitization**: Use `DOMPurify` for HTML. Prevent XSS.
|
|
22
|
+
- **Secrets**: Use env vars. Never hardcode.
|
|
23
|
+
- **SQL Injection**: Use parameterized queries or ORMs (Prisma/TypeORM).
|
|
24
|
+
- **Auth**: Use `bcrypt` for hashing. Implement strict RBAC.
|
|
25
|
+
- **HTTPS**: Enforce HTTPS. Set `secure`, `httpOnly`, `sameSite` cookies.
|
|
26
|
+
- **Rate Limit**: Prevent brute-force/DDoS.
|
|
27
|
+
- **Deps**: Audit with `npm audit`.
|
|
28
|
+
|
|
29
|
+
## Anti-Patterns
|
|
30
|
+
|
|
31
|
+
- **No `eval()`**: Avoid dynamic execution.
|
|
32
|
+
- **No Plaintext**: Never commit secrets.
|
|
33
|
+
- **No Trust**: Validate everything server-side.
|
|
34
|
+
|
|
35
|
+
## Code
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Validation (Zod)
|
|
39
|
+
const UserSchema = z.object({
|
|
40
|
+
email: z.string().email(),
|
|
41
|
+
pass: z.string().min(8),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Secure Cookie
|
|
45
|
+
const cookieOpts = {
|
|
46
|
+
httpOnly: true,
|
|
47
|
+
secure: process.env.NODE_ENV === 'prod',
|
|
48
|
+
sameSite: 'strict' as const,
|
|
49
|
+
};
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Reference & Examples
|
|
53
|
+
|
|
54
|
+
For authentication patterns and security headers:
|
|
55
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
56
|
+
|
|
57
|
+
## Related Topics
|
|
58
|
+
|
|
59
|
+
best-practices | language
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# TypeScript Security Reference
|
|
2
|
+
|
|
3
|
+
Authentication, authorization, and security patterns.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Authentication**](authentication.md) - JWT and session management.
|
|
8
|
+
- [**Security Headers**](security-headers.md) - HTTP security headers configuration.
|
|
9
|
+
|
|
10
|
+
## JWT Authentication Pattern
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import jwt from 'jsonwebtoken';
|
|
14
|
+
|
|
15
|
+
interface JWTPayload {
|
|
16
|
+
userId: string;
|
|
17
|
+
role: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class AuthService {
|
|
21
|
+
private readonly secret: string;
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
this.secret = process.env.JWT_SECRET!;
|
|
25
|
+
if (!this.secret) {
|
|
26
|
+
throw new Error('JWT_SECRET environment variable is required');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
generateToken(payload: JWTPayload): string {
|
|
31
|
+
return jwt.sign(payload, this.secret, {
|
|
32
|
+
expiresIn: '1h',
|
|
33
|
+
issuer: 'your-app',
|
|
34
|
+
audience: 'your-api',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
verifyToken(token: string): JWTPayload {
|
|
39
|
+
try {
|
|
40
|
+
return jwt.verify(token, this.secret) as JWTPayload;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
throw new Error('Invalid token');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Security Headers (Express)
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import helmet from 'helmet';
|
|
52
|
+
import express from 'express';
|
|
53
|
+
|
|
54
|
+
const app = express();
|
|
55
|
+
|
|
56
|
+
// Security headers
|
|
57
|
+
app.use(helmet({
|
|
58
|
+
contentSecurityPolicy: {
|
|
59
|
+
directives: {
|
|
60
|
+
defaultSrc: ["'self'"],
|
|
61
|
+
scriptSrc: ["'self'"],
|
|
62
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
63
|
+
imgSrc: ["'self'", 'data:', 'https:'],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
hsts: {
|
|
67
|
+
maxAge: 31536000,
|
|
68
|
+
includeSubDomains: true,
|
|
69
|
+
preload: true,
|
|
70
|
+
},
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
// CORS configuration
|
|
74
|
+
app.use(cors({
|
|
75
|
+
origin: process.env.ALLOWED_ORIGINS?.split(',') || [],
|
|
76
|
+
credentials: true,
|
|
77
|
+
}));
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Role-Based Access Control
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
enum Role {
|
|
84
|
+
ADMIN = 'admin',
|
|
85
|
+
USER = 'user',
|
|
86
|
+
GUEST = 'guest',
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
type Permission = 'read' | 'write' | 'delete';
|
|
90
|
+
|
|
91
|
+
const rolePermissions: Record<Role, Permission[]> = {
|
|
92
|
+
[Role.ADMIN]: ['read', 'write', 'delete'],
|
|
93
|
+
[Role.USER]: ['read', 'write'],
|
|
94
|
+
[Role.GUEST]: ['read'],
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
function hasPermission(role: Role, permission: Permission): boolean {
|
|
98
|
+
return rolePermissions[role].includes(permission);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Middleware
|
|
102
|
+
function requirePermission(permission: Permission) {
|
|
103
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
104
|
+
const user = req.user; // Assume user is set by auth middleware
|
|
105
|
+
|
|
106
|
+
if (!user || !hasPermission(user.role, permission)) {
|
|
107
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
next();
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: TypeScript Tooling
|
|
3
|
+
description: Development tools, linting, and build configuration for TypeScript projects.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [tooling, typescript, eslint, prettier, testing]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['tsconfig.json', '.eslintrc.*', 'jest.config.*', 'package.json']
|
|
8
|
+
keywords: [eslint, prettier, jest, vitest, build, compile, lint]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TypeScript Tooling
|
|
12
|
+
|
|
13
|
+
## **Priority: P1 (OPERATIONAL)**
|
|
14
|
+
|
|
15
|
+
Essential tooling for TypeScript development and maintenance.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Compiler**: `tsc` for CI. `ts-node`/`esbuild` for dev.
|
|
20
|
+
- **Lint**: ESLint + `@typescript-eslint`. Strict type checking.
|
|
21
|
+
- **Format**: Prettier (on save + commit).
|
|
22
|
+
- **Test**: Jest/Vitest > 80% coverage.
|
|
23
|
+
- **Build**: `tsup` (libs), Vite/Webpack (apps).
|
|
24
|
+
- **Check**: `tsc --noEmit` in CI.
|
|
25
|
+
|
|
26
|
+
## Anti-Patterns
|
|
27
|
+
|
|
28
|
+
- **No Disable**: Avoid `// eslint-disable`.
|
|
29
|
+
- **No Skip**: Avoid `skipLibCheck: true` if possible.
|
|
30
|
+
- **No Ignore**: Use `@ts-expect-error` > `@ts-ignore`.
|
|
31
|
+
|
|
32
|
+
## Configuration
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
// tsconfig.json
|
|
36
|
+
{
|
|
37
|
+
"compilerOptions": {
|
|
38
|
+
"strict": true,
|
|
39
|
+
"noImplicitReturns": true,
|
|
40
|
+
"noUnusedLocals": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Reference & Examples
|
|
46
|
+
|
|
47
|
+
For testing configuration and CI/CD setup:
|
|
48
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
49
|
+
|
|
50
|
+
## Related Topics
|
|
51
|
+
|
|
52
|
+
best-practices | language
|