add option to add any JsonValue for globals
Signed-off-by: Kiss Miklos <miklos@roadie.io>
This commit is contained in:
@@ -34,5 +34,11 @@ export default async function createPlugin(
|
||||
reader: env.reader,
|
||||
identity: env.identity,
|
||||
scheduler: env.scheduler,
|
||||
additionalTemplateGlobals: {
|
||||
company: 'RoadieHQ',
|
||||
now: () => {
|
||||
return 'NOW !!!!';
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user