@backstage/plugin-scaffolder-backend 3.2.0-next.1 → 3.2.0-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 CHANGED
@@ -1,5 +1,24 @@
1
1
  # @backstage/plugin-scaffolder-backend
2
2
 
3
+ ## 3.2.0-next.2
4
+
5
+ ### Minor Changes
6
+
7
+ - e8736ea: Added secrets schema validation for task creation, retry, and dry-run endpoints. When a template defines `spec.secrets.schema`, the API validates provided secrets against the schema and returns a `400` error if validation fails.
8
+
9
+ ### Patch Changes
10
+
11
+ - 30ff981: Fixed a security vulnerability where secrets could bypass log redaction when transformed through Nunjucks filters in scaffolder templates.
12
+ - Updated dependencies
13
+ - @backstage/backend-plugin-api@1.8.0-next.1
14
+ - @backstage/integration@2.0.0-next.2
15
+ - @backstage/plugin-scaffolder-common@2.0.0-next.2
16
+ - @backstage/backend-openapi-utils@0.6.7-next.1
17
+ - @backstage/plugin-catalog-node@2.1.0-next.2
18
+ - @backstage/plugin-events-node@0.4.20-next.1
19
+ - @backstage/plugin-permission-node@0.10.11-next.1
20
+ - @backstage/plugin-scaffolder-node@0.13.0-next.2
21
+
3
22
  ## 3.2.0-next.1
4
23
 
5
24
  ### Minor Changes
