@backstage/plugin-scaffolder-backend 4.0.3-next.1 → 4.0.3-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/ScaffolderPlugin.cjs.js +1 -1
- package/dist/scaffolder/actions/builtin/fetch/template.cjs.js +3 -1
- package/dist/scaffolder/actions/builtin/fetch/template.cjs.js.map +1 -1
- package/dist/scaffolder/actions/builtin/fetch/templateActionHandler.cjs.js +70 -68
- package/dist/scaffolder/actions/builtin/fetch/templateActionHandler.cjs.js.map +1 -1
- package/dist/scaffolder/actions/builtin/fetch/templateFile.cjs.js +4 -1
- package/dist/scaffolder/actions/builtin/fetch/templateFile.cjs.js.map +1 -1
- package/dist/scaffolder/actions/builtin/fetch/templateFileActionHandler.cjs.js +14 -30
- package/dist/scaffolder/actions/builtin/fetch/templateFileActionHandler.cjs.js.map +1 -1
- package/dist/scaffolder/dryrun/createDryRunner.cjs.js +6 -0
- package/dist/scaffolder/dryrun/createDryRunner.cjs.js.map +1 -1
- package/dist/scaffolder/tasks/NunjucksWorkflowRunner.cjs.js +79 -95
- package/dist/scaffolder/tasks/NunjucksWorkflowRunner.cjs.js.map +1 -1
- package/dist/scaffolder/tasks/TaskWorker.cjs.js +5 -2
- package/dist/scaffolder/tasks/TaskWorker.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +1 -1
- package/dist/util/templating.cjs.js +12 -0
- package/dist/util/templating.cjs.js.map +1 -1
- package/package.json +9 -14
- package/assets/nunjucks.js.txt +0 -10385
- package/dist/lib/templating/SecureTemplater.cjs.js +0 -188
- package/dist/lib/templating/SecureTemplater.cjs.js.map +0 -1
- package/dist/lib/templating/helpers.cjs.js +0 -13
- package/dist/lib/templating/helpers.cjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskWorker.cjs.js","sources":["../../../src/scaffolder/tasks/TaskWorker.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuditorService, LoggerService } from '@backstage/backend-plugin-api';\nimport type { MetricsService } from '@backstage/backend-plugin-api/alpha';\nimport { InputError, stringifyError, toError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport {\n TaskBroker,\n TaskContext,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport PQueue from 'p-queue';\nimport { TemplateActionRegistry } from '../actions/TemplateActionRegistry';\nimport { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner';\nimport { WorkflowRunner } from './types';\nimport { setTimeout } from 'node:timers/promises';\nimport { JsonObject } from '@backstage/types';\nimport { Config } from '@backstage/config';\n\nconst DEFAULT_TASK_PARAMETER_MAX_LENGTH = 256;\n\n/**\n * TaskWorkerOptions\n */\nexport type TaskWorkerOptions = {\n taskBroker: TaskBroker;\n runners: {\n workflowRunner: WorkflowRunner;\n };\n concurrentTasksLimit: number;\n permissions?: PermissionEvaluator;\n logger?: LoggerService;\n auditor?: AuditorService;\n config?: Config;\n gracefulShutdown?: boolean;\n};\n\n/**\n * CreateWorkerOptions\n */\nexport type CreateWorkerOptions = {\n taskBroker: TaskBroker;\n actionRegistry: TemplateActionRegistry;\n integrations: ScmIntegrations;\n workingDirectory: string;\n logger: LoggerService;\n auditor?: AuditorService;\n config?: Config;\n additionalTemplateFilters?: Record<string, TemplateFilter>;\n /**\n * The number of tasks that can be executed at the same time by the worker\n * @defaultValue 10\n * @example\n * ```\n * {\n * concurrentTasksLimit: 1,\n * // OR\n * concurrentTasksLimit: Infinity\n * }\n * ```\n */\n concurrentTasksLimit?: number;\n additionalTemplateGlobals?: Record<string, TemplateGlobal>;\n permissions?: PermissionEvaluator;\n gracefulShutdown?: boolean;\n metrics: MetricsService;\n};\n\n/**\n * TaskWorker\n */\nexport class TaskWorker {\n private taskQueue: PQueue;\n private logger: LoggerService | undefined;\n private auditor: AuditorService | undefined;\n private parameterAuditTransform: ParameterAuditTransform;\n private stopWorkers: boolean;\n\n private readonly options: TaskWorkerOptions & {\n parameterAuditTransform: ParameterAuditTransform;\n };\n\n private constructor(\n options: TaskWorkerOptions & {\n parameterAuditTransform: ParameterAuditTransform;\n },\n ) {\n this.options = options;\n this.stopWorkers = false;\n this.logger = options.logger;\n this.auditor = options.auditor;\n this.taskQueue = new PQueue({\n concurrency: options.concurrentTasksLimit,\n });\n this.parameterAuditTransform = options.parameterAuditTransform;\n }\n\n static async create(options: CreateWorkerOptions): Promise<TaskWorker> {\n const {\n taskBroker,\n logger,\n auditor,\n config,\n actionRegistry,\n integrations,\n workingDirectory,\n additionalTemplateFilters,\n concurrentTasksLimit = 10, // from 1 to Infinity\n additionalTemplateGlobals,\n permissions,\n gracefulShutdown,\n metrics,\n } = options;\n\n const workflowRunner = new NunjucksWorkflowRunner({\n actionRegistry,\n integrations,\n logger,\n auditor,\n workingDirectory,\n additionalTemplateFilters,\n additionalTemplateGlobals,\n permissions,\n config,\n metrics,\n });\n\n return new TaskWorker({\n taskBroker: taskBroker,\n runners: { workflowRunner },\n concurrentTasksLimit,\n permissions,\n auditor,\n config,\n gracefulShutdown,\n parameterAuditTransform: createParameterTruncator(config),\n });\n }\n\n async recoverTasks() {\n try {\n await this.options.taskBroker.recoverTasks?.();\n } catch (err) {\n this.logger?.error(stringifyError(err));\n }\n }\n\n start() {\n (async () => {\n while (!this.stopWorkers) {\n await setTimeout(10000);\n await this.recoverTasks();\n }\n })();\n (async () => {\n while (!this.stopWorkers) {\n await this.onReadyToClaimTask();\n if (!this.stopWorkers) {\n const task = await this.options.taskBroker.claim();\n void this.taskQueue.add(() => this.runOneTask(task));\n }\n }\n })();\n }\n\n async stop() {\n this.stopWorkers = true;\n if (this.options?.gracefulShutdown) {\n while (this.taskQueue.size > 0) {\n await setTimeout(1000);\n }\n }\n }\n\n protected onReadyToClaimTask(): Promise<void> {\n if (this.taskQueue.pending < this.options.concurrentTasksLimit) {\n return Promise.resolve();\n }\n return new Promise(resolve => {\n // \"next\" event emits when a task completes\n // https://github.com/sindresorhus/p-queue#next\n this.taskQueue.once('next', () => {\n resolve();\n });\n });\n }\n\n async runOneTask(task: TaskContext) {\n const auditorEvent = await this.auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n meta: {\n actionType: 'execution',\n createdBy: task.createdBy,\n taskId: task.taskId,\n taskParameters: this.parameterAuditTransform(task.spec.parameters),\n templateRef: task.spec.templateInfo?.entityRef,\n },\n });\n\n try {\n if (task.spec.apiVersion !== 'scaffolder.backstage.io/v1beta3') {\n throw new Error(\n `Unsupported Template apiVersion ${task.spec.apiVersion}`,\n );\n }\n\n const { output } = await this.options.runners.workflowRunner.execute(\n task,\n );\n\n await task.complete('completed', { output });\n await auditorEvent?.success();\n } catch (error) {\n const err = toError(error);\n await auditorEvent?.fail({\n error: err,\n });\n await task.complete('failed', {\n error: { name: err.name, message: err.message },\n });\n }\n }\n}\n\ntype ParameterAuditTransform = (parameters: JsonObject) => JsonObject;\n\n/**\n * Truncates task parameters for audit logging using the configured max length.\n * @internal\n */\nexport function createParameterTruncator(\n config?: Config,\n): ParameterAuditTransform {\n const maxLength =\n config?.getOptionalNumber('scaffolder.auditor.taskParameterMaxLength') ??\n DEFAULT_TASK_PARAMETER_MAX_LENGTH;\n\n if (!Number.isSafeInteger(maxLength) || maxLength < -1) {\n throw new InputError(\n `Invalid configuration for 'scaffolder.auditor.taskParameterMaxLength', got ${maxLength}. Must be a positive integer or -1 to disable truncation.`,\n );\n }\n\n if (maxLength === -1) {\n return (parameters: JsonObject) => parameters;\n }\n\n return (parameters: JsonObject) => {\n function truncate(value: unknown): unknown {\n if (typeof value === 'string') {\n if (value.length > maxLength) {\n return value.slice(0, maxLength).concat('...<truncated>');\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(truncate);\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const k in value as object) {\n if (Object.hasOwn(value, k)) {\n result[k] = truncate((value as any)[k]);\n }\n }\n return result;\n }\n return value;\n }\n\n return truncate(parameters) as JsonObject;\n };\n}\n"],"names":["PQueue","NunjucksWorkflowRunner","stringifyError","setTimeout","toError","InputError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TaskWorker.cjs.js","sources":["../../../src/scaffolder/tasks/TaskWorker.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuditorService, LoggerService } from '@backstage/backend-plugin-api';\nimport type { MetricsService } from '@backstage/backend-plugin-api/alpha';\nimport { InputError, stringifyError, toError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport {\n TaskBroker,\n TaskContext,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport PQueue from 'p-queue';\nimport { TemplateActionRegistry } from '../actions/TemplateActionRegistry';\nimport { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner';\nimport { WorkflowRunner } from './types';\nimport { setTimeout } from 'node:timers/promises';\nimport { JsonObject } from '@backstage/types';\nimport { Config } from '@backstage/config';\nimport { collectTemplateCapabilities } from '../../util/templating';\n\nconst DEFAULT_TASK_PARAMETER_MAX_LENGTH = 256;\n\n/**\n * TaskWorkerOptions\n */\nexport type TaskWorkerOptions = {\n taskBroker: TaskBroker;\n runners: {\n workflowRunner: WorkflowRunner;\n };\n concurrentTasksLimit: number;\n permissions?: PermissionEvaluator;\n logger?: LoggerService;\n auditor?: AuditorService;\n config?: Config;\n gracefulShutdown?: boolean;\n};\n\n/**\n * CreateWorkerOptions\n */\nexport type CreateWorkerOptions = {\n taskBroker: TaskBroker;\n actionRegistry: TemplateActionRegistry;\n integrations: ScmIntegrations;\n workingDirectory: string;\n logger: LoggerService;\n auditor?: AuditorService;\n config?: Config;\n additionalTemplateFilters?: Record<string, TemplateFilter>;\n /**\n * The number of tasks that can be executed at the same time by the worker\n * @defaultValue 10\n * @example\n * ```\n * {\n * concurrentTasksLimit: 1,\n * // OR\n * concurrentTasksLimit: Infinity\n * }\n * ```\n */\n concurrentTasksLimit?: number;\n additionalTemplateGlobals?: Record<string, TemplateGlobal>;\n permissions?: PermissionEvaluator;\n gracefulShutdown?: boolean;\n metrics: MetricsService;\n};\n\n/**\n * TaskWorker\n */\nexport class TaskWorker {\n private taskQueue: PQueue;\n private logger: LoggerService | undefined;\n private auditor: AuditorService | undefined;\n private parameterAuditTransform: ParameterAuditTransform;\n private stopWorkers: boolean;\n\n private readonly options: TaskWorkerOptions & {\n parameterAuditTransform: ParameterAuditTransform;\n };\n\n private constructor(\n options: TaskWorkerOptions & {\n parameterAuditTransform: ParameterAuditTransform;\n },\n ) {\n this.options = options;\n this.stopWorkers = false;\n this.logger = options.logger;\n this.auditor = options.auditor;\n this.taskQueue = new PQueue({\n concurrency: options.concurrentTasksLimit,\n });\n this.parameterAuditTransform = options.parameterAuditTransform;\n }\n\n static async create(options: CreateWorkerOptions): Promise<TaskWorker> {\n const {\n taskBroker,\n logger,\n auditor,\n config,\n actionRegistry,\n integrations,\n workingDirectory,\n additionalTemplateFilters,\n concurrentTasksLimit = 10, // from 1 to Infinity\n additionalTemplateGlobals,\n permissions,\n gracefulShutdown,\n metrics,\n } = options;\n\n const workflowRunner = new NunjucksWorkflowRunner({\n actionRegistry,\n integrations,\n logger,\n auditor,\n workingDirectory,\n templateCapabilities: collectTemplateCapabilities({\n filters: additionalTemplateFilters,\n globals: additionalTemplateGlobals,\n }),\n permissions,\n config,\n metrics,\n });\n\n return new TaskWorker({\n taskBroker: taskBroker,\n runners: { workflowRunner },\n concurrentTasksLimit,\n permissions,\n auditor,\n config,\n gracefulShutdown,\n parameterAuditTransform: createParameterTruncator(config),\n });\n }\n\n async recoverTasks() {\n try {\n await this.options.taskBroker.recoverTasks?.();\n } catch (err) {\n this.logger?.error(stringifyError(err));\n }\n }\n\n start() {\n (async () => {\n while (!this.stopWorkers) {\n await setTimeout(10000);\n await this.recoverTasks();\n }\n })();\n (async () => {\n while (!this.stopWorkers) {\n await this.onReadyToClaimTask();\n if (!this.stopWorkers) {\n const task = await this.options.taskBroker.claim();\n void this.taskQueue.add(() => this.runOneTask(task));\n }\n }\n })();\n }\n\n async stop() {\n this.stopWorkers = true;\n if (this.options?.gracefulShutdown) {\n while (this.taskQueue.size > 0) {\n await setTimeout(1000);\n }\n }\n }\n\n protected onReadyToClaimTask(): Promise<void> {\n if (this.taskQueue.pending < this.options.concurrentTasksLimit) {\n return Promise.resolve();\n }\n return new Promise(resolve => {\n // \"next\" event emits when a task completes\n // https://github.com/sindresorhus/p-queue#next\n this.taskQueue.once('next', () => {\n resolve();\n });\n });\n }\n\n async runOneTask(task: TaskContext) {\n const auditorEvent = await this.auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n meta: {\n actionType: 'execution',\n createdBy: task.createdBy,\n taskId: task.taskId,\n taskParameters: this.parameterAuditTransform(task.spec.parameters),\n templateRef: task.spec.templateInfo?.entityRef,\n },\n });\n\n try {\n if (task.spec.apiVersion !== 'scaffolder.backstage.io/v1beta3') {\n throw new Error(\n `Unsupported Template apiVersion ${task.spec.apiVersion}`,\n );\n }\n\n const { output } = await this.options.runners.workflowRunner.execute(\n task,\n );\n\n await task.complete('completed', { output });\n await auditorEvent?.success();\n } catch (error) {\n const err = toError(error);\n await auditorEvent?.fail({\n error: err,\n });\n await task.complete('failed', {\n error: { name: err.name, message: err.message },\n });\n }\n }\n}\n\ntype ParameterAuditTransform = (parameters: JsonObject) => JsonObject;\n\n/**\n * Truncates task parameters for audit logging using the configured max length.\n * @internal\n */\nexport function createParameterTruncator(\n config?: Config,\n): ParameterAuditTransform {\n const maxLength =\n config?.getOptionalNumber('scaffolder.auditor.taskParameterMaxLength') ??\n DEFAULT_TASK_PARAMETER_MAX_LENGTH;\n\n if (!Number.isSafeInteger(maxLength) || maxLength < -1) {\n throw new InputError(\n `Invalid configuration for 'scaffolder.auditor.taskParameterMaxLength', got ${maxLength}. Must be a positive integer or -1 to disable truncation.`,\n );\n }\n\n if (maxLength === -1) {\n return (parameters: JsonObject) => parameters;\n }\n\n return (parameters: JsonObject) => {\n function truncate(value: unknown): unknown {\n if (typeof value === 'string') {\n if (value.length > maxLength) {\n return value.slice(0, maxLength).concat('...<truncated>');\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(truncate);\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const k in value as object) {\n if (Object.hasOwn(value, k)) {\n result[k] = truncate((value as any)[k]);\n }\n }\n return result;\n }\n return value;\n }\n\n return truncate(parameters) as JsonObject;\n };\n}\n"],"names":["PQueue","NunjucksWorkflowRunner","collectTemplateCapabilities","stringifyError","setTimeout","toError","InputError"],"mappings":"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"}
|
|
@@ -30,9 +30,9 @@ require('../scaffolder/actions/builtin/fetch/plainFile.examples.cjs.js');
|
|
|
30
30
|
require('../scaffolder/actions/builtin/fetch/template.examples.cjs.js');
|
|
31
31
|
require('globby');
|
|
32
32
|
require('isbinaryfile');
|
|
33
|
+
require('nunjitsu');
|
|
33
34
|
var createDefaultFilters = require('../lib/templating/filters/createDefaultFilters.cjs.js');
|
|
34
35
|
var templating = require('../util/templating.cjs.js');
|
|
35
|
-
require('isolated-vm');
|
|
36
36
|
require('../scaffolder/actions/builtin/fetch/templateFile.examples.cjs.js');
|
|
37
37
|
require('../scaffolder/actions/builtin/filesystem/delete.examples.cjs.js');
|
|
38
38
|
require('../scaffolder/actions/builtin/filesystem/rename.examples.cjs.js');
|
|
@@ -159,7 +159,19 @@ function convertGlobalsToRecord(globals) {
|
|
|
159
159
|
}
|
|
160
160
|
return result;
|
|
161
161
|
}
|
|
162
|
+
function collectTemplateCapabilities(options) {
|
|
163
|
+
const filters = {};
|
|
164
|
+
for (const [name, filter] of Object.entries(options.filters ?? {})) {
|
|
165
|
+
filters[name] = (input, ...args) => filter(input, ...args);
|
|
166
|
+
}
|
|
167
|
+
const globals = {};
|
|
168
|
+
for (const [name, global] of Object.entries(options.globals ?? {})) {
|
|
169
|
+
globals[name] = typeof global === "function" ? (...args) => global(...args) : global;
|
|
170
|
+
}
|
|
171
|
+
return { filters, globals };
|
|
172
|
+
}
|
|
162
173
|
|
|
174
|
+
exports.collectTemplateCapabilities = collectTemplateCapabilities;
|
|
163
175
|
exports.convertFiltersToRecord = convertFiltersToRecord;
|
|
164
176
|
exports.convertGlobalsToRecord = convertGlobalsToRecord;
|
|
165
177
|
exports.extractFilterMetadata = extractFilterMetadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templating.cjs.js","sources":["../../src/util/templating.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport {\n CreatedTemplateFilter,\n CreatedTemplateGlobal,\n CreatedTemplateGlobalFunction,\n CreatedTemplateGlobalValue,\n ZodFunctionSchema,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { JsonValue } from '@backstage/types';\nimport { Schema } from 'jsonschema';\nimport { ZodType, z } from 'zod/v3';\nimport zodToJsonSchema from 'zod-to-json-schema';\n\n/**\n * Converts template filters to a record of filter functions\n */\nexport function convertFiltersToRecord(\n filters?: Record<string, TemplateFilter> | CreatedTemplateFilter<any, any>[],\n): Record<string, TemplateFilter> {\n if (!filters) {\n return {};\n }\n\n if (Array.isArray(filters)) {\n const result: Record<string, TemplateFilter> = {};\n for (const filter of filters) {\n result[filter.id] = filter.filter as TemplateFilter;\n }\n return result;\n }\n\n return filters;\n}\n\ntype ExportFunctionSchema = {\n arguments?: Schema[];\n output?: Schema;\n};\n\ntype ExportFilterSchema = {\n input?: Schema;\n} & ExportFunctionSchema;\n\n/**\n * Converts a Zod function schema to JSON schema\n */\nfunction convertZodFunctionToJsonSchema(\n t: ReturnType<ZodFunctionSchema<any, any>>,\n): ExportFunctionSchema {\n if (!('parameters' in t) || !('returnType' in t)) {\n throw new Error('Invalid Zod function schema');\n }\n\n const args = (t.parameters().items as ZodType[]).map(\n zt => zodToJsonSchema(zt) as Schema,\n );\n\n let output: Schema | undefined = undefined;\n const returnType = t.returnType();\n if (!returnType._unknown) {\n output = zodToJsonSchema(returnType) as Schema;\n }\n\n const result: ExportFunctionSchema = {};\n if (args.length > 0) {\n result.arguments = args;\n }\n if (output) {\n result.output = output;\n }\n\n return result;\n}\n\n/**\n * Converts a function schema to a filter schema\n */\nfunction convertToFilterSchema(\n fnSchema: ExportFunctionSchema,\n): ExportFilterSchema {\n if (fnSchema.arguments?.length) {\n const [input, ...rest] = fnSchema.arguments;\n const result: ExportFilterSchema = { input };\n\n if (rest.length > 0) {\n result.arguments = rest;\n }\n\n if (fnSchema.output) {\n result.output = fnSchema.output;\n }\n\n return result;\n }\n return fnSchema;\n}\n\ntype ExportFilter = Pick<\n CreatedTemplateFilter<any, any>,\n 'description' | 'examples'\n> & {\n schema?: ExportFilterSchema;\n};\n\n/**\n * Extracts metadata from template filters\n */\nexport function extractFilterMetadata(\n filters?: Record<string, TemplateFilter> | CreatedTemplateFilter<any, any>[],\n): Record<string, ExportFilter> {\n if (!filters) {\n return {};\n }\n\n if (Array.isArray(filters)) {\n const result: Record<string, ExportFilter> = {};\n\n for (const filter of filters) {\n const metadata: ExportFilter = {};\n\n if (filter.description) {\n metadata.description = filter.description;\n }\n\n if (filter.examples) {\n metadata.examples = filter.examples;\n }\n\n if (filter.schema) {\n metadata.schema = convertToFilterSchema(\n convertZodFunctionToJsonSchema(\n filter.schema(z) as z.ZodFunction<any, any>,\n ),\n );\n }\n\n result[filter.id] = metadata;\n }\n\n return result;\n }\n\n // For non-array filters, return empty metadata\n const result: Record<string, ExportFilter> = {};\n for (const key in filters) {\n if (filters.hasOwnProperty(key)) {\n result[key] = {};\n }\n }\n return result;\n}\n\n/**\n * Checks if a global is a function\n */\nfunction isGlobalFunction(\n global: CreatedTemplateGlobal,\n): global is CreatedTemplateGlobalFunction<any, any> {\n return 'fn' in global;\n}\n\n/**\n * Extracts metadata from template global functions\n */\nexport function extractGlobalFunctionMetadata(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<\n string,\n Pick<CreatedTemplateGlobalFunction<any, any>, 'description' | 'examples'> & {\n schema?: ExportFunctionSchema;\n }\n> {\n if (!globals) {\n return {};\n }\n\n if (Array.isArray(globals)) {\n const result: Record<string, any> = {};\n\n for (const global of globals) {\n if (isGlobalFunction(global)) {\n const metadata: any = {};\n\n if (global.description) {\n metadata.description = global.description;\n }\n\n if (global.examples) {\n metadata.examples = global.examples;\n }\n\n if (global.schema) {\n metadata.schema = convertZodFunctionToJsonSchema(global.schema(z));\n }\n\n result[global.id] = metadata;\n }\n }\n\n return result;\n }\n\n // For non-array globals, extract function metadata\n const result: Record<string, any> = {};\n for (const key in globals) {\n if (typeof globals[key] === 'function') {\n result[key] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts metadata from template global values\n */\nexport function extractGlobalValueMetadata(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> {\n if (!globals) {\n return {};\n }\n\n if (Array.isArray(globals)) {\n const result: Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> = {};\n\n for (const global of globals) {\n if (!isGlobalFunction(global)) {\n result[global.id] = {\n value: (global as CreatedTemplateGlobalValue).value,\n description: global.description,\n };\n }\n }\n\n return result;\n }\n\n // For non-array globals, extract value metadata\n const result: Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> = {};\n for (const key in globals) {\n if (typeof globals[key] !== 'function') {\n result[key] = { value: globals[key] as JsonValue };\n }\n }\n return result;\n}\n\n/**\n * Converts template globals to a record of global values and functions\n */\nexport function convertGlobalsToRecord(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<string, TemplateGlobal> {\n if (!globals) {\n return {};\n }\n\n if (!Array.isArray(globals)) {\n return globals;\n }\n\n const result: Record<string, TemplateGlobal> = {};\n for (const global of globals) {\n result[global.id] = isGlobalFunction(global)\n ? (global.fn as TemplateGlobal)\n : (global as CreatedTemplateGlobalValue).value;\n }\n return result;\n}\n"],"names":["zodToJsonSchema","result","z"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"templating.cjs.js","sources":["../../src/util/templating.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport {\n CreatedTemplateFilter,\n CreatedTemplateGlobal,\n CreatedTemplateGlobalFunction,\n CreatedTemplateGlobalValue,\n ZodFunctionSchema,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { JsonValue } from '@backstage/types';\nimport { Schema } from 'jsonschema';\nimport {\n TemplateCapabilities,\n TemplateFilter as NunjitsuTemplateFilter,\n TemplateGlobal as NunjitsuTemplateGlobal,\n TemplateValue as NunjitsuTemplateValue,\n} from 'nunjitsu';\nimport { ZodType, z } from 'zod/v3';\nimport zodToJsonSchema from 'zod-to-json-schema';\n\n/**\n * Converts template filters to a record of filter functions\n */\nexport function convertFiltersToRecord(\n filters?: Record<string, TemplateFilter> | CreatedTemplateFilter<any, any>[],\n): Record<string, TemplateFilter> {\n if (!filters) {\n return {};\n }\n\n if (Array.isArray(filters)) {\n const result: Record<string, TemplateFilter> = {};\n for (const filter of filters) {\n result[filter.id] = filter.filter as TemplateFilter;\n }\n return result;\n }\n\n return filters;\n}\n\ntype ExportFunctionSchema = {\n arguments?: Schema[];\n output?: Schema;\n};\n\ntype ExportFilterSchema = {\n input?: Schema;\n} & ExportFunctionSchema;\n\n/**\n * Converts a Zod function schema to JSON schema\n */\nfunction convertZodFunctionToJsonSchema(\n t: ReturnType<ZodFunctionSchema<any, any>>,\n): ExportFunctionSchema {\n if (!('parameters' in t) || !('returnType' in t)) {\n throw new Error('Invalid Zod function schema');\n }\n\n const args = (t.parameters().items as ZodType[]).map(\n zt => zodToJsonSchema(zt) as Schema,\n );\n\n let output: Schema | undefined = undefined;\n const returnType = t.returnType();\n if (!returnType._unknown) {\n output = zodToJsonSchema(returnType) as Schema;\n }\n\n const result: ExportFunctionSchema = {};\n if (args.length > 0) {\n result.arguments = args;\n }\n if (output) {\n result.output = output;\n }\n\n return result;\n}\n\n/**\n * Converts a function schema to a filter schema\n */\nfunction convertToFilterSchema(\n fnSchema: ExportFunctionSchema,\n): ExportFilterSchema {\n if (fnSchema.arguments?.length) {\n const [input, ...rest] = fnSchema.arguments;\n const result: ExportFilterSchema = { input };\n\n if (rest.length > 0) {\n result.arguments = rest;\n }\n\n if (fnSchema.output) {\n result.output = fnSchema.output;\n }\n\n return result;\n }\n return fnSchema;\n}\n\ntype ExportFilter = Pick<\n CreatedTemplateFilter<any, any>,\n 'description' | 'examples'\n> & {\n schema?: ExportFilterSchema;\n};\n\n/**\n * Extracts metadata from template filters\n */\nexport function extractFilterMetadata(\n filters?: Record<string, TemplateFilter> | CreatedTemplateFilter<any, any>[],\n): Record<string, ExportFilter> {\n if (!filters) {\n return {};\n }\n\n if (Array.isArray(filters)) {\n const result: Record<string, ExportFilter> = {};\n\n for (const filter of filters) {\n const metadata: ExportFilter = {};\n\n if (filter.description) {\n metadata.description = filter.description;\n }\n\n if (filter.examples) {\n metadata.examples = filter.examples;\n }\n\n if (filter.schema) {\n metadata.schema = convertToFilterSchema(\n convertZodFunctionToJsonSchema(\n filter.schema(z) as z.ZodFunction<any, any>,\n ),\n );\n }\n\n result[filter.id] = metadata;\n }\n\n return result;\n }\n\n // For non-array filters, return empty metadata\n const result: Record<string, ExportFilter> = {};\n for (const key in filters) {\n if (filters.hasOwnProperty(key)) {\n result[key] = {};\n }\n }\n return result;\n}\n\n/**\n * Checks if a global is a function\n */\nfunction isGlobalFunction(\n global: CreatedTemplateGlobal,\n): global is CreatedTemplateGlobalFunction<any, any> {\n return 'fn' in global;\n}\n\n/**\n * Extracts metadata from template global functions\n */\nexport function extractGlobalFunctionMetadata(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<\n string,\n Pick<CreatedTemplateGlobalFunction<any, any>, 'description' | 'examples'> & {\n schema?: ExportFunctionSchema;\n }\n> {\n if (!globals) {\n return {};\n }\n\n if (Array.isArray(globals)) {\n const result: Record<string, any> = {};\n\n for (const global of globals) {\n if (isGlobalFunction(global)) {\n const metadata: any = {};\n\n if (global.description) {\n metadata.description = global.description;\n }\n\n if (global.examples) {\n metadata.examples = global.examples;\n }\n\n if (global.schema) {\n metadata.schema = convertZodFunctionToJsonSchema(global.schema(z));\n }\n\n result[global.id] = metadata;\n }\n }\n\n return result;\n }\n\n // For non-array globals, extract function metadata\n const result: Record<string, any> = {};\n for (const key in globals) {\n if (typeof globals[key] === 'function') {\n result[key] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts metadata from template global values\n */\nexport function extractGlobalValueMetadata(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> {\n if (!globals) {\n return {};\n }\n\n if (Array.isArray(globals)) {\n const result: Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> = {};\n\n for (const global of globals) {\n if (!isGlobalFunction(global)) {\n result[global.id] = {\n value: (global as CreatedTemplateGlobalValue).value,\n description: global.description,\n };\n }\n }\n\n return result;\n }\n\n // For non-array globals, extract value metadata\n const result: Record<string, Omit<CreatedTemplateGlobalValue, 'id'>> = {};\n for (const key in globals) {\n if (typeof globals[key] !== 'function') {\n result[key] = { value: globals[key] as JsonValue };\n }\n }\n return result;\n}\n\n/**\n * Converts template globals to a record of global values and functions\n */\nexport function convertGlobalsToRecord(\n globals?: Record<string, TemplateGlobal> | CreatedTemplateGlobal[],\n): Record<string, TemplateGlobal> {\n if (!globals) {\n return {};\n }\n\n if (!Array.isArray(globals)) {\n return globals;\n }\n\n const result: Record<string, TemplateGlobal> = {};\n for (const global of globals) {\n result[global.id] = isGlobalFunction(global)\n ? (global.fn as TemplateGlobal)\n : (global as CreatedTemplateGlobalValue).value;\n }\n return result;\n}\n\n/** Adapts registered Backstage capabilities for reuse by Nunjitsu renderers. */\nexport function collectTemplateCapabilities(options: {\n filters?: Record<string, TemplateFilter>;\n globals?: Record<string, TemplateGlobal>;\n}): TemplateCapabilities {\n const filters: Record<string, NunjitsuTemplateFilter> = {};\n for (const [name, filter] of Object.entries(options.filters ?? {})) {\n filters[name] = (input, ...args) =>\n filter(input as JsonValue, ...(args as JsonValue[])) as\n | NunjitsuTemplateValue\n | undefined;\n }\n\n const globals: Record<string, NunjitsuTemplateGlobal> = {};\n for (const [name, global] of Object.entries(options.globals ?? {})) {\n globals[name] =\n typeof global === 'function'\n ? (...args) =>\n global(...(args as JsonValue[])) as\n | NunjitsuTemplateValue\n | undefined\n : (global as NunjitsuTemplateGlobal);\n }\n\n return { filters, globals };\n}\n"],"names":["zodToJsonSchema","result","z"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder-backend",
|
|
3
|
-
"version": "4.0.3-next.
|
|
3
|
+
"version": "4.0.3-next.2",
|
|
4
4
|
"description": "The Backstage backend plugin that helps you create new things",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin",
|
|
@@ -62,12 +62,10 @@
|
|
|
62
62
|
"files": [
|
|
63
63
|
"dist",
|
|
64
64
|
"migrations",
|
|
65
|
-
"config.schema.json"
|
|
66
|
-
"assets"
|
|
65
|
+
"config.schema.json"
|
|
67
66
|
],
|
|
68
67
|
"scripts": {
|
|
69
68
|
"build": "backstage-cli package build",
|
|
70
|
-
"build:assets": "node scripts/build-nunjucks.js",
|
|
71
69
|
"clean": "backstage-cli package clean",
|
|
72
70
|
"generate": "backstage-repo-tools package schema openapi generate --server --client-package plugins/scaffolder-common",
|
|
73
71
|
"lint": "backstage-cli package lint",
|
|
@@ -78,7 +76,7 @@
|
|
|
78
76
|
},
|
|
79
77
|
"dependencies": {
|
|
80
78
|
"@backstage/backend-openapi-utils": "0.7.1-next.0",
|
|
81
|
-
"@backstage/backend-plugin-api": "1.10.0-next.
|
|
79
|
+
"@backstage/backend-plugin-api": "1.10.0-next.1",
|
|
82
80
|
"@backstage/catalog-model": "1.9.0",
|
|
83
81
|
"@backstage/config": "1.3.8",
|
|
84
82
|
"@backstage/errors": "1.3.1",
|
|
@@ -88,20 +86,19 @@
|
|
|
88
86
|
"@backstage/plugin-permission-common": "0.9.9",
|
|
89
87
|
"@backstage/plugin-permission-node": "0.11.3-next.0",
|
|
90
88
|
"@backstage/plugin-scaffolder-common": "2.2.2-next.0",
|
|
91
|
-
"@backstage/plugin-scaffolder-node": "0.13.6-next.
|
|
89
|
+
"@backstage/plugin-scaffolder-node": "0.13.6-next.2",
|
|
92
90
|
"@backstage/types": "1.2.2",
|
|
93
91
|
"@types/luxon": "^3.0.0",
|
|
94
92
|
"express": "^4.22.0",
|
|
95
93
|
"fs-extra": "^11.2.0",
|
|
96
94
|
"globby": "^11.0.0",
|
|
97
95
|
"isbinaryfile": "^5.0.0",
|
|
98
|
-
"isolated-vm": "^6.0.1",
|
|
99
96
|
"jsonschema": "^1.5.0",
|
|
100
97
|
"knex": "^3.0.0",
|
|
101
98
|
"lodash": "^4.17.21",
|
|
102
99
|
"logform": "^2.3.2",
|
|
103
100
|
"luxon": "^3.0.0",
|
|
104
|
-
"
|
|
101
|
+
"nunjitsu": "^0.5.0",
|
|
105
102
|
"p-queue": "^6.6.2",
|
|
106
103
|
"prom-client": "^15.0.0",
|
|
107
104
|
"triple-beam": "^1.4.1",
|
|
@@ -113,17 +110,15 @@
|
|
|
113
110
|
"zod-to-json-schema": "^3.25.1"
|
|
114
111
|
},
|
|
115
112
|
"devDependencies": {
|
|
116
|
-
"@backstage/backend-defaults": "0.17.
|
|
117
|
-
"@backstage/backend-test-utils": "1.11.6-next.
|
|
118
|
-
"@backstage/cli": "0.36.5-next.
|
|
113
|
+
"@backstage/backend-defaults": "0.17.7-next.2",
|
|
114
|
+
"@backstage/backend-test-utils": "1.11.6-next.1",
|
|
115
|
+
"@backstage/cli": "0.36.5-next.1",
|
|
119
116
|
"@backstage/plugin-scaffolder-node-test-utils": "0.3.14-next.0",
|
|
120
|
-
"@backstage/repo-tools": "0.18.1-next.
|
|
117
|
+
"@backstage/repo-tools": "0.18.1-next.1",
|
|
121
118
|
"@types/express": "^4.17.6",
|
|
122
119
|
"@types/fs-extra": "^11.0.0",
|
|
123
|
-
"@types/nunjucks": "^3.1.4",
|
|
124
120
|
"@types/supertest": "^2.0.8",
|
|
125
121
|
"@types/zen-observable": "^0.8.0",
|
|
126
|
-
"esbuild": "^0.27.0",
|
|
127
122
|
"strip-ansi": "^7.1.0",
|
|
128
123
|
"supertest": "^7.0.0",
|
|
129
124
|
"wait-for-expect": "^4.0.0"
|