44 "bytes"
55 "context"
66 "fmt"
7+ "maps"
78 "os"
89 "path"
910 "path/filepath"
@@ -16,7 +17,7 @@ import (
1617 "sigs.k8s.io/yaml"
1718
1819 "github.com/werf/3p-helm/pkg/action"
19- "github.com/werf/3p-helm/pkg/chart"
20+ helmchart "github.com/werf/3p-helm/pkg/chart"
2021 "github.com/werf/3p-helm/pkg/chart/loader"
2122 "github.com/werf/3p-helm/pkg/chartutil"
2223 "github.com/werf/3p-helm/pkg/cli"
@@ -31,7 +32,9 @@ import (
3132 "github.com/werf/3p-helm/pkg/werf/helmopts"
3233 "github.com/werf/nelm/internal/kube"
3334 "github.com/werf/nelm/internal/resource/spec"
35+ "github.com/werf/nelm/internal/tschart"
3436 "github.com/werf/nelm/pkg/common"
37+ "github.com/werf/nelm/pkg/featgate"
3538 "github.com/werf/nelm/pkg/log"
3639)
3740
@@ -53,7 +56,7 @@ type RenderChartOptions struct {
5356}
5457
5558type RenderChartResult struct {
56- Chart * chart .Chart
59+ Chart * helmchart .Chart
5760 Notes string
5861 ReleaseConfig map [string ]interface {}
5962 ResourceSpecs []* spec.ResourceSpec
@@ -147,6 +150,7 @@ func RenderChart(ctx context.Context, chartPath, releaseName, releaseNamespace s
147150 log .Default .TraceStruct (ctx , runtime , "Runtime:" )
148151
149152 var isUpgrade bool
153+
150154 switch deployType {
151155 case common .DeployTypeUpgrade , common .DeployTypeRollback :
152156 isUpgrade = true
@@ -204,6 +208,17 @@ func RenderChart(ctx context.Context, chartPath, releaseName, releaseNamespace s
204208 return nil , fmt .Errorf ("render resources for chart %q: %w" , chart .Name (), err )
205209 }
206210
211+ if featgate .FeatGateTypescript .Enabled () {
212+ jsRenderedTemplates , err := renderJSTemplates (ctx , chartPath , chart , renderedValues )
213+ if err != nil {
214+ return nil , fmt .Errorf ("render ts chart templates for chart %q: %w" , chart .Name (), err )
215+ }
216+
217+ if len (jsRenderedTemplates ) > 0 {
218+ maps .Copy (renderedTemplates , jsRenderedTemplates )
219+ }
220+ }
221+
207222 log .Default .TraceStruct (ctx , renderedTemplates , "Rendered contents of templates/:" )
208223
209224 if r , err := renderedTemplatesToResourceSpecs (renderedTemplates , releaseNamespace , opts ); err != nil {
@@ -229,7 +244,25 @@ func RenderChart(ctx context.Context, chartPath, releaseName, releaseNamespace s
229244 }, nil
230245}
231246
232- func validateChart (ctx context.Context , chart * chart.Chart ) error {
247+ func renderJSTemplates (
248+ ctx context.Context ,
249+ chartPath string ,
250+ chart * helmchart.Chart ,
251+ renderedValues chartutil.Values ,
252+ ) (map [string ]string , error ) {
253+ log .Default .Debug (ctx , "Rendering TypeScript resources for chart %q and its dependencies" , chart .Name ())
254+
255+ jsEngine := tschart .NewEngine ()
256+
257+ jsRenderedTemplates , err := jsEngine .RenderChartWithDependencies (ctx , chartPath , chart , renderedValues )
258+ if err != nil {
259+ return nil , err
260+ }
261+
262+ return jsRenderedTemplates , nil
263+ }
264+
265+ func validateChart (ctx context.Context , chart * helmchart.Chart ) error {
233266 if chart == nil {
234267 return fmt .Errorf ("load chart: %w" , action .ErrMissingChart ())
235268 }
@@ -253,6 +286,7 @@ func validateChart(ctx context.Context, chart *chart.Chart) error {
253286
254287func renderedTemplatesToResourceSpecs (renderedTemplates map [string ]string , releaseNamespace string , opts RenderChartOptions ) ([]* spec.ResourceSpec , error ) {
255288 var resources []* spec.ResourceSpec
289+
256290 for filePath , fileContent := range renderedTemplates {
257291 if strings .HasPrefix (path .Base (filePath ), "_" ) ||
258292 strings .HasSuffix (filePath , action .NotesFileSuffix ) ||
0 commit comments