From c89d74b7633415396555226793a32e2f45e25ee7 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:05:21 -0800 Subject: [PATCH] address feedback Signed-off-by: williamwu-mongodb --- plugins/devtools-common/package.json | 15 ++++ plugins/devtools-common/report-alpha.api.md | 69 +++++++++++++++++++ plugins/devtools-common/report.api.md | 60 ---------------- plugins/devtools-common/src/alpha.ts | 24 +++++++ plugins/devtools-common/src/index.ts | 18 ++++- plugins/devtools-common/src/permissions.ts | 6 +- plugins/devtools-common/src/types.ts | 6 +- plugins/devtools/report.api.md | 2 +- plugins/devtools/src/api/DevToolsApi.ts | 4 +- plugins/devtools/src/api/DevToolsClient.ts | 4 +- .../ScheduledTaskDetailedPanel.tsx | 2 +- .../ScheduledTasksContent.tsx | 48 +++++++++---- .../DefaultDevToolsPage.tsx | 3 +- 13 files changed, 173 insertions(+), 88 deletions(-) create mode 100644 plugins/devtools-common/report-alpha.api.md create mode 100644 plugins/devtools-common/src/alpha.ts diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index c442185e14..4ae841206d 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -25,8 +25,23 @@ }, "license": "Apache-2.0", "sideEffects": false, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, "main": "src/index.ts", "types": "src/index.ts", + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "files": [ "dist" ], diff --git a/plugins/devtools-common/report-alpha.api.md b/plugins/devtools-common/report-alpha.api.md new file mode 100644 index 0000000000..3c3b7ff89e --- /dev/null +++ b/plugins/devtools-common/report-alpha.api.md @@ -0,0 +1,69 @@ +## API Report File for "@backstage/plugin-devtools-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BasicPermission } from '@backstage/plugin-permission-common'; +import { JsonObject } from '@backstage/types'; + +// @alpha (undocumented) +export const devToolsTaskSchedulerCreatePermission: BasicPermission; + +// @alpha (undocumented) +export const devToolsTaskSchedulerReadPermission: BasicPermission; + +// @alpha (undocumented) +export type ScheduledTasks = { + scheduledTasks?: TaskApiTasksResponse[]; + error?: string; +}; + +// @alpha +export interface TaskApiTasksResponse { + // (undocumented) + pluginId: string; + // (undocumented) + scope: 'global' | 'local'; + // (undocumented) + settings: { + version: number; + } & JsonObject; + // (undocumented) + taskId: string; + // (undocumented) + taskState: + | { + status: 'running'; + startedAt: string; + timesOutAt?: string; + lastRunError?: string; + lastRunEndedAt?: string; + } + | { + status: 'idle'; + startsAt?: string; + lastRunError?: string; + lastRunEndedAt?: string; + } + | null; + // (undocumented) + workerState: + | { + status: 'initial-wait'; + } + | { + status: 'idle'; + } + | { + status: 'running'; + } + | null; +} + +// @alpha (undocumented) +export type TriggerScheduledTask = { + error?: string; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/devtools-common/report.api.md b/plugins/devtools-common/report.api.md index 87abc3f397..25743fce7f 100644 --- a/plugins/devtools-common/report.api.md +++ b/plugins/devtools-common/report.api.md @@ -4,7 +4,6 @@ ```ts import { BasicPermission } from '@backstage/plugin-permission-common'; -import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; // @public (undocumented) @@ -45,12 +44,6 @@ export const devToolsInfoReadPermission: BasicPermission; // @public export const devToolsPermissions: BasicPermission[]; -// @public (undocumented) -export const devToolsTaskSchedulerCreatePermission: BasicPermission; - -// @public (undocumented) -export const devToolsTaskSchedulerReadPermission: BasicPermission; - // @public (undocumented) export type Endpoint = { name: string; @@ -90,57 +83,4 @@ export type PackageDependency = { name: string; versions: string; }; - -// @public (undocumented) -export type ScheduledTasks = { - scheduledTasks?: TaskApiTasksResponse[]; - error?: string; -}; - -// @public -export interface TaskApiTasksResponse { - // (undocumented) - pluginId: string; - // (undocumented) - scope: 'global' | 'local'; - // (undocumented) - settings: { - version: number; - } & JsonObject; - // (undocumented) - taskId: string; - // (undocumented) - taskState: - | { - status: 'running'; - startedAt: string; - timesOutAt?: string; - lastRunError?: string; - lastRunEndedAt?: string; - } - | { - status: 'idle'; - startsAt?: string; - lastRunError?: string; - lastRunEndedAt?: string; - } - | null; - // (undocumented) - workerState: - | { - status: 'initial-wait'; - } - | { - status: 'idle'; - } - | { - status: 'running'; - } - | null; -} - -// @public (undocumented) -export type TriggerScheduledTask = { - error?: string; -}; ``` diff --git a/plugins/devtools-common/src/alpha.ts b/plugins/devtools-common/src/alpha.ts new file mode 100644 index 0000000000..984967c4f3 --- /dev/null +++ b/plugins/devtools-common/src/alpha.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ +export { + devToolsTaskSchedulerReadPermission, + devToolsTaskSchedulerCreatePermission, +} from './permissions'; +export type { + ScheduledTasks, + TaskApiTasksResponse, + TriggerScheduledTask, +} from './types'; diff --git a/plugins/devtools-common/src/index.ts b/plugins/devtools-common/src/index.ts index be7426394b..88bc0d545f 100644 --- a/plugins/devtools-common/src/index.ts +++ b/plugins/devtools-common/src/index.ts @@ -20,5 +20,19 @@ * @packageDocumentation */ -export * from './types'; -export * from './permissions'; +export type { + ConfigError, + ConfigInfo, + DevToolsInfo, + Endpoint, + ExternalDependency, + PackageDependency, +} from './types'; +export { ExternalDependencyStatus } from './types'; +export { + devToolsAdministerPermission, + devToolsConfigReadPermission, + devToolsExternalDependenciesReadPermission, + devToolsInfoReadPermission, + devToolsPermissions, +} from './permissions'; diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index 1fefb5027a..0c93c0ff2a 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -49,7 +49,7 @@ export const devToolsExternalDependenciesReadPermission = createPermission({ }); /** - * @public + * @alpha */ export const devToolsTaskSchedulerReadPermission = createPermission({ name: 'devtools.task-scheduler', @@ -57,7 +57,7 @@ export const devToolsTaskSchedulerReadPermission = createPermission({ }); /** - * @public + * @alpha */ export const devToolsTaskSchedulerCreatePermission = createPermission({ name: 'devtools.task-scheduler', @@ -74,6 +74,4 @@ export const devToolsPermissions = [ devToolsInfoReadPermission, devToolsConfigReadPermission, devToolsExternalDependenciesReadPermission, - devToolsTaskSchedulerReadPermission, - devToolsTaskSchedulerCreatePermission, ]; diff --git a/plugins/devtools-common/src/types.ts b/plugins/devtools-common/src/types.ts index 3b700f31ae..dc35188fde 100644 --- a/plugins/devtools-common/src/types.ts +++ b/plugins/devtools-common/src/types.ts @@ -88,7 +88,7 @@ export type ConfigError = { * This is a duplication of the below: * @see https://github.com/backstage/backstage/blob/master/packages/backend-defaults/src/entrypoints/scheduler/lib/types.ts * - * @public + * @alpha */ export interface TaskApiTasksResponse { taskId: string; @@ -123,13 +123,13 @@ export interface TaskApiTasksResponse { | null; } -/** @public */ +/** @alpha */ export type ScheduledTasks = { scheduledTasks?: TaskApiTasksResponse[]; error?: string; }; -/** @public */ +/** @alpha */ export type TriggerScheduledTask = { error?: string; }; diff --git a/plugins/devtools/report.api.md b/plugins/devtools/report.api.md index e4cfe7ddde..80297f299b 100644 --- a/plugins/devtools/report.api.md +++ b/plugins/devtools/report.api.md @@ -9,7 +9,7 @@ import { JSX as JSX_2 } from 'react/jsx-runtime'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { TabProps } from '@material-ui/core/Tab'; -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; // @public (undocumented) export const ConfigContent: () => JSX_2.Element; diff --git a/plugins/devtools/src/api/DevToolsApi.ts b/plugins/devtools/src/api/DevToolsApi.ts index 4f58f013d4..4fc579ee06 100644 --- a/plugins/devtools/src/api/DevToolsApi.ts +++ b/plugins/devtools/src/api/DevToolsApi.ts @@ -19,9 +19,11 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, +} from '@backstage/plugin-devtools-common'; +import { ScheduledTasks, TriggerScheduledTask, -} from '@backstage/plugin-devtools-common'; +} from '@backstage/plugin-devtools-common/alpha'; export const devToolsApiRef = createApiRef({ id: 'plugin.devtools.service', diff --git a/plugins/devtools/src/api/DevToolsClient.ts b/plugins/devtools/src/api/DevToolsClient.ts index 5e13202099..cd4f53fa81 100644 --- a/plugins/devtools/src/api/DevToolsClient.ts +++ b/plugins/devtools/src/api/DevToolsClient.ts @@ -19,9 +19,11 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, +} from '@backstage/plugin-devtools-common'; +import { ScheduledTasks, TriggerScheduledTask, -} from '@backstage/plugin-devtools-common'; +} from '@backstage/plugin-devtools-common/alpha'; import { ResponseError } from '@backstage/errors'; import { DevToolsApi } from './DevToolsApi'; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx index b26abca221..a29e1eb10e 100644 --- a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import Box from '@material-ui/core/Box'; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx index 29822b90f9..2d4abd56ef 100644 --- a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx @@ -22,18 +22,23 @@ import Tooltip from '@material-ui/core/Tooltip'; import Autocomplete from '@material-ui/lab/Autocomplete'; import TextField from '@material-ui/core/TextField'; import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; -import { Progress, Table, TableColumn } from '@backstage/core-components'; +import { + ErrorPanel, + Progress, + Table, + TableColumn, +} from '@backstage/core-components'; import Alert from '@material-ui/lab/Alert'; import { useScheduledTasks, useTriggerScheduledTask } from '../../../hooks'; -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; import { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api'; import RefreshIcon from '@material-ui/icons/Refresh'; import NightsStay from '@material-ui/icons/NightsStay'; -import Error from '@material-ui/icons/Error'; +import ErrorIcon from '@material-ui/icons/Error'; import CircularProgress from '@material-ui/core/CircularProgress'; import { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel'; import { RequirePermission } from '@backstage/plugin-permission-react'; -import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common'; +import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common/alpha'; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -141,7 +146,7 @@ export const ScheduledTasksContent = () => { return ( {rowData.taskState?.lastRunError && ( - + )} {rowData.taskId} @@ -197,11 +202,9 @@ export const ScheduledTasksContent = () => { { triggerTask(selectedPlugin, rowData.taskId); - if (isTriggering) { - ; - } if (triggerError) { alertApi.post({ message: `Error triggering task ${rowData.taskId}: ${error}`, @@ -252,11 +255,30 @@ export const ScheduledTasksContent = () => { {loading && } {error && ( - - The plugin ID "{selectedPlugin}" doesn't have any scheduled tasks or - may contain a typo. Please verify the plugin ID is correct and that - the plugin has registered scheduled tasks. - + + + The plugin ID "{selectedPlugin}" doesn't have any scheduled tasks or + may contain a typo. + + + Please verify: + +
    +
  • + + The plugin ID is spelled correctly + +
  • +
  • + + The plugin has registered scheduled tasks + +
  • +
+
)} {!loading && !error && ( diff --git a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx index 11cba0213b..d706fe44e7 100644 --- a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx +++ b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx @@ -17,9 +17,8 @@ import { devToolsConfigReadPermission, devToolsInfoReadPermission, - devToolsTaskSchedulerReadPermission, } from '@backstage/plugin-devtools-common'; - +import { devToolsTaskSchedulerReadPermission } from '@backstage/plugin-devtools-common/alpha'; import { ConfigContent } from '../Content/ConfigContent'; import { DevToolsLayout } from '../DevToolsLayout'; import { InfoContent } from '../Content/InfoContent';