diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index d044d095cd..90e32ba6ee 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -17,7 +17,7 @@ import { JsonObject } from '@backstage/types'; import { ConflictError, NotFoundError } from '@backstage/errors'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; - +import zodToJsonSchema from 'zod-to-json-schema'; /** * Registry of all registered template actions. * @public @@ -31,7 +31,22 @@ export class TemplateActionRegistry { `Template action with ID '${action.id}' has already been registered`, ); } - this.actions.set(action.id, action); + + // It's better to convert the zod here, and just deal with jsonschema everywhere + // rather than adding the zod check everywhere like the nunjucks engine, and the /actions/list + // endpoint to create jsonschema for the frontend. + const templateAction = + action.schema?.input && 'safeParseAsync' in action.schema.input + ? { + ...action, + schema: { + ...action.schema, + input: zodToJsonSchema(action.schema.input), + }, + } + : action; + + this.actions.set(action.id, templateAction); } get(actionId: string): TemplateAction { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 3172a2cdae..541531d159 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -287,13 +287,10 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { {}; if (action.schema?.input) { - // Check to see if the input is a zod schema without using instanceof. - const inputSchema = - 'safeParseAsync' in action.schema.input - ? zodToJsonSchema(action.schema.input) - : action.schema.input; - - const validateResult = validateJsonSchema(input, inputSchema); + const validateResult = validateJsonSchema( + input, + action.schema.input, + ); if (!validateResult.valid) { const errors = validateResult.errors.join(', '); throw new InputError( diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index c339de8d10..1dc7036450 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -293,7 +293,7 @@ export async function createRouter( id: action.id, description: action.description, examples: action.examples, - schema: action.schema, + schema: {}, }; }); res.json(actionsList);