diff --git a/internal/generators/nestjs/nestjs.go b/internal/generators/nestjs/nestjs.go index 74b3227..9ff86a8 100644 --- a/internal/generators/nestjs/nestjs.go +++ b/internal/generators/nestjs/nestjs.go @@ -2,6 +2,7 @@ package nestjs import ( _ "embed" + "encoding/json" "text/template" "github.com/open-feature/cli/internal/flagset" @@ -28,14 +29,25 @@ func openFeatureType(t flagset.FlagType) string { return "boolean" case flagset.StringType: return "string" + case flagset.ObjectType: + return "object" default: return "" } } +func toJSONString(value any) string { + bytes, err := json.Marshal(value) + if err != nil { + return "{}" + } + return string(bytes) +} + func (g *NestJsGenerator) Generate(params *generators.Params[Params]) error { funcs := template.FuncMap{ "OpenFeatureType": openFeatureType, + "ToJSONString": toJSONString, } newParams := &generators.Params[any]{ @@ -49,8 +61,6 @@ func (g *NestJsGenerator) Generate(params *generators.Params[Params]) error { // NewGenerator creates a generator for NestJS. func NewGenerator(fs *flagset.Flagset) *NestJsGenerator { return &NestJsGenerator{ - CommonGenerator: *generators.NewGenerator(fs, map[flagset.FlagType]bool{ - flagset.ObjectType: true, - }), + CommonGenerator: *generators.NewGenerator(fs, map[flagset.FlagType]bool{}), } } diff --git a/internal/generators/nestjs/nestjs.tmpl b/internal/generators/nestjs/nestjs.tmpl index 971a74e..910b9bb 100644 --- a/internal/generators/nestjs/nestjs.tmpl +++ b/internal/generators/nestjs/nestjs.tmpl @@ -9,7 +9,7 @@ import type { EvaluationDetails, OpenFeatureModuleOptions, } from "@openfeature/nestjs-sdk"; -import { OpenFeatureModule, BooleanFeatureFlag, StringFeatureFlag, NumberFeatureFlag } from "@openfeature/nestjs-sdk"; +import { OpenFeatureModule, BooleanFeatureFlag, StringFeatureFlag, NumberFeatureFlag, ObjectFeatureFlag } from "@openfeature/nestjs-sdk"; import type { GeneratedClient } from "./openfeature"; import { getGeneratedClient } from "./openfeature"; @@ -100,7 +100,7 @@ interface TypedFeatureProps { * **Details:** * - flag key: `{{ .Key }}` * - description: `{{ .Description }}` - * - default value: `{{ .DefaultValue }}` + * - default value: `{{ if eq (.Type | OpenFeatureType) "object"}}{{ .DefaultValue | ToJSONString }}{{ else }}{{ .DefaultValue | QuoteString }}{{ end }}` * - type: `{{ .Type | OpenFeatureType }}` * * Usage: @@ -108,13 +108,13 @@ interface TypedFeatureProps { * @Get("/") * public async handleRequest( * @{{ .Key | ToPascal }}() - * {{ .Key | ToCamel }}: Observable>, + * {{ .Key | ToCamel }}: Observable>, * ) * ``` * @param {TypedFeatureProps} props The options for injecting the feature flag. * @returns {ParameterDecorator} The decorator function. */ export function {{ .Key | ToPascal }}(props?: TypedFeatureProps): ParameterDecorator { - return {{ .Type | OpenFeatureType | ToPascal }}FeatureFlag({ flagKey: {{ .Key | Quote }}, defaultValue: {{ .DefaultValue | QuoteString }}, ...props }); + return {{ .Type | OpenFeatureType | ToPascal }}FeatureFlag({ flagKey: {{ .Key | Quote }}, defaultValue: {{ if eq (.Type | OpenFeatureType) "object"}}{{ .DefaultValue | ToJSONString }}{{ else }}{{ .DefaultValue | QuoteString }}{{ end }}, ...props }); } {{ end -}}