From 00c90984e5af4c0e1b0f60c641210d529e332e22 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Tue, 23 Jan 2024 16:49:16 +0100 Subject: [PATCH 1/4] 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 }; From 3800d4a8ad1ee3f7109fa1a95d8e980050fa7cad Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 24 Jan 2024 11:42:10 +0100 Subject: [PATCH 2/4] add api-reports Signed-off-by: Kiss Miklos --- plugins/scaffolder-backend/api-report.md | 2 ++ plugins/scaffolder-node/api-report.md | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index c928e5341e..aa8097033e 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -175,6 +175,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-node/api-report.md b/plugins/scaffolder-node/api-report.md index 6bb1534679..877f979656 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -163,6 +163,12 @@ export function initRepoAndPush(input: { commitHash: string; }>; +// @public (undocumented) +export type NunjucksConfigs = { + trimBlocks?: boolean; + lstripBlocks?: boolean; +}; + // @public (undocumented) export const parseRepoUrl: ( repoUrl: string, From e0e5afeaf614ae69c73948d76b60def09a2101b9 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 24 Jan 2024 11:44:03 +0100 Subject: [PATCH 3/4] changeset Signed-off-by: Kiss Miklos --- .changeset/young-ladybugs-decide.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/young-ladybugs-decide.md 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 From 7052918391cc84d98d0c553682da96ffb2d88992 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Thu, 25 Jan 2024 16:04:35 +0100 Subject: [PATCH 4/4] do not export the SecureTemplateOptions Signed-off-by: Kiss Miklos --- .../src/lib/templating/SecureTemplater.ts | 5 ++--- plugins/scaffolder-node/api-report.md | 6 ------ plugins/scaffolder-node/src/index.ts | 2 +- plugins/scaffolder-node/src/types.ts | 3 --- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 8323b4aa98..607b1c6add 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -19,7 +19,6 @@ 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'; @@ -105,14 +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?: NunjucksConfigs; + nunjucksConfigs?: { trimBlocks?: boolean; lstripBlocks?: boolean }; } export type SecureTemplateRenderer = ( diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 877f979656..6bb1534679 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -163,12 +163,6 @@ export function initRepoAndPush(input: { commitHash: string; }>; -// @public (undocumented) -export type NunjucksConfigs = { - trimBlocks?: boolean; - lstripBlocks?: boolean; -}; - // @public (undocumented) export const parseRepoUrl: ( repoUrl: string, diff --git a/plugins/scaffolder-node/src/index.ts b/plugins/scaffolder-node/src/index.ts index a049ffd9b7..0ec492dd32 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, NunjucksConfigs } from './types'; +export type { TemplateFilter, TemplateGlobal } from './types'; diff --git a/plugins/scaffolder-node/src/types.ts b/plugins/scaffolder-node/src/types.ts index 892570af80..bae106c84e 100644 --- a/plugins/scaffolder-node/src/types.ts +++ b/plugins/scaffolder-node/src/types.ts @@ -23,6 +23,3 @@ export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; export type TemplateGlobal = | ((...args: JsonValue[]) => JsonValue | undefined) | JsonValue; - -/** @public */ -export type NunjucksConfigs = { trimBlocks?: boolean; lstripBlocks?: boolean };