From 25e4c493754bd6e0368b8a8187bbf8654e188a2b Mon Sep 17 00:00:00 2001 From: Ian Wahbe Date: Mon, 28 Nov 2022 10:56:04 -0800 Subject: [PATCH] Add `.` between `?` and `]` --- ...28--programgen-nodejs--add-between-and.yaml | 4 ++++ pkg/codegen/nodejs/gen_program_expressions.go | 18 +++++++++++++++--- pkg/codegen/testing/test/program_driver.go | 2 +- .../aws-s3-logging-pp/nodejs/aws-s3-logging.ts | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 changelog/pending/20221128--programgen-nodejs--add-between-and.yaml diff --git a/changelog/pending/20221128--programgen-nodejs--add-between-and.yaml b/changelog/pending/20221128--programgen-nodejs--add-between-and.yaml new file mode 100644 index 000000000000..912903f06b7a --- /dev/null +++ b/changelog/pending/20221128--programgen-nodejs--add-between-and.yaml @@ -0,0 +1,4 @@ +changes: +- type: fix + scope: programgen/nodejs + description: Add `.` between `?` and `[`. diff --git a/pkg/codegen/nodejs/gen_program_expressions.go b/pkg/codegen/nodejs/gen_program_expressions.go index 9ef51257bde5..0632d27a0756 100644 --- a/pkg/codegen/nodejs/gen_program_expressions.go +++ b/pkg/codegen/nodejs/gen_program_expressions.go @@ -594,8 +594,20 @@ func (g *generator) genRelativeTraversal(w io.Writer, traversal hcl.Traversal, p contract.Failf("unexpected traversal part of type %T (%v)", part, part.SourceRange()) } + var indexPrefix string if model.IsOptionalType(model.GetTraversableType(parts[i])) { g.Fgen(w, "?") + // `expr?[expr]` is not valid typescript, since it looks like a ternary + // operator. + // + // Typescript solves this by inserting a `.` in before the `[`: `expr?.[expr]` + // + // We need to do the same when generating index based expressions. + indexPrefix = "." + } + + genIndex := func(inner string, value interface{}) { + g.Fgenf(w, "%s["+inner+"]", indexPrefix, value) } switch key.Type() { @@ -604,13 +616,13 @@ func (g *generator) genRelativeTraversal(w io.Writer, traversal hcl.Traversal, p if isLegalIdentifier(keyVal) { g.Fgenf(w, ".%s", keyVal) } else { - g.Fgenf(w, "[%q]", keyVal) + genIndex("%q", keyVal) } case cty.Number: idx, _ := key.AsBigFloat().Int64() - g.Fgenf(w, "[%d]", idx) + genIndex("%d", idx) default: - g.Fgenf(w, "[%q]", key.AsString()) + genIndex("%q", key.AsString()) } } } diff --git a/pkg/codegen/testing/test/program_driver.go b/pkg/codegen/testing/test/program_driver.go index 6b7669f2a20c..7c95b35a7cbc 100644 --- a/pkg/codegen/testing/test/program_driver.go +++ b/pkg/codegen/testing/test/program_driver.go @@ -88,7 +88,7 @@ var PulumiPulumiProgramTests = []ProgramTest{ { Directory: "aws-s3-logging", Description: "AWS S3 with logging", - SkipCompile: allProgLanguages.Except("python").Except("dotnet"), + SkipCompile: codegen.NewStringSet("go"), // Blocked on nodejs: TODO[pulumi/pulumi#8068] // Flaky in go: TODO[pulumi/pulumi#8123] }, diff --git a/pkg/codegen/testing/test/testdata/aws-s3-logging-pp/nodejs/aws-s3-logging.ts b/pkg/codegen/testing/test/testdata/aws-s3-logging-pp/nodejs/aws-s3-logging.ts index 51840abf7b34..68b8675231d8 100644 --- a/pkg/codegen/testing/test/testdata/aws-s3-logging-pp/nodejs/aws-s3-logging.ts +++ b/pkg/codegen/testing/test/testdata/aws-s3-logging-pp/nodejs/aws-s3-logging.ts @@ -5,4 +5,4 @@ const logs = new aws.s3.Bucket("logs", {}); const bucket = new aws.s3.Bucket("bucket", {loggings: [{ targetBucket: logs.bucket, }]}); -export const targetBucket = bucket.loggings.apply(loggings => loggings?[0]?.targetBucket); +export const targetBucket = bucket.loggings.apply(loggings => loggings?.[0]?.targetBucket);