@@ -64,6 +64,35 @@ const createStepLogger = ({
64
64
  taskLogger.addRedactions(Object.values(redactions ?? {}));
65
65
  return { taskLogger };
66
66
  };
67
+ function collectSecretRedactions(withSecrets, withoutSecrets) {
68
+ if (typeof withSecrets === "string") {
69
+ return withSecrets !== withoutSecrets ? [withSecrets] : [];
70
+ }
71
+ if (Array.isArray(withSecrets)) {
72
+ const other = Array.isArray(withoutSecrets) ? withoutSecrets : [];
73
+ return withSecrets.flatMap(
74
+ (val, i) => collectSecretRedactions(val, other[i])
75
+ );
76
+ }
77
+ if (withSecrets && typeof withSecrets === "object") {
78
+ const other = withoutSecrets && typeof withoutSecrets === "object" ? withoutSecrets : {};
79
+ return Object.entries(withSecrets).flatMap(
80
+ ([key, val]) => collectSecretRedactions(val, other[key])
81
+ );
82
+ }
83
+ return [];
84
+ }
85
+ function extractStringValues(obj) {
86
+ if (typeof obj === "string") return [obj];
87
+ if (Array.isArray(obj)) return obj.flatMap(extractStringValues);
88
+ if (obj && typeof obj === "object") {
89
+ return Object.entries(obj).flatMap(([key, val]) => [
90
+ key,
91
+ ...extractStringValues(val)
92
+ ]);
93
+ }
94
+ return [];
95
+ }
67
96
  const isActionAuthorized = pluginPermissionNode.createConditionAuthorizer(
68
97
  Object.values(rules.scaffolderActionRules)
69
98
  );
@@ -286,6 +315,32 @@ class NunjucksWorkflowRunner {
286
315
  )}`
287
316
  );
288
317
  }
318
+ if (step.input) {
319
+ const hasSecrets = Object.keys(task.secrets ?? {}).length > 0 || Object.keys(this.environment?.secrets ?? {}).length > 0;
320
+ if (hasSecrets) {
321
+ try {
322
+ const contextNoSecrets = {
323
+ ...preIterationContext,
324
+ ...iteration.each ? { each: iteration.each } : {},
325
+ secrets: {},
326
+ environment: {
327
+ ...preIterationContext.environment,
328
+ secrets: {}
329
+ }
330
+ };
331
+ const inputWithoutSecrets = this.render(
332
+ step.input,
333
+ contextNoSecrets,
334
+ renderTemplate
335
+ );
336
+ taskLogger.addRedactions(
337
+ collectSecretRedactions(iteration.input, inputWithoutSecrets)
338
+ );
339
+ } catch {
340
+ taskLogger.addRedactions(extractStringValues(iteration.input));
341
+ }
342
+ }
343
+ }
289
344
  await action.handler({
290
345
  input: iteration.input,
291
346
  task: {
@@ -1 +1 @@
1
- {"version":3,"file":"NunjucksWorkflowRunner.cjs.js","sources":["../../../src/scaffolder/tasks/NunjucksWorkflowRunner.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 { InputError, NotAllowedError, stringifyError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n TaskRecovery,\n TaskSpec,\n TaskSpecV1beta3,\n TaskStep,\n} from '@backstage/plugin-scaffolder-common';\nimport { JsonArray, JsonObject, JsonValue } from '@backstage/types';\nimport { metrics } from '@opentelemetry/api';\nimport fs from 'fs-extra';\nimport { validate as validateJsonSchema } from 'jsonschema';\nimport nunjucks from 'nunjucks';\nimport path from 'node:path';\nimport * as winston from 'winston';\nimport {\n SecureTemplater,\n SecureTemplateRenderer,\n} from '../../lib/templating/SecureTemplater';\nimport { TemplateActionRegistry } from '../actions/TemplateActionRegistry';\nimport { generateExampleOutput, isTruthy } from './helper';\nimport { TaskTrackType, WorkflowResponse, WorkflowRunner } from './types';\n\nimport type {\n AuditorService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AuthorizeResult,\n PolicyDecision,\n} from '@backstage/plugin-permission-common';\nimport { createConditionAuthorizer } from '@backstage/plugin-permission-node';\nimport { actionExecutePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n TaskContext,\n TaskSecrets,\n TemplateAction,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport { createDefaultFilters } from '../../lib/templating/filters/createDefaultFilters';\nimport { scaffolderActionRules } from '../../service/rules';\nimport { createCounterMetric, createHistogramMetric } from '../../util/metrics';\nimport { BackstageLoggerTransport, WinstonLogger } from './logger';\nimport { convertFiltersToRecord } from '../../util/templating';\nimport {\n CheckpointContext,\n CheckpointState,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { Config } from '@backstage/config';\nimport { resolveDefaultEnvironment } from '../../lib/defaultEnvironment';\n\ntype NunjucksWorkflowRunnerOptions = {\n workingDirectory: string;\n actionRegistry: TemplateActionRegistry;\n integrations: ScmIntegrations;\n logger: LoggerService;\n auditor?: AuditorService;\n additionalTemplateFilters?: Record<string, TemplateFilter>;\n additionalTemplateGlobals?: Record<string, TemplateGlobal>;\n permissions?: PermissionsService;\n config?: Config;\n};\n\ntype TemplateContext = {\n parameters: JsonObject;\n environment: JsonObject;\n EXPERIMENTAL_recovery?: TaskRecovery;\n steps: {\n [stepName: string]: { output: { [outputName: string]: JsonValue } };\n };\n secrets?: Record<string, string>;\n user?: {\n entity?: UserEntity;\n ref?: string;\n };\n each?: JsonValue;\n context: {\n task: {\n id: string;\n };\n };\n};\n\nconst isValidTaskSpec = (taskSpec: TaskSpec): taskSpec is TaskSpecV1beta3 => {\n return taskSpec.apiVersion === 'scaffolder.backstage.io/v1beta3';\n};\n\nconst createStepLogger = ({\n task,\n step,\n rootLogger,\n redactions,\n}: {\n task: TaskContext;\n step: TaskStep;\n rootLogger: LoggerService;\n redactions?: Record<string, string>;\n}) => {\n const taskLogger = WinstonLogger.create({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.simple(),\n ),\n transports: [new BackstageLoggerTransport(rootLogger, task, step.id)],\n });\n\n taskLogger.addRedactions(Object.values(redactions ?? {}));\n\n return { taskLogger };\n};\n\nconst isActionAuthorized = createConditionAuthorizer(\n Object.values(scaffolderActionRules),\n);\n\nexport class NunjucksWorkflowRunner implements WorkflowRunner {\n private readonly defaultTemplateFilters: Record<string, TemplateFilter>;\n private readonly options: NunjucksWorkflowRunnerOptions;\n private environment: {\n parameters: JsonObject;\n secrets?: Record<string, string>;\n } = { parameters: {}, secrets: {} };\n\n constructor(options: NunjucksWorkflowRunnerOptions) {\n this.options = options;\n this.defaultTemplateFilters = convertFiltersToRecord(\n createDefaultFilters({\n integrations: this.options.integrations,\n }),\n );\n }\n\n private readonly tracker = scaffoldingTracker();\n\n async getEnvironmentConfig(): Promise<{\n parameters: JsonObject;\n secrets?: TaskSecrets;\n }> {\n if (this.options.config) {\n const defaultEnvironment = resolveDefaultEnvironment(this.options.config);\n return {\n parameters: defaultEnvironment.parameters,\n secrets: defaultEnvironment.secrets,\n };\n }\n\n return {\n parameters: {},\n secrets: {},\n };\n }\n\n private isSingleTemplateString(input: string) {\n const { parser, nodes } = nunjucks as unknown as {\n parser: {\n parse(\n template: string,\n ctx: object,\n options: nunjucks.ConfigureOptions,\n ): { children: { children?: unknown[] }[] };\n };\n nodes: { TemplateData: Function };\n };\n\n const parsed = parser.parse(\n input,\n {},\n {\n autoescape: false,\n tags: {\n variableStart: '${{',\n variableEnd: '}}',\n },\n },\n );\n\n return (\n parsed.children.length === 1 &&\n !(parsed.children[0]?.children?.[0] instanceof nodes.TemplateData)\n );\n }\n\n private render<T>(\n input: T,\n context: TemplateContext,\n renderTemplate: SecureTemplateRenderer,\n ): T {\n return JSON.parse(JSON.stringify(input), (_key, value) => {\n try {\n if (typeof value === 'string') {\n try {\n if (this.isSingleTemplateString(value)) {\n // Lets convert ${{ parameters.bob }} to ${{ (parameters.bob) | dump }} so we can keep the input type\n const wrappedDumped = value.replace(\n /\\${{(.+)}}/g,\n '${{ ( $1 ) | dump }}',\n );\n\n // Run the templating\n const templated = renderTemplate(wrappedDumped, context);\n\n // If there's an empty string returned, then it's undefined\n if (templated === '') {\n return undefined;\n }\n\n // Reparse the dumped string\n return JSON.parse(templated);\n }\n } catch (ex) {\n this.options.logger.error(\n `Failed to parse template string: ${value} with error ${ex.message}`,\n );\n }\n\n // Fallback to default behaviour\n const templated = renderTemplate(value, context);\n\n if (templated === '') {\n return undefined;\n }\n\n return templated;\n }\n } catch {\n return value;\n }\n return value;\n });\n }\n\n async executeStep(\n task: TaskContext,\n step: TaskStep,\n context: TemplateContext,\n renderTemplate: (template: string, values: unknown) => string,\n taskTrack: TaskTrackType,\n workspacePath: string,\n decision: PolicyDecision,\n ) {\n const stepTrack = await this.tracker.stepStart(task, step);\n\n if (task.cancelSignal.aborted) {\n throw new Error(\n `Step ${step.id} (${step.name}) of task ${task.taskId} has been cancelled.`,\n );\n }\n\n try {\n if (\n step.if === false ||\n (typeof step.if === 'string' &&\n step.each === undefined &&\n !isTruthy(this.render(step.if, context, renderTemplate)))\n ) {\n await stepTrack.skipFalsy();\n return;\n }\n const action: TemplateAction<JsonObject> =\n await this.options.actionRegistry.get(step.action, {\n credentials: await task.getInitiatorCredentials(),\n });\n const { taskLogger } = createStepLogger({\n task,\n step,\n rootLogger: this.options.logger,\n redactions: {\n ...task.secrets,\n ...this.environment?.secrets,\n },\n });\n\n if (task.isDryRun) {\n const redactedSecrets = Object.fromEntries(\n Object.entries(task.secrets ?? {}).map(secret => [secret[0], '***']),\n );\n\n const redactedEnvironmentSecrets = Object.fromEntries(\n Object.entries(this.environment?.secrets ?? {}).map(secret => [\n secret[0],\n '***',\n ]),\n );\n const debugInput =\n (step.input &&\n this.render(\n step.input,\n {\n ...context,\n environment: {\n parameters: this.environment?.parameters || {},\n secrets: redactedEnvironmentSecrets,\n },\n secrets: redactedSecrets,\n },\n renderTemplate,\n )) ??\n {};\n taskLogger.info(\n `Running ${\n action.id\n } in dry-run mode with inputs (secrets redacted): ${JSON.stringify(\n debugInput,\n undefined,\n 2,\n )}`,\n );\n if (!action.supportsDryRun) {\n await taskTrack.skipDryRun(step, action);\n const outputSchema = action.schema?.output;\n if (outputSchema) {\n context.steps[step.id] = {\n output: generateExampleOutput(outputSchema) as {\n [name in string]: JsonValue;\n },\n };\n } else {\n context.steps[step.id] = { output: {} };\n }\n return;\n }\n }\n\n const preIterationContext = {\n ...context,\n environment: {\n parameters: this.environment?.parameters ?? {},\n secrets: this.environment?.secrets ?? {},\n },\n secrets: task.secrets ?? {},\n };\n\n const resolvedEach =\n step.each &&\n this.render(step.each, preIterationContext, renderTemplate);\n\n if (step.each && !resolvedEach) {\n throw new InputError(\n `Invalid value on action ${action.id}.each parameter, \"${step.each}\" cannot be resolved to a value`,\n );\n }\n\n const iterations = (\n resolvedEach\n ? Object.entries(resolvedEach).map(([key, value]) => ({\n each: { key, value },\n }))\n : [{}]\n ).map(i => {\n const fullContext = { ...preIterationContext, ...i };\n // Evaluate if condition once per iteration, only when using 'each'\n const shouldRun =\n !('each' in i) ||\n !step.if ||\n isTruthy(this.render(step.if, fullContext, renderTemplate));\n\n return {\n ...i,\n shouldRun,\n // Secrets are only passed when templating the input to actions for security reasons\n input: step.input\n ? this.render(step.input, fullContext, renderTemplate)\n : {},\n };\n });\n for (const iteration of iterations) {\n if (!iteration.shouldRun) {\n // No need to check schema or authorization for iterations that will not run\n continue;\n }\n\n const actionId = `${action.id}${\n iteration.each ? `[${iteration.each.key}]` : ''\n }`;\n\n if (action.schema?.input) {\n const validateResult = validateJsonSchema(\n iteration.input,\n action.schema.input,\n );\n if (!validateResult.valid) {\n const errors = validateResult.errors.join(', ');\n throw new InputError(\n `Invalid input passed to action ${actionId}, ${errors}`,\n );\n }\n }\n if (\n !isActionAuthorized(decision, {\n action: action.id,\n input: iteration.input,\n })\n ) {\n throw new NotAllowedError(\n `Unauthorized action: ${actionId}. The action is not allowed. Input: ${JSON.stringify(\n iteration.input,\n null,\n 2,\n )}`,\n );\n }\n }\n const tmpDirs = new Array<string>();\n const stepOutput: { [outputName: string]: JsonValue } = {};\n const prevTaskState = await task.getTaskState?.();\n\n for (const iteration of iterations) {\n if (iteration.each) {\n if (!iteration.shouldRun) {\n taskLogger.info(\n `Skipping step each: ${JSON.stringify(\n iteration.each,\n (k, v) => (k ? String(v) : v),\n 0,\n )}`,\n );\n continue;\n }\n taskLogger.info(\n `Running step each: ${JSON.stringify(\n iteration.each,\n (k, v) => (k ? String(v) : v),\n 0,\n )}`,\n );\n }\n\n await action.handler({\n input: iteration.input,\n task: {\n id: await task.getWorkspaceName(),\n },\n secrets: task.secrets ?? {},\n logger: taskLogger,\n workspacePath,\n async checkpoint<T extends JsonValue | void>(\n opts: CheckpointContext<T>,\n ) {\n const { key: checkpointKey, fn } = opts;\n const key = `v1.task.checkpoint.${step.id}.${checkpointKey}`;\n\n try {\n let prevValue: T | undefined;\n\n if (prevTaskState) {\n const prevState = (\n prevTaskState.state?.checkpoints as CheckpointState\n )?.[key];\n\n if (prevState && prevState.status === 'success') {\n prevValue = prevState.value as T;\n }\n }\n\n const value = prevValue ? prevValue : await fn();\n\n if (!prevValue) {\n task.updateCheckpoint?.({\n key,\n status: 'success',\n value: value ?? {},\n });\n }\n return value;\n } catch (err) {\n task.updateCheckpoint?.({\n key,\n status: 'failed',\n reason: stringifyError(err),\n });\n throw err;\n } finally {\n await task.serializeWorkspace?.({ path: workspacePath });\n }\n },\n createTemporaryDirectory: async () => {\n const tmpDir = await fs.mkdtemp(\n `${workspacePath}_step-${step.id}-`,\n );\n tmpDirs.push(tmpDir);\n return tmpDir;\n },\n output(name: string, value: JsonValue) {\n if (step.each) {\n stepOutput[name] = stepOutput[name] || [];\n (stepOutput[name] as JsonArray).push(value);\n } else {\n stepOutput[name] = value;\n }\n },\n templateInfo: task.spec.templateInfo,\n user: task.spec.user,\n isDryRun: task.isDryRun,\n signal: task.cancelSignal,\n getInitiatorCredentials: () => task.getInitiatorCredentials(),\n step: {\n id: step.id,\n name: step.name,\n },\n });\n }\n\n // Remove all temporary directories that were created when executing the action\n for (const tmpDir of tmpDirs) {\n await fs.remove(tmpDir);\n }\n\n context.steps[step.id] = { output: stepOutput };\n\n if (task.cancelSignal.aborted) {\n throw new Error(\n `Step ${step.id} (${step.name}) of task ${task.taskId} has been cancelled.`,\n );\n }\n\n await stepTrack.markSuccessful();\n } catch (err) {\n await taskTrack.markFailed(step, err);\n await stepTrack.markFailed();\n throw err;\n } finally {\n await task.serializeWorkspace?.({ path: workspacePath });\n }\n }\n\n async execute(task: TaskContext): Promise<WorkflowResponse> {\n if (!isValidTaskSpec(task.spec)) {\n throw new InputError(\n 'Wrong template version executed with the workflow engine',\n );\n }\n const taskId = await task.getWorkspaceName();\n\n const workspacePath = path.join(this.options.workingDirectory, taskId);\n\n const { additionalTemplateFilters, additionalTemplateGlobals } =\n this.options;\n\n this.environment = await this.getEnvironmentConfig();\n\n const renderTemplate = await SecureTemplater.loadRenderer({\n templateFilters: {\n ...this.defaultTemplateFilters,\n ...additionalTemplateFilters,\n },\n templateGlobals: additionalTemplateGlobals,\n });\n\n try {\n await task.rehydrateWorkspace?.({ taskId, targetPath: workspacePath });\n\n const taskTrack = await this.tracker.taskStart(task);\n await fs.ensureDir(workspacePath);\n\n const context: TemplateContext = {\n parameters: task.spec.parameters,\n environment: {\n parameters: this.environment?.parameters || {},\n secrets: {},\n },\n steps: {},\n user: task.spec.user,\n context: {\n task: {\n id: taskId,\n },\n },\n };\n\n const [decision]: PolicyDecision[] =\n this.options.permissions && task.spec.steps.length\n ? await this.options.permissions.authorizeConditional(\n [{ permission: actionExecutePermission }],\n { credentials: await task.getInitiatorCredentials() },\n )\n : [{ result: AuthorizeResult.ALLOW }];\n\n for (const step of task.spec.steps) {\n await this.executeStep(\n task,\n step,\n context,\n renderTemplate,\n taskTrack,\n workspacePath,\n decision,\n );\n }\n\n const output = this.render(task.spec.output, context, renderTemplate);\n await taskTrack.markSuccessful();\n await task.cleanWorkspace?.();\n\n return { output };\n } finally {\n if (workspacePath) {\n await fs.remove(workspacePath);\n }\n }\n }\n}\n\nfunction scaffoldingTracker() {\n // prom-client metrics are deprecated in favour of OpenTelemetry metrics.\n const promTaskCount = createCounterMetric({\n name: 'scaffolder_task_count',\n help: 'Count of task runs',\n labelNames: ['template', 'user', 'result'],\n });\n const promTaskDuration = createHistogramMetric({\n name: 'scaffolder_task_duration',\n help: 'Duration of a task run',\n labelNames: ['template', 'result'],\n });\n const promtStepCount = createCounterMetric({\n name: 'scaffolder_step_count',\n help: 'Count of step runs',\n labelNames: ['template', 'step', 'result'],\n });\n const promStepDuration = createHistogramMetric({\n name: 'scaffolder_step_duration',\n help: 'Duration of a step runs',\n labelNames: ['template', 'step', 'result'],\n });\n\n const meter = metrics.getMeter('default');\n const taskCount = meter.createCounter('scaffolder.task.count', {\n description: 'Count of task runs',\n });\n\n const taskDuration = meter.createHistogram('scaffolder.task.duration', {\n description: 'Duration of a task run',\n unit: 'seconds',\n });\n\n const stepCount = meter.createCounter('scaffolder.step.count', {\n description: 'Count of step runs',\n });\n\n const stepDuration = meter.createHistogram('scaffolder.step.duration', {\n description: 'Duration of a step runs',\n unit: 'seconds',\n });\n\n async function taskStart(task: TaskContext) {\n await task.emitLog(`Starting up task with ${task.spec.steps.length} steps`);\n const template = task.spec.templateInfo?.entityRef || '';\n const user = task.spec.user?.ref || '';\n\n const startTime = process.hrtime();\n const taskTimer = promTaskDuration.startTimer({\n template,\n });\n\n function endTime() {\n const delta = process.hrtime(startTime);\n return delta[0] + delta[1] / 1e9;\n }\n\n async function skipDryRun(\n step: TaskStep,\n action: TemplateAction<JsonObject>,\n ) {\n task.emitLog(`Skipping because ${action.id} does not support dry-run`, {\n stepId: step.id,\n status: 'skipped',\n });\n }\n\n async function markSuccessful() {\n promTaskCount.inc({\n template,\n user,\n result: 'ok',\n });\n taskTimer({ result: 'ok' });\n\n taskCount.add(1, { template, user, result: 'ok' });\n taskDuration.record(endTime(), {\n template,\n result: 'ok',\n });\n }\n\n async function markFailed(step: TaskStep, err: Error) {\n await task.emitLog(String(err.stack), {\n stepId: step.id,\n status: 'failed',\n });\n promTaskCount.inc({\n template,\n user,\n result: 'failed',\n });\n taskTimer({ result: 'failed' });\n\n taskCount.add(1, { template, user, result: 'failed' });\n taskDuration.record(endTime(), {\n template,\n result: 'failed',\n });\n }\n\n async function markCancelled(step: TaskStep) {\n await task.emitLog(`Step ${step.id} has been cancelled.`, {\n stepId: step.id,\n status: 'cancelled',\n });\n promTaskCount.inc({\n template,\n user,\n result: 'cancelled',\n });\n taskTimer({ result: 'cancelled' });\n\n taskCount.add(1, { template, user, result: 'cancelled' });\n taskDuration.record(endTime(), {\n template,\n result: 'cancelled',\n });\n }\n\n return {\n skipDryRun,\n markCancelled,\n markSuccessful,\n markFailed,\n };\n }\n\n async function stepStart(task: TaskContext, step: TaskStep) {\n await task.emitLog(`Beginning step ${step.name}`, {\n stepId: step.id,\n status: 'processing',\n });\n const template = task.spec.templateInfo?.entityRef || '';\n\n const startTime = process.hrtime();\n const stepTimer = promStepDuration.startTimer({\n template,\n step: step.name,\n });\n\n function endTime() {\n const delta = process.hrtime(startTime);\n return delta[0] + delta[1] / 1e9;\n }\n\n async function markSuccessful() {\n await task.emitLog(`Finished step ${step.name}`, {\n stepId: step.id,\n status: 'completed',\n });\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'ok',\n });\n stepTimer({ result: 'ok' });\n\n stepCount.add(1, { template, step: step.name, result: 'ok' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'ok',\n });\n }\n\n async function markCancelled() {\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'cancelled',\n });\n stepTimer({ result: 'cancelled' });\n\n stepCount.add(1, { template, step: step.name, result: 'cancelled' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'cancelled',\n });\n }\n\n async function markFailed() {\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'failed',\n });\n stepTimer({ result: 'failed' });\n\n stepCount.add(1, { template, step: step.name, result: 'failed' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'failed',\n });\n }\n\n async function skipFalsy() {\n await task.emitLog(\n `Skipping step ${step.id} because its if condition was false`,\n { stepId: step.id, status: 'skipped' },\n );\n stepTimer({ result: 'skipped' });\n\n stepCount.add(1, { template, step: step.name, result: 'skipped' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'skipped',\n });\n }\n\n return {\n markCancelled,\n markFailed,\n markSuccessful,\n skipFalsy,\n };\n }\n\n return {\n taskStart,\n stepStart,\n };\n}\n"],"names":["WinstonLogger","winston","BackstageLoggerTransport","createConditionAuthorizer","scaffolderActionRules","convertFiltersToRecord","createDefaultFilters","defaultEnvironment","resolveDefaultEnvironment","nunjucks","templated","isTruthy","generateExampleOutput","InputError","validateJsonSchema","errors","NotAllowedError","stringifyError","fs","path","SecureTemplater","actionExecutePermission","AuthorizeResult","createCounterMetric","createHistogramMetric","metrics"],"mappings":"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"}
1
+ {"version":3,"file":"NunjucksWorkflowRunner.cjs.js","sources":["../../../src/scaffolder/tasks/NunjucksWorkflowRunner.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 { InputError, NotAllowedError, stringifyError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n TaskRecovery,\n TaskSpec,\n TaskSpecV1beta3,\n TaskStep,\n} from '@backstage/plugin-scaffolder-common';\nimport { JsonArray, JsonObject, JsonValue } from '@backstage/types';\nimport { metrics } from '@opentelemetry/api';\nimport fs from 'fs-extra';\nimport { validate as validateJsonSchema } from 'jsonschema';\nimport nunjucks from 'nunjucks';\nimport path from 'node:path';\nimport * as winston from 'winston';\nimport {\n SecureTemplater,\n SecureTemplateRenderer,\n} from '../../lib/templating/SecureTemplater';\nimport { TemplateActionRegistry } from '../actions/TemplateActionRegistry';\nimport { generateExampleOutput, isTruthy } from './helper';\nimport { TaskTrackType, WorkflowResponse, WorkflowRunner } from './types';\n\nimport type {\n AuditorService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AuthorizeResult,\n PolicyDecision,\n} from '@backstage/plugin-permission-common';\nimport { createConditionAuthorizer } from '@backstage/plugin-permission-node';\nimport { actionExecutePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n TaskContext,\n TaskSecrets,\n TemplateAction,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport { createDefaultFilters } from '../../lib/templating/filters/createDefaultFilters';\nimport { scaffolderActionRules } from '../../service/rules';\nimport { createCounterMetric, createHistogramMetric } from '../../util/metrics';\nimport { BackstageLoggerTransport, WinstonLogger } from './logger';\nimport { convertFiltersToRecord } from '../../util/templating';\nimport {\n CheckpointContext,\n CheckpointState,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { Config } from '@backstage/config';\nimport { resolveDefaultEnvironment } from '../../lib/defaultEnvironment';\n\ntype NunjucksWorkflowRunnerOptions = {\n workingDirectory: string;\n actionRegistry: TemplateActionRegistry;\n integrations: ScmIntegrations;\n logger: LoggerService;\n auditor?: AuditorService;\n additionalTemplateFilters?: Record<string, TemplateFilter>;\n additionalTemplateGlobals?: Record<string, TemplateGlobal>;\n permissions?: PermissionsService;\n config?: Config;\n};\n\ntype TemplateContext = {\n parameters: JsonObject;\n environment: JsonObject;\n EXPERIMENTAL_recovery?: TaskRecovery;\n steps: {\n [stepName: string]: { output: { [outputName: string]: JsonValue } };\n };\n secrets?: Record<string, string>;\n user?: {\n entity?: UserEntity;\n ref?: string;\n };\n each?: JsonValue;\n context: {\n task: {\n id: string;\n };\n };\n};\n\nconst isValidTaskSpec = (taskSpec: TaskSpec): taskSpec is TaskSpecV1beta3 => {\n return taskSpec.apiVersion === 'scaffolder.backstage.io/v1beta3';\n};\n\nconst createStepLogger = ({\n task,\n step,\n rootLogger,\n redactions,\n}: {\n task: TaskContext;\n step: TaskStep;\n rootLogger: LoggerService;\n redactions?: Record<string, string>;\n}) => {\n const taskLogger = WinstonLogger.create({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.simple(),\n ),\n transports: [new BackstageLoggerTransport(rootLogger, task, step.id)],\n });\n\n taskLogger.addRedactions(Object.values(redactions ?? {}));\n\n return { taskLogger };\n};\n\n/**\n * Recursively compares two rendered objects and returns string values from\n * `withSecrets` that differ from their counterpart in `withoutSecrets`.\n * These are values that were influenced by secret interpolation and should\n * be added as log redactions.\n */\nfunction collectSecretRedactions(\n withSecrets: unknown,\n withoutSecrets: unknown,\n): string[] {\n if (typeof withSecrets === 'string') {\n return withSecrets !== withoutSecrets ? [withSecrets] : [];\n }\n if (Array.isArray(withSecrets)) {\n const other = Array.isArray(withoutSecrets) ? withoutSecrets : [];\n return withSecrets.flatMap((val, i) =>\n collectSecretRedactions(val, other[i]),\n );\n }\n if (withSecrets && typeof withSecrets === 'object') {\n const other =\n withoutSecrets && typeof withoutSecrets === 'object'\n ? (withoutSecrets as Record<string, unknown>)\n : {};\n return Object.entries(withSecrets as Record<string, unknown>).flatMap(\n ([key, val]) => collectSecretRedactions(val, other[key]),\n );\n }\n return [];\n}\n\n/**\n * Extracts all string values from a nested object structure.\n * Used as a fallback when the comparison render fails.\n */\nfunction extractStringValues(obj: unknown): string[] {\n if (typeof obj === 'string') return [obj];\n if (Array.isArray(obj)) return obj.flatMap(extractStringValues);\n if (obj && typeof obj === 'object') {\n return Object.entries(obj).flatMap(([key, val]) => [\n key,\n ...extractStringValues(val),\n ]);\n }\n return [];\n}\n\nconst isActionAuthorized = createConditionAuthorizer(\n Object.values(scaffolderActionRules),\n);\n\nexport class NunjucksWorkflowRunner implements WorkflowRunner {\n private readonly defaultTemplateFilters: Record<string, TemplateFilter>;\n private readonly options: NunjucksWorkflowRunnerOptions;\n private environment: {\n parameters: JsonObject;\n secrets?: Record<string, string>;\n } = { parameters: {}, secrets: {} };\n\n constructor(options: NunjucksWorkflowRunnerOptions) {\n this.options = options;\n this.defaultTemplateFilters = convertFiltersToRecord(\n createDefaultFilters({\n integrations: this.options.integrations,\n }),\n );\n }\n\n private readonly tracker = scaffoldingTracker();\n\n async getEnvironmentConfig(): Promise<{\n parameters: JsonObject;\n secrets?: TaskSecrets;\n }> {\n if (this.options.config) {\n const defaultEnvironment = resolveDefaultEnvironment(this.options.config);\n return {\n parameters: defaultEnvironment.parameters,\n secrets: defaultEnvironment.secrets,\n };\n }\n\n return {\n parameters: {},\n secrets: {},\n };\n }\n\n private isSingleTemplateString(input: string) {\n const { parser, nodes } = nunjucks as unknown as {\n parser: {\n parse(\n template: string,\n ctx: object,\n options: nunjucks.ConfigureOptions,\n ): { children: { children?: unknown[] }[] };\n };\n nodes: { TemplateData: Function };\n };\n\n const parsed = parser.parse(\n input,\n {},\n {\n autoescape: false,\n tags: {\n variableStart: '${{',\n variableEnd: '}}',\n },\n },\n );\n\n return (\n parsed.children.length === 1 &&\n !(parsed.children[0]?.children?.[0] instanceof nodes.TemplateData)\n );\n }\n\n private render<T>(\n input: T,\n context: TemplateContext,\n renderTemplate: SecureTemplateRenderer,\n ): T {\n return JSON.parse(JSON.stringify(input), (_key, value) => {\n try {\n if (typeof value === 'string') {\n try {\n if (this.isSingleTemplateString(value)) {\n // Lets convert ${{ parameters.bob }} to ${{ (parameters.bob) | dump }} so we can keep the input type\n const wrappedDumped = value.replace(\n /\\${{(.+)}}/g,\n '${{ ( $1 ) | dump }}',\n );\n\n // Run the templating\n const templated = renderTemplate(wrappedDumped, context);\n\n // If there's an empty string returned, then it's undefined\n if (templated === '') {\n return undefined;\n }\n\n // Reparse the dumped string\n return JSON.parse(templated);\n }\n } catch (ex) {\n this.options.logger.error(\n `Failed to parse template string: ${value} with error ${ex.message}`,\n );\n }\n\n // Fallback to default behaviour\n const templated = renderTemplate(value, context);\n\n if (templated === '') {\n return undefined;\n }\n\n return templated;\n }\n } catch {\n return value;\n }\n return value;\n });\n }\n\n async executeStep(\n task: TaskContext,\n step: TaskStep,\n context: TemplateContext,\n renderTemplate: (template: string, values: unknown) => string,\n taskTrack: TaskTrackType,\n workspacePath: string,\n decision: PolicyDecision,\n ) {\n const stepTrack = await this.tracker.stepStart(task, step);\n\n if (task.cancelSignal.aborted) {\n throw new Error(\n `Step ${step.id} (${step.name}) of task ${task.taskId} has been cancelled.`,\n );\n }\n\n try {\n if (\n step.if === false ||\n (typeof step.if === 'string' &&\n step.each === undefined &&\n !isTruthy(this.render(step.if, context, renderTemplate)))\n ) {\n await stepTrack.skipFalsy();\n return;\n }\n const action: TemplateAction<JsonObject> =\n await this.options.actionRegistry.get(step.action, {\n credentials: await task.getInitiatorCredentials(),\n });\n const { taskLogger } = createStepLogger({\n task,\n step,\n rootLogger: this.options.logger,\n redactions: {\n ...task.secrets,\n ...this.environment?.secrets,\n },\n });\n\n if (task.isDryRun) {\n const redactedSecrets = Object.fromEntries(\n Object.entries(task.secrets ?? {}).map(secret => [secret[0], '***']),\n );\n\n const redactedEnvironmentSecrets = Object.fromEntries(\n Object.entries(this.environment?.secrets ?? {}).map(secret => [\n secret[0],\n '***',\n ]),\n );\n const debugInput =\n (step.input &&\n this.render(\n step.input,\n {\n ...context,\n environment: {\n parameters: this.environment?.parameters || {},\n secrets: redactedEnvironmentSecrets,\n },\n secrets: redactedSecrets,\n },\n renderTemplate,\n )) ??\n {};\n taskLogger.info(\n `Running ${\n action.id\n } in dry-run mode with inputs (secrets redacted): ${JSON.stringify(\n debugInput,\n undefined,\n 2,\n )}`,\n );\n if (!action.supportsDryRun) {\n await taskTrack.skipDryRun(step, action);\n const outputSchema = action.schema?.output;\n if (outputSchema) {\n context.steps[step.id] = {\n output: generateExampleOutput(outputSchema) as {\n [name in string]: JsonValue;\n },\n };\n } else {\n context.steps[step.id] = { output: {} };\n }\n return;\n }\n }\n\n const preIterationContext = {\n ...context,\n environment: {\n parameters: this.environment?.parameters ?? {},\n secrets: this.environment?.secrets ?? {},\n },\n secrets: task.secrets ?? {},\n };\n\n const resolvedEach =\n step.each &&\n this.render(step.each, preIterationContext, renderTemplate);\n\n if (step.each && !resolvedEach) {\n throw new InputError(\n `Invalid value on action ${action.id}.each parameter, \"${step.each}\" cannot be resolved to a value`,\n );\n }\n\n const iterations = (\n resolvedEach\n ? Object.entries(resolvedEach).map(([key, value]) => ({\n each: { key, value },\n }))\n : [{}]\n ).map(i => {\n const fullContext = { ...preIterationContext, ...i };\n // Evaluate if condition once per iteration, only when using 'each'\n const shouldRun =\n !('each' in i) ||\n !step.if ||\n isTruthy(this.render(step.if, fullContext, renderTemplate));\n\n return {\n ...i,\n shouldRun,\n // Secrets are only passed when templating the input to actions for security reasons\n input: step.input\n ? this.render(step.input, fullContext, renderTemplate)\n : {},\n };\n });\n for (const iteration of iterations) {\n if (!iteration.shouldRun) {\n // No need to check schema or authorization for iterations that will not run\n continue;\n }\n\n const actionId = `${action.id}${\n iteration.each ? `[${iteration.each.key}]` : ''\n }`;\n\n if (action.schema?.input) {\n const validateResult = validateJsonSchema(\n iteration.input,\n action.schema.input,\n );\n if (!validateResult.valid) {\n const errors = validateResult.errors.join(', ');\n throw new InputError(\n `Invalid input passed to action ${actionId}, ${errors}`,\n );\n }\n }\n if (\n !isActionAuthorized(decision, {\n action: action.id,\n input: iteration.input,\n })\n ) {\n throw new NotAllowedError(\n `Unauthorized action: ${actionId}. The action is not allowed. Input: ${JSON.stringify(\n iteration.input,\n null,\n 2,\n )}`,\n );\n }\n }\n const tmpDirs = new Array<string>();\n const stepOutput: { [outputName: string]: JsonValue } = {};\n const prevTaskState = await task.getTaskState?.();\n\n for (const iteration of iterations) {\n if (iteration.each) {\n if (!iteration.shouldRun) {\n taskLogger.info(\n `Skipping step each: ${JSON.stringify(\n iteration.each,\n (k, v) => (k ? String(v) : v),\n 0,\n )}`,\n );\n continue;\n }\n taskLogger.info(\n `Running step each: ${JSON.stringify(\n iteration.each,\n (k, v) => (k ? String(v) : v),\n 0,\n )}`,\n );\n }\n\n // Redact any rendered values that were influenced by secrets.\n // Re-render the input without secrets and diff against the real render\n // to find values that changed due to secret interpolation.\n if (step.input) {\n const hasSecrets =\n Object.keys(task.secrets ?? {}).length > 0 ||\n Object.keys(this.environment?.secrets ?? {}).length > 0;\n\n if (hasSecrets) {\n try {\n const contextNoSecrets = {\n ...preIterationContext,\n ...(iteration.each ? { each: iteration.each } : {}),\n secrets: {},\n environment: {\n ...preIterationContext.environment,\n secrets: {},\n },\n };\n const inputWithoutSecrets = this.render(\n step.input,\n contextNoSecrets,\n renderTemplate,\n );\n taskLogger.addRedactions(\n collectSecretRedactions(iteration.input, inputWithoutSecrets),\n );\n } catch {\n taskLogger.addRedactions(extractStringValues(iteration.input));\n }\n }\n }\n\n await action.handler({\n input: iteration.input,\n task: {\n id: await task.getWorkspaceName(),\n },\n secrets: task.secrets ?? {},\n logger: taskLogger,\n workspacePath,\n async checkpoint<T extends JsonValue | void>(\n opts: CheckpointContext<T>,\n ) {\n const { key: checkpointKey, fn } = opts;\n const key = `v1.task.checkpoint.${step.id}.${checkpointKey}`;\n\n try {\n let prevValue: T | undefined;\n\n if (prevTaskState) {\n const prevState = (\n prevTaskState.state?.checkpoints as CheckpointState\n )?.[key];\n\n if (prevState && prevState.status === 'success') {\n prevValue = prevState.value as T;\n }\n }\n\n const value = prevValue ? prevValue : await fn();\n\n if (!prevValue) {\n task.updateCheckpoint?.({\n key,\n status: 'success',\n value: value ?? {},\n });\n }\n return value;\n } catch (err) {\n task.updateCheckpoint?.({\n key,\n status: 'failed',\n reason: stringifyError(err),\n });\n throw err;\n } finally {\n await task.serializeWorkspace?.({ path: workspacePath });\n }\n },\n createTemporaryDirectory: async () => {\n const tmpDir = await fs.mkdtemp(\n `${workspacePath}_step-${step.id}-`,\n );\n tmpDirs.push(tmpDir);\n return tmpDir;\n },\n output(name: string, value: JsonValue) {\n if (step.each) {\n stepOutput[name] = stepOutput[name] || [];\n (stepOutput[name] as JsonArray).push(value);\n } else {\n stepOutput[name] = value;\n }\n },\n templateInfo: task.spec.templateInfo,\n user: task.spec.user,\n isDryRun: task.isDryRun,\n signal: task.cancelSignal,\n getInitiatorCredentials: () => task.getInitiatorCredentials(),\n step: {\n id: step.id,\n name: step.name,\n },\n });\n }\n\n // Remove all temporary directories that were created when executing the action\n for (const tmpDir of tmpDirs) {\n await fs.remove(tmpDir);\n }\n\n context.steps[step.id] = { output: stepOutput };\n\n if (task.cancelSignal.aborted) {\n throw new Error(\n `Step ${step.id} (${step.name}) of task ${task.taskId} has been cancelled.`,\n );\n }\n\n await stepTrack.markSuccessful();\n } catch (err) {\n await taskTrack.markFailed(step, err);\n await stepTrack.markFailed();\n throw err;\n } finally {\n await task.serializeWorkspace?.({ path: workspacePath });\n }\n }\n\n async execute(task: TaskContext): Promise<WorkflowResponse> {\n if (!isValidTaskSpec(task.spec)) {\n throw new InputError(\n 'Wrong template version executed with the workflow engine',\n );\n }\n const taskId = await task.getWorkspaceName();\n\n const workspacePath = path.join(this.options.workingDirectory, taskId);\n\n const { additionalTemplateFilters, additionalTemplateGlobals } =\n this.options;\n\n this.environment = await this.getEnvironmentConfig();\n\n const renderTemplate = await SecureTemplater.loadRenderer({\n templateFilters: {\n ...this.defaultTemplateFilters,\n ...additionalTemplateFilters,\n },\n templateGlobals: additionalTemplateGlobals,\n });\n\n try {\n await task.rehydrateWorkspace?.({ taskId, targetPath: workspacePath });\n\n const taskTrack = await this.tracker.taskStart(task);\n await fs.ensureDir(workspacePath);\n\n const context: TemplateContext = {\n parameters: task.spec.parameters,\n environment: {\n parameters: this.environment?.parameters || {},\n secrets: {},\n },\n steps: {},\n user: task.spec.user,\n context: {\n task: {\n id: taskId,\n },\n },\n };\n\n const [decision]: PolicyDecision[] =\n this.options.permissions && task.spec.steps.length\n ? await this.options.permissions.authorizeConditional(\n [{ permission: actionExecutePermission }],\n { credentials: await task.getInitiatorCredentials() },\n )\n : [{ result: AuthorizeResult.ALLOW }];\n\n for (const step of task.spec.steps) {\n await this.executeStep(\n task,\n step,\n context,\n renderTemplate,\n taskTrack,\n workspacePath,\n decision,\n );\n }\n\n const output = this.render(task.spec.output, context, renderTemplate);\n await taskTrack.markSuccessful();\n await task.cleanWorkspace?.();\n\n return { output };\n } finally {\n if (workspacePath) {\n await fs.remove(workspacePath);\n }\n }\n }\n}\n\nfunction scaffoldingTracker() {\n // prom-client metrics are deprecated in favour of OpenTelemetry metrics.\n const promTaskCount = createCounterMetric({\n name: 'scaffolder_task_count',\n help: 'Count of task runs',\n labelNames: ['template', 'user', 'result'],\n });\n const promTaskDuration = createHistogramMetric({\n name: 'scaffolder_task_duration',\n help: 'Duration of a task run',\n labelNames: ['template', 'result'],\n });\n const promtStepCount = createCounterMetric({\n name: 'scaffolder_step_count',\n help: 'Count of step runs',\n labelNames: ['template', 'step', 'result'],\n });\n const promStepDuration = createHistogramMetric({\n name: 'scaffolder_step_duration',\n help: 'Duration of a step runs',\n labelNames: ['template', 'step', 'result'],\n });\n\n const meter = metrics.getMeter('default');\n const taskCount = meter.createCounter('scaffolder.task.count', {\n description: 'Count of task runs',\n });\n\n const taskDuration = meter.createHistogram('scaffolder.task.duration', {\n description: 'Duration of a task run',\n unit: 'seconds',\n });\n\n const stepCount = meter.createCounter('scaffolder.step.count', {\n description: 'Count of step runs',\n });\n\n const stepDuration = meter.createHistogram('scaffolder.step.duration', {\n description: 'Duration of a step runs',\n unit: 'seconds',\n });\n\n async function taskStart(task: TaskContext) {\n await task.emitLog(`Starting up task with ${task.spec.steps.length} steps`);\n const template = task.spec.templateInfo?.entityRef || '';\n const user = task.spec.user?.ref || '';\n\n const startTime = process.hrtime();\n const taskTimer = promTaskDuration.startTimer({\n template,\n });\n\n function endTime() {\n const delta = process.hrtime(startTime);\n return delta[0] + delta[1] / 1e9;\n }\n\n async function skipDryRun(\n step: TaskStep,\n action: TemplateAction<JsonObject>,\n ) {\n task.emitLog(`Skipping because ${action.id} does not support dry-run`, {\n stepId: step.id,\n status: 'skipped',\n });\n }\n\n async function markSuccessful() {\n promTaskCount.inc({\n template,\n user,\n result: 'ok',\n });\n taskTimer({ result: 'ok' });\n\n taskCount.add(1, { template, user, result: 'ok' });\n taskDuration.record(endTime(), {\n template,\n result: 'ok',\n });\n }\n\n async function markFailed(step: TaskStep, err: Error) {\n await task.emitLog(String(err.stack), {\n stepId: step.id,\n status: 'failed',\n });\n promTaskCount.inc({\n template,\n user,\n result: 'failed',\n });\n taskTimer({ result: 'failed' });\n\n taskCount.add(1, { template, user, result: 'failed' });\n taskDuration.record(endTime(), {\n template,\n result: 'failed',\n });\n }\n\n async function markCancelled(step: TaskStep) {\n await task.emitLog(`Step ${step.id} has been cancelled.`, {\n stepId: step.id,\n status: 'cancelled',\n });\n promTaskCount.inc({\n template,\n user,\n result: 'cancelled',\n });\n taskTimer({ result: 'cancelled' });\n\n taskCount.add(1, { template, user, result: 'cancelled' });\n taskDuration.record(endTime(), {\n template,\n result: 'cancelled',\n });\n }\n\n return {\n skipDryRun,\n markCancelled,\n markSuccessful,\n markFailed,\n };\n }\n\n async function stepStart(task: TaskContext, step: TaskStep) {\n await task.emitLog(`Beginning step ${step.name}`, {\n stepId: step.id,\n status: 'processing',\n });\n const template = task.spec.templateInfo?.entityRef || '';\n\n const startTime = process.hrtime();\n const stepTimer = promStepDuration.startTimer({\n template,\n step: step.name,\n });\n\n function endTime() {\n const delta = process.hrtime(startTime);\n return delta[0] + delta[1] / 1e9;\n }\n\n async function markSuccessful() {\n await task.emitLog(`Finished step ${step.name}`, {\n stepId: step.id,\n status: 'completed',\n });\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'ok',\n });\n stepTimer({ result: 'ok' });\n\n stepCount.add(1, { template, step: step.name, result: 'ok' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'ok',\n });\n }\n\n async function markCancelled() {\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'cancelled',\n });\n stepTimer({ result: 'cancelled' });\n\n stepCount.add(1, { template, step: step.name, result: 'cancelled' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'cancelled',\n });\n }\n\n async function markFailed() {\n promtStepCount.inc({\n template,\n step: step.name,\n result: 'failed',\n });\n stepTimer({ result: 'failed' });\n\n stepCount.add(1, { template, step: step.name, result: 'failed' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'failed',\n });\n }\n\n async function skipFalsy() {\n await task.emitLog(\n `Skipping step ${step.id} because its if condition was false`,\n { stepId: step.id, status: 'skipped' },\n );\n stepTimer({ result: 'skipped' });\n\n stepCount.add(1, { template, step: step.name, result: 'skipped' });\n stepDuration.record(endTime(), {\n template,\n step: step.name,\n result: 'skipped',\n });\n }\n\n return {\n markCancelled,\n markFailed,\n markSuccessful,\n skipFalsy,\n };\n }\n\n return {\n taskStart,\n stepStart,\n };\n}\n"],"names":["WinstonLogger","winston","BackstageLoggerTransport","createConditionAuthorizer","scaffolderActionRules","convertFiltersToRecord","createDefaultFilters","defaultEnvironment","resolveDefaultEnvironment","nunjucks","templated","isTruthy","generateExampleOutput","InputError","validateJsonSchema","errors","NotAllowedError","stringifyError","fs","path","SecureTemplater","actionExecutePermission","AuthorizeResult","createCounterMetric","createHistogramMetric","metrics"],"mappings":"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"}
@@ -991,6 +991,25 @@ const spec = {
991
991
  }
