diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index e3d7a55b87..8b8d7847ac 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -104,7 +104,7 @@ describe('SecureTemplater', () => { const mockFilter2 = jest.fn((var1, var2) => `${var1} ${var2}`); const mockFilter3 = jest.fn((var1, var2) => ({ var1, var2 })); const renderWith = await SecureTemplater.loadRenderer({ - nunjucksFilters: { mockFilter1, mockFilter2, mockFilter3 }, + additionalTemplateFilters: { mockFilter1, mockFilter2, mockFilter3 }, }); const renderWithout = await SecureTemplater.loadRenderer(); diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 1c1e2639a3..6d3ce6f556 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -58,8 +58,8 @@ const { render, renderCompat } = (() => { }); } - if (typeof nunjucksFilters !== 'undefined') { - for (const [filterName, filterFn] of Object.entries(nunjucksFilters)) { + if (typeof additionalTemplateFilters !== 'undefined') { + for (const [filterName, filterFn] of Object.entries(additionalTemplateFilters)) { env.addFilter(filterName, (...args) => JSON.parse(filterFn(...args))); } } @@ -95,7 +95,7 @@ const { render, renderCompat } = (() => { })(); `; -export type NunjucksFilter = (...args: JsonValue[]) => JsonValue | undefined; +export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; export interface SecureTemplaterOptions { /* Optional implementation of the parseRepoUrl filter */ @@ -105,7 +105,7 @@ export interface SecureTemplaterOptions { cookiecutterCompat?: boolean; /* Extra user-provided nunjucks filters */ - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; } export type SecureTemplateRenderer = ( @@ -115,16 +115,17 @@ export type SecureTemplateRenderer = ( export class SecureTemplater { static async loadRenderer(options: SecureTemplaterOptions = {}) { - const { parseRepoUrl, cookiecutterCompat, nunjucksFilters } = options; + const { parseRepoUrl, cookiecutterCompat, additionalTemplateFilters } = + options; const sandbox: Record = {}; if (parseRepoUrl) { sandbox.parseRepoUrl = (url: string) => JSON.stringify(parseRepoUrl(url)); } - if (nunjucksFilters) { - sandbox.nunjucksFilters = Object.fromEntries( - Object.entries(nunjucksFilters) + if (additionalTemplateFilters) { + sandbox.additionalTemplateFilters = Object.fromEntries( + Object.entries(additionalTemplateFilters) .filter(([_, filterFunction]) => !!filterFunction) .map(([filterName, filterFunction]) => [ filterName, diff --git a/plugins/scaffolder-backend/src/lib/templating/index.ts b/plugins/scaffolder-backend/src/lib/templating/index.ts index 110d7de20b..29d77291a1 100644 --- a/plugins/scaffolder-backend/src/lib/templating/index.ts +++ b/plugins/scaffolder-backend/src/lib/templating/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export type { NunjucksFilter } from './SecureTemplater'; +export type { TemplateFilter } from './SecureTemplater'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 9cc60a6b1e..481ab894ec 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -46,7 +46,7 @@ import { createGithubActionsDispatchAction, createGithubWebhookAction, } from './github'; -import { NunjucksFilter } from '../../../lib/templating/SecureTemplater'; +import { TemplateFilter } from '../../../lib'; export const createBuiltinActions = (options: { reader: UrlReader; @@ -54,7 +54,7 @@ export const createBuiltinActions = (options: { catalogClient: CatalogApi; containerRunner?: ContainerRunner; config: Config; - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; }) => { const { reader, @@ -62,7 +62,7 @@ export const createBuiltinActions = (options: { containerRunner, catalogClient, config, - nunjucksFilters, + additionalTemplateFilters, } = options; const githubCredentialsProvider: GithubCredentialsProvider = DefaultGithubCredentialsProvider.fromIntegrations(integrations); @@ -75,7 +75,7 @@ export const createBuiltinActions = (options: { createFetchTemplateAction({ integrations, reader, - nunjucksFilters, + additionalTemplateFilters, }), createPublishGithubAction({ integrations, 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 58e96f4164..32a3a84070 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -24,7 +24,7 @@ import globby from 'globby'; import fs from 'fs-extra'; import { isBinaryFile } from 'isbinaryfile'; import { - NunjucksFilter, + TemplateFilter, SecureTemplater, } from '../../../../lib/templating/SecureTemplater'; @@ -47,9 +47,9 @@ export type FetchTemplateInput = { export function createFetchTemplateAction(options: { reader: UrlReader; integrations: ScmIntegrations; - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; }) { - const { reader, integrations, nunjucksFilters } = options; + const { reader, integrations, additionalTemplateFilters } = options; return createTemplateAction({ id: 'fetch:template', @@ -186,7 +186,7 @@ export function createFetchTemplateAction(options: { const renderTemplate = await SecureTemplater.loadRenderer({ cookiecutterCompat: ctx.input.cookiecutterCompat, - nunjucksFilters: nunjucksFilters, + additionalTemplateFilters, }); for (const location of allEntriesInTemplate) { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 41b605e2e2..5089998834 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -35,7 +35,7 @@ import { validate as validateJsonSchema } from 'jsonschema'; import { parseRepoUrl } from '../actions/builtin/publish/util'; import { TemplateActionRegistry } from '../actions'; import { - NunjucksFilter, + TemplateFilter, SecureTemplater, SecureTemplateRenderer, } from '../../lib/templating/SecureTemplater'; @@ -45,7 +45,7 @@ type NunjucksWorkflowRunnerOptions = { actionRegistry: TemplateActionRegistry; integrations: ScmIntegrations; logger: winston.Logger; - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; }; type TemplateContext = { @@ -192,7 +192,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { parseRepoUrl(url: string) { return parseRepoUrl(url, integrations); }, - nunjucksFilters: this.options.nunjucksFilters, + additionalTemplateFilters: this.options.additionalTemplateFilters, }); try { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 8439c4ed8e..8de9359806 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -21,7 +21,7 @@ import { Logger } from 'winston'; import { TemplateActionRegistry } from '../actions'; import { ScmIntegrations } from '@backstage/integration'; import { assertError } from '@backstage/errors'; -import { NunjucksFilter } from '../../lib/templating/SecureTemplater'; +import { TemplateFilter } from '../../lib/templating/SecureTemplater'; /** * TaskWorkerOptions @@ -47,7 +47,7 @@ export type CreateWorkerOptions = { integrations: ScmIntegrations; workingDirectory: string; logger: Logger; - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; }; /** @@ -65,7 +65,7 @@ export class TaskWorker { actionRegistry, integrations, workingDirectory, - nunjucksFilters, + additionalTemplateFilters, } = options; const legacyWorkflowRunner = new HandlebarsWorkflowRunner({ @@ -80,7 +80,7 @@ export class TaskWorker { integrations, logger, workingDirectory, - nunjucksFilters: nunjucksFilters, + additionalTemplateFilters, }); return new TaskWorker({ diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 085b4b4d78..85ed8a60ab 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -29,7 +29,7 @@ import express from 'express'; import Router from 'express-promise-router'; import { validate } from 'jsonschema'; import { Logger } from 'winston'; -import { CatalogEntityClient, NunjucksFilter } from '../lib'; +import { CatalogEntityClient, TemplateFilter } from '../lib'; import { createBuiltinActions, DatabaseTaskStore, @@ -57,7 +57,7 @@ export interface RouterOptions { taskWorkers?: number; containerRunner?: ContainerRunner; taskBroker?: TaskBroker; - nunjucksFilters?: Record; + additionalTemplateFilters?: Record; } function isSupportedTemplate( @@ -84,7 +84,7 @@ export async function createRouter( actions, containerRunner, taskWorkers, - nunjucksFilters, + additionalTemplateFilters, } = options; const logger = parentLogger.child({ plugin: 'scaffolder' }); @@ -112,7 +112,7 @@ export async function createRouter( integrations, logger, workingDirectory, - nunjucksFilters, + additionalTemplateFilters, }); workers.push(worker); } @@ -125,7 +125,7 @@ export async function createRouter( containerRunner, reader, config, - nunjucksFilters, + additionalTemplateFilters, }); actionsToRegister.forEach(action => actionRegistry.register(action));