From 6ea23c9c6d99f0b04216329198575cae20311b73 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:49:58 +0200 Subject: [PATCH 1/6] chore: remove deprecated types and making breaking changes Signed-off-by: benjdlambert --- plugins/scaffolder-backend/report.api.md | 373 ------------------ plugins/scaffolder-backend/src/index.ts | 4 +- .../actions/TemplateActionRegistry.ts | 3 +- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 6 +- .../tasks/NunjucksWorkflowRunner.ts | 2 +- .../src/scaffolder/tasks/StorageTaskBroker.ts | 4 +- .../src/scaffolder/tasks/TaskWorker.ts | 8 +- .../src/scaffolder/tasks/types.ts | 50 +-- plugins/scaffolder-node/report.api.md | 13 +- plugins/scaffolder-node/src/tasks/types.ts | 16 +- 10 files changed, 24 insertions(+), 455 deletions(-) diff --git a/plugins/scaffolder-backend/report.api.md b/plugins/scaffolder-backend/report.api.md index 918718e495..8f9249cc5e 100644 --- a/plugins/scaffolder-backend/report.api.md +++ b/plugins/scaffolder-backend/report.api.md @@ -3,45 +3,21 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AuditorService } from '@backstage/backend-plugin-api'; -import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; -import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { CatalogService } from '@backstage/plugin-catalog-node'; -import { Config } from '@backstage/config'; -import { DatabaseService } from '@backstage/backend-plugin-api'; import { Duration } from 'luxon'; -import { EventsService } from '@backstage/plugin-events-node'; import { HumanDuration } from '@backstage/types'; -import { JsonObject } from '@backstage/types'; -import { Knex } from 'knex'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { PermissionCriteria } from '@backstage/plugin-permission-common'; -import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { RESOURCE_TYPE_SCAFFOLDER_ACTION } from '@backstage/plugin-scaffolder-common/alpha'; import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; import { ScmIntegrations } from '@backstage/integration'; -import { SerializedTask } from '@backstage/plugin-scaffolder-node'; -import { SerializedTaskEvent } from '@backstage/plugin-scaffolder-node'; -import { TaskBroker } from '@backstage/plugin-scaffolder-node'; -import { TaskCompletionState } from '@backstage/plugin-scaffolder-node'; -import { TaskContext } from '@backstage/plugin-scaffolder-node'; -import { TaskFilters } from '@backstage/plugin-scaffolder-node'; -import { TaskRecovery } from '@backstage/plugin-scaffolder-common'; -import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; -import { TaskSpec } from '@backstage/plugin-scaffolder-common'; -import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TaskStatus } from '@backstage/plugin-scaffolder-node'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateFilter } from '@backstage/plugin-scaffolder-node'; import { TemplateGlobal } from '@backstage/plugin-scaffolder-node'; import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { UpdateTaskCheckpointOptions } from '@backstage/plugin-scaffolder-node/alpha'; import { UrlReaderService } from '@backstage/backend-plugin-api'; -import { WorkspaceProvider } from '@backstage/plugin-scaffolder-node/alpha'; // @public (undocumented) export type ActionPermissionRuleInput< @@ -267,359 +243,10 @@ export function createWaitAction(options?: { 'v2' >; -// @public @deprecated -export type CreateWorkerOptions = { - taskBroker: TaskBroker; - actionRegistry: TemplateActionRegistry; - integrations: ScmIntegrations; - workingDirectory: string; - logger: LoggerService; - auditor?: AuditorService; - config?: Config; - additionalTemplateFilters?: Record; - concurrentTasksLimit?: number; - additionalTemplateGlobals?: Record; - permissions?: PermissionEvaluator; - gracefulShutdown?: boolean; -}; - -// @public -export interface CurrentClaimedTask { - createdBy?: string; - secrets?: TaskSecrets; - spec: TaskSpec; - state?: JsonObject; - taskId: string; - workspace?: Promise; -} - -// @public @deprecated -export class DatabaseTaskStore implements TaskStore { - // (undocumented) - cancelTask( - options: TaskStoreEmitOptions< - { - message: string; - } & JsonObject - >, - ): Promise; - // (undocumented) - claimTask(): Promise; - // (undocumented) - cleanWorkspace({ taskId }: { taskId: string }): Promise; - // (undocumented) - completeTask(options: { - taskId: string; - status: TaskStatus; - eventBody: JsonObject; - }): Promise; - // (undocumented) - static create(options: DatabaseTaskStoreOptions): Promise; - // (undocumented) - createTask( - options: TaskStoreCreateTaskOptions, - ): Promise; - // (undocumented) - emitLogEvent( - options: TaskStoreEmitOptions< - { - message: string; - } & JsonObject - >, - ): Promise; - // (undocumented) - getTask(taskId: string): Promise; - // (undocumented) - getTaskState({ taskId }: { taskId: string }): Promise< - | { - state: JsonObject; - } - | undefined - >; - // (undocumented) - heartbeatTask(taskId: string): Promise; - // (undocumented) - list(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - permissionFilters?: PermissionCriteria; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // (undocumented) - listEvents(options: TaskStoreListEventsOptions): Promise<{ - events: SerializedTaskEvent[]; - }>; - // (undocumented) - listStaleTasks(options: { timeoutS: number }): Promise<{ - tasks: { - taskId: string; - recovery?: TaskRecovery; - }[]; - }>; - // (undocumented) - recoverTasks(options: TaskStoreRecoverTaskOptions): Promise<{ - ids: string[]; - }>; - // (undocumented) - rehydrateWorkspace(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; - // (undocumented) - saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; - // (undocumented) - serializeWorkspace(options: { path: string; taskId: string }): Promise; - // (undocumented) - shutdownTask(options: TaskStoreShutDownTaskOptions): Promise; -} - -// @public @deprecated -export type DatabaseTaskStoreOptions = { - database: DatabaseService | Knex; - events?: EventsService; -}; - // @public const scaffolderPlugin: BackendFeature; export default scaffolderPlugin; -// @public @deprecated -export class TaskManager implements TaskContext { - // (undocumented) - get cancelSignal(): AbortSignal; - // (undocumented) - cleanWorkspace?(): Promise; - // (undocumented) - complete(result: TaskCompletionState, metadata?: JsonObject): Promise; - // (undocumented) - static create( - task: CurrentClaimedTask, - storage: TaskStore, - abortSignal: AbortSignal, - logger: LoggerService, - auth?: AuthService, - config?: Config, - additionalWorkspaceProviders?: Record, - ): TaskManager; - // (undocumented) - get createdBy(): string | undefined; - // (undocumented) - get done(): boolean; - // (undocumented) - emitLog(message: string, logMetadata?: JsonObject): Promise; - // (undocumented) - getInitiatorCredentials(): Promise; - // (undocumented) - getTaskState?(): Promise< - | { - state?: JsonObject; - } - | undefined - >; - // (undocumented) - getWorkspaceName(): Promise; - // (undocumented) - rehydrateWorkspace?(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - get secrets(): TaskSecrets | undefined; - // (undocumented) - serializeWorkspace?(options: { path: string }): Promise; - // (undocumented) - get spec(): TaskSpecV1beta3; - // (undocumented) - get taskId(): string; - // (undocumented) - updateCheckpoint?(options: UpdateTaskCheckpointOptions): Promise; -} - -// @public @deprecated -export interface TaskStore { - // (undocumented) - cancelTask?(options: TaskStoreEmitOptions): Promise; - // (undocumented) - claimTask(): Promise; - // (undocumented) - cleanWorkspace?({ taskId }: { taskId: string }): Promise; - // (undocumented) - completeTask(options: { - taskId: string; - status: TaskStatus; - eventBody: JsonObject; - }): Promise; - // (undocumented) - createTask( - options: TaskStoreCreateTaskOptions, - ): Promise; - // (undocumented) - emitLogEvent(options: TaskStoreEmitOptions): Promise; - // (undocumented) - getTask(taskId: string): Promise; - // (undocumented) - getTaskState?({ taskId }: { taskId: string }): Promise< - | { - state: JsonObject; - } - | undefined - >; - // (undocumented) - heartbeatTask(taskId: string): Promise; - // (undocumented) - list?(options: { - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - permissionFilters?: PermissionCriteria; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // @deprecated (undocumented) - list?(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // (undocumented) - listEvents(options: TaskStoreListEventsOptions): Promise<{ - events: SerializedTaskEvent[]; - }>; - // (undocumented) - listStaleTasks(options: { timeoutS: number }): Promise<{ - tasks: { - taskId: string; - }[]; - }>; - // (undocumented) - recoverTasks?(options: TaskStoreRecoverTaskOptions): Promise<{ - ids: string[]; - }>; - // (undocumented) - rehydrateWorkspace?(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; - // (undocumented) - saveTaskState?(options: { - taskId: string; - state?: JsonObject; - }): Promise; - // (undocumented) - serializeWorkspace?({ - path, - taskId, - }: { - path: string; - taskId: string; - }): Promise; - // (undocumented) - shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; -} - -// @public @deprecated -export type TaskStoreCreateTaskOptions = { - spec: TaskSpec; - createdBy?: string; - secrets?: TaskSecrets; -}; - -// @public @deprecated -export type TaskStoreCreateTaskResult = { - taskId: string; -}; - -// @public @deprecated -export type TaskStoreEmitOptions = { - taskId: string; - body: TBody; -}; - -// @public @deprecated -export type TaskStoreListEventsOptions = { - isTaskRecoverable?: boolean; - taskId: string; - after?: number | undefined; -}; - -// @public @deprecated -export type TaskStoreRecoverTaskOptions = { - timeout: HumanDuration; -}; - -// @public @deprecated -export type TaskStoreShutDownTaskOptions = { - taskId: string; -}; - -// @public @deprecated -export class TaskWorker { - // (undocumented) - static create(options: CreateWorkerOptions): Promise; - // (undocumented) - protected onReadyToClaimTask(): Promise; - // (undocumented) - recoverTasks(): Promise; - // (undocumented) - runOneTask(task: TaskContext): Promise; - // (undocumented) - start(): void; - // (undocumented) - stop(): Promise; -} - -// @public @deprecated -export class TemplateActionRegistry { - // (undocumented) - get(actionId: string): TemplateAction; - // (undocumented) - list(): TemplateAction[]; - // (undocumented) - register(action: TemplateAction): void; -} - // @public (undocumented) export type TemplatePermissionRuleInput< TParams extends PermissionRuleParams = PermissionRuleParams, diff --git a/plugins/scaffolder-backend/src/index.ts b/plugins/scaffolder-backend/src/index.ts index 4273ed8197..d911d51536 100644 --- a/plugins/scaffolder-backend/src/index.ts +++ b/plugins/scaffolder-backend/src/index.ts @@ -21,7 +21,9 @@ */ export { scaffolderPlugin as default } from './ScaffolderPlugin'; -export * from './scaffolder'; + +export * from './scaffolder/actions/builtin'; + export { type TemplatePermissionRuleInput, type ActionPermissionRuleInput, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index c819d4c21f..d6d7685a21 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -16,10 +16,9 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; + /** * Registry of all registered template actions. - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export class TemplateActionRegistry { private readonly actions = new Map(); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index fdcaa8613e..22ce3e83b7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -85,8 +85,6 @@ export type RawDbTaskEventRow = { /** * DatabaseTaskStore - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type DatabaseTaskStoreOptions = { database: DatabaseService | Knex; @@ -118,8 +116,6 @@ const parseSqlDateToIsoString = (input: T): T | string => { /** * DatabaseTaskStore - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class DatabaseTaskStore implements TaskStore { private readonly db: Knex; @@ -723,7 +719,7 @@ export class DatabaseTaskStore implements TaskStore { }); } - async retryTask?(options: { + async retryTask(options: { secrets?: TaskSecrets; taskId: string; }): Promise { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index d069a6bc1c..bcae93fb4d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -33,7 +33,7 @@ import { SecureTemplater, SecureTemplateRenderer, } from '../../lib/templating/SecureTemplater'; -import { TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions/TemplateActionRegistry'; import { generateExampleOutput, isTruthy } from './helper'; import { TaskTrackType, WorkflowResponse, WorkflowRunner } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 5b4d568144..2c2c176770 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -50,8 +50,6 @@ type TaskState = { }; /** * TaskManager - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class TaskManager implements TaskContext { private isDone = false; @@ -488,7 +486,7 @@ export class StorageTaskBroker implements TaskBroker { }); } - async retry?(options: { + async retry(options: { secrets?: TaskSecrets; taskId: string; }): Promise { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 9abe5f3ba6..adfdf0b553 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -25,7 +25,7 @@ import { TemplateGlobal, } from '@backstage/plugin-scaffolder-node'; import PQueue from 'p-queue'; -import { TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions/TemplateActionRegistry'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; import { WorkflowRunner } from './types'; import { setTimeout } from 'timers/promises'; @@ -36,8 +36,6 @@ const DEFAULT_TASK_PARAMETER_MAX_LENGTH = 256; /** * TaskWorkerOptions - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type TaskWorkerOptions = { taskBroker: TaskBroker; @@ -54,8 +52,6 @@ export type TaskWorkerOptions = { /** * CreateWorkerOptions - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type CreateWorkerOptions = { taskBroker: TaskBroker; @@ -86,8 +82,6 @@ export type CreateWorkerOptions = { /** * TaskWorker - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class TaskWorker { private taskQueue: PQueue; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 62ffb171ff..874e32b838 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -30,8 +30,6 @@ import { PermissionCriteria } from '@backstage/plugin-permission-common'; /** * TaskStoreEmitOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreEmitOptions = { taskId: string; @@ -41,8 +39,6 @@ export type TaskStoreEmitOptions = { /** * TaskStoreListEventsOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreListEventsOptions = { isTaskRecoverable?: boolean; @@ -53,8 +49,6 @@ export type TaskStoreListEventsOptions = { /** * TaskStoreShutDownTaskOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreShutDownTaskOptions = { taskId: string; @@ -62,8 +56,6 @@ export type TaskStoreShutDownTaskOptions = { /** * The options passed to {@link TaskStore.createTask} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreCreateTaskOptions = { spec: TaskSpec; @@ -73,8 +65,6 @@ export type TaskStoreCreateTaskOptions = { /** * The options passed to {@link TaskStore.recoverTasks} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreRecoverTaskOptions = { timeout: HumanDuration; @@ -82,8 +72,6 @@ export type TaskStoreRecoverTaskOptions = { /** * The response from {@link TaskStore.createTask} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreCreateTaskResult = { taskId: string; @@ -92,19 +80,17 @@ export type TaskStoreCreateTaskResult = { /** * TaskStore * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export interface TaskStore { - cancelTask?(options: TaskStoreEmitOptions): Promise; + cancelTask(options: TaskStoreEmitOptions): Promise; createTask( options: TaskStoreCreateTaskOptions, ): Promise; - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retryTask(options: { secrets?: TaskSecrets; taskId: string }): Promise; - recoverTasks?( + recoverTasks( options: TaskStoreRecoverTaskOptions, ): Promise<{ ids: string[] }>; @@ -137,51 +123,31 @@ export interface TaskStore { order?: { order: 'asc' | 'desc'; field: string }[]; }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - /** - * @deprecated Make sure to pass `createdBy` and `status` in the `filters` parameter instead - */ - list?(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { order: 'asc' | 'desc'; field: string }[]; - }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - emitLogEvent(options: TaskStoreEmitOptions): Promise; - getTaskState?({ taskId }: { taskId: string }): Promise< + getTaskState({ taskId }: { taskId: string }): Promise< | { state: JsonObject; } | undefined >; - saveTaskState?(options: { - taskId: string; - state?: JsonObject; - }): Promise; + saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; listEvents( options: TaskStoreListEventsOptions, ): Promise<{ events: SerializedTaskEvent[] }>; - shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; + shutdownTask(options: TaskStoreShutDownTaskOptions): Promise; rehydrateWorkspace?(options: { taskId: string; targetPath: string; }): Promise; - cleanWorkspace?({ taskId }: { taskId: string }): Promise; + cleanWorkspace({ taskId }: { taskId: string }): Promise; - serializeWorkspace?({ + serializeWorkspace({ path, taskId, }: { diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c97344867a..fa0163b245 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -356,7 +356,7 @@ export type SerializedTaskEvent = { // @public export interface TaskBroker { // (undocumented) - cancel?(taskId: string): Promise; + cancel(taskId: string): Promise; // (undocumented) claim(): Promise; // (undocumented) @@ -370,7 +370,7 @@ export interface TaskBroker { // (undocumented) get(taskId: string): Promise; // (undocumented) - list?(options?: { + list(options?: { filters?: { createdBy?: string | string[]; status?: TaskStatus | TaskStatus[]; @@ -388,15 +388,10 @@ export interface TaskBroker { tasks: SerializedTask[]; totalTasks?: number; }>; - // @deprecated (undocumented) - list?(options: { createdBy?: string; status?: TaskStatus }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; // (undocumented) - recoverTasks?(): Promise; + recoverTasks(): Promise; // (undocumented) - retry?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retry(options: { secrets?: TaskSecrets; taskId: string }): Promise; // (undocumented) vacuumTasks(options: { timeoutS: number }): Promise; } diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index aaac468fce..fd80d547c1 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -177,13 +177,13 @@ export interface TaskContext { * @public */ export interface TaskBroker { - cancel?(taskId: string): Promise; + cancel(taskId: string): Promise; - retry?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retry(options: { secrets?: TaskSecrets; taskId: string }): Promise; claim(): Promise; - recoverTasks?(): Promise; + recoverTasks(): Promise; dispatch( options: TaskBrokerDispatchOptions, @@ -198,7 +198,7 @@ export interface TaskBroker { get(taskId: string): Promise; - list?(options?: { + list(options?: { filters?: { createdBy?: string | string[]; status?: TaskStatus | TaskStatus[]; @@ -210,12 +210,4 @@ export interface TaskBroker { order?: { order: 'asc' | 'desc'; field: string }[]; permissionFilters?: PermissionCriteria; }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - - /** - * @deprecated Make sure to pass `createdBy` and `status` in the `filters` parameter instead - */ - list?(options: { - createdBy?: string; - status?: TaskStatus; - }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; } From 9b81a90b91d7973660952489257eb231af992b96 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:51:25 +0200 Subject: [PATCH 2/6] chore: changesets Signed-off-by: benjdlambert --- .changeset/ready-poems-change.md | 5 +++++ .changeset/wet-spiders-wait.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/ready-poems-change.md create mode 100644 .changeset/wet-spiders-wait.md diff --git a/.changeset/ready-poems-change.md b/.changeset/ready-poems-change.md new file mode 100644 index 0000000000..e716779b95 --- /dev/null +++ b/.changeset/ready-poems-change.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': minor +--- + +Making fields required diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md new file mode 100644 index 0000000000..49cb2a56ac --- /dev/null +++ b/.changeset/wet-spiders-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': major +--- + +Removing the deprecated types and interfaces From 55b0b7e48e6b111d0ea547cc9a6886b8a8acdf80 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:58:42 +0200 Subject: [PATCH 3/6] chore: update changeset for scaffolder-backend Signed-off-by: benjdlambert --- .changeset/wet-spiders-wait.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md index 49cb2a56ac..6db9dfc1a1 100644 --- a/.changeset/wet-spiders-wait.md +++ b/.changeset/wet-spiders-wait.md @@ -2,4 +2,6 @@ '@backstage/plugin-scaffolder-backend': major --- -Removing the deprecated types and interfaces +Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. + +Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. From 62e3e83bb44c39c76e9e3fe6ecb309babba24965 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:01:55 +0200 Subject: [PATCH 4/6] chore: fix Signed-off-by: benjdlambert --- .changeset/ready-poems-change.md | 6 +++++- .changeset/wet-spiders-wait.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.changeset/ready-poems-change.md b/.changeset/ready-poems-change.md index e716779b95..fc95ddb99a 100644 --- a/.changeset/ready-poems-change.md +++ b/.changeset/ready-poems-change.md @@ -2,4 +2,8 @@ '@backstage/plugin-scaffolder-node': minor --- -Making fields required +**BREAKING** - Marking optional fields as required in the `TaskBroker`, these can be fixed with a no-op `() => void` if you don't want to implement the functions. + +- `cancel`, `recoverTasks` and `retry` are the required methods on the `TaskBroker` interface. + +**NOTE**: If you're affected by this breaking change, please reach out to us in an issue as we're thinking about completely removing the `TaskBroker` extension point soon and would like to hear your use cases for the upcoming re-architecture of the `scaffolder-backend` plugin. diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md index 6db9dfc1a1..aaffc92013 100644 --- a/.changeset/wet-spiders-wait.md +++ b/.changeset/wet-spiders-wait.md @@ -2,6 +2,6 @@ '@backstage/plugin-scaffolder-backend': major --- -Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. +**BREAKING** - Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. From 6e2bda78bd711adc097e39aa51ae8514b1a0bfce Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:15:36 +0200 Subject: [PATCH 5/6] chore: moar deprecations Signed-off-by: benjdlambert --- .changeset/solid-bikes-leave.md | 9 ++++++++ plugins/scaffolder-node/report-alpha.api.md | 2 +- plugins/scaffolder-node/report.api.md | 22 +++++++++--------- plugins/scaffolder-node/src/alpha/index.ts | 1 + plugins/scaffolder-node/src/tasks/types.ts | 25 ++++++++++++++++++++- 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 .changeset/solid-bikes-leave.md diff --git a/.changeset/solid-bikes-leave.md b/.changeset/solid-bikes-leave.md new file mode 100644 index 0000000000..6f1bfe0b2f --- /dev/null +++ b/.changeset/solid-bikes-leave.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +**DEPRECATION**: We're going to be working on refactoring a lot of the internals of the Scaffolder backend plugin, and with that comes a lot of deprecations and removals for public types that are making these things hard. + +If you're using these types, please reach out to us either on Discord or a GitHub issue with your use cases. + +- `SerializedTask`, `SerializedTaskEvent`, `TaskBroker`, `TaskContext`, `TaskBrokerDispatchOptions`, `TaskBrokerDispatchResult`, `TaskCompletionState`, `TaskEventType`, `TaskFilter`, `TaskFilters`, `TaskStatus` are the types that have now been marked as deprecated, and will be removed in a future release. diff --git a/plugins/scaffolder-node/report-alpha.api.md b/plugins/scaffolder-node/report-alpha.api.md index 09541fbc56..c5ac6ce79d 100644 --- a/plugins/scaffolder-node/report-alpha.api.md +++ b/plugins/scaffolder-node/report-alpha.api.md @@ -147,7 +147,7 @@ export interface ScaffolderAutocompleteExtensionPoint { // @alpha export const scaffolderAutocompleteExtensionPoint: ExtensionPoint; -// @alpha +// @alpha @deprecated export interface ScaffolderTaskBrokerExtensionPoint { // (undocumented) setTaskBroker(taskBroker: TaskBroker): void; diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index fa0163b245..027d57ede4 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -327,7 +327,7 @@ export function serializeDirectoryContents( }, ): Promise; -// @public +// @public @deprecated export type SerializedTask = { id: string; spec: TaskSpec; @@ -339,7 +339,7 @@ export type SerializedTask = { state?: JsonObject; }; -// @public +// @public @deprecated export type SerializedTaskEvent = { id: number; isTaskRecoverable?: boolean; @@ -353,7 +353,7 @@ export type SerializedTaskEvent = { createdAt: string; }; -// @public +// @public @deprecated export interface TaskBroker { // (undocumented) cancel(taskId: string): Promise; @@ -396,22 +396,22 @@ export interface TaskBroker { vacuumTasks(options: { timeoutS: number }): Promise; } -// @public +// @public @deprecated export type TaskBrokerDispatchOptions = { spec: TaskSpec; secrets?: TaskSecrets; createdBy?: string; }; -// @public +// @public @deprecated export type TaskBrokerDispatchResult = { taskId: string; }; -// @public +// @public @deprecated export type TaskCompletionState = 'failed' | 'completed'; -// @public +// @public @deprecated export interface TaskContext { // (undocumented) cancelSignal: AbortSignal; @@ -455,16 +455,16 @@ export interface TaskContext { updateCheckpoint?(options: UpdateTaskCheckpointOptions): Promise; } -// @public +// @public @deprecated export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; -// @public +// @public @deprecated export type TaskFilter = { key: string; values?: string[]; }; -// @public +// @public @deprecated export type TaskFilters = | { anyOf: TaskFilter[]; @@ -482,7 +482,7 @@ export type TaskSecrets = Record & { backstageToken?: string; }; -// @public +// @public @deprecated export type TaskStatus = | 'cancelled' | 'completed' diff --git a/plugins/scaffolder-node/src/alpha/index.ts b/plugins/scaffolder-node/src/alpha/index.ts index 30f95f116a..2147085983 100644 --- a/plugins/scaffolder-node/src/alpha/index.ts +++ b/plugins/scaffolder-node/src/alpha/index.ts @@ -53,6 +53,7 @@ export const scaffolderActionsExtensionPoint = * Extension point for replacing the scaffolder task broker. * * @alpha + * @deprecated this extension point is planned to be removed, please reach out to us in an issue if you're using this extension point and your use cases. */ export interface ScaffolderTaskBrokerExtensionPoint { setTaskBroker(taskBroker: TaskBroker): void; diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index fd80d547c1..d6e4bb2dd9 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -33,6 +33,8 @@ export type TaskSecrets = Record & { * The status of each step of the Task * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskStatus = | 'cancelled' @@ -46,6 +48,8 @@ export type TaskStatus = * The state of a completed task. * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskCompletionState = 'failed' | 'completed'; @@ -53,6 +57,8 @@ export type TaskCompletionState = 'failed' | 'completed'; * SerializedTask * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type SerializedTask = { id: string; @@ -69,6 +75,8 @@ export type SerializedTask = { * TaskEventType * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; @@ -76,6 +84,8 @@ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; * SerializedTaskEvent * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type SerializedTaskEvent = { id: number; @@ -94,6 +104,8 @@ export type SerializedTaskEvent = { * The result of {@link TaskBroker.dispatch} * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskBrokerDispatchResult = { taskId: string; @@ -104,6 +116,8 @@ export type TaskBrokerDispatchResult = { * Currently a spec and optional secrets * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskBrokerDispatchOptions = { spec: TaskSpec; @@ -114,6 +128,8 @@ export type TaskBrokerDispatchOptions = { /** * TaskFilter * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskFilter = { key: string; @@ -123,6 +139,8 @@ export type TaskFilter = { /** * TaskFilters * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskFilters = | { anyOf: TaskFilter[] } @@ -131,9 +149,12 @@ export type TaskFilters = | TaskFilter; /** - * Task + * TaskContext * * @public + * + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export interface TaskContext { taskId?: string; @@ -175,6 +196,8 @@ export interface TaskContext { * TaskBroker * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export interface TaskBroker { cancel(taskId: string): Promise; From c8aa21077c765901e3a2b1e69d7cacbbf8a5fad9 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:38:54 +0200 Subject: [PATCH 6/6] chore: last bits Signed-off-by: benjdlambert --- .changeset/legal-eagles-jog.md | 18 ++++++++++ .changeset/red-times-bet.md | 13 +++++++ .../src/module.ts | 2 +- .../src/module.ts | 6 ++-- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 6 ++-- .../src/module.ts | 6 ++-- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/ScaffolderPlugin.ts | 7 ++-- plugins/scaffolder-node/report-alpha.api.md | 12 +------ plugins/scaffolder-node/report.api.md | 10 ++++++ plugins/scaffolder-node/src/alpha/index.ts | 21 +---------- plugins/scaffolder-node/src/extensions.ts | 36 +++++++++++++++++++ plugins/scaffolder-node/src/index.ts | 1 + 22 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 .changeset/legal-eagles-jog.md create mode 100644 .changeset/red-times-bet.md create mode 100644 plugins/scaffolder-node/src/extensions.ts diff --git a/.changeset/legal-eagles-jog.md b/.changeset/legal-eagles-jog.md new file mode 100644 index 0000000000..5b520af91f --- /dev/null +++ b/.changeset/legal-eagles-jog.md @@ -0,0 +1,18 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch +'@backstage/plugin-scaffolder-backend-module-notifications': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket': patch +'@backstage/plugin-scaffolder-backend-module-gerrit': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +'@backstage/plugin-scaffolder-backend-module-sentry': patch +'@backstage/plugin-scaffolder-backend-module-yeoman': patch +'@backstage/plugin-scaffolder-backend-module-azure': patch +'@backstage/plugin-scaffolder-backend-module-gitea': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +--- + +Updating import for the `scaffolderActionsExtensionPoint` to be the main export diff --git a/.changeset/red-times-bet.md b/.changeset/red-times-bet.md new file mode 100644 index 0000000000..29e89fb07f --- /dev/null +++ b/.changeset/red-times-bet.md @@ -0,0 +1,13 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +**BREAKING ALPHA**: We've moved the `scaffolderActionsExtensionPoint` from `/alpha` to the main export. + +```tsx +// before +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; + +// after +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; +``` diff --git a/plugins/scaffolder-backend-module-azure/src/module.ts b/plugins/scaffolder-backend-module-azure/src/module.ts index 40ca3f0978..937d806932 100644 --- a/plugins/scaffolder-backend-module-azure/src/module.ts +++ b/plugins/scaffolder-backend-module-azure/src/module.ts @@ -18,7 +18,7 @@ import { coreServices, } from '@backstage/backend-plugin-api'; import { ScmIntegrations } from '@backstage/integration'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishAzureAction } from './actions'; /** diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts b/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts index 4001c064da..04ac3b7a56 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts @@ -17,10 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createBitbucketCloudBranchRestrictionAction } from './actions/bitbucketCloudBranchRestriction'; import { createBitbucketPipelinesRunAction, @@ -29,6 +26,7 @@ import { } from './actions'; import { ScmIntegrations } from '@backstage/integration'; import { handleAutocompleteRequest } from './autocomplete/autocomplete'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts index d3d457cb1f..21159759d4 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishBitbucketServerAction, createPublishBitbucketServerPullRequestAction, diff --git a/plugins/scaffolder-backend-module-bitbucket/src/module.ts b/plugins/scaffolder-backend-module-bitbucket/src/module.ts index db27d0b7b9..884c8be004 100644 --- a/plugins/scaffolder-backend-module-bitbucket/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createBitbucketPipelinesRunAction, createPublishBitbucketCloudAction, diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts index 402f56c951..3b18ef8294 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts @@ -17,7 +17,7 @@ import { createBackendModule, coreServices, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createConfluenceToMarkdownAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/module.ts b/plugins/scaffolder-backend-module-cookiecutter/src/module.ts index df1b201518..3caa9259f2 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/module.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createFetchCookiecutterAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-gerrit/src/module.ts b/plugins/scaffolder-backend-module-gerrit/src/module.ts index 32607431f3..f0bbed9649 100644 --- a/plugins/scaffolder-backend-module-gerrit/src/module.ts +++ b/plugins/scaffolder-backend-module-gerrit/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishGerritAction, createPublishGerritReviewAction, diff --git a/plugins/scaffolder-backend-module-gitea/src/module.ts b/plugins/scaffolder-backend-module-gitea/src/module.ts index 658f240471..b087e1637e 100644 --- a/plugins/scaffolder-backend-module-gitea/src/module.ts +++ b/plugins/scaffolder-backend-module-gitea/src/module.ts @@ -17,7 +17,7 @@ import { createBackendModule, coreServices, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishGiteaAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-github/src/module.ts b/plugins/scaffolder-backend-module-github/src/module.ts index 67bda58fc4..964bc018ae 100644 --- a/plugins/scaffolder-backend-module-github/src/module.ts +++ b/plugins/scaffolder-backend-module-github/src/module.ts @@ -17,10 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createGithubActionsDispatchAction, createGithubAutolinksAction, @@ -42,6 +39,7 @@ import { } from '@backstage/integration'; import { createHandleAutocompleteRequest } from './autocomplete/autocomplete'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-gitlab/src/module.ts b/plugins/scaffolder-backend-module-gitlab/src/module.ts index 7dbfddfc1b..3c04f57077 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/module.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/module.ts @@ -18,10 +18,7 @@ import { createBackendModule, } from '@backstage/backend-plugin-api'; import { ScmIntegrations } from '@backstage/integration'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createGitlabGroupEnsureExistsAction, createGitlabIssueAction, @@ -36,6 +33,7 @@ import { } from './actions'; import { createGitlabProjectMigrateAction } from './actions/gitlabProjectMigrate'; import { createHandleAutocompleteRequest } from './autocomplete/autocomplete'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-notifications/src/module.ts b/plugins/scaffolder-backend-module-notifications/src/module.ts index e8b6823e99..4639175229 100644 --- a/plugins/scaffolder-backend-module-notifications/src/module.ts +++ b/plugins/scaffolder-backend-module-notifications/src/module.ts @@ -15,7 +15,7 @@ */ import { createBackendModule } from '@backstage/backend-plugin-api'; import { notificationService } from '@backstage/plugin-notifications-node'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createSendNotificationAction } from './actions'; /** diff --git a/plugins/scaffolder-backend-module-rails/src/module.ts b/plugins/scaffolder-backend-module-rails/src/module.ts index ec70610cd3..eb14c47977 100644 --- a/plugins/scaffolder-backend-module-rails/src/module.ts +++ b/plugins/scaffolder-backend-module-rails/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createFetchRailsAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-sentry/src/module.ts b/plugins/scaffolder-backend-module-sentry/src/module.ts index dcde344262..2b343edbc7 100644 --- a/plugins/scaffolder-backend-module-sentry/src/module.ts +++ b/plugins/scaffolder-backend-module-sentry/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createSentryCreateProjectAction } from './actions/createProject'; /** diff --git a/plugins/scaffolder-backend-module-yeoman/src/module.ts b/plugins/scaffolder-backend-module-yeoman/src/module.ts index 1fdbda28a3..0564d69369 100644 --- a/plugins/scaffolder-backend-module-yeoman/src/module.ts +++ b/plugins/scaffolder-backend-module-yeoman/src/module.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createBackendModule } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createRunYeomanAction } from './actions'; /** diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index a00da9e524..39bab85c7e 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -21,7 +21,11 @@ import { import { ScmIntegrations } from '@backstage/integration'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; import { eventsServiceRef } from '@backstage/plugin-events-node'; -import { TaskBroker, TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + scaffolderActionsExtensionPoint, + TaskBroker, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; import { AutocompleteHandler, CreatedTemplateFilter, @@ -29,7 +33,6 @@ import { createTemplateFilter, createTemplateGlobalFunction, createTemplateGlobalValue, - scaffolderActionsExtensionPoint, scaffolderAutocompleteExtensionPoint, scaffolderTaskBrokerExtensionPoint, scaffolderTemplatingExtensionPoint, diff --git a/plugins/scaffolder-node/report-alpha.api.md b/plugins/scaffolder-node/report-alpha.api.md index c5ac6ce79d..e1d49f571a 100644 --- a/plugins/scaffolder-node/report-alpha.api.md +++ b/plugins/scaffolder-node/report-alpha.api.md @@ -6,7 +6,6 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonValue } from '@backstage/types'; import { TaskBroker } from '@backstage/plugin-scaffolder-node'; -import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { TemplateFilter as TemplateFilter_2 } from '@backstage/plugin-scaffolder-node'; import { TemplateGlobal as TemplateGlobal_2 } from '@backstage/plugin-scaffolder-node'; import { z } from 'zod'; @@ -123,15 +122,6 @@ export const restoreWorkspace: (opts: { buffer?: Buffer; }) => Promise; -// @alpha -export interface ScaffolderActionsExtensionPoint { - // (undocumented) - addActions(...actions: TemplateAction[]): void; -} - -// @alpha -export const scaffolderActionsExtensionPoint: ExtensionPoint; - // @alpha export interface ScaffolderAutocompleteExtensionPoint { // (undocumented) @@ -153,7 +143,7 @@ export interface ScaffolderTaskBrokerExtensionPoint { setTaskBroker(taskBroker: TaskBroker): void; } -// @alpha +// @alpha @deprecated export const scaffolderTaskBrokerExtensionPoint: ExtensionPoint; // @alpha diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index 027d57ede4..7f70c9d786 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -6,6 +6,7 @@ import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { CheckpointContext } from '@backstage/plugin-scaffolder-node/alpha'; import { Expand } from '@backstage/types'; +import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { LoggerService } from '@backstage/backend-plugin-api'; @@ -306,6 +307,15 @@ export const parseRepoUrl: ( project?: string; }; +// @public +export interface ScaffolderActionsExtensionPoint { + // (undocumented) + addActions(...actions: TemplateAction[]): void; +} + +// @public +export const scaffolderActionsExtensionPoint: ExtensionPoint; + // @public (undocumented) export interface SerializedFile { // (undocumented) diff --git a/plugins/scaffolder-node/src/alpha/index.ts b/plugins/scaffolder-node/src/alpha/index.ts index 2147085983..9d0b9efafd 100644 --- a/plugins/scaffolder-node/src/alpha/index.ts +++ b/plugins/scaffolder-node/src/alpha/index.ts @@ -17,7 +17,6 @@ import { createExtensionPoint } from '@backstage/backend-plugin-api'; import { TaskBroker, - TemplateAction, TemplateFilter, TemplateGlobal, } from '@backstage/plugin-scaffolder-node'; @@ -30,25 +29,6 @@ export * from './globals'; export * from './types'; export * from './checkpoints'; -/** - * Extension point for managing scaffolder actions. - * - * @alpha - */ -export interface ScaffolderActionsExtensionPoint { - addActions(...actions: TemplateAction[]): void; -} - -/** - * Extension point for managing scaffolder actions. - * - * @alpha - */ -export const scaffolderActionsExtensionPoint = - createExtensionPoint({ - id: 'scaffolder.actions', - }); - /** * Extension point for replacing the scaffolder task broker. * @@ -63,6 +43,7 @@ export interface ScaffolderTaskBrokerExtensionPoint { * Extension point for replacing the scaffolder task broker. * * @alpha + * @deprecated this extension point is planned to be removed, please reach out to us in an issue if you're using this extension point and your use cases. */ export const scaffolderTaskBrokerExtensionPoint = createExtensionPoint({ diff --git a/plugins/scaffolder-node/src/extensions.ts b/plugins/scaffolder-node/src/extensions.ts new file mode 100644 index 0000000000..94b366fceb --- /dev/null +++ b/plugins/scaffolder-node/src/extensions.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { TemplateAction } from './actions'; + +/** + * Extension point for managing scaffolder actions. + * + * @public + */ +export interface ScaffolderActionsExtensionPoint { + addActions(...actions: TemplateAction[]): void; +} + +/** + * Extension point for managing scaffolder actions. + * + * @public + */ +export const scaffolderActionsExtensionPoint = + createExtensionPoint({ + id: 'scaffolder.actions', + }); diff --git a/plugins/scaffolder-node/src/index.ts b/plugins/scaffolder-node/src/index.ts index 5d49ee874c..a9aa77ba4e 100644 --- a/plugins/scaffolder-node/src/index.ts +++ b/plugins/scaffolder-node/src/index.ts @@ -24,3 +24,4 @@ export * from './actions'; export * from './tasks'; export * from './files'; export * from './types'; +export * from './extensions';