add option to add any JsonValue for globals

Signed-off-by: Kiss Miklos <miklos@roadie.io>
This commit is contained in:
Kiss Miklos
2022-09-26 01:35:21 +02:00
parent 5ca599b381
commit bd8ab057dc
11 changed files with 58 additions and 27 deletions
@@ -34,5 +34,11 @@ export default async function createPlugin(
reader: env.reader,
identity: env.identity,
scheduler: env.scheduler,
additionalTemplateGlobals: {
company: 'RoadieHQ',
now: () => {
return 'NOW !!!!';
},
},
});
}
+11 -6
View File
@@ -61,7 +61,7 @@ export const createBuiltinActions: (
export interface CreateBuiltInActionsOptions {
additionalTemplateFilters?: Record<string, TemplateFilter>;
// (undocumented)
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
catalogClient: CatalogApi;
config: Config;
integrations: ScmIntegrations;
@@ -110,7 +110,7 @@ export function createFetchTemplateAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
}): TemplateAction<{
url: string;
targetPath?: string | undefined;
@@ -429,7 +429,7 @@ export const createPublishGitlabMergeRequestAction: (options: {
branchName: string;
targetPath: string;
token?: string | undefined;
commitAction?: 'update' | 'create' | 'delete' | undefined;
commitAction?: 'update' | 'delete' | 'create' | undefined;
projectid?: string | undefined;
removeSourceBranch?: boolean | undefined;
assignee?: string | undefined;
@@ -451,7 +451,7 @@ export type CreateWorkerOptions = {
workingDirectory: string;
logger: Logger;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
// @public
@@ -542,7 +542,7 @@ export interface RouterOptions {
// (undocumented)
additionalTemplateFilters?: Record<string, TemplateFilter>;
// (undocumented)
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
// (undocumented)
catalogClient: CatalogApi;
// (undocumented)
@@ -599,7 +599,7 @@ export type ScaffolderPluginOptions = {
taskWorkers?: number;
taskBroker?: TaskBroker;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
// @public
@@ -820,4 +820,9 @@ export class TemplateActionRegistry {
// @public (undocumented)
export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined;
// @public (undocumented)
export type TemplateGlobal =
| ((...args: JsonValue[]) => JsonValue | undefined)
| JsonValue;
```
@@ -26,7 +26,7 @@ import {
} from '@backstage/backend-plugin-api';
import { ScmIntegrations } from '@backstage/integration';
import { catalogServiceRef } from '@backstage/plugin-catalog-node';
import { TemplateFilter } from './lib';
import { TemplateFilter, TemplateGlobal } from './lib';
import { createBuiltinActions, TaskBroker, TemplateAction } from './scaffolder';
import { createRouter } from './service/router';
@@ -39,7 +39,7 @@ export type ScaffolderPluginOptions = {
taskWorkers?: number;
taskBroker?: TaskBroker;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
/**
@@ -65,8 +65,12 @@ const { render, renderCompat } = (() => {
}
if (typeof additionalTemplateGlobals !== 'undefined') {
for (const [globalName, globalFn] of Object.entries(additionalTemplateGlobals)) {
env.addGlobal(globalName, (...args) => JSON.parse(globalFn(...args)));
for (const [globalName, global] of Object.entries(additionalTemplateGlobals)) {
if (typeof global === 'function') {
env.addGlobal(globalName, (...args) => JSON.parse(global(...args)));
} else {
env.addGlobal(globalName, global);
}
}
}
@@ -104,6 +108,11 @@ const { render, renderCompat } = (() => {
/** @public */
export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined;
/** @public */
export type TemplateGlobal =
| ((...args: JsonValue[]) => JsonValue | undefined)
| JsonValue;
export interface SecureTemplaterOptions {
/* Optional implementation of the parseRepoUrl filter */
parseRepoUrl?(repoUrl: string): RepoSpec;
@@ -113,7 +122,8 @@ export interface SecureTemplaterOptions {
/* Extra user-provided nunjucks filters */
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
/* Extra user-provided nunjucks globals */
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
}
export type SecureTemplateRenderer = (
@@ -148,11 +158,16 @@ export class SecureTemplater {
if (additionalTemplateGlobals) {
sandbox.additionalTemplateGlobals = Object.fromEntries(
Object.entries(additionalTemplateGlobals)
.filter(([_, filterFunction]) => !!filterFunction)
.map(([filterName, filterFunction]) => [
filterName,
(...args: JsonValue[]) => JSON.stringify(filterFunction(...args)),
]),
.filter(([_, global]) => !!global)
.map(([globalName, global]) => {
if (typeof global === 'function') {
return [
globalName,
(...args: JsonValue[]) => JSON.stringify(global(...args)),
];
}
return [globalName, global];
}),
);
}
const vm = new VM({ sandbox });
@@ -14,4 +14,4 @@
* limitations under the License.
*/
export type { TemplateFilter } from './SecureTemplater';
export type { TemplateFilter, TemplateGlobal } from './SecureTemplater';
@@ -28,7 +28,7 @@ import {
createCatalogWriteAction,
} from './catalog';
import { TemplateFilter } from '../../../lib';
import { TemplateFilter, TemplateGlobal } from '../../../lib';
import { TemplateAction } from '../types';
import { createDebugLogAction } from './debug';
import { createFetchPlainAction, createFetchTemplateAction } from './fetch';
@@ -82,7 +82,7 @@ export interface CreateBuiltInActionsOptions {
* Template Manifests and also template skeleton files when using `fetch:template`.
*/
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
}
/**
@@ -26,6 +26,7 @@ import { isBinaryFile } from 'isbinaryfile';
import {
TemplateFilter,
SecureTemplater,
TemplateGlobal,
} from '../../../../lib/templating/SecureTemplater';
/**
@@ -39,7 +40,7 @@ export function createFetchTemplateAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
}) {
const {
reader,
@@ -25,7 +25,7 @@ import {
SerializedFile,
serializeDirectoryContents,
} from '../../lib/files';
import { TemplateFilter } from '../../lib/templating';
import { TemplateFilter, TemplateGlobal } from '../../lib/templating';
import { createTemplateAction, TemplateActionRegistry } from '../actions';
import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner';
import { TaskSecrets } from '../tasks/types';
@@ -52,7 +52,7 @@ export type TemplateTesterCreateOptions = {
actionRegistry: TemplateActionRegistry;
workingDirectory: string;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
/**
@@ -31,6 +31,7 @@ import {
TemplateFilter,
SecureTemplater,
SecureTemplateRenderer,
TemplateGlobal,
} from '../../lib/templating/SecureTemplater';
import {
TaskSpec,
@@ -45,7 +46,7 @@ type NunjucksWorkflowRunnerOptions = {
integrations: ScmIntegrations;
logger: winston.Logger;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
type TemplateContext = {
@@ -20,7 +20,10 @@ import { Logger } from 'winston';
import { TemplateActionRegistry } from '../actions';
import { ScmIntegrations } from '@backstage/integration';
import { assertError } from '@backstage/errors';
import { TemplateFilter } from '../../lib/templating/SecureTemplater';
import {
TemplateFilter,
TemplateGlobal,
} from '../../lib/templating/SecureTemplater';
/**
* TaskWorkerOptions
@@ -46,7 +49,7 @@ export type CreateWorkerOptions = {
workingDirectory: string;
logger: Logger;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
};
/**
@@ -36,7 +36,7 @@ import Router from 'express-promise-router';
import { validate } from 'jsonschema';
import { Logger } from 'winston';
import { z } from 'zod';
import { TemplateFilter } from '../lib';
import { TemplateFilter, TemplateGlobal } from '../lib';
import {
createBuiltinActions,
DatabaseTaskStore,
@@ -70,7 +70,7 @@ export interface RouterOptions {
taskWorkers?: number;
taskBroker?: TaskBroker;
additionalTemplateFilters?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateFilter>;
additionalTemplateGlobals?: Record<string, TemplateGlobal>;
identity?: IdentityApi;
}