From 00c90984e5af4c0e1b0f60c641210d529e332e22 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Tue, 23 Jan 2024 16:49:16 +0100 Subject: [PATCH] add possibility to configure nunjucks configs Signed-off-by: Kiss Miklos --- .../src/lib/templating/SecureTemplater.ts | 7 +++++++ .../src/scaffolder/actions/builtin/fetch/template.ts | 6 ++++++ plugins/scaffolder-node/src/index.ts | 2 +- plugins/scaffolder-node/src/types.ts | 3 +++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 701863c7f6..8323b4aa98 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -19,6 +19,7 @@ import { resolvePackagePath } from '@backstage/backend-common'; import { TemplateFilter as _TemplateFilter, TemplateGlobal as _TemplateGlobal, + NunjucksConfigs, } from '@backstage/plugin-scaffolder-node'; import fs from 'fs-extra'; import { JsonValue } from '@backstage/types'; @@ -34,6 +35,7 @@ const { render, renderCompat } = (() => { const env = module.exports.configure({ autoescape: false, + ...JSON.parse(nunjucksConfigs), tags: { variableStart: '\${{', variableEnd: '}}', @@ -42,6 +44,7 @@ const { render, renderCompat } = (() => { const compatEnv = module.exports.configure({ autoescape: false, + ...JSON.parse(nunjucksConfigs), tags: { variableStart: '{{', variableEnd: '}}', @@ -109,6 +112,7 @@ export interface SecureTemplaterOptions { templateFilters?: Record; /* Extra user-provided nunjucks globals */ templateGlobals?: Record; + nunjucksConfigs?: NunjucksConfigs; } export type SecureTemplateRenderer = ( @@ -122,6 +126,7 @@ export class SecureTemplater { cookiecutterCompat, templateFilters = {}, templateGlobals = {}, + nunjucksConfigs = {}, } = options; const isolate = new Isolate({ memoryLimit: 128 }); @@ -140,6 +145,8 @@ export class SecureTemplater { mkScript(nunjucksSource), ); + await contextGlobal.set('nunjucksConfigs', JSON.stringify(nunjucksConfigs)); + const availableFilters = Object.keys(templateFilters); await contextGlobal.set( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 26b249b76d..2a2c138708 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -69,6 +69,8 @@ export function createFetchTemplateAction(options: { copyWithoutTemplating?: string[]; cookiecutterCompat?: boolean; replace?: boolean; + trimBlocks?: boolean; + lstripBlocks?: boolean; }>({ id: 'fetch:template', description: @@ -237,6 +239,10 @@ export function createFetchTemplateAction(options: { ...additionalTemplateFilters, }, templateGlobals: additionalTemplateGlobals, + nunjucksConfigs: { + trimBlocks: ctx.input.trimBlocks, + lstripBlocks: ctx.input.lstripBlocks, + }, }); for (const location of allEntriesInTemplate) { diff --git a/plugins/scaffolder-node/src/index.ts b/plugins/scaffolder-node/src/index.ts index 0ec492dd32..a049ffd9b7 100644 --- a/plugins/scaffolder-node/src/index.ts +++ b/plugins/scaffolder-node/src/index.ts @@ -23,4 +23,4 @@ export * from './actions'; export * from './tasks'; export * from './files'; -export type { TemplateFilter, TemplateGlobal } from './types'; +export type { TemplateFilter, TemplateGlobal, NunjucksConfigs } from './types'; diff --git a/plugins/scaffolder-node/src/types.ts b/plugins/scaffolder-node/src/types.ts index bae106c84e..892570af80 100644 --- a/plugins/scaffolder-node/src/types.ts +++ b/plugins/scaffolder-node/src/types.ts @@ -23,3 +23,6 @@ export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; export type TemplateGlobal = | ((...args: JsonValue[]) => JsonValue | undefined) | JsonValue; + +/** @public */ +export type NunjucksConfigs = { trimBlocks?: boolean; lstripBlocks?: boolean };