From cf792300a70a3025aa03b6eee11ae6f81410cd3d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Feb 2021 11:45:04 +0100 Subject: [PATCH] scaffolder-backend: add support for deep templating in task steps Co-authored-by: Johan Haals --- .../src/scaffolder/tasks/TaskWorker.ts | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index e717fcae1b..e7ad21e703 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -94,22 +94,20 @@ export class TaskWorker { throw new Error(`Action '${step.action}' does not exist`); } - const parameters: { [name: string]: JsonValue } = {}; - for (const [name, maybeTemplateStr] of Object.entries( - step.parameters ?? {}, - )) { - if (typeof maybeTemplateStr === 'string') { - const value = handlebars.compile(maybeTemplateStr, { - noEscape: true, - strict: true, - data: false, - preventIndent: true, - })(templateCtx); - parameters[name] = value; - } else { - parameters[name] = maybeTemplateStr; - } - } + const parameters = JSON.parse( + JSON.stringify(step.parameters), + (_key, value) => { + if (typeof value === 'string') { + return handlebars.compile(value, { + noEscape: true, + strict: true, + data: false, + preventIndent: true, + })(templateCtx); + } + return value; + }, + ); const stepOutputs: { [name: string]: JsonValue } = {}; @@ -138,16 +136,19 @@ export class TaskWorker { } } - const output = Object.fromEntries( - Object.entries(task.spec.output).map(([name, templateStr]) => { - const value = handlebars.compile(templateStr, { - noEscape: true, - strict: true, - data: false, - preventIndent: true, - })(templateCtx); - return [name, value]; - }), + const output = JSON.parse( + JSON.stringify(task.spec.output), + (_key, value) => { + if (typeof value === 'string') { + return handlebars.compile(value, { + noEscape: true, + strict: true, + data: false, + preventIndent: true, + })(templateCtx); + } + return value; + }, ); await task.complete('completed', { output });