diff --git a/.changeset/young-ladybugs-decide.md b/.changeset/young-ladybugs-decide.md new file mode 100644 index 0000000000..53284cbc37 --- /dev/null +++ b/.changeset/young-ladybugs-decide.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Add option to configure nunjucks with the `trimBlocks` and `lstripBlocks` options in the fetch:template action diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index cc16791390..c4a7656cd3 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -177,6 +177,8 @@ export function createFetchTemplateAction(options: { copyWithoutTemplating?: string[] | undefined; cookiecutterCompat?: boolean | undefined; replace?: boolean | undefined; + trimBlocks?: boolean | undefined; + lstripBlocks?: boolean | undefined; }, JsonObject >; diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 701863c7f6..607b1c6add 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -34,6 +34,7 @@ const { render, renderCompat } = (() => { const env = module.exports.configure({ autoescape: false, + ...JSON.parse(nunjucksConfigs), tags: { variableStart: '\${{', variableEnd: '}}', @@ -42,6 +43,7 @@ const { render, renderCompat } = (() => { const compatEnv = module.exports.configure({ autoescape: false, + ...JSON.parse(nunjucksConfigs), tags: { variableStart: '{{', variableEnd: '}}', @@ -102,13 +104,14 @@ export type TemplateFilter = _TemplateFilter; */ export type TemplateGlobal = _TemplateGlobal; -export interface SecureTemplaterOptions { +interface SecureTemplaterOptions { /* Enables jinja compatibility and the "jsonify" filter */ cookiecutterCompat?: boolean; /* Extra user-provided nunjucks filters */ templateFilters?: Record; /* Extra user-provided nunjucks globals */ templateGlobals?: Record; + nunjucksConfigs?: { trimBlocks?: boolean; lstripBlocks?: boolean }; } export type SecureTemplateRenderer = ( @@ -122,6 +125,7 @@ export class SecureTemplater { cookiecutterCompat, templateFilters = {}, templateGlobals = {}, + nunjucksConfigs = {}, } = options; const isolate = new Isolate({ memoryLimit: 128 }); @@ -140,6 +144,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) {