From 6413e33bd80a5a380273adc91b816b543658e879 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Thu, 1 Dec 2022 17:41:57 +0100 Subject: [PATCH 1/4] feat: handle map in workflows --- packages/cli/src/commands/test.ts | 6 +++- .../cli/src/lib/helpers/workflow-validator.ts | 30 ++++++++++++++----- packages/cli/src/lib/workflow/util.ts | 3 +- .../test/003-json-output/polywrap.test.yaml | 8 +++++ .../cli/test/run-test-wrapper/src/index.ts | 7 ++++- .../test/run-test-wrapper/src/schema.graphql | 4 +++ 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/commands/test.ts b/packages/cli/src/commands/test.ts index 7dfc7bd3ea..185a3f3771 100644 --- a/packages/cli/src/commands/test.ts +++ b/packages/cli/src/commands/test.ts @@ -15,6 +15,7 @@ import { defaultWorkflowManifest, parseManifestFileOption, parseLogFileOption, + typesHandler, } from "../lib"; import { createLogger } from "./utils/createLogger"; @@ -143,7 +144,10 @@ const _run = async (options: WorkflowCommandOptions) => { fs.writeFileSync(outputFile, yaml.stringify(printableOutput, null, 2)); break; case "json": - fs.writeFileSync(outputFile, JSON.stringify(printableOutput, null, 2)); + fs.writeFileSync( + outputFile, + JSON.stringify(printableOutput, typesHandler, 2) + ); break; default: throw new Error( diff --git a/packages/cli/src/lib/helpers/workflow-validator.ts b/packages/cli/src/lib/helpers/workflow-validator.ts index b75c9fdd88..f36acab518 100644 --- a/packages/cli/src/lib/helpers/workflow-validator.ts +++ b/packages/cli/src/lib/helpers/workflow-validator.ts @@ -14,6 +14,20 @@ export function cueExists(logger: Logger): boolean { return stdout ? stdout.startsWith("cue version ") : false; } +export const typesHandler = (_: unknown, value: unknown): unknown => { + if (value instanceof Map) { + return Array.from(value).reduce( + (obj: Record, [key, value]) => { + obj[key] = value; + return obj; + }, + {} + ); + } + + return value; +}; + export function validateOutput( output: WorkflowOutput, validateScriptPath: string, @@ -30,20 +44,22 @@ export function validateOutput( const stepId = id.substring(index + 1); const selector = `${jobId}.\\$${stepId}`; - const jsonOutput = `${TMPDIR}/${id}.json`; + const tempOutputPath = `${TMPDIR}/${id}.json`; - fs.writeFileSync( - jsonOutput, - JSON.stringify({ data, error: error?.message }, null, 2) + const outputData = JSON.stringify( + { data, error: error?.message }, + typesHandler, + 2 ); + fs.writeFileSync(tempOutputPath, outputData); const { stderr } = runCommandSync( - `cue vet -d ${selector} ${validateScriptPath} ${jsonOutput}`, + `cue vet -d ${selector} ${validateScriptPath} ${tempOutputPath}`, logger ); - if (fs.existsSync(jsonOutput)) { - fs.unlinkSync(jsonOutput); + if (fs.existsSync(tempOutputPath)) { + fs.unlinkSync(tempOutputPath); } if (!stderr) { diff --git a/packages/cli/src/lib/workflow/util.ts b/packages/cli/src/lib/workflow/util.ts index 2bbdc6df73..e6c71cf744 100644 --- a/packages/cli/src/lib/workflow/util.ts +++ b/packages/cli/src/lib/workflow/util.ts @@ -4,6 +4,7 @@ import { WorkflowOutput } from "./types"; import path from "path"; import fs from "fs"; import { WorkflowJobs } from "@polywrap/polywrap-manifest-types-js"; +import { typesHandler } from "../helpers"; export const validateJobNames = ( jobs: WorkflowJobs | undefined, @@ -44,7 +45,7 @@ export function printJobOutput(output: WorkflowOutput): void { console.log(`Job status: ${output.status}`); if (output.data !== undefined) { - console.log(`Data: ${JSON.stringify(output.data, null, 2)}`); + console.log(`Data: ${JSON.stringify(output.data, typesHandler, 2)}`); } if (output.error) { diff --git a/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml b/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml index 40b784b1af..e579f04ca0 100644 --- a/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml +++ b/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml @@ -31,3 +31,11 @@ jobs: args: x: "$cases.0.data" y: "$cases.0.data" + case3: + steps: + - uri: fs/../run-test-wrapper/build + method: returnMap + args: + map: + Hello: 1 + Heyo: 50 \ No newline at end of file diff --git a/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts b/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts index 16433efac2..00fd36c8e5 100644 --- a/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts +++ b/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts @@ -2,6 +2,7 @@ import { Args_add, Args_addInBox, Args_addFromEnv, + Args_returnMap, Num, Env } from "./wrap"; @@ -16,4 +17,8 @@ export function addInBox(args: Args_addInBox): Num { export function addFromEnv(args: Args_addFromEnv, env: Env): i32 { return args.x + env.value; -} \ No newline at end of file +} + +export function returnMap(args: Args_returnMap): Map { + return args.map; +} diff --git a/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql b/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql index 27e7b438cb..fc2f214181 100644 --- a/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql +++ b/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql @@ -12,6 +12,10 @@ type Module { addFromEnv( x: Int32! ): Int32! @env(required: true) + + returnMap( + map: Map! @annotate(type: "Map!") + ): Map! @annotate(type: "Map!") } type Num { From 9abcf06e9a06d27859e12a4b14ae11dffaf3baf7 Mon Sep 17 00:00:00 2001 From: Cesar Date: Thu, 1 Dec 2022 19:29:48 +0100 Subject: [PATCH 2/4] tests(workflow): check that nested map also works as expected --- .../cases/cli/test/003-json-output/polywrap.test.yaml | 5 +++-- .../test-cases/cases/cli/test/run-test-wrapper/src/index.ts | 2 +- .../cases/cli/test/run-test-wrapper/src/schema.graphql | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml b/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml index e579f04ca0..1b1bc8437e 100644 --- a/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml +++ b/packages/test-cases/cases/cli/test/003-json-output/polywrap.test.yaml @@ -37,5 +37,6 @@ jobs: method: returnMap args: map: - Hello: 1 - Heyo: 50 \ No newline at end of file + nested_map: + Hello: 1 + Heyo: 50 \ No newline at end of file diff --git a/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts b/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts index 00fd36c8e5..4269850151 100644 --- a/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts +++ b/packages/test-cases/cases/cli/test/run-test-wrapper/src/index.ts @@ -19,6 +19,6 @@ export function addFromEnv(args: Args_addFromEnv, env: Env): i32 { return args.x + env.value; } -export function returnMap(args: Args_returnMap): Map { +export function returnMap(args: Args_returnMap): Map> { return args.map; } diff --git a/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql b/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql index fc2f214181..6df61e255b 100644 --- a/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql +++ b/packages/test-cases/cases/cli/test/run-test-wrapper/src/schema.graphql @@ -14,8 +14,8 @@ type Module { ): Int32! @env(required: true) returnMap( - map: Map! @annotate(type: "Map!") - ): Map! @annotate(type: "Map!") + map: Map! @annotate(type: "Map!>!") + ): Map! @annotate(type: "Map!>!") } type Num { From bd5e4d5603d3741a19f3f3d4e3854f405a57f6bf Mon Sep 17 00:00:00 2001 From: Cesar Date: Thu, 1 Dec 2022 20:04:12 +0100 Subject: [PATCH 3/4] fix: lint --- packages/cli/src/lib/helpers/workflow-validator.ts | 12 ++++++++---- packages/cli/src/lib/workflow/util.ts | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/lib/helpers/workflow-validator.ts b/packages/cli/src/lib/helpers/workflow-validator.ts index f36acab518..cd38825c3e 100644 --- a/packages/cli/src/lib/helpers/workflow-validator.ts +++ b/packages/cli/src/lib/helpers/workflow-validator.ts @@ -53,15 +53,19 @@ export function validateOutput( ); fs.writeFileSync(tempOutputPath, outputData); - const { stderr } = runCommandSync( - `cue vet -d ${selector} ${validateScriptPath} ${tempOutputPath}`, - logger - ); + const validate = (args: string[]) => { + const [selector, scriptPath, tempOutput] = args; + return runCommandSync( + `cue vet -d ${selector} ${scriptPath} ${tempOutput}`, + logger + ); + }; if (fs.existsSync(tempOutputPath)) { fs.unlinkSync(tempOutputPath); } + const { stderr } = validate([selector, validateScriptPath, tempOutputPath]); if (!stderr) { output.validation = { status: Status.SUCCEED }; } else { diff --git a/packages/cli/src/lib/workflow/util.ts b/packages/cli/src/lib/workflow/util.ts index e6c71cf744..de2b1aa965 100644 --- a/packages/cli/src/lib/workflow/util.ts +++ b/packages/cli/src/lib/workflow/util.ts @@ -1,10 +1,10 @@ import { intlMsg } from "../intl"; import { WorkflowOutput } from "./types"; +import { typesHandler } from "../helpers"; import path from "path"; import fs from "fs"; import { WorkflowJobs } from "@polywrap/polywrap-manifest-types-js"; -import { typesHandler } from "../helpers"; export const validateJobNames = ( jobs: WorkflowJobs | undefined, From 65122c6f3936b9124b55dd3645e53232a0326b2e Mon Sep 17 00:00:00 2001 From: cbrzn Date: Thu, 1 Dec 2022 20:53:56 +0100 Subject: [PATCH 4/4] fix: tests and hopefully code scan error --- .../cli/src/lib/helpers/workflow-validator.ts | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/packages/cli/src/lib/helpers/workflow-validator.ts b/packages/cli/src/lib/helpers/workflow-validator.ts index cd38825c3e..fc5252990a 100644 --- a/packages/cli/src/lib/helpers/workflow-validator.ts +++ b/packages/cli/src/lib/helpers/workflow-validator.ts @@ -44,28 +44,20 @@ export function validateOutput( const stepId = id.substring(index + 1); const selector = `${jobId}.\\$${stepId}`; - const tempOutputPath = `${TMPDIR}/${id}.json`; + const jsonOutput = `${TMPDIR}/${id}.json`; - const outputData = JSON.stringify( - { data, error: error?.message }, - typesHandler, - 2 + fs.writeFileSync( + jsonOutput, + JSON.stringify({ data, error: error?.message }, typesHandler, 2) ); - fs.writeFileSync(tempOutputPath, outputData); - const validate = (args: string[]) => { - const [selector, scriptPath, tempOutput] = args; - return runCommandSync( - `cue vet -d ${selector} ${scriptPath} ${tempOutput}`, - logger - ); - }; + const args = [selector, validateScriptPath, jsonOutput]; + const { stderr } = runCommandSync(`cue vet -d ${args.join(" ")}`, logger); - if (fs.existsSync(tempOutputPath)) { - fs.unlinkSync(tempOutputPath); + if (fs.existsSync(jsonOutput)) { + fs.unlinkSync(jsonOutput); } - const { stderr } = validate([selector, validateScriptPath, tempOutputPath]); if (!stderr) { output.validation = { status: Status.SUCCEED }; } else {