@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,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Wire Dependency Injection
|
|
3
|
+
description: Compile-time dependency injection from Google.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [golang, wire, di, dependency-injection]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/wire.go', '**/wire_gen.go']
|
|
8
|
+
keywords: [wire, Build, NewSet, Bind, Injector]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Wire DI Standards
|
|
12
|
+
|
|
13
|
+
## Basic Setup
|
|
14
|
+
|
|
15
|
+
```go
|
|
16
|
+
// wire.go
|
|
17
|
+
//go:build wireinject
|
|
18
|
+
// +build wireinject
|
|
19
|
+
|
|
20
|
+
package main
|
|
21
|
+
|
|
22
|
+
import "github.com/google/wire"
|
|
23
|
+
|
|
24
|
+
func InitializeApp() (*App, error) {
|
|
25
|
+
wire.Build(
|
|
26
|
+
NewDatabase,
|
|
27
|
+
NewUserRepository,
|
|
28
|
+
NewUserService,
|
|
29
|
+
NewApp,
|
|
30
|
+
)
|
|
31
|
+
return nil, nil
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Generate wire_gen.go
|
|
37
|
+
wire ./...
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Providers
|
|
41
|
+
|
|
42
|
+
```go
|
|
43
|
+
// Providers are constructors
|
|
44
|
+
func NewDatabase(cfg *Config) (*sql.DB, error) {
|
|
45
|
+
return sql.Open("postgres", cfg.DatabaseURL)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func NewUserRepository(db *sql.DB) *UserRepository {
|
|
49
|
+
return &UserRepository{db: db}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func NewUserService(repo *UserRepository) *UserService {
|
|
53
|
+
return &UserService{repo: repo}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func NewApp(svc *UserService) *App {
|
|
57
|
+
return &App{userService: svc}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Provider Sets
|
|
62
|
+
|
|
63
|
+
```go
|
|
64
|
+
// Group related providers
|
|
65
|
+
var DatabaseSet = wire.NewSet(
|
|
66
|
+
NewDatabase,
|
|
67
|
+
NewUserRepository,
|
|
68
|
+
NewPostRepository,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
var ServiceSet = wire.NewSet(
|
|
72
|
+
NewUserService,
|
|
73
|
+
NewPostService,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
// Use sets in injector
|
|
77
|
+
func InitializeApp(cfg *Config) (*App, error) {
|
|
78
|
+
wire.Build(
|
|
79
|
+
DatabaseSet,
|
|
80
|
+
ServiceSet,
|
|
81
|
+
NewApp,
|
|
82
|
+
)
|
|
83
|
+
return nil, nil
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Interface Binding
|
|
88
|
+
|
|
89
|
+
```go
|
|
90
|
+
type UserRepository interface {
|
|
91
|
+
FindByID(id int) (*User, error)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
type userRepository struct {
|
|
95
|
+
db *sql.DB
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func NewUserRepository(db *sql.DB) *userRepository {
|
|
99
|
+
return &userRepository{db: db}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Bind implementation to interface
|
|
103
|
+
var RepositorySet = wire.NewSet(
|
|
104
|
+
NewUserRepository,
|
|
105
|
+
wire.Bind(new(UserRepository), new(*userRepository)),
|
|
106
|
+
)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Struct Providers
|
|
110
|
+
|
|
111
|
+
```go
|
|
112
|
+
type Config struct {
|
|
113
|
+
DatabaseURL string
|
|
114
|
+
Port int
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Provide struct fields
|
|
118
|
+
var ConfigSet = wire.NewSet(
|
|
119
|
+
wire.Struct(new(Config), "*"), // All fields
|
|
120
|
+
// or
|
|
121
|
+
wire.Struct(new(Config), "DatabaseURL", "Port"), // Specific fields
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
// Field providers must exist
|
|
125
|
+
func InitializeApp(dbURL string, port int) (*App, error) {
|
|
126
|
+
wire.Build(
|
|
127
|
+
ConfigSet,
|
|
128
|
+
// ...
|
|
129
|
+
)
|
|
130
|
+
return nil, nil
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Value Providers
|
|
135
|
+
|
|
136
|
+
```go
|
|
137
|
+
func InitializeApp() (*App, error) {
|
|
138
|
+
wire.Build(
|
|
139
|
+
wire.Value(&Config{
|
|
140
|
+
DatabaseURL: "postgres://...",
|
|
141
|
+
Port: 8080,
|
|
142
|
+
}),
|
|
143
|
+
NewDatabase,
|
|
144
|
+
NewApp,
|
|
145
|
+
)
|
|
146
|
+
return nil, nil
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Or interface value
|
|
150
|
+
wire.InterfaceValue(new(io.Writer), os.Stdout)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Cleanup Functions
|
|
154
|
+
|
|
155
|
+
```go
|
|
156
|
+
func NewDatabase(cfg *Config) (*sql.DB, func(), error) {
|
|
157
|
+
db, err := sql.Open("postgres", cfg.DatabaseURL)
|
|
158
|
+
if err != nil {
|
|
159
|
+
return nil, nil, err
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
cleanup := func() {
|
|
163
|
+
db.Close()
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return db, cleanup, nil
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Injector returns cleanup
|
|
170
|
+
func InitializeApp(cfg *Config) (*App, func(), error) {
|
|
171
|
+
wire.Build(
|
|
172
|
+
NewDatabase,
|
|
173
|
+
NewApp,
|
|
174
|
+
)
|
|
175
|
+
return nil, nil, nil
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Usage
|
|
179
|
+
app, cleanup, err := InitializeApp(cfg)
|
|
180
|
+
if err != nil {
|
|
181
|
+
log.Fatal(err)
|
|
182
|
+
}
|
|
183
|
+
defer cleanup()
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Multiple Injectors
|
|
187
|
+
|
|
188
|
+
```go
|
|
189
|
+
// wire.go
|
|
190
|
+
//go:build wireinject
|
|
191
|
+
|
|
192
|
+
package main
|
|
193
|
+
|
|
194
|
+
import "github.com/google/wire"
|
|
195
|
+
|
|
196
|
+
// For HTTP server
|
|
197
|
+
func InitializeHTTPServer(cfg *Config) (*HTTPServer, func(), error) {
|
|
198
|
+
wire.Build(
|
|
199
|
+
DatabaseSet,
|
|
200
|
+
HTTPSet,
|
|
201
|
+
)
|
|
202
|
+
return nil, nil, nil
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// For CLI
|
|
206
|
+
func InitializeCLI(cfg *Config) (*CLI, error) {
|
|
207
|
+
wire.Build(
|
|
208
|
+
DatabaseSet,
|
|
209
|
+
CLISet,
|
|
210
|
+
)
|
|
211
|
+
return nil, nil
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Testing
|
|
216
|
+
|
|
217
|
+
```go
|
|
218
|
+
// Mock for testing
|
|
219
|
+
type mockUserRepository struct{}
|
|
220
|
+
|
|
221
|
+
func (m *mockUserRepository) FindByID(id int) (*User, error) {
|
|
222
|
+
return &User{ID: id, Name: "Test"}, nil
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Test injector
|
|
226
|
+
func InitializeTestApp() (*App, error) {
|
|
227
|
+
wire.Build(
|
|
228
|
+
wire.Value(&mockUserRepository{}),
|
|
229
|
+
wire.Bind(new(UserRepository), new(*mockUserRepository)),
|
|
230
|
+
NewUserService,
|
|
231
|
+
NewApp,
|
|
232
|
+
)
|
|
233
|
+
return nil, nil
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Best Practices
|
|
238
|
+
|
|
239
|
+
1. **Provider sets**: Group related providers
|
|
240
|
+
2. **Interfaces**: Use `wire.Bind` for testability
|
|
241
|
+
3. **Cleanup**: Return cleanup functions for resources
|
|
242
|
+
4. **Build tags**: Use `wireinject` build tag
|
|
243
|
+
5. **Regenerate**: Run `wire ./...` after changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Wire DI References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**Provider Patterns**](provider-patterns.md) - Providers, sets, injectors
|
|
6
|
+
|
|
7
|
+
## Quick Checks
|
|
8
|
+
|
|
9
|
+
- [ ] Use ProviderSet for grouping related providers
|
|
10
|
+
- [ ] wire.Build in injector functions
|
|
11
|
+
- [ ] Interface bindings with wire.Bind
|
|
12
|
+
- [ ] Cleanup functions for resources
|
|
13
|
+
- [ ] Run wire generate after changes
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Wire Provider Patterns
|
|
2
|
+
|
|
3
|
+
## Basic Providers
|
|
4
|
+
|
|
5
|
+
```go
|
|
6
|
+
// Provider function returns a dependency
|
|
7
|
+
func NewDatabase(cfg *Config) (*Database, error) {
|
|
8
|
+
db, err := sql.Open("postgres", cfg.DSN)
|
|
9
|
+
if err != nil {
|
|
10
|
+
return nil, err
|
|
11
|
+
}
|
|
12
|
+
return &Database{db: db}, nil
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
func NewUserRepository(db *Database) *UserRepository {
|
|
16
|
+
return &UserRepository{db: db}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func NewUserService(repo *UserRepository) *UserService {
|
|
20
|
+
return &UserService{repo: repo}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Injector Function
|
|
25
|
+
|
|
26
|
+
```go
|
|
27
|
+
// +build wireinject
|
|
28
|
+
|
|
29
|
+
package main
|
|
30
|
+
|
|
31
|
+
import "github.com/google/wire"
|
|
32
|
+
|
|
33
|
+
// InitializeApp creates the application with all dependencies
|
|
34
|
+
func InitializeApp(cfg *Config) (*App, error) {
|
|
35
|
+
wire.Build(
|
|
36
|
+
NewDatabase,
|
|
37
|
+
NewUserRepository,
|
|
38
|
+
NewUserService,
|
|
39
|
+
NewApp,
|
|
40
|
+
)
|
|
41
|
+
return nil, nil // Wire generates the actual implementation
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Run: wire gen ./...
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Provider Sets
|
|
48
|
+
|
|
49
|
+
```go
|
|
50
|
+
// Group related providers
|
|
51
|
+
var DatabaseSet = wire.NewSet(
|
|
52
|
+
NewDatabase,
|
|
53
|
+
NewUserRepository,
|
|
54
|
+
NewOrderRepository,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
var ServiceSet = wire.NewSet(
|
|
58
|
+
NewUserService,
|
|
59
|
+
NewOrderService,
|
|
60
|
+
NewPaymentService,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
var AppSet = wire.NewSet(
|
|
64
|
+
DatabaseSet,
|
|
65
|
+
ServiceSet,
|
|
66
|
+
NewApp,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
// Use in injector
|
|
70
|
+
func InitializeApp(cfg *Config) (*App, error) {
|
|
71
|
+
wire.Build(AppSet)
|
|
72
|
+
return nil, nil
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Interface Bindings
|
|
77
|
+
|
|
78
|
+
```go
|
|
79
|
+
// Interface
|
|
80
|
+
type UserRepository interface {
|
|
81
|
+
FindByID(id int) (*User, error)
|
|
82
|
+
Save(user *User) error
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Implementation
|
|
86
|
+
type PostgresUserRepository struct {
|
|
87
|
+
db *Database
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func NewPostgresUserRepository(db *Database) *PostgresUserRepository {
|
|
91
|
+
return &PostgresUserRepository{db: db}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Bind implementation to interface
|
|
95
|
+
var RepositorySet = wire.NewSet(
|
|
96
|
+
NewPostgresUserRepository,
|
|
97
|
+
wire.Bind(new(UserRepository), new(*PostgresUserRepository)),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
// Service now depends on interface
|
|
101
|
+
func NewUserService(repo UserRepository) *UserService {
|
|
102
|
+
return &UserService{repo: repo}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Cleanup Functions
|
|
107
|
+
|
|
108
|
+
```go
|
|
109
|
+
// Provider with cleanup
|
|
110
|
+
func NewDatabase(cfg *Config) (*Database, func(), error) {
|
|
111
|
+
db, err := sql.Open("postgres", cfg.DSN)
|
|
112
|
+
if err != nil {
|
|
113
|
+
return nil, nil, err
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
cleanup := func() {
|
|
117
|
+
db.Close()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return &Database{db: db}, cleanup, nil
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Injector returns cleanup function
|
|
124
|
+
func InitializeApp(cfg *Config) (*App, func(), error) {
|
|
125
|
+
wire.Build(AppSet)
|
|
126
|
+
return nil, nil, nil
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Usage
|
|
130
|
+
func main() {
|
|
131
|
+
app, cleanup, err := InitializeApp(cfg)
|
|
132
|
+
if err != nil {
|
|
133
|
+
log.Fatal(err)
|
|
134
|
+
}
|
|
135
|
+
defer cleanup() // Cleanup all resources
|
|
136
|
+
|
|
137
|
+
app.Run()
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Struct Providers
|
|
142
|
+
|
|
143
|
+
```go
|
|
144
|
+
// Provide struct fields
|
|
145
|
+
type Config struct {
|
|
146
|
+
DB DBConfig
|
|
147
|
+
Server ServerConfig
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var ConfigSet = wire.NewSet(
|
|
151
|
+
wire.FieldsOf(new(*Config), "DB", "Server"),
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
// Or struct with all exported fields
|
|
155
|
+
var ConfigSet = wire.NewSet(
|
|
156
|
+
wire.Struct(new(Config), "*"),
|
|
157
|
+
)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Values
|
|
161
|
+
|
|
162
|
+
```go
|
|
163
|
+
// Provide specific values
|
|
164
|
+
func InitializeApp() (*App, error) {
|
|
165
|
+
wire.Build(
|
|
166
|
+
wire.Value(Config{Port: 8080}),
|
|
167
|
+
wire.InterfaceValue(new(io.Writer), os.Stdout),
|
|
168
|
+
NewApp,
|
|
169
|
+
)
|
|
170
|
+
return nil, nil
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Generated Code (wire_gen.go)
|
|
175
|
+
|
|
176
|
+
```go
|
|
177
|
+
// Code generated by Wire. DO NOT EDIT.
|
|
178
|
+
|
|
179
|
+
package main
|
|
180
|
+
|
|
181
|
+
func InitializeApp(cfg *Config) (*App, func(), error) {
|
|
182
|
+
database, cleanup, err := NewDatabase(cfg)
|
|
183
|
+
if err != nil {
|
|
184
|
+
return nil, nil, err
|
|
185
|
+
}
|
|
186
|
+
userRepository := NewUserRepository(database)
|
|
187
|
+
userService := NewUserService(userRepository)
|
|
188
|
+
app := NewApp(userService)
|
|
189
|
+
return app, func() {
|
|
190
|
+
cleanup()
|
|
191
|
+
}, nil
|
|
192
|
+
}
|
|
193
|
+
```
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Zap Logging
|
|
3
|
+
description: Blazing fast structured logging from Uber.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [golang, zap, logging, observability]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/logger.go', '**/main.go']
|
|
8
|
+
keywords: [zap, Logger, SugaredLogger, zapcore]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Zap Logging Standards
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```go
|
|
16
|
+
import "go.uber.org/zap"
|
|
17
|
+
|
|
18
|
+
// Development (human readable)
|
|
19
|
+
func NewDevelopmentLogger() *zap.Logger {
|
|
20
|
+
logger, _ := zap.NewDevelopment()
|
|
21
|
+
return logger
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Production (JSON, optimized)
|
|
25
|
+
func NewProductionLogger() *zap.Logger {
|
|
26
|
+
logger, _ := zap.NewProduction()
|
|
27
|
+
return logger
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// With options
|
|
31
|
+
func NewLogger() *zap.Logger {
|
|
32
|
+
cfg := zap.NewProductionConfig()
|
|
33
|
+
cfg.Level = zap.NewAtomicLevelAt(zap.InfoLevel)
|
|
34
|
+
cfg.OutputPaths = []string{"stdout", "/var/log/app.log"}
|
|
35
|
+
cfg.EncoderConfig.TimeKey = "timestamp"
|
|
36
|
+
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
|
37
|
+
|
|
38
|
+
logger, _ := cfg.Build()
|
|
39
|
+
return logger
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Logger vs SugaredLogger
|
|
44
|
+
|
|
45
|
+
```go
|
|
46
|
+
// Logger - faster, type-safe
|
|
47
|
+
logger := zap.NewProduction()
|
|
48
|
+
logger.Info("User logged in",
|
|
49
|
+
zap.String("user_id", "123"),
|
|
50
|
+
zap.Int("attempt", 1),
|
|
51
|
+
zap.Duration("latency", time.Millisecond*50),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
// SugaredLogger - convenient, slower
|
|
55
|
+
sugar := logger.Sugar()
|
|
56
|
+
sugar.Infow("User logged in",
|
|
57
|
+
"user_id", "123",
|
|
58
|
+
"attempt", 1,
|
|
59
|
+
"latency", time.Millisecond*50,
|
|
60
|
+
)
|
|
61
|
+
sugar.Infof("User %s logged in", userID)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Structured Fields
|
|
65
|
+
|
|
66
|
+
```go
|
|
67
|
+
logger.Info("Request completed",
|
|
68
|
+
zap.String("method", "GET"),
|
|
69
|
+
zap.String("path", "/users"),
|
|
70
|
+
zap.Int("status", 200),
|
|
71
|
+
zap.Duration("latency", latency),
|
|
72
|
+
zap.String("client_ip", clientIP),
|
|
73
|
+
zap.Any("headers", headers), // Any type
|
|
74
|
+
zap.Error(err), // Error field
|
|
75
|
+
zap.Stack("stacktrace"), // Stack trace
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
// Namespaced fields
|
|
79
|
+
logger.Info("Request",
|
|
80
|
+
zap.Namespace("http"),
|
|
81
|
+
zap.String("method", "GET"),
|
|
82
|
+
zap.Int("status", 200),
|
|
83
|
+
)
|
|
84
|
+
// Output: {"http": {"method": "GET", "status": 200}}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Log Levels
|
|
88
|
+
|
|
89
|
+
```go
|
|
90
|
+
logger.Debug("Debug message") // -1
|
|
91
|
+
logger.Info("Info message") // 0
|
|
92
|
+
logger.Warn("Warning message") // 1
|
|
93
|
+
logger.Error("Error message") // 2
|
|
94
|
+
logger.DPanic("DPanic message") // 3 (panics in development)
|
|
95
|
+
logger.Panic("Panic message") // 4 (always panics)
|
|
96
|
+
logger.Fatal("Fatal message") // 5 (calls os.Exit(1))
|
|
97
|
+
|
|
98
|
+
// Check level before expensive operations
|
|
99
|
+
if logger.Core().Enabled(zap.DebugLevel) {
|
|
100
|
+
logger.Debug("Expensive", zap.Any("data", computeExpensiveData()))
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Child Loggers
|
|
105
|
+
|
|
106
|
+
```go
|
|
107
|
+
// Add fields to all subsequent logs
|
|
108
|
+
requestLogger := logger.With(
|
|
109
|
+
zap.String("request_id", requestID),
|
|
110
|
+
zap.String("user_id", userID),
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
requestLogger.Info("Processing request")
|
|
114
|
+
requestLogger.Info("Request completed")
|
|
115
|
+
// Both logs include request_id and user_id
|
|
116
|
+
|
|
117
|
+
// Named logger
|
|
118
|
+
dbLogger := logger.Named("database")
|
|
119
|
+
dbLogger.Info("Query executed")
|
|
120
|
+
// Output: {"logger": "database", "msg": "Query executed"}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Gin Integration
|
|
124
|
+
|
|
125
|
+
```go
|
|
126
|
+
import (
|
|
127
|
+
"github.com/gin-gonic/gin"
|
|
128
|
+
"go.uber.org/zap"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
func GinLogger(logger *zap.Logger) gin.HandlerFunc {
|
|
132
|
+
return func(c *gin.Context) {
|
|
133
|
+
start := time.Now()
|
|
134
|
+
path := c.Request.URL.Path
|
|
135
|
+
|
|
136
|
+
c.Next()
|
|
137
|
+
|
|
138
|
+
logger.Info("Request",
|
|
139
|
+
zap.String("method", c.Request.Method),
|
|
140
|
+
zap.String("path", path),
|
|
141
|
+
zap.Int("status", c.Writer.Status()),
|
|
142
|
+
zap.Duration("latency", time.Since(start)),
|
|
143
|
+
zap.String("client_ip", c.ClientIP()),
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
r := gin.New()
|
|
149
|
+
r.Use(GinLogger(logger))
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Custom Encoder
|
|
153
|
+
|
|
154
|
+
```go
|
|
155
|
+
cfg := zap.NewProductionConfig()
|
|
156
|
+
cfg.EncoderConfig = zapcore.EncoderConfig{
|
|
157
|
+
TimeKey: "ts",
|
|
158
|
+
LevelKey: "level",
|
|
159
|
+
NameKey: "logger",
|
|
160
|
+
CallerKey: "caller",
|
|
161
|
+
MessageKey: "msg",
|
|
162
|
+
StacktraceKey: "stacktrace",
|
|
163
|
+
LineEnding: zapcore.DefaultLineEnding,
|
|
164
|
+
EncodeLevel: zapcore.LowercaseLevelEncoder,
|
|
165
|
+
EncodeTime: zapcore.ISO8601TimeEncoder,
|
|
166
|
+
EncodeDuration: zapcore.MillisDurationEncoder,
|
|
167
|
+
EncodeCaller: zapcore.ShortCallerEncoder,
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Sampling
|
|
172
|
+
|
|
173
|
+
```go
|
|
174
|
+
// Sample logs to reduce volume in production
|
|
175
|
+
cfg := zap.NewProductionConfig()
|
|
176
|
+
cfg.Sampling = &zap.SamplingConfig{
|
|
177
|
+
Initial: 100, // First 100 per second logged
|
|
178
|
+
Thereafter: 100, // Then every 100th message
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Global Logger
|
|
183
|
+
|
|
184
|
+
```go
|
|
185
|
+
// Replace global logger
|
|
186
|
+
logger := zap.NewProduction()
|
|
187
|
+
zap.ReplaceGlobals(logger)
|
|
188
|
+
|
|
189
|
+
// Use global
|
|
190
|
+
zap.L().Info("Using global logger")
|
|
191
|
+
zap.S().Infow("Using global sugar")
|
|
192
|
+
|
|
193
|
+
// Always sync before exit
|
|
194
|
+
defer logger.Sync()
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Best Practices
|
|
198
|
+
|
|
199
|
+
1. **Production**: Use `zap.NewProduction()` for JSON output
|
|
200
|
+
2. **Sync**: Always call `logger.Sync()` before exit
|
|
201
|
+
3. **Fields**: Prefer `zap.String()` etc. over SugaredLogger
|
|
202
|
+
4. **Child loggers**: Add request context with `With()`
|
|
203
|
+
5. **Sampling**: Enable in high-throughput production
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Zap Logging References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**Logger Configuration**](logger-config.md) - Setup, levels, output formats
|
|
6
|
+
|
|
7
|
+
## Quick Checks
|
|
8
|
+
|
|
9
|
+
- [ ] Use sugared logger for development convenience
|
|
10
|
+
- [ ] Use standard logger for production performance
|
|
11
|
+
- [ ] Structured logging with typed fields
|
|
12
|
+
- [ ] Configure appropriate log levels
|
|
13
|
+
- [ ] Use sampling for high-volume logs
|