stocky-france-59380
07/22/2021, 1:20 AMconfig:
aws:region: us-east-1
pulumi_node:application-dashboards:
- namespace: api-platform
topic:
- ap-topic-1
- ap-topic-2
applications:
- name: template-api-reference
topic:
- tar-topic-1
- tar-topic-2
- name: msk-healthcheck-consumer
- name: msk-healthcheck-producer
let pulumiConfig = new pulumi.Config()
let applicationDashboards = pulumiConfig.getObject<ApplicationDashboards[]>("application-dashboards")
export interface ApplicationDashboards {
namespace: string
topic: string[]
applications: {
name: string
topic: string[]
}[]
}
This produces the output below
console.log(JSON.stringify(applicationDashboards))
console.log(applicationDashboards)
[{"applications":[{"name":"template-api-reference","topic":["tar-topic-1","tar-topic-2"]},{"name":"msk-healthcheck-consumer"},{"name":"msk-healthcheck-producer"}],"namespace":"api-platform","topic":["ap-topic-1","ap-topic-2"]}]
[
{
applications: [ [Object], [Object], [Object] ],
namespace: 'api-platform',
topic: [ 'ap-topic-1', 'ap-topic-2' ]
}
]
little-cartoon-10569
07/22/2021, 1:28 AMstocky-france-59380
07/22/2021, 1:29 AMlittle-cartoon-10569
07/22/2021, 1:29 AMstocky-france-59380
07/22/2021, 1:30 AMconfig:
aws:region: us-east-1
pulumi_node:application-dashboards: - namespace: api-platform
topic:
- ap-topic-1
- ap-topic-2
applications:
- template-api-reference
- msk-healthcheck-consumer
- msk-healthcheck-producer
little-cartoon-10569
07/22/2021, 1:32 AMapplications
is supposed to be an array of objects, duck-typed as {name:string; topics:string[]}
. The unmarshalled object above shows applications
as an array of strings. Are you asking why it's getting an array of strings instead of the expected objects?stocky-france-59380
07/22/2021, 1:35 AMfunction findTopic(dashboards: ApplicationDashboards[], splitStr: string[]): string[] {
const namespace_name = splitStr[0]
const application_name = splitStr[1]
// console.log(namespace_name + " " + application_name)
let appTopics: string[] = []
for (var ns of dashboards) {
if (ns.namespace === namespace_name) {
if (ns.topic.length === 0) {
return []
}
appTopics = appTopics.concat(ns.topic)
for (var app of ns.applications) {
console.log(app)
if (app.name == application_name) {
appTopics = (app.topic?.length > 0) ? appTopics.concat(app.topic) : appTopics
}
}
}
}
return appTopics
}
With the way that this is unmarshalled i.e. with an array of objects this loop for (var app of ns.applications)
is undefined@test 'typescript interface' () {
interface SquareConfig {
color?: string
width?: number
thing?: {
name?: string
}[]
}
// interface something {
// name?: string
// }
let newSquare = { color: "white", area: 100, thing:[{name:"Janitha"},{name:"Jayaweera"}] }
testassert.deepStrictEqual(newSquare.area,100)
testassert.deepStrictEqual(newSquare.thing[0].name,"Janitha")
testassert.deepStrictEqual(newSquare.thing[1].name,"Jayaweera")
}
given a unit test like this it behaves as I expect it. I can index and access. i.e. what I want to do with the for loop abovelittle-cartoon-10569
07/22/2021, 1:39 AMapplications:
- name: template-api-reference
topic:
- tar-topic-1
- tar-topic-2
- name: msk-healthcheck-consumer
- name: msk-healthcheck-producer
And this corresponding interface definition:
applications: {
name: string
topic: string[]
}[]
In the example YAML, topic is optional, but in the interface, it is not. Would making this change help?
applications: {
name: string
topic?: string[]
}[]
stocky-france-59380
07/22/2021, 1:43 AMconsole.log(applicationDashboards[0].applications)
error: Running program '/workspaces/pulumi_node' failed with an unhandled exception:
TSError: ⨯ Unable to compile TypeScript:
index.ts(21,13): error TS2532: Object is possibly 'undefined'.
at createTSError (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:261:12)
at getOutput (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:367:40)
at Object.compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:558:11)
at Module.m._compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:439:43)
at Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
at Object.require.extensions.<computed> [as .ts] (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:442:12)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
at Module.require (node:internal/modules/cjs/loader:1013:19)
at require (node:internal/modules/cjs/helpers:93:18)
little-cartoon-10569
07/22/2021, 1:44 AMconsole.log(applicationDashboards?[0].applications)
stocky-france-59380
07/22/2021, 1:45 AMconsole.log(applicationDashboards[0]?.applications)
error: Running program '/workspaces/pulumi_node' failed with an unhandled exception:
TSError: ⨯ Unable to compile TypeScript:
index.ts(21,13): error TS2532: Object is possibly 'undefined'.
at createTSError (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:261:12)
at getOutput (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:367:40)
at Object.compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:558:11)
at Module.m._compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:439:43)
at Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
at Object.require.extensions.<computed> [as .ts] (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:442:12)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
at Module.require (node:internal/modules/cjs/loader:1013:19)
at require (node:internal/modules/cjs/helpers:93:18)
error: Running program '/workspaces/pulumi_node' failed with an unhandled exception:
TSError: ⨯ Unable to compile TypeScript:
index.ts(21,51): error TS1005: ':' expected.
index.ts(21,39): error TS2339: Property 'applications' does not exist on type 'number[]'.
at createTSError (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:261:12)
at getOutput (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:367:40)
at Object.compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:558:11)
at Module.m._compile (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:439:43)
at Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
at Object.require.extensions.<computed> [as .ts] (/workspaces/pulumi_node/node_modules/@pulumi/pulumi/node_modules/ts-node/src/index.ts:442:12)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
at Module.require (node:internal/modules/cjs/loader:1013:19)
at require (node:internal/modules/cjs/helpers:93:18)
little-cartoon-10569
07/22/2021, 2:06 AMstocky-france-59380
07/22/2021, 3:21 PMlet pulumiConfig = new pulumi.Config()
let applicationDashboards = pulumiConfig.getObject<ApplicationDashboards[]>("application-dashboards")
little-cartoon-10569
07/22/2021, 8:59 PM