@ngxtm/devkit 3.4.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.
Files changed (343) hide show
  1. package/package.json +2 -1
  2. package/rules/README.md +141 -0
  3. package/rules/dart/best-practices/SKILL.md +23 -0
  4. package/rules/dart/language/SKILL.md +52 -0
  5. package/rules/dart/tooling/SKILL.md +43 -0
  6. package/rules/dotnet/aspnet-core/SKILL.md +92 -0
  7. package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
  8. package/rules/dotnet/best-practices/SKILL.md +101 -0
  9. package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
  10. package/rules/dotnet/blazor/SKILL.md +146 -0
  11. package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
  12. package/rules/dotnet/language/SKILL.md +82 -0
  13. package/rules/dotnet/language/references/REFERENCE.md +222 -0
  14. package/rules/dotnet/patterns.rule.md +388 -0
  15. package/rules/dotnet/razor-pages/SKILL.md +124 -0
  16. package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
  17. package/rules/dotnet/security/SKILL.md +89 -0
  18. package/rules/dotnet/security/references/REFERENCE.md +295 -0
  19. package/rules/dotnet/tooling/SKILL.md +92 -0
  20. package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
  21. package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
  22. package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
  23. package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
  24. package/rules/flutter/bloc-state-management/SKILL.md +64 -0
  25. package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
  26. package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
  27. package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
  28. package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
  29. package/rules/flutter/bloc.rule.md +76 -0
  30. package/rules/flutter/cicd/SKILL.md +48 -0
  31. package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
  32. package/rules/flutter/cicd/references/fastlane.md +139 -0
  33. package/rules/flutter/cicd/references/github-actions.md +59 -0
  34. package/rules/flutter/dependency-injection/SKILL.md +42 -0
  35. package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
  36. package/rules/flutter/dependency-injection/references/modules.md +37 -0
  37. package/rules/flutter/error-handling/SKILL.md +32 -0
  38. package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
  39. package/rules/flutter/error-handling/references/error-mapping.md +31 -0
  40. package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
  41. package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
  42. package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
  43. package/rules/flutter/getx-navigation/SKILL.md +70 -0
  44. package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
  45. package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
  46. package/rules/flutter/getx-state-management/SKILL.md +76 -0
  47. package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
  48. package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
  49. package/rules/flutter/go-router-navigation/SKILL.md +57 -0
  50. package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
  51. package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
  52. package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
  53. package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
  54. package/rules/flutter/localization/SKILL.md +50 -0
  55. package/rules/flutter/localization/references/REFERENCE.md +48 -0
  56. package/rules/flutter/localization/references/sheet-loader.md +33 -0
  57. package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
  58. package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
  59. package/rules/flutter/performance/SKILL.md +24 -0
  60. package/rules/flutter/retrofit-networking/SKILL.md +51 -0
  61. package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
  62. package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
  63. package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
  64. package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
  65. package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
  66. package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
  67. package/rules/flutter/riverpod.rule.md +78 -0
  68. package/rules/flutter/security/SKILL.md +33 -0
  69. package/rules/flutter/security/references/REFERENCE.md +15 -0
  70. package/rules/flutter/security/references/network-security.md +28 -0
  71. package/rules/flutter/testing/SKILL.md +44 -0
  72. package/rules/flutter/testing/references/REFERENCE.md +21 -0
  73. package/rules/flutter/testing/references/bloc-testing.md +38 -0
  74. package/rules/flutter/testing/references/integration-testing.md +128 -0
  75. package/rules/flutter/testing/references/robot-pattern.md +82 -0
  76. package/rules/flutter/testing/references/unit-testing.md +130 -0
  77. package/rules/flutter/testing/references/widget-testing.md +120 -0
  78. package/rules/flutter/widgets/SKILL.md +37 -0
  79. package/rules/golang/chi-router/SKILL.md +219 -0
  80. package/rules/golang/chi-router/references/REFERENCE.md +13 -0
  81. package/rules/golang/chi-router/references/routing-patterns.md +205 -0
  82. package/rules/golang/cobra-cli/SKILL.md +227 -0
  83. package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
  84. package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
  85. package/rules/golang/core/SKILL.md +210 -0
  86. package/rules/golang/core/references/REFERENCE.md +14 -0
  87. package/rules/golang/core/references/concurrency-patterns.md +114 -0
  88. package/rules/golang/core/references/error-handling.md +87 -0
  89. package/rules/golang/echo-framework/SKILL.md +215 -0
  90. package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
  91. package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
  92. package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
  93. package/rules/golang/ent-orm/SKILL.md +239 -0
  94. package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
  95. package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
  96. package/rules/golang/fiber-framework/SKILL.md +196 -0
  97. package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
  98. package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
  99. package/rules/golang/gin-framework/SKILL.md +205 -0
  100. package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
  101. package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
  102. package/rules/golang/gorm-orm/SKILL.md +196 -0
  103. package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
  104. package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
  105. package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
  106. package/rules/golang/grpc/SKILL.md +231 -0
  107. package/rules/golang/grpc/references/REFERENCE.md +13 -0
  108. package/rules/golang/grpc/references/service-patterns.md +276 -0
  109. package/rules/golang/testify/SKILL.md +239 -0
  110. package/rules/golang/testify/references/REFERENCE.md +13 -0
  111. package/rules/golang/testify/references/assert-patterns.md +170 -0
  112. package/rules/golang/validator/SKILL.md +234 -0
  113. package/rules/golang/validator/references/REFERENCE.md +13 -0
  114. package/rules/golang/validator/references/validation-tags.md +211 -0
  115. package/rules/golang/viper-config/SKILL.md +244 -0
  116. package/rules/golang/viper-config/references/REFERENCE.md +13 -0
  117. package/rules/golang/viper-config/references/config-loading.md +181 -0
  118. package/rules/golang/wire-di/SKILL.md +243 -0
  119. package/rules/golang/wire-di/references/REFERENCE.md +13 -0
  120. package/rules/golang/wire-di/references/provider-patterns.md +193 -0
  121. package/rules/golang/zap-logging/SKILL.md +203 -0
  122. package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
  123. package/rules/golang/zap-logging/references/logger-config.md +165 -0
  124. package/rules/java/build-gradle/SKILL.md +92 -0
  125. package/rules/java/build-gradle/references/REFERENCE.md +14 -0
  126. package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
  127. package/rules/java/build-gradle/references/task-configuration.md +132 -0
  128. package/rules/java/build-maven/SKILL.md +86 -0
  129. package/rules/java/build-maven/references/REFERENCE.md +14 -0
  130. package/rules/java/build-maven/references/dependency-management.md +111 -0
  131. package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
  132. package/rules/java/graalvm-native/SKILL.md +105 -0
  133. package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
  134. package/rules/java/java-collections-streams/SKILL.md +148 -0
  135. package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
  136. package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
  137. package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
  138. package/rules/java/java-concurrency/SKILL.md +187 -0
  139. package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
  140. package/rules/java/java-concurrency/references/completable-future.md +165 -0
  141. package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
  142. package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
  143. package/rules/java/java-core-language/SKILL.md +121 -0
  144. package/rules/java/java-core-language/references/REFERENCE.md +15 -0
  145. package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
  146. package/rules/java/java-core-language/references/modern-java-features.md +168 -0
  147. package/rules/java/java-project-structure/SKILL.md +195 -0
  148. package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
  149. package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
  150. package/rules/java/java-project-structure/references/module-system.md +159 -0
  151. package/rules/java/micronaut-core/SKILL.md +99 -0
  152. package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
  153. package/rules/java/micronaut-reactive/SKILL.md +68 -0
  154. package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
  155. package/rules/java/quarkus-core/SKILL.md +85 -0
  156. package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
  157. package/rules/java/quarkus-reactive/SKILL.md +67 -0
  158. package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
  159. package/rules/java/spring-batch/SKILL.md +102 -0
  160. package/rules/java/spring-batch/references/REFERENCE.md +12 -0
  161. package/rules/java/spring-boot-architecture/SKILL.md +206 -0
  162. package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
  163. package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
  164. package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
  165. package/rules/java/spring-boot-web/SKILL.md +217 -0
  166. package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
  167. package/rules/java/spring-cloud/SKILL.md +109 -0
  168. package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
  169. package/rules/java/spring-data-jpa/SKILL.md +241 -0
  170. package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
  171. package/rules/java/spring-security/SKILL.md +161 -0
  172. package/rules/java/spring-security/references/REFERENCE.md +16 -0
  173. package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
  174. package/rules/java/testing-junit-mockito/SKILL.md +135 -0
  175. package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
  176. package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
  177. package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
  178. package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
  179. package/rules/javascript/best-practices/SKILL.md +64 -0
  180. package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
  181. package/rules/javascript/language/SKILL.md +71 -0
  182. package/rules/javascript/language/references/REFERENCE.md +106 -0
  183. package/rules/javascript/tooling/SKILL.md +60 -0
  184. package/rules/javascript/tooling/references/REFERENCE.md +107 -0
  185. package/rules/metadata.json +54 -0
  186. package/rules/nestjs/api-standards/SKILL.md +47 -0
  187. package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
  188. package/rules/nestjs/architecture/SKILL.md +68 -0
  189. package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
  190. package/rules/nestjs/caching/SKILL.md +51 -0
  191. package/rules/nestjs/caching/references/REFERENCE.md +13 -0
  192. package/rules/nestjs/caching/references/cache-patterns.md +183 -0
  193. package/rules/nestjs/configuration/SKILL.md +41 -0
  194. package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
  195. package/rules/nestjs/configuration/references/config-patterns.md +184 -0
  196. package/rules/nestjs/controllers-services/SKILL.md +63 -0
  197. package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
  198. package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
  199. package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
  200. package/rules/nestjs/database/SKILL.md +102 -0
  201. package/rules/nestjs/database/references/REFERENCE.md +14 -0
  202. package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
  203. package/rules/nestjs/deployment/SKILL.md +36 -0
  204. package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
  205. package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
  206. package/rules/nestjs/documentation/SKILL.md +64 -0
  207. package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
  208. package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
  209. package/rules/nestjs/error-handling/SKILL.md +55 -0
  210. package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
  211. package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
  212. package/rules/nestjs/file-uploads/SKILL.md +35 -0
  213. package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
  214. package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
  215. package/rules/nestjs/observability/SKILL.md +39 -0
  216. package/rules/nestjs/observability/references/REFERENCE.md +13 -0
  217. package/rules/nestjs/observability/references/logging-metrics.md +175 -0
  218. package/rules/nestjs/performance/SKILL.md +60 -0
  219. package/rules/nestjs/performance/references/REFERENCE.md +13 -0
  220. package/rules/nestjs/performance/references/performance-patterns.md +107 -0
  221. package/rules/nestjs/real-time/SKILL.md +45 -0
  222. package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
  223. package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
  224. package/rules/nestjs/scheduling/SKILL.md +39 -0
  225. package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
  226. package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
  227. package/rules/nestjs/search/SKILL.md +41 -0
  228. package/rules/nestjs/search/references/REFERENCE.md +13 -0
  229. package/rules/nestjs/search/references/search-patterns.md +137 -0
  230. package/rules/nestjs/security/SKILL.md +87 -0
  231. package/rules/nestjs/security/references/REFERENCE.md +14 -0
  232. package/rules/nestjs/security/references/authentication.md +151 -0
  233. package/rules/nestjs/testing/SKILL.md +40 -0
  234. package/rules/nestjs/testing/references/REFERENCE.md +14 -0
  235. package/rules/nestjs/testing/references/unit-testing.md +179 -0
  236. package/rules/nestjs/transport/SKILL.md +45 -0
  237. package/rules/nestjs/transport/references/REFERENCE.md +13 -0
  238. package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
  239. package/rules/nextjs/app-router/SKILL.md +46 -0
  240. package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
  241. package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
  242. package/rules/nextjs/architecture/SKILL.md +44 -0
  243. package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
  244. package/rules/nextjs/authentication/SKILL.md +29 -0
  245. package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
  246. package/rules/nextjs/caching/SKILL.md +66 -0
  247. package/rules/nextjs/caching/references/REFERENCE.md +13 -0
  248. package/rules/nextjs/caching/references/cache-strategies.md +168 -0
  249. package/rules/nextjs/data-access-layer/SKILL.md +33 -0
  250. package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
  251. package/rules/nextjs/data-fetching/SKILL.md +59 -0
  252. package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
  253. package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
  254. package/rules/nextjs/internationalization/SKILL.md +105 -0
  255. package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
  256. package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
  257. package/rules/nextjs/optimization/SKILL.md +64 -0
  258. package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
  259. package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
  260. package/rules/nextjs/rendering/SKILL.md +91 -0
  261. package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
  262. package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
  263. package/rules/nextjs/server-actions/SKILL.md +46 -0
  264. package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
  265. package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
  266. package/rules/nextjs/server-components/SKILL.md +52 -0
  267. package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
  268. package/rules/nextjs/server-components/references/component-patterns.md +175 -0
  269. package/rules/nextjs/state-management/SKILL.md +73 -0
  270. package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
  271. package/rules/nextjs/state-management/references/state-patterns.md +218 -0
  272. package/rules/nextjs/styling/SKILL.md +31 -0
  273. package/rules/nextjs/styling/references/implementation.md +56 -0
  274. package/rules/react/component-patterns/SKILL.md +66 -0
  275. package/rules/react/component-patterns/references/REFERENCE.md +126 -0
  276. package/rules/react/hooks/SKILL.md +60 -0
  277. package/rules/react/hooks/references/REFERENCE.md +132 -0
  278. package/rules/react/hooks.rule.md +79 -0
  279. package/rules/react/performance/SKILL.md +69 -0
  280. package/rules/react/performance/references/REFERENCE.md +143 -0
  281. package/rules/react/security/SKILL.md +46 -0
  282. package/rules/react/security/references/REFERENCE.md +170 -0
  283. package/rules/react/state-management/SKILL.md +56 -0
  284. package/rules/react/state-management/references/REFERENCE.md +137 -0
  285. package/rules/react/testing/SKILL.md +45 -0
  286. package/rules/react/testing/references/REFERENCE.md +149 -0
  287. package/rules/react/tooling/SKILL.md +39 -0
  288. package/rules/react/typescript/SKILL.md +53 -0
  289. package/rules/rust/actix-web/SKILL.md +160 -0
  290. package/rules/rust/actix-web/references/REFERENCE.md +13 -0
  291. package/rules/rust/actix-web/references/handler-patterns.md +198 -0
  292. package/rules/rust/async-graphql/SKILL.md +228 -0
  293. package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
  294. package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
  295. package/rules/rust/axum/SKILL.md +161 -0
  296. package/rules/rust/axum/references/REFERENCE.md +14 -0
  297. package/rules/rust/axum/references/handler-patterns.md +97 -0
  298. package/rules/rust/bevy/SKILL.md +206 -0
  299. package/rules/rust/bevy/references/REFERENCE.md +13 -0
  300. package/rules/rust/bevy/references/ecs-patterns.md +226 -0
  301. package/rules/rust/clap/SKILL.md +217 -0
  302. package/rules/rust/clap/references/REFERENCE.md +13 -0
  303. package/rules/rust/clap/references/derive-patterns.md +205 -0
  304. package/rules/rust/core/SKILL.md +154 -0
  305. package/rules/rust/core/references/REFERENCE.md +14 -0
  306. package/rules/rust/core/references/error-handling.md +92 -0
  307. package/rules/rust/diesel-orm/SKILL.md +176 -0
  308. package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
  309. package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
  310. package/rules/rust/rocket/SKILL.md +182 -0
  311. package/rules/rust/rocket/references/REFERENCE.md +13 -0
  312. package/rules/rust/rocket/references/handler-patterns.md +209 -0
  313. package/rules/rust/sea-orm/SKILL.md +230 -0
  314. package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
  315. package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
  316. package/rules/rust/serde-serialization/SKILL.md +150 -0
  317. package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
  318. package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
  319. package/rules/rust/sqlx-database/SKILL.md +140 -0
  320. package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
  321. package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
  322. package/rules/rust/tauri/SKILL.md +180 -0
  323. package/rules/rust/tauri/references/REFERENCE.md +13 -0
  324. package/rules/rust/tauri/references/command-patterns.md +209 -0
  325. package/rules/rust/tokio-runtime/SKILL.md +167 -0
  326. package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
  327. package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
  328. package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
  329. package/rules/rust/tonic/SKILL.md +231 -0
  330. package/rules/rust/tonic/references/REFERENCE.md +13 -0
  331. package/rules/rust/tonic/references/service-patterns.md +213 -0
  332. package/rules/rust/tracing/SKILL.md +214 -0
  333. package/rules/rust/tracing/references/REFERENCE.md +13 -0
  334. package/rules/rust/tracing/references/instrumentation.md +187 -0
  335. package/rules/typescript/best-practices/SKILL.md +108 -0
  336. package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
  337. package/rules/typescript/language/SKILL.md +72 -0
  338. package/rules/typescript/language/references/REFERENCE.md +67 -0
  339. package/rules/typescript/patterns.rule.md +85 -0
  340. package/rules/typescript/security/SKILL.md +59 -0
  341. package/rules/typescript/security/references/REFERENCE.md +113 -0
  342. package/rules/typescript/tooling/SKILL.md +52 -0
  343. package/rules/typescript/tooling/references/REFERENCE.md +110 -0