992
992
  }
993
993
  }
994
+ },
995
+ "400": {
996
+ description: "Validation errors.",
997
+ content: {
998
+ "application/json": {
999
+ schema: {
1000
+ type: "object",
1001
+ properties: {
1002
+ errors: {
1003
+ type: "array",
1004
+ items: {
1005
+ $ref: "#/components/schemas/ValidationError"
1006
+ }
1007
+ }
1008
+ },
1009
+ required: ["errors"]
1010
+ }
1011
+ }
1012
+ }
994
1013
  }
995
1014
  },
996
1015
  security: [
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../../../src/schema/openapi/generated/router.ts"],"sourcesContent":["/*\n * Copyright 2026 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\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouterFromGeneratedEndpointMap } from '@backstage/backend-openapi-utils';\nimport { EndpointMap } from './apis';\n\nexport const spec = {\n openapi: '3.1.0',\n info: {\n title: 'scaffolder',\n version: '1',\n description:\n 'The Backstage backend plugin that helps you create new things',\n license: {\n name: 'Apache-2.0',\n url: 'http://www.apache.org/licenses/LICENSE-2.0.html',\n },\n contact: {},\n },\n servers: [\n {\n url: '/',\n },\n ],\n components: {\n examples: {},\n headers: {},\n parameters: {\n createdBy: {\n name: 'createdBy',\n in: 'query',\n description: 'Created by',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n eventsAfter: {\n name: 'after',\n in: 'query',\n description: 'Offset event ID to stream events after.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n },\n },\n kind: {\n name: 'kind',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n limit: {\n name: 'limit',\n in: 'query',\n description: 'Number of records to return in the response.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n namespace: {\n name: 'namespace',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n name: {\n name: 'name',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n offset: {\n name: 'offset',\n in: 'query',\n description: 'Number of records to skip in the query page.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n order: {\n name: 'order',\n in: 'query',\n description: 'Order',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n status: {\n name: 'status',\n in: 'query',\n description: 'Status',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n taskId: {\n name: 'taskId',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n },\n requestBodies: {},\n responses: {\n ErrorResponse: {\n description: 'An error response from the backend.',\n content: {\n 'application/json; charset=utf-8': {\n schema: {\n $ref: '#/components/schemas/Error',\n },\n },\n },\n },\n },\n schemas: {\n Action: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ActionExample',\n },\n },\n schema: {\n type: 'object',\n properties: {\n input: {\n $ref: '#/components/schemas/JsonObject',\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n },\n required: ['id'],\n description:\n 'The response shape for a single action in the `listActions` call to the `scaffolder-backend`',\n },\n ActionExample: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n example: {\n type: 'string',\n },\n },\n required: ['description', 'example'],\n description: 'A single action example',\n },\n DryRunResult: {\n type: 'object',\n properties: {\n log: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n body: {\n allOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n stepId: {\n type: 'string',\n },\n },\n required: ['message'],\n },\n ],\n },\n },\n required: ['body'],\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedFile',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n required: ['log', 'directoryContents', 'output'],\n },\n Error: {\n type: 'object',\n properties: {\n error: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n stack: {\n type: 'string',\n },\n code: {\n type: 'string',\n },\n },\n required: ['name', 'message'],\n },\n request: {\n type: 'object',\n properties: {\n method: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n },\n required: ['method', 'url'],\n },\n response: {\n type: 'object',\n properties: {\n statusCode: {\n type: 'number',\n },\n },\n required: ['statusCode'],\n },\n },\n required: ['error', 'response'],\n additionalProperties: {},\n },\n JsonArray: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonValue',\n },\n description: 'A type representing all allowed JSON array values.',\n },\n JsonObject: {\n type: 'object',\n properties: {},\n description: 'A type representing all allowed JSON object values.',\n additionalProperties: {},\n },\n JsonPrimitive: {\n oneOf: [\n {\n type: 'boolean',\n },\n {\n type: 'number',\n },\n {\n type: 'string',\n },\n {\n type: 'null',\n },\n ],\n description: 'A type representing all allowed JSON primitive values.',\n },\n JsonValue: {\n oneOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n $ref: '#/components/schemas/JsonArray',\n },\n {\n $ref: '#/components/schemas/JsonPrimitive',\n },\n ],\n description: 'A type representing all allowed JSON values.',\n },\n ListActionsResponse: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Action',\n },\n description:\n 'The response shape for the `listActions` call to the `scaffolder-backend`',\n },\n ListTasksResponse: {\n type: 'object',\n properties: {\n tasks: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedTask',\n },\n },\n totalTasks: {\n type: 'number',\n },\n },\n required: ['tasks'],\n description:\n 'The response shape for the `listTasks` call to the `scaffolder-backend`',\n },\n ListTemplatingExtensionsResponse: {\n type: 'object',\n properties: {\n filters: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateFilter',\n },\n },\n globals: {\n type: 'object',\n properties: {\n functions: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateGlobalFunction',\n },\n },\n values: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateGlobalValue',\n },\n },\n },\n required: ['functions', 'values'],\n },\n },\n required: ['filters', 'globals'],\n description:\n 'The response shape for the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n ScaffolderScaffoldOptions: {\n type: 'object',\n properties: {\n templateRef: {\n type: 'string',\n },\n values: {\n type: 'object',\n additionalProperties: {},\n },\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n },\n required: ['templateRef', 'values'],\n description:\n 'The input options to the `scaffold` method of the `ScaffolderClient`.',\n },\n ScaffolderUsageExample: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n example: {\n type: 'string',\n },\n notes: {\n type: 'string',\n },\n },\n required: ['example'],\n description: 'A single scaffolder usage example',\n },\n SerializedFile: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n content: {\n type: 'string',\n },\n executable: {\n type: 'boolean',\n },\n symlink: {\n type: 'boolean',\n },\n },\n required: ['path', 'content'],\n },\n SerializedTaskEvent: {\n type: 'object',\n properties: {\n id: {\n type: 'integer',\n },\n isTaskRecoverable: {\n type: 'boolean',\n },\n taskId: {\n type: 'string',\n },\n body: {\n allOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n stepId: {\n type: 'string',\n },\n },\n required: ['message'],\n },\n ],\n },\n type: {\n $ref: '#/components/schemas/TaskEventType',\n },\n createdAt: {\n type: 'string',\n },\n },\n required: ['id', 'taskId', 'body', 'type', 'createdAt'],\n description: 'SerializedTaskEvent',\n },\n SerializedTask: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n spec: {\n type: 'object',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n createdAt: {\n type: 'string',\n },\n lastHeartbeatAt: {\n type: 'string',\n },\n createdBy: {\n type: 'string',\n },\n secrets: {\n $ref: '#/components/schemas/TaskSecrets',\n },\n state: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n required: ['id', 'spec', 'status', 'createdAt'],\n description: 'SerializedTask',\n },\n TaskEventType: {\n type: 'string',\n description: 'TaskEventType',\n enum: ['cancelled', 'completion', 'log', 'recovered'],\n },\n TaskSecrets: {\n allOf: [\n {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n {\n type: 'object',\n properties: {\n backstageToken: {\n type: 'string',\n },\n },\n },\n ],\n description: 'TaskSecrets',\n },\n TaskStatus: {\n type: 'string',\n enum: [\n 'cancelled',\n 'completed',\n 'failed',\n 'open',\n 'processing',\n 'skipped',\n ],\n description: 'The status of each step of the Task',\n },\n TemplateGlobalFunction: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n properties: {\n arguments: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ScaffolderUsageExample',\n },\n },\n },\n description:\n 'The response shape for a single global function in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateGlobalValue: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n value: {\n anyOf: [\n {\n type: 'object',\n },\n {\n type: 'null',\n },\n ],\n },\n },\n required: ['value'],\n description:\n 'The response shape for a single global value in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateFilter: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n properties: {\n input: {\n $ref: '#/components/schemas/JsonObject',\n },\n arguments: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ScaffolderUsageExample',\n },\n },\n },\n description:\n 'The response shape for a single filter in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateParameterSchema: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n },\n },\n required: ['title', 'schema'],\n },\n },\n },\n required: ['title', 'steps'],\n description:\n 'The shape of each entry of parameters which gets rendered\\nas a separate step in the wizard input',\n additionalProperties: {},\n },\n ValidationError: {\n type: 'object',\n properties: {\n path: {\n type: 'array',\n items: {\n oneOf: [\n {\n type: 'string',\n },\n {\n type: 'integer',\n },\n ],\n },\n },\n property: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n instance: {\n type: 'object',\n },\n name: {\n type: 'string',\n },\n argument: {\n oneOf: [\n {\n type: 'boolean',\n },\n {\n type: 'number',\n },\n {\n type: 'object',\n },\n {\n type: 'string',\n },\n ],\n },\n stack: {\n type: 'string',\n },\n },\n required: [\n 'path',\n 'property',\n 'message',\n 'schema',\n 'instance',\n 'name',\n 'argument',\n 'stack',\n ],\n additionalProperties: {},\n },\n },\n securitySchemes: {\n JWT: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n },\n },\n },\n paths: {\n '/v2/templates/{namespace}/{kind}/{name}/parameter-schema': {\n get: {\n operationId: 'GetTemplateParameterSchema',\n description: 'Get template parameter schema.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/TemplateParameterSchema',\n },\n },\n },\n },\n '400': {\n $ref: '#/components/responses/ErrorResponse',\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/namespace',\n },\n {\n $ref: '#/components/parameters/kind',\n },\n {\n $ref: '#/components/parameters/name',\n },\n ],\n },\n },\n '/v2/actions': {\n get: {\n operationId: 'ListActions',\n description: 'Returns a list of all installed actions.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListActionsResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n '/v2/tasks': {\n get: {\n operationId: 'ListTasks',\n description:\n 'Returns a list of tasks, filtering by ownership and/or status if given.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListTasksResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/createdBy',\n },\n {\n $ref: '#/components/parameters/limit',\n },\n {\n $ref: '#/components/parameters/offset',\n },\n {\n $ref: '#/components/parameters/order',\n },\n {\n $ref: '#/components/parameters/status',\n },\n ],\n },\n post: {\n operationId: 'Scaffold',\n description:\n 'Executes the scaffolding of a component, given a template and its\\nparameter values.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ScaffolderScaffoldOptions',\n },\n },\n },\n },\n responses: {\n '201': {\n description: 'Created',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n },\n '400': {\n description: 'Validation errors.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n errors: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ValidationError',\n },\n },\n },\n required: ['errors'],\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n '/v2/tasks/{taskId}': {\n get: {\n operationId: 'GetTask',\n description: 'Get a task by ID.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/SerializedTask',\n },\n },\n },\n },\n '403': {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/cancel': {\n post: {\n operationId: 'CancelTask',\n description:\n 'Sends a signal to a task broker to cancel the running task by taskId.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n },\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/retry': {\n post: {\n operationId: 'Retry',\n description: 'Starts the task again from the point where it failed.',\n requestBody: {\n required: false,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n },\n },\n },\n },\n },\n responses: {\n '201': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/events': {\n get: {\n operationId: 'StreamLogsPolling',\n description: 'Get events for a task by ID.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedTaskEvent',\n },\n },\n },\n },\n },\n '403': {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n parameters: [\n {\n $ref: '#/components/parameters/eventsAfter',\n },\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/dry-run': {\n post: {\n operationId: 'DryRun',\n description: 'Perform a dry-run of a template',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n template: {\n type: 'object',\n },\n values: {\n $ref: '#/components/schemas/JsonObject',\n },\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n base64Content: {\n type: 'string',\n },\n },\n },\n },\n },\n required: ['template', 'values', 'directoryContents'],\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n allOf: [\n {\n $ref: '#/components/schemas/DryRunResult',\n },\n {\n type: 'object',\n properties: {\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n action: {\n type: 'string',\n },\n },\n required: ['id', 'name', 'action'],\n additionalProperties: {},\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n executable: {\n type: 'boolean',\n },\n base64Content: {\n type: 'string',\n },\n },\n required: ['path', 'base64Content'],\n },\n },\n },\n required: ['steps'],\n },\n ],\n },\n },\n },\n },\n '400': {\n description: 'Validation errors.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n errors: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ValidationError',\n },\n },\n },\n required: ['errors'],\n },\n },\n },\n },\n },\n parameters: [],\n },\n },\n '/v2/autocomplete/{provider}/{resource}': {\n post: {\n operationId: 'Autocomplete',\n description:\n 'Perform an autocomplete for the given provider and resource.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n context: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n token: {\n type: 'string',\n },\n },\n required: ['context', 'token'],\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n results: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n required: ['results'],\n },\n },\n },\n },\n '400': {\n description: 'Unsupported provider.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n },\n },\n },\n },\n },\n },\n parameters: [\n {\n in: 'path',\n name: 'provider',\n required: true,\n schema: {\n type: 'string',\n },\n },\n {\n in: 'path',\n name: 'resource',\n required: true,\n schema: {\n type: 'string',\n },\n },\n ],\n },\n },\n '/v2/templating-extensions': {\n get: {\n operationId: 'ListTemplatingExtensions',\n description:\n 'Returns a structure describing the available templating extensions.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListTemplatingExtensionsResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<\n typeof createValidatedOpenApiRouterFromGeneratedEndpointMap\n >['1'],\n) =>\n createValidatedOpenApiRouterFromGeneratedEndpointMap<EndpointMap>(\n spec,\n options,\n );\n"],"names":["createValidatedOpenApiRouterFromGeneratedEndpointMap"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../../../src/schema/openapi/generated/router.ts"],"sourcesContent":["/*\n * Copyright 2026 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\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouterFromGeneratedEndpointMap } from '@backstage/backend-openapi-utils';\nimport { EndpointMap } from './apis';\n\nexport const spec = {\n openapi: '3.1.0',\n info: {\n title: 'scaffolder',\n version: '1',\n description:\n 'The Backstage backend plugin that helps you create new things',\n license: {\n name: 'Apache-2.0',\n url: 'http://www.apache.org/licenses/LICENSE-2.0.html',\n },\n contact: {},\n },\n servers: [\n {\n url: '/',\n },\n ],\n components: {\n examples: {},\n headers: {},\n parameters: {\n createdBy: {\n name: 'createdBy',\n in: 'query',\n description: 'Created by',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n eventsAfter: {\n name: 'after',\n in: 'query',\n description: 'Offset event ID to stream events after.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n },\n },\n kind: {\n name: 'kind',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n limit: {\n name: 'limit',\n in: 'query',\n description: 'Number of records to return in the response.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n namespace: {\n name: 'namespace',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n name: {\n name: 'name',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n offset: {\n name: 'offset',\n in: 'query',\n description: 'Number of records to skip in the query page.',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n order: {\n name: 'order',\n in: 'query',\n description: 'Order',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n status: {\n name: 'status',\n in: 'query',\n description: 'Status',\n required: false,\n allowReserved: true,\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n taskId: {\n name: 'taskId',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n },\n requestBodies: {},\n responses: {\n ErrorResponse: {\n description: 'An error response from the backend.',\n content: {\n 'application/json; charset=utf-8': {\n schema: {\n $ref: '#/components/schemas/Error',\n },\n },\n },\n },\n },\n schemas: {\n Action: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ActionExample',\n },\n },\n schema: {\n type: 'object',\n properties: {\n input: {\n $ref: '#/components/schemas/JsonObject',\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n },\n required: ['id'],\n description:\n 'The response shape for a single action in the `listActions` call to the `scaffolder-backend`',\n },\n ActionExample: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n example: {\n type: 'string',\n },\n },\n required: ['description', 'example'],\n description: 'A single action example',\n },\n DryRunResult: {\n type: 'object',\n properties: {\n log: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n body: {\n allOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n stepId: {\n type: 'string',\n },\n },\n required: ['message'],\n },\n ],\n },\n },\n required: ['body'],\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedFile',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n required: ['log', 'directoryContents', 'output'],\n },\n Error: {\n type: 'object',\n properties: {\n error: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n stack: {\n type: 'string',\n },\n code: {\n type: 'string',\n },\n },\n required: ['name', 'message'],\n },\n request: {\n type: 'object',\n properties: {\n method: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n },\n required: ['method', 'url'],\n },\n response: {\n type: 'object',\n properties: {\n statusCode: {\n type: 'number',\n },\n },\n required: ['statusCode'],\n },\n },\n required: ['error', 'response'],\n additionalProperties: {},\n },\n JsonArray: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonValue',\n },\n description: 'A type representing all allowed JSON array values.',\n },\n JsonObject: {\n type: 'object',\n properties: {},\n description: 'A type representing all allowed JSON object values.',\n additionalProperties: {},\n },\n JsonPrimitive: {\n oneOf: [\n {\n type: 'boolean',\n },\n {\n type: 'number',\n },\n {\n type: 'string',\n },\n {\n type: 'null',\n },\n ],\n description: 'A type representing all allowed JSON primitive values.',\n },\n JsonValue: {\n oneOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n $ref: '#/components/schemas/JsonArray',\n },\n {\n $ref: '#/components/schemas/JsonPrimitive',\n },\n ],\n description: 'A type representing all allowed JSON values.',\n },\n ListActionsResponse: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Action',\n },\n description:\n 'The response shape for the `listActions` call to the `scaffolder-backend`',\n },\n ListTasksResponse: {\n type: 'object',\n properties: {\n tasks: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedTask',\n },\n },\n totalTasks: {\n type: 'number',\n },\n },\n required: ['tasks'],\n description:\n 'The response shape for the `listTasks` call to the `scaffolder-backend`',\n },\n ListTemplatingExtensionsResponse: {\n type: 'object',\n properties: {\n filters: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateFilter',\n },\n },\n globals: {\n type: 'object',\n properties: {\n functions: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateGlobalFunction',\n },\n },\n values: {\n type: 'object',\n additionalProperties: {\n $ref: '#/components/schemas/TemplateGlobalValue',\n },\n },\n },\n required: ['functions', 'values'],\n },\n },\n required: ['filters', 'globals'],\n description:\n 'The response shape for the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n ScaffolderScaffoldOptions: {\n type: 'object',\n properties: {\n templateRef: {\n type: 'string',\n },\n values: {\n type: 'object',\n additionalProperties: {},\n },\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n },\n required: ['templateRef', 'values'],\n description:\n 'The input options to the `scaffold` method of the `ScaffolderClient`.',\n },\n ScaffolderUsageExample: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n example: {\n type: 'string',\n },\n notes: {\n type: 'string',\n },\n },\n required: ['example'],\n description: 'A single scaffolder usage example',\n },\n SerializedFile: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n content: {\n type: 'string',\n },\n executable: {\n type: 'boolean',\n },\n symlink: {\n type: 'boolean',\n },\n },\n required: ['path', 'content'],\n },\n SerializedTaskEvent: {\n type: 'object',\n properties: {\n id: {\n type: 'integer',\n },\n isTaskRecoverable: {\n type: 'boolean',\n },\n taskId: {\n type: 'string',\n },\n body: {\n allOf: [\n {\n $ref: '#/components/schemas/JsonObject',\n },\n {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n stepId: {\n type: 'string',\n },\n },\n required: ['message'],\n },\n ],\n },\n type: {\n $ref: '#/components/schemas/TaskEventType',\n },\n createdAt: {\n type: 'string',\n },\n },\n required: ['id', 'taskId', 'body', 'type', 'createdAt'],\n description: 'SerializedTaskEvent',\n },\n SerializedTask: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n spec: {\n type: 'object',\n },\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n createdAt: {\n type: 'string',\n },\n lastHeartbeatAt: {\n type: 'string',\n },\n createdBy: {\n type: 'string',\n },\n secrets: {\n $ref: '#/components/schemas/TaskSecrets',\n },\n state: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n required: ['id', 'spec', 'status', 'createdAt'],\n description: 'SerializedTask',\n },\n TaskEventType: {\n type: 'string',\n description: 'TaskEventType',\n enum: ['cancelled', 'completion', 'log', 'recovered'],\n },\n TaskSecrets: {\n allOf: [\n {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n {\n type: 'object',\n properties: {\n backstageToken: {\n type: 'string',\n },\n },\n },\n ],\n description: 'TaskSecrets',\n },\n TaskStatus: {\n type: 'string',\n enum: [\n 'cancelled',\n 'completed',\n 'failed',\n 'open',\n 'processing',\n 'skipped',\n ],\n description: 'The status of each step of the Task',\n },\n TemplateGlobalFunction: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n properties: {\n arguments: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ScaffolderUsageExample',\n },\n },\n },\n description:\n 'The response shape for a single global function in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateGlobalValue: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n value: {\n anyOf: [\n {\n type: 'object',\n },\n {\n type: 'null',\n },\n ],\n },\n },\n required: ['value'],\n description:\n 'The response shape for a single global value in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateFilter: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n properties: {\n input: {\n $ref: '#/components/schemas/JsonObject',\n },\n arguments: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n output: {\n $ref: '#/components/schemas/JsonObject',\n },\n },\n },\n examples: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ScaffolderUsageExample',\n },\n },\n },\n description:\n 'The response shape for a single filter in the `listTemplatingExtensions` call to the `scaffolder-backend`',\n },\n TemplateParameterSchema: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n schema: {\n type: 'object',\n },\n },\n required: ['title', 'schema'],\n },\n },\n },\n required: ['title', 'steps'],\n description:\n 'The shape of each entry of parameters which gets rendered\\nas a separate step in the wizard input',\n additionalProperties: {},\n },\n ValidationError: {\n type: 'object',\n properties: {\n path: {\n type: 'array',\n items: {\n oneOf: [\n {\n type: 'string',\n },\n {\n type: 'integer',\n },\n ],\n },\n },\n property: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n instance: {\n type: 'object',\n },\n name: {\n type: 'string',\n },\n argument: {\n oneOf: [\n {\n type: 'boolean',\n },\n {\n type: 'number',\n },\n {\n type: 'object',\n },\n {\n type: 'string',\n },\n ],\n },\n stack: {\n type: 'string',\n },\n },\n required: [\n 'path',\n 'property',\n 'message',\n 'schema',\n 'instance',\n 'name',\n 'argument',\n 'stack',\n ],\n additionalProperties: {},\n },\n },\n securitySchemes: {\n JWT: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n },\n },\n },\n paths: {\n '/v2/templates/{namespace}/{kind}/{name}/parameter-schema': {\n get: {\n operationId: 'GetTemplateParameterSchema',\n description: 'Get template parameter schema.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/TemplateParameterSchema',\n },\n },\n },\n },\n '400': {\n $ref: '#/components/responses/ErrorResponse',\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/namespace',\n },\n {\n $ref: '#/components/parameters/kind',\n },\n {\n $ref: '#/components/parameters/name',\n },\n ],\n },\n },\n '/v2/actions': {\n get: {\n operationId: 'ListActions',\n description: 'Returns a list of all installed actions.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListActionsResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n '/v2/tasks': {\n get: {\n operationId: 'ListTasks',\n description:\n 'Returns a list of tasks, filtering by ownership and/or status if given.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListTasksResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/createdBy',\n },\n {\n $ref: '#/components/parameters/limit',\n },\n {\n $ref: '#/components/parameters/offset',\n },\n {\n $ref: '#/components/parameters/order',\n },\n {\n $ref: '#/components/parameters/status',\n },\n ],\n },\n post: {\n operationId: 'Scaffold',\n description:\n 'Executes the scaffolding of a component, given a template and its\\nparameter values.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ScaffolderScaffoldOptions',\n },\n },\n },\n },\n responses: {\n '201': {\n description: 'Created',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n },\n '400': {\n description: 'Validation errors.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n errors: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ValidationError',\n },\n },\n },\n required: ['errors'],\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n '/v2/tasks/{taskId}': {\n get: {\n operationId: 'GetTask',\n description: 'Get a task by ID.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/SerializedTask',\n },\n },\n },\n },\n '403': {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/cancel': {\n post: {\n operationId: 'CancelTask',\n description:\n 'Sends a signal to a task broker to cancel the running task by taskId.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: {\n $ref: '#/components/schemas/TaskStatus',\n },\n },\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/retry': {\n post: {\n operationId: 'Retry',\n description: 'Starts the task again from the point where it failed.',\n requestBody: {\n required: false,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n },\n },\n },\n },\n },\n responses: {\n '201': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n },\n '400': {\n description: 'Validation errors.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n errors: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ValidationError',\n },\n },\n },\n required: ['errors'],\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/tasks/{taskId}/events': {\n get: {\n operationId: 'StreamLogsPolling',\n description: 'Get events for a task by ID.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/SerializedTaskEvent',\n },\n },\n },\n },\n },\n '403': {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n parameters: [\n {\n $ref: '#/components/parameters/eventsAfter',\n },\n {\n $ref: '#/components/parameters/taskId',\n },\n ],\n },\n },\n '/v2/dry-run': {\n post: {\n operationId: 'DryRun',\n description: 'Perform a dry-run of a template',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n template: {\n type: 'object',\n },\n values: {\n $ref: '#/components/schemas/JsonObject',\n },\n secrets: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n base64Content: {\n type: 'string',\n },\n },\n },\n },\n },\n required: ['template', 'values', 'directoryContents'],\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n allOf: [\n {\n $ref: '#/components/schemas/DryRunResult',\n },\n {\n type: 'object',\n properties: {\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n action: {\n type: 'string',\n },\n },\n required: ['id', 'name', 'action'],\n additionalProperties: {},\n },\n },\n directoryContents: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n executable: {\n type: 'boolean',\n },\n base64Content: {\n type: 'string',\n },\n },\n required: ['path', 'base64Content'],\n },\n },\n },\n required: ['steps'],\n },\n ],\n },\n },\n },\n },\n '400': {\n description: 'Validation errors.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n errors: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ValidationError',\n },\n },\n },\n required: ['errors'],\n },\n },\n },\n },\n },\n parameters: [],\n },\n },\n '/v2/autocomplete/{provider}/{resource}': {\n post: {\n operationId: 'Autocomplete',\n description:\n 'Perform an autocomplete for the given provider and resource.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n context: {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n token: {\n type: 'string',\n },\n },\n required: ['context', 'token'],\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n results: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n },\n id: {\n type: 'string',\n },\n },\n required: ['id'],\n },\n },\n },\n required: ['results'],\n },\n },\n },\n },\n '400': {\n description: 'Unsupported provider.',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n },\n },\n },\n },\n },\n },\n parameters: [\n {\n in: 'path',\n name: 'provider',\n required: true,\n schema: {\n type: 'string',\n },\n },\n {\n in: 'path',\n name: 'resource',\n required: true,\n schema: {\n type: 'string',\n },\n },\n ],\n },\n },\n '/v2/templating-extensions': {\n get: {\n operationId: 'ListTemplatingExtensions',\n description:\n 'Returns a structure describing the available templating extensions.',\n responses: {\n '200': {\n description: 'Ok',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListTemplatingExtensionsResponse',\n },\n },\n },\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n parameters: [],\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<\n typeof createValidatedOpenApiRouterFromGeneratedEndpointMap\n >['1'],\n) =>\n createValidatedOpenApiRouterFromGeneratedEndpointMap<EndpointMap>(\n spec,\n options,\n );\n"],"names":["createValidatedOpenApiRouterFromGeneratedEndpointMap"],"mappings":";;;;AAsBO,MAAM,IAAA,GAAO;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,GAAA;AAAA,IACT,WAAA,EACE,+DAAA;AAAA,IACF,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK;AAAA,KACP;AAAA,IACA,SAAS;AAAC,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,GAAA,EAAK;AAAA;AACP,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAU,EAAC;AAAA,IACX,SAAS,EAAC;AAAA,IACV,UAAA,EAAY;AAAA,MACV,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,YAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,yCAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,8CAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,8CAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,OAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,WAAA,EAAa,QAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,IACA,eAAe,EAAC;AAAA,IAChB,SAAA,EAAW;AAAA,MACT,aAAA,EAAe;AAAA,QACb,WAAA,EAAa,qCAAA;AAAA,QACb,OAAA,EAAS;AAAA,UACP,iCAAA,EAAmC;AAAA,YACjC,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,EAAA,EAAI;AAAA,YACF,IAAA,EAAM;AAAA,WACR;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM;AAAA,eACR;AAAA,cACA,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,IAAI,CAAA;AAAA,QACf,WAAA,EACE;AAAA,OACJ;AAAA,MACA,aAAA,EAAe;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,aAAA,EAAe,SAAS,CAAA;AAAA,QACnC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,GAAA,EAAK;AAAA,YACH,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,IAAA,EAAM;AAAA,kBACJ,KAAA,EAAO;AAAA,oBACL;AAAA,sBACE,IAAA,EAAM;AAAA,qBACR;AAAA,oBACA;AAAA,sBACE,IAAA,EAAM,QAAA;AAAA,sBACN,UAAA,EAAY;AAAA,wBACV,OAAA,EAAS;AAAA,0BACP,IAAA,EAAM;AAAA,yBACR;AAAA,wBACA,MAAA,EAAQ;AAAA,0BACN,IAAA,EAAM;AAAA,yBACR;AAAA,wBACA,MAAA,EAAQ;AAAA,0BACN,IAAA,EAAM;AAAA;AACR,uBACF;AAAA,sBACA,QAAA,EAAU,CAAC,SAAS;AAAA;AACtB;AACF;AACF,eACF;AAAA,cACA,QAAA,EAAU,CAAC,MAAM;AAAA;AACnB,WACF;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,EAAO,mBAAA,EAAqB,QAAQ;AAAA,OACjD;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,IAAA,EAAM;AAAA,gBACJ,IAAA,EAAM;AAAA,eACR;AAAA,cACA,OAAA,EAAS;AAAA,gBACP,IAAA,EAAM;AAAA,eACR;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM;AAAA,eACR;AAAA,cACA,IAAA,EAAM;AAAA,gBACJ,IAAA,EAAM;AAAA;AACR,aACF;AAAA,YACA,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS;AAAA,WAC9B;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM;AAAA,eACR;AAAA,cACA,GAAA,EAAK;AAAA,gBACH,IAAA,EAAM;AAAA;AACR,aACF;AAAA,YACA,QAAA,EAAU,CAAC,QAAA,EAAU,KAAK;AAAA,WAC5B;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,UAAA,EAAY;AAAA,gBACV,IAAA,EAAM;AAAA;AACR,aACF;AAAA,YACA,QAAA,EAAU,CAAC,YAAY;AAAA;AACzB,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,QAC9B,sBAAsB;AAAC,OACzB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,IAAA,EAAM;AAAA,SACR;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY,EAAC;AAAA,QACb,WAAA,EAAa,qDAAA;AAAA,QACb,sBAAsB;AAAC,OACzB;AAAA,MACA,aAAA,EAAe;AAAA,QACb,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,IAAA,EAAM;AAAA,SACR;AAAA,QACA,WAAA,EACE;AAAA,OACJ;AAAA,MACA,iBAAA,EAAmB;AAAA,QACjB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,QAClB,WAAA,EACE;AAAA,OACJ;AAAA,MACA,gCAAA,EAAkC;AAAA,QAChC,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,oBAAA,EAAsB;AAAA,cACpB,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,SAAA,EAAW;AAAA,gBACT,IAAA,EAAM,QAAA;AAAA,gBACN,oBAAA,EAAsB;AAAA,kBACpB,IAAA,EAAM;AAAA;AACR,eACF;AAAA,cACA,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,QAAA;AAAA,gBACN,oBAAA,EAAsB;AAAA,kBACpB,IAAA,EAAM;AAAA;AACR;AACF,aACF;AAAA,YACA,QAAA,EAAU,CAAC,WAAA,EAAa,QAAQ;AAAA;AAClC,SACF;AAAA,QACA,QAAA,EAAU,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,QAC/B,WAAA,EACE;AAAA,OACJ;AAAA,MACA,yBAAA,EAA2B;AAAA,QACzB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,sBAAsB;AAAC,WACzB;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,oBAAA,EAAsB;AAAA,cACpB,IAAA,EAAM;AAAA;AACR;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,aAAA,EAAe,QAAQ,CAAA;AAAA,QAClC,WAAA,EACE;AAAA,OACJ;AAAA,MACA,sBAAA,EAAwB;AAAA,QACtB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA,WACR;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,QACpB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA,WACR;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS;AAAA,OAC9B;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,EAAA,EAAI;AAAA,YACF,IAAA,EAAM;AAAA,WACR;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM;AAAA,WACR;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO;AAAA,cACL;AAAA,gBACE,IAAA,EAAM;AAAA,eACR;AAAA,cACA;AAAA,gBACE,IAAA,EAAM,QAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM;AAAA,mBACR;AAAA,kBACA,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM;AAAA,mBACR;AAAA,kBACA,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM;AAAA;AACR,iBACF;AAAA,gBACA,QAAA,EAAU,CAAC,SAAS;AAAA;AACtB;AACF,WACF;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM;AAAA,WACR;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,UAAU,CAAC,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,QAAQ,WAAW,CAAA;AAAA,QACtD,WAAA,EAAa;AAAA,OACf;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,EAAA,EAAI;AAAA,YACF,IAAA,EAAM;AAAA,WACR;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM;AAAA,WACR;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM;AAAA,WACR;AAAA,UACA,eAAA,EAAiB;AAAA,YACf,IAAA,EAAM;AAAA,WACR;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA,WACR;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,UAAU,WAAW,CAAA;AAAA,QAC9C,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,eAAA;AAAA,QACb,IAAA,EAAM,CAAC,WAAA,EAAa,YAAA,EAAc,OAAO,WAAW;AAAA,OACtD;AAAA,MACA,WAAA,EAAa;AAAA,QACX,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,oBAAA,EAAsB;AAAA,cACpB,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,cAAA,EAAgB;AAAA,gBACd,IAAA,EAAM;AAAA;AACR;AACF;AACF,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,WAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,sBAAA,EAAwB;AAAA,QACtB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,SAAA,EAAW;AAAA,gBACT,IAAA,EAAM,OAAA;AAAA,gBACN,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM;AAAA;AACR,eACF;AAAA,cACA,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM;AAAA;AACR;AACF,WACF;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM;AAAA;AACR;AACF,SACF;AAAA,QACA,WAAA,EACE;AAAA,OACJ;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,KAAA,EAAO;AAAA,YACL,KAAA,EAAO;AAAA,cACL;AAAA,gBACE,IAAA,EAAM;AAAA,eACR;AAAA,cACA;AAAA,gBACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,QAClB,WAAA,EACE;AAAA,OACJ;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM;AAAA,eACR;AAAA,cACA,SAAA,EAAW;AAAA,gBACT,IAAA,EAAM,OAAA;AAAA,gBACN,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM;AAAA;AACR,eACF;AAAA,cACA,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM;AAAA;AACR;AACF,WACF;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM;AAAA;AACR;AACF,SACF;AAAA,QACA,WAAA,EACE;AAAA,OACJ;AAAA,MACA,uBAAA,EAAyB;AAAA,QACvB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA,WACR;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM;AAAA,iBACR;AAAA,gBACA,WAAA,EAAa;AAAA,kBACX,IAAA,EAAM;AAAA,iBACR;AAAA,gBACA,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR,eACF;AAAA,cACA,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ;AAAA;AAC9B;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,QAC3B,WAAA,EACE,mGAAA;AAAA,QACF,sBAAsB;AAAC,OACzB;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,iBACR;AAAA,gBACA;AAAA,kBACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,WACF;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA,WACR;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM;AAAA,WACR;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM;AAAA,WACR;AAAA,UACA,QAAA,EAAU;AAAA,YACR,KAAA,EAAO;AAAA,cACL;AAAA,gBACE,IAAA,EAAM;AAAA,eACR;AAAA,cACA;AAAA,gBACE,IAAA,EAAM;AAAA,eACR;AAAA,cACA;AAAA,gBACE,IAAA,EAAM;AAAA,eACR;AAAA,cACA;AAAA,gBACE,IAAA,EAAM;AAAA;AACR;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,MAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,sBAAsB;AAAC;AACzB,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc;AAAA;AAChB;AACF,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,0DAAA,EAA4D;AAAA,MAC1D,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,4BAAA;AAAA,QACb,WAAA,EAAa,gCAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA,WACR;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,aAAA;AAAA,QACb,WAAA,EAAa,0CAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,YAAY;AAAC;AACf,KACF;AAAA,IACA,WAAA,EAAa;AAAA,MACX,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,WAAA;AAAA,QACb,WAAA,EACE,yEAAA;AAAA,QACF,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,UAAA;AAAA,QACb,WAAA,EACE,sFAAA;AAAA,QACF,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,SAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,EAAA,EAAI;AAAA,sBACF,IAAA,EAAM;AAAA;AACR,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,IAAI;AAAA;AACjB;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,oBAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,MAAA,EAAQ;AAAA,sBACN,IAAA,EAAM,OAAA;AAAA,sBACN,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM;AAAA;AACR;AACF,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,YAAY;AAAC;AACf,KACF;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAa,mBAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,YAAA;AAAA,QACb,WAAA,EACE,uEAAA;AAAA,QACF,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,MAAA,EAAQ;AAAA,sBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,0BAAA,EAA4B;AAAA,MAC1B,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,OAAA;AAAA,QACb,WAAA,EAAa,uDAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,KAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,QAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM,QAAA;AAAA,oBACN,oBAAA,EAAsB;AAAA,sBACpB,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,EAAA,EAAI;AAAA,sBACF,IAAA,EAAM;AAAA;AACR,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,IAAI;AAAA;AACjB;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,oBAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,MAAA,EAAQ;AAAA,sBACN,IAAA,EAAM,OAAA;AAAA,sBACN,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM;AAAA;AACR;AACF,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,mBAAA;AAAA,QACb,WAAA,EAAa,8BAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,OAAA;AAAA,kBACN,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,QAAA;AAAA,QACb,WAAA,EAAa,iCAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,QAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,QAAA,EAAU;AAAA,oBACR,IAAA,EAAM;AAAA,mBACR;AAAA,kBACA,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM;AAAA,mBACR;AAAA,kBACA,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM,QAAA;AAAA,oBACN,oBAAA,EAAsB;AAAA,sBACpB,IAAA,EAAM;AAAA;AACR,mBACF;AAAA,kBACA,iBAAA,EAAmB;AAAA,oBACjB,IAAA,EAAM,OAAA;AAAA,oBACN,KAAA,EAAO;AAAA,sBACL,IAAA,EAAM,QAAA;AAAA,sBACN,UAAA,EAAY;AAAA,wBACV,IAAA,EAAM;AAAA,0BACJ,IAAA,EAAM;AAAA,yBACR;AAAA,wBACA,aAAA,EAAe;AAAA,0BACb,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,iBACF;AAAA,gBACA,QAAA,EAAU,CAAC,UAAA,EAAY,QAAA,EAAU,mBAAmB;AAAA;AACtD;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,KAAA,EAAO;AAAA,oBACL;AAAA,sBACE,IAAA,EAAM;AAAA,qBACR;AAAA,oBACA;AAAA,sBACE,IAAA,EAAM,QAAA;AAAA,sBACN,UAAA,EAAY;AAAA,wBACV,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,OAAA;AAAA,0BACN,KAAA,EAAO;AAAA,4BACL,IAAA,EAAM,QAAA;AAAA,4BACN,UAAA,EAAY;AAAA,8BACV,EAAA,EAAI;AAAA,gCACF,IAAA,EAAM;AAAA,+BACR;AAAA,8BACA,IAAA,EAAM;AAAA,gCACJ,IAAA,EAAM;AAAA,+BACR;AAAA,8BACA,MAAA,EAAQ;AAAA,gCACN,IAAA,EAAM;AAAA;AACR,6BACF;AAAA,4BACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,4BACjC,sBAAsB;AAAC;AACzB,yBACF;AAAA,wBACA,iBAAA,EAAmB;AAAA,0BACjB,IAAA,EAAM,OAAA;AAAA,0BACN,KAAA,EAAO;AAAA,4BACL,IAAA,EAAM,QAAA;AAAA,4BACN,UAAA,EAAY;AAAA,8BACV,IAAA,EAAM;AAAA,gCACJ,IAAA,EAAM;AAAA,+BACR;AAAA,8BACA,UAAA,EAAY;AAAA,gCACV,IAAA,EAAM;AAAA,+BACR;AAAA,8BACA,aAAA,EAAe;AAAA,gCACb,IAAA,EAAM;AAAA;AACR,6BACF;AAAA,4BACA,QAAA,EAAU,CAAC,MAAA,EAAQ,eAAe;AAAA;AACpC;AACF,uBACF;AAAA,sBACA,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB;AACF;AACF;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,oBAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,MAAA,EAAQ;AAAA,sBACN,IAAA,EAAM,OAAA;AAAA,sBACN,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM;AAAA;AACR;AACF,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB;AACF;AACF;AACF,SACF;AAAA,QACA,YAAY;AAAC;AACf,KACF;AAAA,IACA,wCAAA,EAA0C;AAAA,MACxC,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,cAAA;AAAA,QACb,WAAA,EACE,8DAAA;AAAA,QACF,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,QAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM,QAAA;AAAA,oBACN,oBAAA,EAAsB;AAAA,sBACpB,IAAA,EAAM;AAAA;AACR,mBACF;AAAA,kBACA,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM;AAAA;AACR,iBACF;AAAA,gBACA,QAAA,EAAU,CAAC,SAAA,EAAW,OAAO;AAAA;AAC/B;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,OAAA,EAAS;AAAA,sBACP,IAAA,EAAM,OAAA;AAAA,sBACN,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM,QAAA;AAAA,wBACN,UAAA,EAAY;AAAA,0BACV,KAAA,EAAO;AAAA,4BACL,IAAA,EAAM;AAAA,2BACR;AAAA,0BACA,EAAA,EAAI;AAAA,4BACF,IAAA,EAAM;AAAA;AACR,yBACF;AAAA,wBACA,QAAA,EAAU,CAAC,IAAI;AAAA;AACjB;AACF,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,SAAS;AAAA;AACtB;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,uBAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,OAAA,EAAS;AAAA,sBACP,IAAA,EAAM;AAAA,qBACR;AAAA,oBACA,IAAA,EAAM;AAAA,sBACJ,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF;AACF;AACF,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,IAAA;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA;AAAA,YACE,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,IAAA;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,KACF;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,GAAA,EAAK;AAAA,QACH,WAAA,EAAa,0BAAA;AAAA,QACb,WAAA,EACE,qEAAA;AAAA,QACF,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAC;AAAA,UACD;AAAA,YACE,KAAK;AAAC;AACR,SACF;AAAA,QACA,YAAY;AAAC;AACf;AACF;AAEJ;AACO,MAAM,mBAAA,GAAsB,OACjC,OAAA,KAIAA,wEAAA;AAAA,EACE,IAAA;AAAA,EACA;AACF;;;;;"}
@@ -61,6 +61,36 @@ const readDuration = (config$1, key, defaultValue) => {
61
61
  }
62
62
  return defaultValue;
63
63
  };
64
+ function formatSecretsValidationErrors(result) {
65
+ return result.errors.map((err) => {
66
+ const property = err.property.replace(/^instance/, "secrets");
67
+ const secretName = err.argument;
68
+ const message = err.name === "required" ? `secrets.${secretName} is required` : `${property} ${err.message}`;
69
+ return {
70
+ ...err,
71
+ property,
72
+ message,
73
+ instance: {}
74
+ };
75
+ });
76
+ }
77
+ async function validateSecrets(options) {
78
+ const { template, secrets, res, auditorEvent } = options;
79
+ if (!template.spec.secrets?.schema) {
80
+ return true;
81
+ }
82
+ const result = jsonschema.validate(secrets, template.spec.secrets.schema);
83
+ if (result.valid) {
84
+ return true;
85
+ }
86
+ await auditorEvent?.fail({
87
+ error: new errors.InputError("Secrets validation failed")
88
+ });
89
+ res.status(400).json({
90
+ errors: formatSecretsValidationErrors(result)
91
+ });
92
+ return false;
93
+ }
64
94
  async function createRouter(options) {
65
95
  const router$1 = await router.createOpenApiRouter({
66
96
  middleware: [
@@ -338,6 +368,15 @@ async function createRouter(options) {
338
368
  return;
339
369
  }
340
370
  }
371
+ const secretsValid = await validateSecrets({
372
+ template,
373
+ secrets: req.body.secrets ?? {},
374
+ res,
375
+ auditorEvent
376
+ });
377
+ if (!secretsValid) {
378
+ return;
379
+ }
341
380
  const baseUrl = helpers.getEntityBaseUrl(template);
342
381
  const taskSpec = {
343
382
  apiVersion: template.apiVersion,
@@ -519,6 +558,25 @@ async function createRouter(options) {
519
558
  task,
520
559
  isTaskAuthorized
521
560
  });
561
+ if (task.spec.templateInfo?.entityRef) {
562
+ const templateEntityRef = catalogModel.parseEntityRef(
563
+ task.spec.templateInfo.entityRef,
564
+ { defaultKind: "template" }
565
+ );
566
+ const template = await authorizeTemplate(
567
+ templateEntityRef,
568
+ credentials
569
+ );
570
+ const secretsValid = await validateSecrets({
571
+ template,
572
+ secrets: req.body.secrets ?? {},
573
+ res,
574
+ auditorEvent
575
+ });
576
+ if (!secretsValid) {
577
+ return;
578
+ }
579
+ }
522
580
  await auditorEvent?.success();
523
581
  const { token } = await auth.getPluginRequestToken({
524
582
  onBehalfOf: credentials,
@@ -705,6 +763,15 @@ data: ${JSON.stringify(event)}
705
763
  return;
706
764
  }
707
765
  }
766
+ const secretsValid = await validateSecrets({
767
+ template,
768
+ secrets: body.secrets ?? {},
769
+ res,
770
+ auditorEvent
771
+ });
772
+ if (!secretsValid) {
773
+ return;
774
+ }
708
775
  const steps = template.spec.steps.map((step, index) => ({
709
776
  ...step,
710
777
  id: step.id ?? `step-${index + 1}`,
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {\n AuditorService,\n AuthService,\n BackstageCredentials,\n DatabaseService,\n HttpAuthService,\n LifecycleService,\n LoggerService,\n PermissionsService,\n resolveSafeChildPath,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport { validate } from 'jsonschema';\nimport {\n CompoundEntityRef,\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n UserEntity,\n} from '@backstage/catalog-model';\nimport { Config, readDurationFromConfig } from '@backstage/config';\nimport { InputError, NotFoundError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\n\nimport { EventsService } from '@backstage/plugin-events-node';\n\nimport {\n ConditionTransformer,\n createConditionAuthorizer,\n createConditionTransformer,\n createPermissionIntegrationRouter,\n} from '@backstage/plugin-permission-node';\nimport {\n TaskSpec,\n TemplateEntityV1beta3,\n templateEntityV1beta3Validator,\n} from '@backstage/plugin-scaffolder-common';\nimport {\n RESOURCE_TYPE_SCAFFOLDER_ACTION,\n RESOURCE_TYPE_SCAFFOLDER_TASK,\n RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n scaffolderActionPermissions,\n scaffolderPermissions,\n scaffolderTaskPermissions,\n scaffolderTemplatePermissions,\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n templateParameterReadPermission,\n templateStepReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n TaskBroker,\n TaskFilters,\n TaskStatus,\n TemplateAction,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport {\n AutocompleteHandler,\n CreatedTemplateFilter,\n CreatedTemplateGlobal,\n WorkspaceProvider,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { HumanDuration, JsonObject } from '@backstage/types';\nimport express from 'express';\nimport { Duration } from 'luxon';\nimport { pathToFileURL } from 'node:url';\nimport { v4 as uuid } from 'uuid';\nimport { z } from 'zod';\nimport {\n DatabaseTaskStore,\n DefaultTemplateActionRegistry,\n TaskWorker,\n} from '../scaffolder';\nimport { createDryRunner } from '../scaffolder/dryrun';\nimport { StorageTaskBroker } from '../scaffolder/tasks/StorageTaskBroker';\nimport { InternalTaskSecrets } from '../scaffolder/tasks/types';\nimport { createOpenApiRouter } from '../schema/openapi';\nimport {\n checkPermission,\n checkTaskPermission,\n getAuthorizeConditions,\n} from '../util/checkPermissions';\nimport {\n findTemplate,\n getEntityBaseUrl,\n getWorkingDirectory,\n parseStringsParam,\n} from './helpers';\n\nimport {\n convertFiltersToRecord,\n convertGlobalsToRecord,\n extractFilterMetadata,\n extractGlobalFunctionMetadata,\n extractGlobalValueMetadata,\n} from '../util/templating';\nimport { createDefaultFilters } from '../lib/templating/filters/createDefaultFilters';\nimport {\n ActionPermissionRuleInput,\n isActionPermissionRuleInput,\n isTaskPermissionRuleInput,\n isTemplatePermissionRuleInput,\n ScaffolderPermissionRuleInput,\n TaskPermissionRuleInput,\n TemplatePermissionRuleInput,\n} from './permissions';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\n\nimport {\n scaffolderActionRules,\n scaffolderTaskRules,\n scaffolderTemplateRules,\n} from './rules';\nimport { ActionsService } from '@backstage/backend-plugin-api/alpha';\n\n/**\n * RouterOptions\n */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n lifecycle?: LifecycleService;\n database: DatabaseService;\n catalog: CatalogService;\n scheduler?: SchedulerService;\n actions?: TemplateAction<any, any, any>[];\n /**\n * Sets the number of concurrent tasks that can be run at any given time on the TaskWorker\n * @defaultValue 10\n */\n concurrentTasksLimit?: number;\n taskBroker?: TaskBroker;\n additionalTemplateFilters?:\n | Record<string, TemplateFilter>\n | CreatedTemplateFilter<any, any>[];\n additionalTemplateGlobals?:\n | Record<string, TemplateGlobal>\n | CreatedTemplateGlobal[];\n additionalWorkspaceProviders?: Record<string, WorkspaceProvider>;\n permissions?: PermissionsService;\n permissionRules?: Array<ScaffolderPermissionRuleInput>;\n auth: AuthService;\n httpAuth: HttpAuthService;\n events?: EventsService;\n auditor?: AuditorService;\n autocompleteHandlers?: Record<string, AutocompleteHandler>;\n actionsRegistry: ActionsService;\n}\n\nfunction isSupportedTemplate(entity: TemplateEntityV1beta3) {\n return entity.apiVersion === 'scaffolder.backstage.io/v1beta3';\n}\n\nconst readDuration = (\n config: Config,\n key: string,\n defaultValue: HumanDuration,\n) => {\n if (config.has(key)) {\n return readDurationFromConfig(config, { key });\n }\n return defaultValue;\n};\n\n/**\n * A method to create a router for the scaffolder backend plugin.\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const router = await createOpenApiRouter({\n middleware: [\n // Be generous in upload size to support a wide range of templates in dry-run mode.\n express.json({ limit: '10MB' }),\n ],\n });\n\n const {\n logger: parentLogger,\n config,\n database,\n catalog,\n actions = [],\n scheduler,\n additionalTemplateFilters,\n additionalTemplateGlobals,\n additionalWorkspaceProviders,\n permissions,\n permissionRules,\n autocompleteHandlers = {},\n events: eventsService,\n auth,\n httpAuth,\n auditor,\n actionsRegistry,\n } = options;\n\n const concurrentTasksLimit =\n options.concurrentTasksLimit ??\n options.config.getOptionalNumber('scaffolder.concurrentTasksLimit');\n\n const logger = parentLogger.child({ plugin: 'scaffolder' });\n\n const workingDirectory = await getWorkingDirectory(config, logger);\n const integrations = ScmIntegrations.fromConfig(config);\n\n let taskBroker: TaskBroker;\n if (!options.taskBroker) {\n const databaseTaskStore = await DatabaseTaskStore.create({\n database,\n events: eventsService,\n });\n taskBroker = new StorageTaskBroker(\n databaseTaskStore,\n logger,\n config,\n auth,\n additionalWorkspaceProviders,\n auditor,\n );\n\n if (scheduler && databaseTaskStore.listStaleTasks) {\n await scheduler.scheduleTask({\n id: 'close_stale_tasks',\n frequency: readDuration(\n config,\n 'scaffolder.taskTimeoutJanitorFrequency',\n {\n minutes: 5,\n },\n ),\n timeout: { minutes: 15 },\n fn: async () => {\n const { tasks } = await databaseTaskStore.listStaleTasks({\n timeoutS: Duration.fromObject(\n readDuration(config, 'scaffolder.taskTimeout', {\n hours: 24,\n }),\n ).as('seconds'),\n });\n\n for (const task of tasks) {\n await databaseTaskStore.shutdownTask(task);\n logger.info(`Successfully closed stale task ${task.taskId}`);\n }\n },\n });\n }\n } else {\n taskBroker = options.taskBroker;\n }\n\n const actionRegistry = new DefaultTemplateActionRegistry(\n actionsRegistry,\n logger,\n );\n\n const templateExtensions = {\n additionalTemplateFilters: convertFiltersToRecord(\n additionalTemplateFilters,\n ),\n additionalTemplateGlobals: convertGlobalsToRecord(\n additionalTemplateGlobals,\n ),\n };\n\n const workers: TaskWorker[] = [];\n if (concurrentTasksLimit !== 0) {\n const gracefulShutdown = config.getOptionalBoolean(\n 'scaffolder.EXPERIMENTAL_gracefulShutdown',\n );\n\n const worker = await TaskWorker.create({\n taskBroker,\n actionRegistry,\n integrations,\n logger,\n auditor,\n config,\n workingDirectory,\n concurrentTasksLimit,\n permissions,\n gracefulShutdown,\n ...templateExtensions,\n });\n\n workers.push(worker);\n }\n\n for (const action of actions) {\n actionRegistry.register(action);\n }\n\n const launchWorkers = () => workers.forEach(worker => worker.start());\n\n const shutdownWorkers = async () => {\n await Promise.allSettled(workers.map(worker => worker.stop()));\n };\n\n if (options.lifecycle) {\n options.lifecycle.addStartupHook(launchWorkers);\n options.lifecycle.addShutdownHook(shutdownWorkers);\n } else {\n launchWorkers();\n }\n\n const dryRunner = createDryRunner({\n actionRegistry,\n integrations,\n logger,\n auditor,\n workingDirectory,\n permissions,\n config,\n ...templateExtensions,\n });\n\n const templateRules: TemplatePermissionRuleInput[] = Object.values(\n scaffolderTemplateRules,\n );\n const actionRules: ActionPermissionRuleInput[] = Object.values(\n scaffolderActionRules,\n );\n const taskRules: TaskPermissionRuleInput[] =\n Object.values(scaffolderTaskRules);\n\n if (permissionRules) {\n templateRules.push(\n ...permissionRules.filter(isTemplatePermissionRuleInput),\n );\n actionRules.push(...permissionRules.filter(isActionPermissionRuleInput));\n taskRules.push(...permissionRules.filter(isTaskPermissionRuleInput));\n }\n\n const isTemplateAuthorized = createConditionAuthorizer(\n Object.values(templateRules),\n );\n const isTaskAuthorized = createConditionAuthorizer(Object.values(taskRules));\n\n const taskTransformConditions: ConditionTransformer<TaskFilters> =\n createConditionTransformer(Object.values(taskRules));\n\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n resources: [\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n permissions: scaffolderTemplatePermissions,\n rules: templateRules,\n },\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,\n permissions: scaffolderActionPermissions,\n rules: actionRules,\n },\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_TASK,\n permissions: scaffolderTaskPermissions,\n rules: taskRules,\n getResources: async resourceRefs => {\n return Promise.all(\n resourceRefs.map(async taskId => {\n return await taskBroker.get(taskId);\n }),\n );\n },\n },\n ],\n permissions: scaffolderPermissions,\n });\n\n router.use(permissionIntegrationRouter);\n\n router\n .get(\n '/v2/templates/:namespace/:kind/:name/parameter-schema',\n async (req, res) => {\n const requestedTemplateRef = `${req.params.kind}:${req.params.namespace}/${req.params.name}`;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'template-parameter-schema',\n request: req,\n meta: { templateRef: requestedTemplateRef },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n const template = await authorizeTemplate(req.params, credentials);\n\n const parameters = [template.spec.parameters ?? []].flat();\n\n const presentation = template.spec.presentation;\n\n const templateRef = `${template.kind}:${\n template.metadata.namespace || 'default'\n }/${template.metadata.name}`;\n\n await auditorEvent?.success({ meta: { templateRef: templateRef } });\n\n res.json({\n title: template.metadata.title ?? template.metadata.name,\n ...(presentation ? { presentation } : {}),\n description: template.metadata.description,\n 'ui:options': template.metadata['ui:options'],\n steps: parameters.map(schema => ({\n title:\n (schema.title as string) ??\n 'Please enter the following information',\n description: schema.description as string,\n schema,\n })),\n EXPERIMENTAL_formDecorators:\n template.spec.EXPERIMENTAL_formDecorators,\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n },\n )\n .get('/v2/actions', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'action-fetch',\n request: req,\n });\n const credentials = await httpAuth.credentials(req);\n\n try {\n const list = await actionRegistry.list({ credentials });\n const actionsList = Array.from(list.values())\n .map(action => {\n return {\n id: action.id,\n description: action.description,\n examples: action.examples,\n schema: action.schema,\n };\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n\n await auditorEvent?.success();\n\n res.json(actionsList);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks', async (req, res) => {\n const templateRef: string = req.body.templateRef;\n const { kind, namespace, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'create',\n templateRef: templateRef,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n const userEntityRef = auth.isPrincipal(credentials, 'user')\n ? credentials.principal.userEntityRef\n : undefined;\n\n const userEntity = userEntityRef\n ? await catalog.getEntityByRef(userEntityRef, { credentials })\n : undefined;\n\n let auditLog = `Scaffolding task for ${templateRef}`;\n if (userEntityRef) {\n auditLog += ` created by ${userEntityRef}`;\n }\n logger.info(auditLog);\n\n const values = req.body.values;\n\n const template = await authorizeTemplate(\n { kind, namespace, name },\n credentials,\n );\n\n for (const parameters of [template.spec.parameters ?? []].flat()) {\n const result = validate(values, parameters);\n\n if (!result.valid) {\n await auditorEvent?.fail({\n // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet\n error: (AggregateError as any)(\n result.errors,\n 'Could not create entity',\n ),\n });\n\n res.status(400).json({ errors: result.errors });\n return;\n }\n }\n\n const baseUrl = getEntityBaseUrl(template);\n\n const taskSpec: TaskSpec = {\n apiVersion: template.apiVersion,\n steps: template.spec.steps.map((step, index) => ({\n ...step,\n id: step.id ?? `step-${index + 1}`,\n name: step.name ?? step.action,\n })),\n EXPERIMENTAL_recovery: template.spec.EXPERIMENTAL_recovery,\n output: template.spec.output ?? {},\n parameters: values,\n user: {\n entity: userEntity as UserEntity,\n ref: userEntityRef,\n },\n templateInfo: {\n entityRef: stringifyEntityRef({ kind, name, namespace }),\n baseUrl,\n entity: {\n metadata: template.metadata,\n },\n },\n };\n\n const secrets: InternalTaskSecrets = {\n ...req.body.secrets,\n backstageToken: (credentials as any).token,\n __initiatorCredentials: JSON.stringify({\n ...credentials,\n // credentials.token is nonenumerable and will not be serialized, so we need to add it explicitly\n token: (credentials as any).token,\n }),\n };\n\n const result = await taskBroker.dispatch({\n spec: taskSpec,\n createdBy: userEntityRef,\n secrets,\n });\n\n await auditorEvent?.success({ meta: { taskId: result.taskId } });\n\n res.status(201).json({ id: result.taskId });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .get('/v2/tasks', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'list',\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n if (!taskBroker.list) {\n throw new Error(\n 'TaskBroker does not support listing tasks, please implement the list method on the TaskBroker.',\n );\n }\n\n const createdBy = parseStringsParam(req.query.createdBy, 'createdBy');\n const status = parseStringsParam(req.query.status, 'status');\n\n const order = parseStringsParam(req.query.order, 'order')?.map(item => {\n const match = item.match(/^(asc|desc):(.+)$/);\n if (!match) {\n throw new InputError(\n `Invalid order parameter \"${item}\", expected \"<asc or desc>:<field name>\"`,\n );\n }\n\n return {\n order: match[1] as 'asc' | 'desc',\n field: match[2],\n };\n });\n\n const { limit, offset } = req.query;\n\n const taskPermissionFilters = await getAuthorizeConditions({\n credentials: credentials,\n permission: taskReadPermission,\n permissionService: permissions,\n transformConditions: taskTransformConditions,\n });\n\n const tasks = await taskBroker.list({\n filters: {\n createdBy,\n status: status ? (status as TaskStatus[]) : undefined,\n },\n order,\n pagination: {\n limit,\n offset,\n },\n permissionFilters: taskPermissionFilters,\n });\n\n await auditorEvent?.success();\n\n res.status(200).json(tasks);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .get('/v2/tasks/:taskId', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'get',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n if (!task) {\n throw new NotFoundError(`Task with id ${taskId} does not exist`);\n }\n\n await auditorEvent?.success();\n\n // Do not disclose secrets\n delete task.secrets;\n res.status(200).json(task);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks/:taskId/cancel', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'cancel',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n // Requires both read and cancel permissions\n await checkTaskPermission({\n credentials,\n permissions: [taskCancelPermission, taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n await taskBroker.cancel?.(taskId);\n\n await auditorEvent?.success();\n\n res.status(200).json({ status: 'cancelled' });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks/:taskId/retry', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'retry',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n // Requires both read and create permissions\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n await auditorEvent?.success();\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: credentials,\n targetPluginId: 'catalog',\n });\n\n const secrets: InternalTaskSecrets = {\n ...req.body.secrets,\n backstageToken: token,\n __initiatorCredentials: JSON.stringify({\n ...credentials,\n // credentials.token is nonenumerable and will not be serialized, so we need to add it explicitly\n token: (credentials as any).token,\n }),\n };\n\n await taskBroker.retry?.({ secrets, taskId });\n res.status(201).json({ id: taskId });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n });\n (router as express.Router).get(\n '/v2/tasks/:taskId/eventstream',\n async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'stream',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n const after =\n req.query.after !== undefined ? Number(req.query.after) : undefined;\n\n logger.debug(`Event stream observing taskId '${taskId}' opened`);\n\n // Mandatory headers and http status to keep connection open\n res.writeHead(200, {\n Connection: 'keep-alive',\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'text/event-stream',\n });\n\n // After client opens connection send all events as string\n const subscription = taskBroker.event$({ taskId, after }).subscribe({\n error: async error => {\n logger.error(\n `Received error from event stream when observing taskId '${taskId}', ${error}`,\n );\n await auditorEvent?.fail({ error: error });\n res.end();\n },\n next: ({ events }) => {\n let shouldUnsubscribe = false;\n for (const event of events) {\n res.write(\n `event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`,\n );\n if (event.type === 'completion' && !event.isTaskRecoverable) {\n shouldUnsubscribe = true;\n }\n }\n // res.flush() is only available with the compression middleware\n res.flush?.();\n if (shouldUnsubscribe) {\n subscription.unsubscribe();\n res.end();\n }\n },\n });\n\n // When client closes connection we update the clients list\n // avoiding the disconnected one\n req.on('close', async () => {\n subscription.unsubscribe();\n logger.debug(`Event stream observing taskId '${taskId}' closed`);\n await auditorEvent?.success();\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n },\n );\n router\n .get('/v2/tasks/:taskId/events', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'events',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n const after = Number(req.query.after) || undefined;\n\n // cancel the request after 30 seconds. this aligns with the recommendations of RFC 6202.\n const timeout = setTimeout(() => {\n res.json([]);\n }, 30_000);\n\n // Get all known events after an id (always includes the completion event) and return the first callback\n const subscription = taskBroker.event$({ taskId, after }).subscribe({\n error: async error => {\n logger.error(\n `Received error from event stream when observing taskId '${taskId}', ${error}`,\n );\n await auditorEvent?.fail({ error: error });\n },\n next: async ({ events }) => {\n clearTimeout(timeout);\n subscription.unsubscribe();\n await auditorEvent?.success();\n res.json(events);\n },\n });\n\n // When client closes connection we update the clients list\n // avoiding the disconnected one\n req.on('close', () => {\n subscription.unsubscribe();\n clearTimeout(timeout);\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/dry-run', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'dry-run',\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n const bodySchema = z.object({\n template: z.unknown(),\n values: z.record(z.unknown()),\n secrets: z.record(z.string()).optional(),\n directoryContents: z.array(\n z.object({ path: z.string(), base64Content: z.string() }),\n ),\n });\n const body = await bodySchema.parseAsync(req.body).catch(e => {\n throw new InputError(`Malformed request: ${e}`);\n });\n\n const template = body.template as TemplateEntityV1beta3;\n if (!(await templateEntityV1beta3Validator.check(template))) {\n throw new InputError('Input template is not a template');\n }\n\n const userEntityRef = auth.isPrincipal(credentials, 'user')\n ? credentials.principal.userEntityRef\n : undefined;\n\n const userEntity = userEntityRef\n ? await catalog.getEntityByRef(userEntityRef, { credentials })\n : undefined;\n\n const templateRef: string = `${template.kind}:${\n template.metadata.namespace || 'default'\n }/${template.metadata.name}`;\n\n for (const parameters of [template.spec.parameters ?? []].flat()) {\n const result = validate(body.values, parameters);\n if (!result.valid) {\n await auditorEvent?.fail({\n // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet\n error: (AggregateError as any)(\n result.errors,\n 'Could not execute dry run',\n ),\n meta: {\n templateRef: templateRef,\n parameters: template.spec.parameters,\n },\n });\n\n res.status(400).json({ errors: result.errors });\n return;\n }\n }\n\n const steps = template.spec.steps.map((step, index) => ({\n ...step,\n id: step.id ?? `step-${index + 1}`,\n name: step.name ?? step.action,\n }));\n\n const dryRunId = uuid();\n const contentsPath = resolveSafeChildPath(\n workingDirectory,\n `dry-run-content-${dryRunId}`,\n );\n const templateInfo = {\n entityRef: 'template:default/dry-run',\n entity: {\n metadata: template.metadata,\n },\n baseUrl: pathToFileURL(\n resolveSafeChildPath(contentsPath, 'template.yaml'),\n ).toString(),\n };\n\n const result = await dryRunner({\n spec: {\n apiVersion: template.apiVersion,\n steps,\n output: template.spec.output ?? {},\n parameters: body.values as JsonObject,\n user: {\n entity: userEntity as UserEntity,\n ref: userEntityRef,\n },\n },\n templateInfo: templateInfo,\n directoryContents: (body.directoryContents ?? []).map(file => ({\n path: file.path,\n content: Buffer.from(file.base64Content, 'base64'),\n })),\n secrets: {\n ...body.secrets,\n backstageToken: (credentials as any).token,\n },\n credentials,\n });\n\n await auditorEvent?.success({\n meta: {\n templateRef: templateRef,\n parameters: template.spec.parameters,\n },\n });\n\n res.status(200).json({\n ...result,\n steps,\n directoryContents: result.directoryContents.map(file => ({\n path: file.path,\n executable: file.executable,\n base64Content: file.content.toString('base64'),\n })),\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/autocomplete/:provider/:resource', async (req, res) => {\n const { token, context } = req.body;\n const { provider, resource } = req.params;\n\n if (!token) throw new InputError('Missing token query parameter');\n\n if (!autocompleteHandlers[provider]) {\n throw new InputError(`Unsupported provider: ${provider}`);\n }\n\n const { results } = await autocompleteHandlers[provider]({\n resource,\n token,\n context,\n });\n\n res.status(200).json({ results });\n })\n .get('/v2/templating-extensions', async (_req, res) => {\n res.status(200).json({\n filters: {\n ...extractFilterMetadata(createDefaultFilters({ integrations })),\n ...extractFilterMetadata(additionalTemplateFilters),\n },\n globals: {\n functions: extractGlobalFunctionMetadata(additionalTemplateGlobals),\n values: extractGlobalValueMetadata(additionalTemplateGlobals),\n },\n });\n });\n\n const app = express();\n app.set('logger', logger);\n app.use('/', router);\n\n async function authorizeTemplate(\n entityRef: CompoundEntityRef,\n credentials: BackstageCredentials,\n ) {\n const template = await findTemplate({\n catalog,\n entityRef,\n credentials,\n });\n\n if (!isSupportedTemplate(template)) {\n throw new InputError(\n `Unsupported apiVersion field in schema entity, ${\n (template as Entity).apiVersion\n }`,\n );\n }\n\n if (!permissions) {\n return template;\n }\n\n const [parameterDecision, stepDecision] =\n await permissions.authorizeConditional(\n [\n { permission: templateParameterReadPermission },\n { permission: templateStepReadPermission },\n ],\n { credentials },\n );\n\n // Authorize parameters\n if (Array.isArray(template.spec.parameters)) {\n template.spec.parameters = template.spec.parameters.filter(step =>\n isTemplateAuthorized(parameterDecision, step),\n );\n } else if (\n template.spec.parameters &&\n !isTemplateAuthorized(parameterDecision, template.spec.parameters)\n ) {\n template.spec.parameters = undefined;\n }\n\n // Authorize steps\n template.spec.steps = template.spec.steps.filter(step =>\n isTemplateAuthorized(stepDecision, step),\n );\n\n return template;\n }\n\n return app;\n}\n"],"names":["config","readDurationFromConfig","router","createOpenApiRouter","express","permissions","getWorkingDirectory","ScmIntegrations","DatabaseTaskStore","StorageTaskBroker","Duration","DefaultTemplateActionRegistry","convertFiltersToRecord","convertGlobalsToRecord","TaskWorker","createDryRunner","scaffolderTemplateRules","scaffolderActionRules","scaffolderTaskRules","isTemplatePermissionRuleInput","isActionPermissionRuleInput","isTaskPermissionRuleInput","createConditionAuthorizer","createConditionTransformer","createPermissionIntegrationRouter","RESOURCE_TYPE_SCAFFOLDER_TEMPLATE","scaffolderTemplatePermissions","RESOURCE_TYPE_SCAFFOLDER_ACTION","scaffolderActionPermissions","RESOURCE_TYPE_SCAFFOLDER_TASK","scaffolderTaskPermissions","scaffolderPermissions","parseEntityRef","checkPermission","taskCreatePermission","result","validate","getEntityBaseUrl","stringifyEntityRef","parseStringsParam","InputError","getAuthorizeConditions","taskReadPermission","checkTaskPermission","NotFoundError","taskCancelPermission","z","templateEntityV1beta3Validator","uuid","resolveSafeChildPath","pathToFileURL","extractFilterMetadata","createDefaultFilters","extractGlobalFunctionMetadata","extractGlobalValueMetadata","findTemplate","templateParameterReadPermission","templateStepReadPermission"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {\n AuditorService,\n AuditorServiceEvent,\n AuthService,\n BackstageCredentials,\n DatabaseService,\n HttpAuthService,\n LifecycleService,\n LoggerService,\n PermissionsService,\n resolveSafeChildPath,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport { validate, ValidatorResult } from 'jsonschema';\nimport {\n CompoundEntityRef,\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n UserEntity,\n} from '@backstage/catalog-model';\nimport { Config, readDurationFromConfig } from '@backstage/config';\nimport { InputError, NotFoundError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\n\nimport { EventsService } from '@backstage/plugin-events-node';\n\nimport {\n ConditionTransformer,\n createConditionAuthorizer,\n createConditionTransformer,\n createPermissionIntegrationRouter,\n} from '@backstage/plugin-permission-node';\nimport {\n TaskSpec,\n TemplateEntityV1beta3,\n templateEntityV1beta3Validator,\n} from '@backstage/plugin-scaffolder-common';\nimport {\n RESOURCE_TYPE_SCAFFOLDER_ACTION,\n RESOURCE_TYPE_SCAFFOLDER_TASK,\n RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n scaffolderActionPermissions,\n scaffolderPermissions,\n scaffolderTaskPermissions,\n scaffolderTemplatePermissions,\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n templateParameterReadPermission,\n templateStepReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n TaskBroker,\n TaskFilters,\n TaskStatus,\n TemplateAction,\n TemplateFilter,\n TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport {\n AutocompleteHandler,\n CreatedTemplateFilter,\n CreatedTemplateGlobal,\n WorkspaceProvider,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport { HumanDuration, JsonObject } from '@backstage/types';\nimport express from 'express';\nimport { Duration } from 'luxon';\nimport { pathToFileURL } from 'node:url';\nimport { v4 as uuid } from 'uuid';\nimport { z } from 'zod';\nimport {\n DatabaseTaskStore,\n DefaultTemplateActionRegistry,\n TaskWorker,\n} from '../scaffolder';\nimport { createDryRunner } from '../scaffolder/dryrun';\nimport { StorageTaskBroker } from '../scaffolder/tasks/StorageTaskBroker';\nimport { InternalTaskSecrets } from '../scaffolder/tasks/types';\nimport { createOpenApiRouter } from '../schema/openapi';\nimport {\n checkPermission,\n checkTaskPermission,\n getAuthorizeConditions,\n} from '../util/checkPermissions';\nimport {\n findTemplate,\n getEntityBaseUrl,\n getWorkingDirectory,\n parseStringsParam,\n} from './helpers';\n\nimport {\n convertFiltersToRecord,\n convertGlobalsToRecord,\n extractFilterMetadata,\n extractGlobalFunctionMetadata,\n extractGlobalValueMetadata,\n} from '../util/templating';\nimport { createDefaultFilters } from '../lib/templating/filters/createDefaultFilters';\nimport {\n ActionPermissionRuleInput,\n isActionPermissionRuleInput,\n isTaskPermissionRuleInput,\n isTemplatePermissionRuleInput,\n ScaffolderPermissionRuleInput,\n TaskPermissionRuleInput,\n TemplatePermissionRuleInput,\n} from './permissions';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\n\nimport {\n scaffolderActionRules,\n scaffolderTaskRules,\n scaffolderTemplateRules,\n} from './rules';\nimport { ActionsService } from '@backstage/backend-plugin-api/alpha';\n\n/**\n * RouterOptions\n */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n lifecycle?: LifecycleService;\n database: DatabaseService;\n catalog: CatalogService;\n scheduler?: SchedulerService;\n actions?: TemplateAction<any, any, any>[];\n /**\n * Sets the number of concurrent tasks that can be run at any given time on the TaskWorker\n * @defaultValue 10\n */\n concurrentTasksLimit?: number;\n taskBroker?: TaskBroker;\n additionalTemplateFilters?:\n | Record<string, TemplateFilter>\n | CreatedTemplateFilter<any, any>[];\n additionalTemplateGlobals?:\n | Record<string, TemplateGlobal>\n | CreatedTemplateGlobal[];\n additionalWorkspaceProviders?: Record<string, WorkspaceProvider>;\n permissions?: PermissionsService;\n permissionRules?: Array<ScaffolderPermissionRuleInput>;\n auth: AuthService;\n httpAuth: HttpAuthService;\n events?: EventsService;\n auditor?: AuditorService;\n autocompleteHandlers?: Record<string, AutocompleteHandler>;\n actionsRegistry: ActionsService;\n}\n\nfunction isSupportedTemplate(entity: TemplateEntityV1beta3) {\n return entity.apiVersion === 'scaffolder.backstage.io/v1beta3';\n}\n\nconst readDuration = (\n config: Config,\n key: string,\n defaultValue: HumanDuration,\n) => {\n if (config.has(key)) {\n return readDurationFromConfig(config, { key });\n }\n return defaultValue;\n};\n\nfunction formatSecretsValidationErrors(result: ValidatorResult) {\n return result.errors.map(err => {\n const property = err.property.replace(/^instance/, 'secrets');\n const secretName = err.argument;\n const message =\n err.name === 'required'\n ? `secrets.${secretName} is required`\n : `${property} ${err.message}`;\n return {\n ...err,\n property,\n message,\n instance: {},\n };\n });\n}\n\nasync function validateSecrets(options: {\n template: TemplateEntityV1beta3;\n secrets: Record<string, unknown>;\n res: express.Response;\n auditorEvent?: AuditorServiceEvent;\n}): Promise<boolean> {\n const { template, secrets, res, auditorEvent } = options;\n if (!template.spec.secrets?.schema) {\n return true;\n }\n\n const result = validate(secrets, template.spec.secrets.schema);\n if (result.valid) {\n return true;\n }\n\n await auditorEvent?.fail({\n error: new InputError('Secrets validation failed'),\n });\n\n res.status(400).json({\n errors: formatSecretsValidationErrors(result),\n });\n return false;\n}\n\n/**\n * A method to create a router for the scaffolder backend plugin.\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const router = await createOpenApiRouter({\n middleware: [\n // Be generous in upload size to support a wide range of templates in dry-run mode.\n express.json({ limit: '10MB' }),\n ],\n });\n\n const {\n logger: parentLogger,\n config,\n database,\n catalog,\n actions = [],\n scheduler,\n additionalTemplateFilters,\n additionalTemplateGlobals,\n additionalWorkspaceProviders,\n permissions,\n permissionRules,\n autocompleteHandlers = {},\n events: eventsService,\n auth,\n httpAuth,\n auditor,\n actionsRegistry,\n } = options;\n\n const concurrentTasksLimit =\n options.concurrentTasksLimit ??\n options.config.getOptionalNumber('scaffolder.concurrentTasksLimit');\n\n const logger = parentLogger.child({ plugin: 'scaffolder' });\n\n const workingDirectory = await getWorkingDirectory(config, logger);\n const integrations = ScmIntegrations.fromConfig(config);\n\n let taskBroker: TaskBroker;\n if (!options.taskBroker) {\n const databaseTaskStore = await DatabaseTaskStore.create({\n database,\n events: eventsService,\n });\n taskBroker = new StorageTaskBroker(\n databaseTaskStore,\n logger,\n config,\n auth,\n additionalWorkspaceProviders,\n auditor,\n );\n\n if (scheduler && databaseTaskStore.listStaleTasks) {\n await scheduler.scheduleTask({\n id: 'close_stale_tasks',\n frequency: readDuration(\n config,\n 'scaffolder.taskTimeoutJanitorFrequency',\n {\n minutes: 5,\n },\n ),\n timeout: { minutes: 15 },\n fn: async () => {\n const { tasks } = await databaseTaskStore.listStaleTasks({\n timeoutS: Duration.fromObject(\n readDuration(config, 'scaffolder.taskTimeout', {\n hours: 24,\n }),\n ).as('seconds'),\n });\n\n for (const task of tasks) {\n await databaseTaskStore.shutdownTask(task);\n logger.info(`Successfully closed stale task ${task.taskId}`);\n }\n },\n });\n }\n } else {\n taskBroker = options.taskBroker;\n }\n\n const actionRegistry = new DefaultTemplateActionRegistry(\n actionsRegistry,\n logger,\n );\n\n const templateExtensions = {\n additionalTemplateFilters: convertFiltersToRecord(\n additionalTemplateFilters,\n ),\n additionalTemplateGlobals: convertGlobalsToRecord(\n additionalTemplateGlobals,\n ),\n };\n\n const workers: TaskWorker[] = [];\n if (concurrentTasksLimit !== 0) {\n const gracefulShutdown = config.getOptionalBoolean(\n 'scaffolder.EXPERIMENTAL_gracefulShutdown',\n );\n\n const worker = await TaskWorker.create({\n taskBroker,\n actionRegistry,\n integrations,\n logger,\n auditor,\n config,\n workingDirectory,\n concurrentTasksLimit,\n permissions,\n gracefulShutdown,\n ...templateExtensions,\n });\n\n workers.push(worker);\n }\n\n for (const action of actions) {\n actionRegistry.register(action);\n }\n\n const launchWorkers = () => workers.forEach(worker => worker.start());\n\n const shutdownWorkers = async () => {\n await Promise.allSettled(workers.map(worker => worker.stop()));\n };\n\n if (options.lifecycle) {\n options.lifecycle.addStartupHook(launchWorkers);\n options.lifecycle.addShutdownHook(shutdownWorkers);\n } else {\n launchWorkers();\n }\n\n const dryRunner = createDryRunner({\n actionRegistry,\n integrations,\n logger,\n auditor,\n workingDirectory,\n permissions,\n config,\n ...templateExtensions,\n });\n\n const templateRules: TemplatePermissionRuleInput[] = Object.values(\n scaffolderTemplateRules,\n );\n const actionRules: ActionPermissionRuleInput[] = Object.values(\n scaffolderActionRules,\n );\n const taskRules: TaskPermissionRuleInput[] =\n Object.values(scaffolderTaskRules);\n\n if (permissionRules) {\n templateRules.push(\n ...permissionRules.filter(isTemplatePermissionRuleInput),\n );\n actionRules.push(...permissionRules.filter(isActionPermissionRuleInput));\n taskRules.push(...permissionRules.filter(isTaskPermissionRuleInput));\n }\n\n const isTemplateAuthorized = createConditionAuthorizer(\n Object.values(templateRules),\n );\n const isTaskAuthorized = createConditionAuthorizer(Object.values(taskRules));\n\n const taskTransformConditions: ConditionTransformer<TaskFilters> =\n createConditionTransformer(Object.values(taskRules));\n\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n resources: [\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n permissions: scaffolderTemplatePermissions,\n rules: templateRules,\n },\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,\n permissions: scaffolderActionPermissions,\n rules: actionRules,\n },\n {\n resourceType: RESOURCE_TYPE_SCAFFOLDER_TASK,\n permissions: scaffolderTaskPermissions,\n rules: taskRules,\n getResources: async resourceRefs => {\n return Promise.all(\n resourceRefs.map(async taskId => {\n return await taskBroker.get(taskId);\n }),\n );\n },\n },\n ],\n permissions: scaffolderPermissions,\n });\n\n router.use(permissionIntegrationRouter);\n\n router\n .get(\n '/v2/templates/:namespace/:kind/:name/parameter-schema',\n async (req, res) => {\n const requestedTemplateRef = `${req.params.kind}:${req.params.namespace}/${req.params.name}`;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'template-parameter-schema',\n request: req,\n meta: { templateRef: requestedTemplateRef },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n const template = await authorizeTemplate(req.params, credentials);\n\n const parameters = [template.spec.parameters ?? []].flat();\n\n const presentation = template.spec.presentation;\n\n const templateRef = `${template.kind}:${\n template.metadata.namespace || 'default'\n }/${template.metadata.name}`;\n\n await auditorEvent?.success({ meta: { templateRef: templateRef } });\n\n res.json({\n title: template.metadata.title ?? template.metadata.name,\n ...(presentation ? { presentation } : {}),\n description: template.metadata.description,\n 'ui:options': template.metadata['ui:options'],\n steps: parameters.map(schema => ({\n title:\n (schema.title as string) ??\n 'Please enter the following information',\n description: schema.description as string,\n schema,\n })),\n EXPERIMENTAL_formDecorators:\n template.spec.EXPERIMENTAL_formDecorators,\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n },\n )\n .get('/v2/actions', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'action-fetch',\n request: req,\n });\n const credentials = await httpAuth.credentials(req);\n\n try {\n const list = await actionRegistry.list({ credentials });\n const actionsList = Array.from(list.values())\n .map(action => {\n return {\n id: action.id,\n description: action.description,\n examples: action.examples,\n schema: action.schema,\n };\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n\n await auditorEvent?.success();\n\n res.json(actionsList);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks', async (req, res) => {\n const templateRef: string = req.body.templateRef;\n const { kind, namespace, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'create',\n templateRef: templateRef,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n const userEntityRef = auth.isPrincipal(credentials, 'user')\n ? credentials.principal.userEntityRef\n : undefined;\n\n const userEntity = userEntityRef\n ? await catalog.getEntityByRef(userEntityRef, { credentials })\n : undefined;\n\n let auditLog = `Scaffolding task for ${templateRef}`;\n if (userEntityRef) {\n auditLog += ` created by ${userEntityRef}`;\n }\n logger.info(auditLog);\n\n const values = req.body.values;\n\n const template = await authorizeTemplate(\n { kind, namespace, name },\n credentials,\n );\n\n for (const parameters of [template.spec.parameters ?? []].flat()) {\n const result = validate(values, parameters);\n\n if (!result.valid) {\n await auditorEvent?.fail({\n // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet\n error: (AggregateError as any)(\n result.errors,\n 'Could not create entity',\n ),\n });\n\n res.status(400).json({ errors: result.errors });\n return;\n }\n }\n\n const secretsValid = await validateSecrets({\n template,\n secrets: req.body.secrets ?? {},\n res,\n auditorEvent,\n });\n if (!secretsValid) {\n return;\n }\n\n const baseUrl = getEntityBaseUrl(template);\n\n const taskSpec: TaskSpec = {\n apiVersion: template.apiVersion,\n steps: template.spec.steps.map((step, index) => ({\n ...step,\n id: step.id ?? `step-${index + 1}`,\n name: step.name ?? step.action,\n })),\n EXPERIMENTAL_recovery: template.spec.EXPERIMENTAL_recovery,\n output: template.spec.output ?? {},\n parameters: values,\n user: {\n entity: userEntity as UserEntity,\n ref: userEntityRef,\n },\n templateInfo: {\n entityRef: stringifyEntityRef({ kind, name, namespace }),\n baseUrl,\n entity: {\n metadata: template.metadata,\n },\n },\n };\n\n const secrets: InternalTaskSecrets = {\n ...req.body.secrets,\n backstageToken: (credentials as any).token,\n __initiatorCredentials: JSON.stringify({\n ...credentials,\n // credentials.token is nonenumerable and will not be serialized, so we need to add it explicitly\n token: (credentials as any).token,\n }),\n };\n\n const result = await taskBroker.dispatch({\n spec: taskSpec,\n createdBy: userEntityRef,\n secrets,\n });\n\n await auditorEvent?.success({ meta: { taskId: result.taskId } });\n\n res.status(201).json({ id: result.taskId });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .get('/v2/tasks', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'list',\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n if (!taskBroker.list) {\n throw new Error(\n 'TaskBroker does not support listing tasks, please implement the list method on the TaskBroker.',\n );\n }\n\n const createdBy = parseStringsParam(req.query.createdBy, 'createdBy');\n const status = parseStringsParam(req.query.status, 'status');\n\n const order = parseStringsParam(req.query.order, 'order')?.map(item => {\n const match = item.match(/^(asc|desc):(.+)$/);\n if (!match) {\n throw new InputError(\n `Invalid order parameter \"${item}\", expected \"<asc or desc>:<field name>\"`,\n );\n }\n\n return {\n order: match[1] as 'asc' | 'desc',\n field: match[2],\n };\n });\n\n const { limit, offset } = req.query;\n\n const taskPermissionFilters = await getAuthorizeConditions({\n credentials: credentials,\n permission: taskReadPermission,\n permissionService: permissions,\n transformConditions: taskTransformConditions,\n });\n\n const tasks = await taskBroker.list({\n filters: {\n createdBy,\n status: status ? (status as TaskStatus[]) : undefined,\n },\n order,\n pagination: {\n limit,\n offset,\n },\n permissionFilters: taskPermissionFilters,\n });\n\n await auditorEvent?.success();\n\n res.status(200).json(tasks);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .get('/v2/tasks/:taskId', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'get',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n if (!task) {\n throw new NotFoundError(`Task with id ${taskId} does not exist`);\n }\n\n await auditorEvent?.success();\n\n // Do not disclose secrets\n delete task.secrets;\n res.status(200).json(task);\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks/:taskId/cancel', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'cancel',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n // Requires both read and cancel permissions\n await checkTaskPermission({\n credentials,\n permissions: [taskCancelPermission, taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n await taskBroker.cancel?.(taskId);\n\n await auditorEvent?.success();\n\n res.status(200).json({ status: 'cancelled' });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/tasks/:taskId/retry', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n severityLevel: 'medium',\n request: req,\n meta: {\n actionType: 'retry',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n // Requires both read and create permissions\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n // Validate secrets against template schema if defined\n if (task.spec.templateInfo?.entityRef) {\n const templateEntityRef = parseEntityRef(\n task.spec.templateInfo.entityRef,\n { defaultKind: 'template' },\n );\n const template = await authorizeTemplate(\n templateEntityRef,\n credentials,\n );\n\n const secretsValid = await validateSecrets({\n template,\n secrets: req.body.secrets ?? {},\n res,\n auditorEvent,\n });\n if (!secretsValid) {\n return;\n }\n }\n\n await auditorEvent?.success();\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: credentials,\n targetPluginId: 'catalog',\n });\n\n const secrets: InternalTaskSecrets = {\n ...req.body.secrets,\n backstageToken: token,\n __initiatorCredentials: JSON.stringify({\n ...credentials,\n // credentials.token is nonenumerable and will not be serialized, so we need to add it explicitly\n token: (credentials as any).token,\n }),\n };\n\n await taskBroker.retry?.({ secrets, taskId });\n res.status(201).json({ id: taskId });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n });\n (router as express.Router).get(\n '/v2/tasks/:taskId/eventstream',\n async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'stream',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n const after =\n req.query.after !== undefined ? Number(req.query.after) : undefined;\n\n logger.debug(`Event stream observing taskId '${taskId}' opened`);\n\n // Mandatory headers and http status to keep connection open\n res.writeHead(200, {\n Connection: 'keep-alive',\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'text/event-stream',\n });\n\n // After client opens connection send all events as string\n const subscription = taskBroker.event$({ taskId, after }).subscribe({\n error: async error => {\n logger.error(\n `Received error from event stream when observing taskId '${taskId}', ${error}`,\n );\n await auditorEvent?.fail({ error: error });\n res.end();\n },\n next: ({ events }) => {\n let shouldUnsubscribe = false;\n for (const event of events) {\n res.write(\n `event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`,\n );\n if (event.type === 'completion' && !event.isTaskRecoverable) {\n shouldUnsubscribe = true;\n }\n }\n // res.flush() is only available with the compression middleware\n res.flush?.();\n if (shouldUnsubscribe) {\n subscription.unsubscribe();\n res.end();\n }\n },\n });\n\n // When client closes connection we update the clients list\n // avoiding the disconnected one\n req.on('close', async () => {\n subscription.unsubscribe();\n logger.debug(`Event stream observing taskId '${taskId}' closed`);\n await auditorEvent?.success();\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n },\n );\n router\n .get('/v2/tasks/:taskId/events', async (req, res) => {\n const { taskId } = req.params;\n\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'events',\n taskId: taskId,\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n const task = await taskBroker.get(taskId);\n\n await checkTaskPermission({\n credentials,\n permissions: [taskReadPermission],\n permissionService: permissions,\n task: task,\n isTaskAuthorized,\n });\n\n const after = Number(req.query.after) || undefined;\n\n // cancel the request after 30 seconds. this aligns with the recommendations of RFC 6202.\n const timeout = setTimeout(() => {\n res.json([]);\n }, 30_000);\n\n // Get all known events after an id (always includes the completion event) and return the first callback\n const subscription = taskBroker.event$({ taskId, after }).subscribe({\n error: async error => {\n logger.error(\n `Received error from event stream when observing taskId '${taskId}', ${error}`,\n );\n await auditorEvent?.fail({ error: error });\n },\n next: async ({ events }) => {\n clearTimeout(timeout);\n subscription.unsubscribe();\n await auditorEvent?.success();\n res.json(events);\n },\n });\n\n // When client closes connection we update the clients list\n // avoiding the disconnected one\n req.on('close', () => {\n subscription.unsubscribe();\n clearTimeout(timeout);\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/dry-run', async (req, res) => {\n const auditorEvent = await auditor?.createEvent({\n eventId: 'task',\n request: req,\n meta: {\n actionType: 'dry-run',\n },\n });\n\n try {\n const credentials = await httpAuth.credentials(req);\n await checkPermission({\n credentials,\n permissions: [taskCreatePermission],\n permissionService: permissions,\n });\n\n const bodySchema = z.object({\n template: z.unknown(),\n values: z.record(z.unknown()),\n secrets: z.record(z.string()).optional(),\n directoryContents: z.array(\n z.object({ path: z.string(), base64Content: z.string() }),\n ),\n });\n const body = await bodySchema.parseAsync(req.body).catch(e => {\n throw new InputError(`Malformed request: ${e}`);\n });\n\n const template = body.template as TemplateEntityV1beta3;\n if (!(await templateEntityV1beta3Validator.check(template))) {\n throw new InputError('Input template is not a template');\n }\n\n const userEntityRef = auth.isPrincipal(credentials, 'user')\n ? credentials.principal.userEntityRef\n : undefined;\n\n const userEntity = userEntityRef\n ? await catalog.getEntityByRef(userEntityRef, { credentials })\n : undefined;\n\n const templateRef: string = `${template.kind}:${\n template.metadata.namespace || 'default'\n }/${template.metadata.name}`;\n\n for (const parameters of [template.spec.parameters ?? []].flat()) {\n const result = validate(body.values, parameters);\n if (!result.valid) {\n await auditorEvent?.fail({\n // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet\n error: (AggregateError as any)(\n result.errors,\n 'Could not execute dry run',\n ),\n meta: {\n templateRef: templateRef,\n parameters: template.spec.parameters,\n },\n });\n\n res.status(400).json({ errors: result.errors });\n return;\n }\n }\n\n const secretsValid = await validateSecrets({\n template,\n secrets: body.secrets ?? {},\n res,\n auditorEvent,\n });\n if (!secretsValid) {\n return;\n }\n\n const steps = template.spec.steps.map((step, index) => ({\n ...step,\n id: step.id ?? `step-${index + 1}`,\n name: step.name ?? step.action,\n }));\n\n const dryRunId = uuid();\n const contentsPath = resolveSafeChildPath(\n workingDirectory,\n `dry-run-content-${dryRunId}`,\n );\n const templateInfo = {\n entityRef: 'template:default/dry-run',\n entity: {\n metadata: template.metadata,\n },\n baseUrl: pathToFileURL(\n resolveSafeChildPath(contentsPath, 'template.yaml'),\n ).toString(),\n };\n\n const result = await dryRunner({\n spec: {\n apiVersion: template.apiVersion,\n steps,\n output: template.spec.output ?? {},\n parameters: body.values as JsonObject,\n user: {\n entity: userEntity as UserEntity,\n ref: userEntityRef,\n },\n },\n templateInfo: templateInfo,\n directoryContents: (body.directoryContents ?? []).map(file => ({\n path: file.path,\n content: Buffer.from(file.base64Content, 'base64'),\n })),\n secrets: {\n ...body.secrets,\n backstageToken: (credentials as any).token,\n },\n credentials,\n });\n\n await auditorEvent?.success({\n meta: {\n templateRef: templateRef,\n parameters: template.spec.parameters,\n },\n });\n\n res.status(200).json({\n ...result,\n steps,\n directoryContents: result.directoryContents.map(file => ({\n path: file.path,\n executable: file.executable,\n base64Content: file.content.toString('base64'),\n })),\n });\n } catch (err) {\n await auditorEvent?.fail({ error: err });\n throw err;\n }\n })\n .post('/v2/autocomplete/:provider/:resource', async (req, res) => {\n const { token, context } = req.body;\n const { provider, resource } = req.params;\n\n if (!token) throw new InputError('Missing token query parameter');\n\n if (!autocompleteHandlers[provider]) {\n throw new InputError(`Unsupported provider: ${provider}`);\n }\n\n const { results } = await autocompleteHandlers[provider]({\n resource,\n token,\n context,\n });\n\n res.status(200).json({ results });\n })\n .get('/v2/templating-extensions', async (_req, res) => {\n res.status(200).json({\n filters: {\n ...extractFilterMetadata(createDefaultFilters({ integrations })),\n ...extractFilterMetadata(additionalTemplateFilters),\n },\n globals: {\n functions: extractGlobalFunctionMetadata(additionalTemplateGlobals),\n values: extractGlobalValueMetadata(additionalTemplateGlobals),\n },\n });\n });\n\n const app = express();\n app.set('logger', logger);\n app.use('/', router);\n\n async function authorizeTemplate(\n entityRef: CompoundEntityRef,\n credentials: BackstageCredentials,\n ) {\n const template = await findTemplate({\n catalog,\n entityRef,\n credentials,\n });\n\n if (!isSupportedTemplate(template)) {\n throw new InputError(\n `Unsupported apiVersion field in schema entity, ${\n (template as Entity).apiVersion\n }`,\n );\n }\n\n if (!permissions) {\n return template;\n }\n\n const [parameterDecision, stepDecision] =\n await permissions.authorizeConditional(\n [\n { permission: templateParameterReadPermission },\n { permission: templateStepReadPermission },\n ],\n { credentials },\n );\n\n // Authorize parameters\n if (Array.isArray(template.spec.parameters)) {\n template.spec.parameters = template.spec.parameters.filter(step =>\n isTemplateAuthorized(parameterDecision, step),\n );\n } else if (\n template.spec.parameters &&\n !isTemplateAuthorized(parameterDecision, template.spec.parameters)\n ) {\n template.spec.parameters = undefined;\n }\n\n // Authorize steps\n template.spec.steps = template.spec.steps.filter(step =>\n isTemplateAuthorized(stepDecision, step),\n );\n\n return template;\n }\n\n return app;\n}\n"],"names":["config","readDurationFromConfig","validate","InputError","router","createOpenApiRouter","express","permissions","getWorkingDirectory","ScmIntegrations","DatabaseTaskStore","StorageTaskBroker","Duration","DefaultTemplateActionRegistry","convertFiltersToRecord","convertGlobalsToRecord","TaskWorker","createDryRunner","scaffolderTemplateRules","scaffolderActionRules","scaffolderTaskRules","isTemplatePermissionRuleInput","isActionPermissionRuleInput","isTaskPermissionRuleInput","createConditionAuthorizer","createConditionTransformer","createPermissionIntegrationRouter","RESOURCE_TYPE_SCAFFOLDER_TEMPLATE","scaffolderTemplatePermissions","RESOURCE_TYPE_SCAFFOLDER_ACTION","scaffolderActionPermissions","RESOURCE_TYPE_SCAFFOLDER_TASK","scaffolderTaskPermissions","scaffolderPermissions","parseEntityRef","checkPermission","taskCreatePermission","result","getEntityBaseUrl","stringifyEntityRef","parseStringsParam","getAuthorizeConditions","taskReadPermission","checkTaskPermission","NotFoundError","taskCancelPermission","z","templateEntityV1beta3Validator","uuid","resolveSafeChildPath","pathToFileURL","extractFilterMetadata","createDefaultFilters","extractGlobalFunctionMetadata","extractGlobalValueMetadata","findTemplate","templateParameterReadPermission","templateStepReadPermission"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-backend",
3
- "version": "3.2.0-next.1",
3
+ "version": "3.2.0-next.2",
4
4
  "description": "The Backstage backend plugin that helps you create new things",
5
5
  "backstage": {
6
6
  "role": "backend-plugin",
@@ -77,18 +77,18 @@
77
77
  "test": "backstage-cli package test"
78
78
  },
79
79
  "dependencies": {
80
- "@backstage/backend-openapi-utils": "0.6.7-next.0",
81
- "@backstage/backend-plugin-api": "1.7.1-next.0",
80
+ "@backstage/backend-openapi-utils": "0.6.7-next.1",
81
+ "@backstage/backend-plugin-api": "1.8.0-next.1",
82
82
  "@backstage/catalog-model": "1.7.6",
83
83
  "@backstage/config": "1.3.6",
84
84
  "@backstage/errors": "1.2.7",
85
- "@backstage/integration": "2.0.0-next.1",
86
- "@backstage/plugin-catalog-node": "2.1.0-next.1",
87
- "@backstage/plugin-events-node": "0.4.20-next.0",
85
+ "@backstage/integration": "2.0.0-next.2",
86
+ "@backstage/plugin-catalog-node": "2.1.0-next.2",
87
+ "@backstage/plugin-events-node": "0.4.20-next.1",
88
88
  "@backstage/plugin-permission-common": "0.9.6",
89
- "@backstage/plugin-permission-node": "0.10.11-next.0",
90
- "@backstage/plugin-scaffolder-common": "2.0.0-next.1",
91
- "@backstage/plugin-scaffolder-node": "0.13.0-next.1",
89
+ "@backstage/plugin-permission-node": "0.10.11-next.1",
90
+ "@backstage/plugin-scaffolder-common": "2.0.0-next.2",
91
+ "@backstage/plugin-scaffolder-node": "0.13.0-next.2",
92
92
  "@backstage/types": "1.2.2",
93
93
  "@opentelemetry/api": "^1.9.0",
94
94
  "@types/luxon": "^3.0.0",
@@ -115,11 +115,11 @@
115
115
  "zod-to-json-schema": "^3.25.1"
116
116
  },
117
117
  "devDependencies": {
118
- "@backstage/backend-defaults": "0.16.0-next.1",
119
- "@backstage/backend-test-utils": "1.11.1-next.1",
120
- "@backstage/cli": "0.36.0-next.1",
121
- "@backstage/plugin-scaffolder-node-test-utils": "0.3.9-next.1",
122
- "@backstage/repo-tools": "0.17.0-next.1",
118
+ "@backstage/backend-defaults": "0.16.0-next.2",
119
+ "@backstage/backend-test-utils": "1.11.1-next.2",
120
+ "@backstage/cli": "0.36.0-next.2",
121
+ "@backstage/plugin-scaffolder-node-test-utils": "0.3.9-next.2",
122
+ "@backstage/repo-tools": "0.17.0-next.2",
123
123
  "@types/express": "^4.17.6",
124
124
  "@types/fs-extra": "^11.0.0",
125
125
  "@types/nunjucks": "^3.1.4",