@@ -0,0 +1,119 @@
1
+ # NestJS Controller Patterns
2
+
3
+ ## Basic Controller
4
+
5
+ ```typescript
6
+ import { Controller, Get, Post, Body, Param, Query, HttpStatus } from '@nestjs/common';
7
+ import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
8
+
9
+ @ApiTags('users')
10
+ @Controller('users')
11
+ export class UsersController {
12
+ constructor(private readonly usersService: UsersService) {}
13
+
14
+ @Get()
15
+ @ApiOperation({ summary: 'List all users' })
16
+ async findAll(@Query() query: ListUsersDto) {
17
+ return this.usersService.findAll(query);
18
+ }
19
+
20
+ @Get(':id')
21
+ @ApiResponse({ status: 200, type: UserResponseDto })
22
+ async findOne(@Param('id', ParseIntPipe) id: number) {
23
+ return this.usersService.findOne(id);
24
+ }
25
+
26
+ @Post()
27
+ @HttpCode(HttpStatus.CREATED)
28
+ async create(@Body() createUserDto: CreateUserDto) {
29
+ return this.usersService.create(createUserDto);
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## Request Handling
35
+
36
+ ```typescript
37
+ // Path parameters
38
+ @Get(':id')
39
+ findOne(@Param('id') id: string) {}
40
+
41
+ // Multiple params
42
+ @Get(':userId/posts/:postId')
43
+ findPost(@Param('userId') userId: string, @Param('postId') postId: string) {}
44
+
45
+ // Query parameters
46
+ @Get()
47
+ findAll(@Query('page') page: number, @Query('limit') limit: number) {}
48
+
49
+ // Request body
50
+ @Post()
51
+ create(@Body() dto: CreateDto) {}
52
+
53
+ // Headers
54
+ @Get()
55
+ getWithHeader(@Headers('authorization') auth: string) {}
56
+
57
+ // Full request
58
+ @Get()
59
+ handleRequest(@Req() request: Request) {}
60
+ ```
61
+
62
+ ## Response Patterns
63
+
64
+ ```typescript
65
+ // Standard response
66
+ @Get()
67
+ async findAll(): Promise<User[]> {
68
+ return this.usersService.findAll();
69
+ }
70
+
71
+ // Custom status
72
+ @Post()
73
+ @HttpCode(201)
74
+ create() {}
75
+
76
+ // Redirect
77
+ @Get('old-path')
78
+ @Redirect('new-path', 301)
79
+ redirect() {}
80
+
81
+ // Custom headers
82
+ @Get()
83
+ @Header('Cache-Control', 'none')
84
+ findAll() {}
85
+
86
+ // Stream response
87
+ @Get('file')
88
+ getFile(@Res() res: Response) {
89
+ const file = createReadStream(join(process.cwd(), 'file.txt'));
90
+ file.pipe(res);
91
+ }
92
+ ```
93
+
94
+ ## Validation
95
+
96
+ ```typescript
97
+ import { ValidationPipe, UsePipes } from '@nestjs/common';
98
+ import { IsString, IsEmail, MinLength } from 'class-validator';
99
+
100
+ class CreateUserDto {
101
+ @IsString()
102
+ @MinLength(2)
103
+ name: string;
104
+
105
+ @IsEmail()
106
+ email: string;
107
+ }
108
+
109
+ @Post()
110
+ @UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
111
+ create(@Body() dto: CreateUserDto) {}
112
+
113
+ // Global validation (main.ts)
114
+ app.useGlobalPipes(new ValidationPipe({
115
+ whitelist: true,
116
+ forbidNonWhitelisted: true,
117
+ transform: true,
118
+ }));
119
+ ```
@@ -0,0 +1,129 @@
1
+ # NestJS Service Patterns
2
+
3
+ ## Basic Service
4
+
5
+ ```typescript
6
+ import { Injectable, NotFoundException } from '@nestjs/common';
7
+
8
+ @Injectable()
9
+ export class UsersService {
10
+ constructor(
11
+ private readonly usersRepository: UsersRepository,
12
+ private readonly emailService: EmailService,
13
+ ) {}
14
+
15
+ async findAll(query: ListUsersDto): Promise<User[]> {
16
+ return this.usersRepository.find(query);
17
+ }
18
+
19
+ async findOne(id: number): Promise<User> {
20
+ const user = await this.usersRepository.findById(id);
21
+ if (!user) {
22
+ throw new NotFoundException(`User #${id} not found`);
23
+ }
24
+ return user;
25
+ }
26
+
27
+ async create(dto: CreateUserDto): Promise<User> {
28
+ const user = await this.usersRepository.create(dto);
29
+ await this.emailService.sendWelcome(user.email);
30
+ return user;
31
+ }
32
+ }
33
+ ```
34
+
35
+ ## Provider Scopes
36
+
37
+ ```typescript
38
+ import { Injectable, Scope } from '@nestjs/common';
39
+
40
+ // Singleton (default) - shared across all requests
41
+ @Injectable()
42
+ export class SingletonService {}
43
+
44
+ // Request scope - new instance per request
45
+ @Injectable({ scope: Scope.REQUEST })
46
+ export class RequestScopedService {
47
+ constructor(@Inject(REQUEST) private request: Request) {}
48
+ }
49
+
50
+ // Transient - new instance each injection
51
+ @Injectable({ scope: Scope.TRANSIENT })
52
+ export class TransientService {}
53
+ ```
54
+
55
+ ## Custom Providers
56
+
57
+ ```typescript
58
+ // Value provider
59
+ const configProvider = {
60
+ provide: 'CONFIG',
61
+ useValue: { apiKey: 'xxx' },
62
+ };
63
+
64
+ // Factory provider
65
+ const dbProvider = {
66
+ provide: 'DATABASE',
67
+ useFactory: async (config: ConfigService) => {
68
+ return createConnection(config.get('DATABASE_URL'));
69
+ },
70
+ inject: [ConfigService],
71
+ };
72
+
73
+ // Class provider
74
+ const loggerProvider = {
75
+ provide: LoggerService,
76
+ useClass: process.env.NODE_ENV === 'test'
77
+ ? MockLoggerService
78
+ : LoggerService,
79
+ };
80
+
81
+ // Existing provider (alias)
82
+ const aliasProvider = {
83
+ provide: 'ALIAS',
84
+ useExisting: RealService,
85
+ };
86
+
87
+ @Module({
88
+ providers: [configProvider, dbProvider, loggerProvider],
89
+ })
90
+ export class AppModule {}
91
+ ```
92
+
93
+ ## Async Providers
94
+
95
+ ```typescript
96
+ @Module({
97
+ providers: [
98
+ {
99
+ provide: 'ASYNC_CONNECTION',
100
+ useFactory: async () => {
101
+ const connection = await createConnection();
102
+ return connection;
103
+ },
104
+ },
105
+ ],
106
+ })
107
+ export class DatabaseModule {}
108
+ ```
109
+
110
+ ## Circular Dependencies
111
+
112
+ ```typescript
113
+ // Use forwardRef for circular deps
114
+ @Injectable()
115
+ export class CatsService {
116
+ constructor(
117
+ @Inject(forwardRef(() => DogsService))
118
+ private dogsService: DogsService,
119
+ ) {}
120
+ }
121
+
122
+ @Injectable()
123
+ export class DogsService {
124
+ constructor(
125
+ @Inject(forwardRef(() => CatsService))
126
+ private catsService: CatsService,
127
+ ) {}
128
+ }
129
+ ```
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: NestJS Database
3
+ description: Data access patterns, Scaling, Migrations, and ORM selection.
4
+ metadata:
5
+ labels: [nestjs, database, typeorm, prisma, mongodb]
6
+ triggers:
7
+ files: ['**/*.entity.ts', 'prisma/schema.prisma']
8
+ keywords: [TypeOrmModule, PrismaService, MongooseModule, Repository]
9
+ ---
10
+
11
+ # NestJS Database Standards
12
+
13
+ ## Selection Framework
14
+
15
+ ### 1. Data Structure Analysis (The "What")
16
+
17
+ - **Structured & Highly Related**: Users, Orders, Inventory, Financials.
18
+ - **Choice**: **PostgreSQL** (Default).
19
+ - _Why_: Strict schema validation, ACID transactions, complex generic queries (Joins).
20
+ - **Unstructured / Polymorphic**: Product Catalogs (lots of unique attributes), CMS Content, Raw JSON blobs.
21
+ - **Choice**: **MongoDB**.
22
+ - _Why_: Schema flexibility, fast development speed for flexible data models.
23
+ - **Time-Series / Metrics**: IoT Sensor Data, Stock Prices, Server Logs.
24
+ - **Choice**: **TimescaleDB** (Postgres Extension).
25
+ - _Why_: Compression, hypertable partitioning, rapid ingestion.
26
+
27
+ ### 2. Access Pattern Analysis (The "How")
28
+
29
+ - **Transactional (OLTP)**: "User buys items to cart".
30
+ - **Requirement**: Strong Consistency (ACID). **SQL** is mandatory.
31
+ - **Analytical (OLAP)**: "Dashboard showing sales trends".
32
+ - **Requirement**: Aggregation speed. Columnar storage (ClickHouse) or Read Replicas.
33
+ - **High Throughput Write**: "1M events/sec".
34
+ - **Requirement**: Append-only speed. **Cassandra** / **DynamoDB** (Leaderless replication).
35
+
36
+ ### 3. Decision Matrix
37
+
38
+ | Feature Needed | Primary Choice | Alternative |
39
+ | :--------------------- | :---------------- | :--------------------- |
40
+ | General Purpose App | **PostgreSQL** | MySQL |
41
+ | Flexible JSON Docs | **MongoDB** | PostgreSQL (JSONB) |
42
+ | Search Engine | **ElasticSearch** | PostgreSQL (Full Text) |
43
+ | Financial Transactions | **PostgreSQL** | (None) |
44
+
45
+ ## Patterns
46
+
47
+ - **Repository Pattern**: Isolate database logic.
48
+ - **TypeORM**: Inject `@InjectRepository(Entity)`.
49
+ - **Prisma**: Create a comprehensive `PrismaService`.
50
+ - **Abstraction**: Services should call Repositories, not raw SQL queries.
51
+
52
+ ## Configuration (TypeORM)
53
+
54
+ - **Async Loading**: Always use `TypeOrmModule.forRootAsync` to load secrets from `ConfigService`.
55
+ - **Sync**: Set `synchronize: false` in production; use migrations instead.
56
+
57
+ ## Scaling & Production
58
+
59
+ - **Read Replicas**: Configure separate `replication` connections (Master for Write, Slaves for Read) in TypeORM/Prisma to distribute load.
60
+ - **Connection Multiplexing**:
61
+ - **Problem**: Scaling K8s pods to 100+ exhausts DB connection limits (100 pods \* 10 connections = 1000 conns).
62
+ - **Solution**: Use **PgBouncer** (Postgres) or **ProxySQL** (MySQL) in transaction mode. Do NOT rely solely on ORM pooling.
63
+ - **Migrations**:
64
+ - **NEVER** run `synchronize: true` in production.
65
+ - **Execution**: Run migrations via a dedicated "init container" or CD job step. Do **NOT** auto-run inside the main app process on startup (race conditions when scaling to multiple pods).
66
+ - **Soft Deletes**: Use `@DeleteDateColumn` (TypeORM) or middleware (Prisma) to preserve data integrity.
67
+
68
+ ## Architectures (Multi-Tenancy & Sharding)
69
+
70
+ - **Column-Based (SaaS Standard)**: Single DB, `tenant_id` column.
71
+ - _Scale_: High. _Isolation_: Low.
72
+ - _Code_: Requires Row-Level Security (RLS) policies or strict `Where` scopes.
73
+ - **Schema-Based**: One DB, one Schema per Tenant.
74
+ - _Scale_: Medium. _Isolation_: Medium. Good for B2B.
75
+ - **Database-Based**: One DB per Tenant.
76
+ - _Scale_: Low (max ~500 tenants per cluster). _Isolation_: High.
77
+ - _Code_: Requires "Connection Switching" middleware. Complex.
78
+ - **Horizontal Sharding**:
79
+ - **Logic**: Shard massive tables by a key (e.g. `user_id`) across physical nodes to exceed single-node write limits.
80
+ - **Complexity**: Extreme. Avoid until >10TB data. Use "Partitioning" first.
81
+ - **Partioning (Postgres)**:
82
+ - **Strategy**: Use native Table Partitioning (e.g., by range/date) for massive tables (Logs, Audit, Events).
83
+ - **App Logic**: Ensure partition keys (e.g., `created_at`) are included in `WHERE` clauses to enable "Partition Pruning".
84
+
85
+ ## Migrations & Data Evolution
86
+
87
+ - **Separation**:
88
+ - **Schema Migrations (DDL)**: Structural changes (`CREATE TABLE`, `ADD COLUMN`). Fast. Run before app deploy.
89
+ - **Data Migrations (DML)**: transforming data (`UPDATE users SET name = ...`). Slow. Run as background jobs or separate scripts purely to avoid locking tables for too long.
90
+ - **Zero-Downtime Field Migration (Expand-Contract Pattern)**:
91
+ 1. **Expand**: Add new column `new_field` (nullable). Deploy App v1 (Writes to both `old` and `new`).
92
+ 2. **Migrate**: Backfill data from `old` to `new` in batches (background script).
93
+ 3. **Contract**: Deploy App v2 (Reads/Writes only `new`). Drop `old_field` in next schema migration.
94
+ - **Seeding**:
95
+ - **Dev**: Use factories (`@faker-js/faker`) to generate mock data.
96
+ - **Prod**: Only seed static dictionaries (Roles, Countries) using "Upsert" logic to prevent duplicates.
97
+
98
+ ## Best Practices
99
+
100
+ 1. **Pagination**: Mandatory. Use limit/offset or cursor-based pagination.
101
+ 2. **Indexing**: Define indexes in code (decorators/schema) for frequently filtered columns (`where`, `order by`).
102
+ 3. **Transactions**: Use `QueryRunner` (TypeORM) or `$transaction` (Prisma) for all multi-step mutations to ensure atomicity.
@@ -0,0 +1,14 @@
1
+ # NestJS Database References
2
+
3
+ ## References
4
+
5
+ - [**TypeORM Patterns**](typeorm-patterns.md) - Entities, repositories, relations
6
+ - [**Prisma Patterns**](prisma-patterns.md) - Schema, client, transactions
7
+
8
+ ## Quick Checks
9
+
10
+ - [ ] Use repository pattern for data access
11
+ - [ ] Define entities/models with proper relations
12
+ - [ ] Use transactions for multi-operation consistency
13
+ - [ ] Implement soft delete where appropriate
14
+ - [ ] Use migrations for schema changes
@@ -0,0 +1,156 @@
1
+ # NestJS TypeORM Patterns
2
+
3
+ ## Entity Definition
4
+
5
+ ```typescript
6
+ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, ManyToOne, OneToMany } from 'typeorm';
7
+
8
+ @Entity('users')
9
+ export class User {
10
+ @PrimaryGeneratedColumn()
11
+ id: number;
12
+
13
+ @Column({ length: 100 })
14
+ name: string;
15
+
16
+ @Column({ unique: true })
17
+ email: string;
18
+
19
+ @Column({ default: true })
20
+ isActive: boolean;
21
+
22
+ @CreateDateColumn()
23
+ createdAt: Date;
24
+
25
+ @OneToMany(() => Post, post => post.author)
26
+ posts: Post[];
27
+ }
28
+
29
+ @Entity('posts')
30
+ export class Post {
31
+ @PrimaryGeneratedColumn()
32
+ id: number;
33
+
34
+ @Column()
35
+ title: string;
36
+
37
+ @ManyToOne(() => User, user => user.posts)
38
+ author: User;
39
+
40
+ @Column()
41
+ authorId: number;
42
+ }
43
+ ```
44
+
45
+ ## Repository Pattern
46
+
47
+ ```typescript
48
+ import { Injectable } from '@nestjs/common';
49
+ import { InjectRepository } from '@nestjs/typeorm';
50
+ import { Repository } from 'typeorm';
51
+
52
+ @Injectable()
53
+ export class UsersRepository {
54
+ constructor(
55
+ @InjectRepository(User)
56
+ private readonly repo: Repository<User>,
57
+ ) {}
58
+
59
+ async findAll(): Promise<User[]> {
60
+ return this.repo.find({ relations: ['posts'] });
61
+ }
62
+
63
+ async findById(id: number): Promise<User | null> {
64
+ return this.repo.findOne({ where: { id }, relations: ['posts'] });
65
+ }
66
+
67
+ async create(data: CreateUserDto): Promise<User> {
68
+ const user = this.repo.create(data);
69
+ return this.repo.save(user);
70
+ }
71
+
72
+ async update(id: number, data: UpdateUserDto): Promise<User> {
73
+ await this.repo.update(id, data);
74
+ return this.findById(id);
75
+ }
76
+
77
+ async delete(id: number): Promise<void> {
78
+ await this.repo.delete(id);
79
+ }
80
+ }
81
+ ```
82
+
83
+ ## Query Builder
84
+
85
+ ```typescript
86
+ async findWithFilters(filters: FilterDto): Promise<User[]> {
87
+ const qb = this.repo.createQueryBuilder('user')
88
+ .leftJoinAndSelect('user.posts', 'post');
89
+
90
+ if (filters.name) {
91
+ qb.andWhere('user.name ILIKE :name', { name: `%${filters.name}%` });
92
+ }
93
+
94
+ if (filters.isActive !== undefined) {
95
+ qb.andWhere('user.isActive = :isActive', { isActive: filters.isActive });
96
+ }
97
+
98
+ return qb
99
+ .orderBy('user.createdAt', 'DESC')
100
+ .skip(filters.offset)
101
+ .take(filters.limit)
102
+ .getMany();
103
+ }
104
+ ```
105
+
106
+ ## Transactions
107
+
108
+ ```typescript
109
+ import { DataSource } from 'typeorm';
110
+
111
+ @Injectable()
112
+ export class OrdersService {
113
+ constructor(private dataSource: DataSource) {}
114
+
115
+ async createOrder(dto: CreateOrderDto): Promise<Order> {
116
+ const queryRunner = this.dataSource.createQueryRunner();
117
+ await queryRunner.connect();
118
+ await queryRunner.startTransaction();
119
+
120
+ try {
121
+ const order = await queryRunner.manager.save(Order, dto);
122
+ await queryRunner.manager.update(Product, dto.productId, {
123
+ stock: () => 'stock - 1',
124
+ });
125
+ await queryRunner.commitTransaction();
126
+ return order;
127
+ } catch (err) {
128
+ await queryRunner.rollbackTransaction();
129
+ throw err;
130
+ } finally {
131
+ await queryRunner.release();
132
+ }
133
+ }
134
+ }
135
+ ```
136
+
137
+ ## Module Setup
138
+
139
+ ```typescript
140
+ import { TypeOrmModule } from '@nestjs/typeorm';
141
+
142
+ @Module({
143
+ imports: [
144
+ TypeOrmModule.forRoot({
145
+ type: 'postgres',
146
+ host: 'localhost',
147
+ port: 5432,
148
+ database: 'mydb',
149
+ entities: [User, Post],
150
+ synchronize: false, // Use migrations in production
151
+ }),
152
+ TypeOrmModule.forFeature([User, Post]),
153
+ ],
154
+ })
155
+ export class DatabaseModule {}
156
+ ```
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: NestJS Deployment
3
+ description: Docker builds, Memory tuning, and Graceful shutdown.
4
+ metadata:
5
+ labels: [nestjs, deployment, docker, k8s]
6
+ triggers:
7
+ files: ['Dockerfile', 'k8s/**', 'helm/**']
8
+ keywords: [Dockerfile, max-old-space-size, shutdown hooks]
9
+ ---
10
+
11
+ # Deployment & Ops Standards
12
+
13
+ ## Docker Optimization
14
+
15
+ - **Multi-Stage Builds**: Mandatory.
16
+ 1. **Build Stage**: Install `devDependencies`, build NestJS (`nest build`).
17
+ 2. **Run Stage**: Copy only `dist` and `node_modules` (pruned), use `node:alpine`.
18
+ - **Security**: Do not run as `root`.
19
+ - **Dockerfile**: `USER node`.
20
+
21
+ ## Runtime Tuning (Node.js)
22
+
23
+ - **Memory Config**: Container memory != Node memory.
24
+ - **Rule**: Explicitly set Max Old Space.
25
+ - **Command**: `node --max-old-space-size=XXX dist/main`
26
+ - **Calculation**: Set to ~75-80% of Kubernetes Limit. (Limit: 1GB -> OldSpace: 800MB).
27
+ - **Graceful Shutdown**:
28
+ - **Signal**: Listen to `SIGTERM`.
29
+ - **NestJS**: `app.enableShutdownHooks()` is mandatory.
30
+ - **Sleep**: Add a "Pre-Stop" sleep in K8s (5-10s) to allow Load Balancer to drain connections before Node process stops accepting traffic.
31
+
32
+ ## Init Patterns
33
+
34
+ - **Database Migrations**:
35
+ - **Anti-Pattern**: Running migration in `main.ts` on startup.
36
+ - **Pro Pattern**: Use an **Init Container** in Kubernetes that runs `npm run typeorm:migration:run` before the app container starts.
@@ -0,0 +1,13 @@
1
+ # NestJS Deployment References
2
+
3
+ ## References
4
+
5
+ - [**Deployment Patterns**](deployment-patterns.md) - Docker, PM2, serverless, cloud platforms
6
+
7
+ ## Quick Checks
8
+
9
+ - [ ] Use multi-stage Docker builds
10
+ - [ ] Configure health checks
11
+ - [ ] Use PM2 for process management
12
+ - [ ] Set production environment variables
13
+ - [ ] Enable graceful shutdown
@@ -0,0 +1,140 @@
1
+ # NestJS Deployment Patterns
2
+
3
+ ## Docker Multi-Stage Build
4
+
5
+ ```dockerfile
6
+ # Build stage
7
+ FROM node:20-alpine AS builder
8
+ WORKDIR /app
9
+ COPY package*.json ./
10
+ RUN npm ci
11
+ COPY . .
12
+ RUN npm run build
13
+
14
+ # Production stage
15
+ FROM node:20-alpine AS production
16
+ WORKDIR /app
17
+ COPY --from=builder /app/dist ./dist
18
+ COPY --from=builder /app/node_modules ./node_modules
19
+ COPY --from=builder /app/package*.json ./
20
+
21
+ ENV NODE_ENV=production
22
+ EXPOSE 3000
23
+
24
+ CMD ["node", "dist/main.js"]
25
+ ```
26
+
27
+ ## PM2 Configuration
28
+
29
+ ```javascript
30
+ // ecosystem.config.js
31
+ module.exports = {
32
+ apps: [{
33
+ name: 'api',
34
+ script: 'dist/main.js',
35
+ instances: 'max',
36
+ exec_mode: 'cluster',
37
+ env_production: {
38
+ NODE_ENV: 'production',
39
+ PORT: 3000,
40
+ },
41
+ max_memory_restart: '1G',
42
+ error_file: './logs/error.log',
43
+ out_file: './logs/out.log',
44
+ }],
45
+ };
46
+ ```
47
+
48
+ ## Graceful Shutdown
49
+
50
+ ```typescript
51
+ import { NestFactory } from '@nestjs/core';
52
+ import { AppModule } from './app.module';
53
+
54
+ async function bootstrap() {
55
+ const app = await NestFactory.create(AppModule);
56
+
57
+ app.enableShutdownHooks();
58
+
59
+ await app.listen(3000);
60
+ }
61
+
62
+ // In service
63
+ @Injectable()
64
+ export class AppService implements OnModuleDestroy {
65
+ async onModuleDestroy() {
66
+ // Cleanup: close DB connections, finish jobs
67
+ await this.closeConnections();
68
+ }
69
+ }
70
+ ```
71
+
72
+ ## Health Checks
73
+
74
+ ```typescript
75
+ import { Controller, Get } from '@nestjs/common';
76
+ import {
77
+ HealthCheck,
78
+ HealthCheckService,
79
+ HttpHealthIndicator,
80
+ TypeOrmHealthIndicator,
81
+ } from '@nestjs/terminus';
82
+
83
+ @Controller('health')
84
+ export class HealthController {
85
+ constructor(
86
+ private health: HealthCheckService,
87
+ private http: HttpHealthIndicator,
88
+ private db: TypeOrmHealthIndicator,
89
+ ) {}
90
+
91
+ @Get()
92
+ @HealthCheck()
93
+ check() {
94
+ return this.health.check([
95
+ () => this.db.pingCheck('database'),
96
+ () => this.http.pingCheck('api', 'https://api.example.com'),
97
+ ]);
98
+ }
99
+
100
+ @Get('live')
101
+ liveness() {
102
+ return { status: 'ok' };
103
+ }
104
+
105
+ @Get('ready')
106
+ readiness() {
107
+ return this.health.check([
108
+ () => this.db.pingCheck('database'),
109
+ ]);
110
+ }
111
+ }
112
+ ```
113
+
114
+ ## Serverless (AWS Lambda)
115
+
116
+ ```typescript
117
+ // lambda.ts
118
+ import { NestFactory } from '@nestjs/core';
119
+ import { ExpressAdapter } from '@nestjs/platform-express';
120
+ import serverlessExpress from '@vendia/serverless-express';
121
+ import express from 'express';
122
+ import { AppModule } from './app.module';
123
+
124
+ let cachedServer;
125
+
126
+ async function bootstrap() {
127
+ const expressApp = express();
128
+ const adapter = new ExpressAdapter(expressApp);
129
+ const app = await NestFactory.create(AppModule, adapter);
130
+ await app.init();
131
+ return serverlessExpress({ app: expressApp });
132
+ }
133
+
134
+ export const handler = async (event, context) => {
135
+ if (!cachedServer) {
136
+ cachedServer = await bootstrap();
137
+ }
138
+ return cachedServer(event, context);
139
+ };
140
+ ```