diff --git a/workspaces/bulk-import/.changeset/promote-nfs-stable.md b/workspaces/bulk-import/.changeset/promote-nfs-stable.md new file mode 100644 index 00000000000..9f2f51f9a94 --- /dev/null +++ b/workspaces/bulk-import/.changeset/promote-nfs-stable.md @@ -0,0 +1,35 @@ +--- +'@red-hat-developer-hub/backstage-plugin-bulk-import': major +--- + +**BREAKING**: Graduated the New Frontend System (NFS) bulk-import plugin to stable API. +The NFS plugin (`createFrontendPlugin`) has been promoted from the `./alpha` subpath to the primary `.` entry point. The `./alpha` subpath now only exports translations. Legacy (OFS) exports (`bulkImportPlugin`, `BulkImportPage`, `BulkImportSidebarItem`, `BulkImportIcon`) have been moved to the new `./legacy` subpath. + +**Migration for NFS consumers (previously using `./alpha`):** + +```diff +- import bulkImportPlugin, { bulkImportTranslationsModule } from '@red-hat-developer-hub/backstage-plugin-bulk-import/alpha'; ++ import bulkImportPlugin, { bulkImportTranslationsModule } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; +``` + +**Migration for OFS consumers:** + +```diff +- import { BulkImportPage } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; ++ import { BulkImportPage } from '@red-hat-developer-hub/backstage-plugin-bulk-import/legacy'; +``` + +**Migration for dynamic plugin configurations:** + +Legacy exports require `module: Legacy` — they are not available on the default module. + +```yaml +dynamicPlugins: + frontend: + red-hat-developer-hub.backstage-plugin-bulk-import: + # Legacy exports require `module: Legacy` + dynamicRoutes: + - path: /bulk-import + importName: BulkImportPage + module: Legacy +``` diff --git a/workspaces/bulk-import/.prettierignore b/workspaces/bulk-import/.prettierignore index cf1d155e2ff..3e4ad8c60b8 100644 --- a/workspaces/bulk-import/.prettierignore +++ b/workspaces/bulk-import/.prettierignore @@ -5,6 +5,7 @@ coverage .eslintrc.js report.api.md report-alpha.api.md +report-legacy.api.md # Generated plugins/bulk-import-backend/api-docs diff --git a/workspaces/bulk-import/packages/app-legacy/src/App.tsx b/workspaces/bulk-import/packages/app-legacy/src/App.tsx index fdbc049f883..54c8ccf488a 100644 --- a/workspaces/bulk-import/packages/app-legacy/src/App.tsx +++ b/workspaces/bulk-import/packages/app-legacy/src/App.tsx @@ -50,7 +50,10 @@ import { OrchestratorPage, orchestratorTranslations, } from '@red-hat-developer-hub/backstage-plugin-orchestrator'; -import { BulkImportPage } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; +import { + BulkImportPage, + bulkImportTranslations, +} from '@red-hat-developer-hub/backstage-plugin-bulk-import/legacy'; import { getThemes } from '@red-hat-developer-hub/backstage-plugin-theme'; import { SignalsDisplay } from '@backstage/plugin-signals'; import { RbacPage } from '@backstage-community/plugin-rbac'; @@ -59,7 +62,6 @@ import { apis } from './apis'; import { entityPage } from './components/catalog/EntityPage'; import { Root } from './components/Root'; import { searchPage } from './components/search/SearchPage'; -import { bulkImportTranslations } from '@red-hat-developer-hub/backstage-plugin-bulk-import/alpha'; const app = createApp({ apis, diff --git a/workspaces/bulk-import/packages/app-legacy/src/components/Root/Root.tsx b/workspaces/bulk-import/packages/app-legacy/src/components/Root/Root.tsx index 1f1bab580e8..64c14add686 100644 --- a/workspaces/bulk-import/packages/app-legacy/src/components/Root/Root.tsx +++ b/workspaces/bulk-import/packages/app-legacy/src/components/Root/Root.tsx @@ -41,7 +41,7 @@ import MenuIcon from '@mui/icons-material/Menu'; import GroupIcon from '@mui/icons-material/People'; import SearchIcon from '@mui/icons-material/Search'; import Box from '@mui/material/Box'; -import { BulkImportSidebarItem } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; +import { BulkImportSidebarItem } from '@red-hat-developer-hub/backstage-plugin-bulk-import/legacy'; import { LogoFull, LogoIcon, diff --git a/workspaces/bulk-import/packages/app/src/App.tsx b/workspaces/bulk-import/packages/app/src/App.tsx index 5bb9dba2ae8..d2ac037797a 100644 --- a/workspaces/bulk-import/packages/app/src/App.tsx +++ b/workspaces/bulk-import/packages/app/src/App.tsx @@ -32,7 +32,7 @@ import { navModule } from './modules/nav'; // Import the new frontend system plugin for bulk-import import bulkImportPlugin, { bulkImportTranslationsModule, -} from '@red-hat-developer-hub/backstage-plugin-bulk-import/alpha'; +} from '@red-hat-developer-hub/backstage-plugin-bulk-import'; // Import core Backstage plugins (NFS versions) import catalogPlugin from '@backstage/plugin-catalog/alpha'; diff --git a/workspaces/bulk-import/plugins/bulk-import/.prettierignore b/workspaces/bulk-import/plugins/bulk-import/.prettierignore index fc8357d99e3..5cb436588d2 100644 --- a/workspaces/bulk-import/plugins/bulk-import/.prettierignore +++ b/workspaces/bulk-import/plugins/bulk-import/.prettierignore @@ -10,3 +10,6 @@ renovate.json dist-dynamic dist-scalprum playwright-report +report.api.md +report-alpha.api.md +report-legacy.api.md diff --git a/workspaces/bulk-import/plugins/bulk-import/README.md b/workspaces/bulk-import/plugins/bulk-import/README.md index 5d1b0978db6..33a1f64962c 100644 --- a/workspaces/bulk-import/plugins/bulk-import/README.md +++ b/workspaces/bulk-import/plugins/bulk-import/README.md @@ -11,7 +11,9 @@ This plugin allows bulk import of multiple catalog entities into the catalog. The sections below are relevant for static plugins. If the plugin is expected to be installed as a dynamic one: - Follow https://github.com/janus-idp/backstage-showcase/blob/main/showcase-docs/dynamic-plugins.md#installing-a-dynamic-plugin-package-in-the-showcase -- Add content of `app-config.janus-idp.yaml` into `app-config.local.yaml`. +- Add content of `app-config.yaml` into `app-config.local.yaml`. + +> **Important:** Dynamic plugin configurations must now use `module: Legacy` instead of `module: BulkImportPlugin`. See the `app-config.yaml` in this plugin for the updated configuration. #### Prerequisites @@ -46,7 +48,7 @@ g, user:default/, role:default/team_a ```tsx title="packages/app/src/App.tsx" /* highlight-add-next-line */ - import { BulkImportPage } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; + import { BulkImportPage } from '@red-hat-developer-hub/backstage-plugin-bulk-import/legacy'; ... /* highlight-add-start */ , role:default/team_a ```tsx title="packages/app/src/components/Root/Root.tsx" /* highlight-add-next-line */ - import { BulkImportSidebarItem } from '@red-hat-developer-hub/backstage-plugin-bulk-import'; + import { BulkImportSidebarItem } from '@red-hat-developer-hub/backstage-plugin-bulk-import/legacy'; export const Root = ({ children }: PropsWithChildren<{}>) => ( @@ -74,6 +76,8 @@ g, user:default/, role:default/team_a ); ``` +> **Note:** The main entry point (`@red-hat-developer-hub/backstage-plugin-bulk-import`) now exports the New Frontend System (NFS) plugin. Legacy (OFS) consumers must use the `./legacy` subpath. + ## On Behalf of User Access The Bulk Import plugin can fetch repository and organization listings **on behalf of the signed-in user** using their OAuth credentials, so that users see only the repositories and organizations they personally have access to. @@ -117,16 +121,19 @@ Refer to the Backstage documentation for [GitHub auth](https://backstage.io/docs ## New Frontend System -If you're using Backstage's new frontend system, add the plugin to your app: +The main entry point (`@red-hat-developer-hub/backstage-plugin-bulk-import`) exports the New Frontend System (NFS) plugin as the default export. Add it to your app: ```tsx // packages/app/src/App.tsx -import bulkImportPlugin from '@red-hat-developer-hub/backstage-plugin-bulk-import/alpha'; +import bulkImportPlugin, { + bulkImportTranslationsModule, +} from '@red-hat-developer-hub/backstage-plugin-bulk-import'; export default createApp({ features: [ // ...other plugins bulkImportPlugin, + bulkImportTranslationsModule, ], }); ``` @@ -135,6 +142,7 @@ The plugin will automatically provide: - Bulk Import page at `/bulk-import` with all existing features - A "Bulk import" navigation item in the sidebar +- Translations support (via `bulkImportTranslationsModule`) ### Extensions diff --git a/workspaces/bulk-import/plugins/bulk-import/app-config.yaml b/workspaces/bulk-import/plugins/bulk-import/app-config.yaml index 5ca41765cab..5e753b1dedd 100644 --- a/workspaces/bulk-import/plugins/bulk-import/app-config.yaml +++ b/workspaces/bulk-import/plugins/bulk-import/app-config.yaml @@ -1,14 +1,15 @@ dynamicPlugins: frontend: red-hat-developer-hub.backstage-plugin-bulk-import: + # Legacy exports require `module: Legacy` — they are not available on the default module. appIcons: - name: bulkImportIcon - module: BulkImportPlugin + module: Legacy importName: BulkImportIcon dynamicRoutes: - path: /bulk-import importName: BulkImportPage - module: BulkImportPlugin + module: Legacy menuItem: icon: bulkImportIcon text: Bulk import diff --git a/workspaces/bulk-import/plugins/bulk-import/dev/index.tsx b/workspaces/bulk-import/plugins/bulk-import/dev/index.tsx index f1da21f1a24..08c6dc4cf43 100644 --- a/workspaces/bulk-import/plugins/bulk-import/dev/index.tsx +++ b/workspaces/bulk-import/plugins/bulk-import/dev/index.tsx @@ -52,7 +52,7 @@ import MenuItem from '@mui/material/MenuItem'; import { rhdhThemeModule } from '@red-hat-developer-hub/backstage-plugin-theme/alpha'; -import bulkImportPlugin, { bulkImportTranslationsModule } from '../src/alpha'; +import bulkImportPlugin, { bulkImportTranslationsModule } from '../src'; import { bulkImportApiRef, mockBulkImportApi, @@ -60,18 +60,9 @@ import { mockConfigApi, } from './mocks'; -const bulkImportDevModule = createFrontendModule({ - pluginId: 'bulk-import', +const appDevOverrides = createFrontendModule({ + pluginId: 'app', extensions: [ - ApiBlueprint.make({ - name: 'bulk-import-mock', - params: defineParams => - defineParams({ - api: bulkImportApiRef, - deps: {}, - factory: () => mockBulkImportApi, - }), - }), ApiBlueprint.make({ name: 'config-mock', params: defineParams => @@ -102,6 +93,21 @@ const bulkImportDevModule = createFrontendModule({ ], }); +const bulkImportDevModule = createFrontendModule({ + pluginId: 'bulk-import', + extensions: [ + ApiBlueprint.make({ + name: 'bulk-import-mock', + params: defineParams => + defineParams({ + api: bulkImportApiRef, + deps: {}, + factory: () => mockBulkImportApi, + }), + }), + ], +}); + function ThemeIcon({ active, icon, @@ -216,6 +222,7 @@ const app = createApp({ bulkImportPlugin, bulkImportTranslationsModule, bulkImportDevModule, + appDevOverrides, rhdhThemeModule, devNavModule, ], diff --git a/workspaces/bulk-import/plugins/bulk-import/package.json b/workspaces/bulk-import/plugins/bulk-import/package.json index 886220829cc..65b508abe3f 100644 --- a/workspaces/bulk-import/plugins/bulk-import/package.json +++ b/workspaces/bulk-import/plugins/bulk-import/package.json @@ -5,14 +5,18 @@ "types": "src/index.ts", "license": "Apache-2.0", "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.tsx", + ".": "./src/index.tsx", + "./alpha": "./src/alpha.ts", + "./legacy": "./src/legacyExports.ts", "./package.json": "./package.json" }, "typesVersions": { "*": { "alpha": [ - "src/alpha.tsx" + "src/alpha.ts" + ], + "legacy": [ + "src/legacyExports.ts" ], "package.json": [ "package.json" @@ -97,6 +101,13 @@ "prettier": "3.8.4", "react": "16.13.1 || ^17.0.0 || ^18.0.0" }, + "scalprum": { + "name": "red-hat-developer-hub.backstage-plugin-bulk-import", + "exposedModules": { + "PluginRoot": "./src/index.tsx", + "Legacy": "./src/legacyExports.ts" + } + }, "configSchema": "config.d.ts", "files": [ "dist", diff --git a/workspaces/bulk-import/plugins/bulk-import/report-alpha.api.md b/workspaces/bulk-import/plugins/bulk-import/report-alpha.api.md index 9f9e7d7a28c..4a65d80b2fb 100644 --- a/workspaces/bulk-import/plugins/bulk-import/report-alpha.api.md +++ b/workspaces/bulk-import/plugins/bulk-import/report-alpha.api.md @@ -3,20 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AnyApiFactory } from '@backstage/frontend-plugin-api'; -import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; -import { ApiFactory } from '@backstage/frontend-plugin-api'; -import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; -import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; -import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; -import { ExtensionInput } from '@backstage/frontend-plugin-api'; -import { FrontendModule } from '@backstage/frontend-plugin-api'; -import { IconElement } from '@backstage/frontend-plugin-api'; -import { JSX as JSX_2 } from 'react'; -import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; -import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; -import { RouteRef } from '@backstage/frontend-plugin-api'; -import { SubRouteRef } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/frontend-plugin-api'; import { TranslationResource } from '@backstage/frontend-plugin-api'; @@ -225,114 +211,6 @@ export const bulkImportTranslationRef: TranslationRef< // @public export const bulkImportTranslations: TranslationResource<'plugin.bulk-import'>; -// @public -export const bulkImportTranslationsModule: FrontendModule; - -// @public -const _default: OverridableFrontendPlugin< - { - root: RouteRef; - tasks: SubRouteRef<{ - repoUrl: string; - }>; - }, - {}, - { - 'api:bulk-import': OverridableExtensionDefinition<{ - kind: 'api'; - name: undefined; - config: {}; - configInput: {}; - output: ExtensionDataRef; - inputs: {}; - params: < - TApi, - TImpl extends TApi, - TDeps extends { [name in string]: unknown }, - >( - params: ApiFactory, - ) => ExtensionBlueprintParams; - }>; - 'page:bulk-import': OverridableExtensionDefinition<{ - kind: 'page'; - name: undefined; - config: { - path: string | undefined; - title: string | undefined; - }; - configInput: { - path?: string | undefined; - title?: string | undefined; - }; - output: - | ExtensionDataRef - | ExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - > - | ExtensionDataRef - | ExtensionDataRef< - string, - 'core.title', - { - optional: true; - } - > - | ExtensionDataRef< - IconElement, - 'core.icon', - { - optional: true; - } - >; - inputs: { - pages: ExtensionInput< - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'core.title', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - IconElement, - 'core.icon', - { - optional: true; - } - >, - { - singleton: false; - optional: false; - internal: false; - } - >; - }; - params: { - path: string; - title?: string; - icon?: IconElement; - loader?: () => Promise; - routeRef?: RouteRef; - noHeader?: boolean; - }; - }>; - } ->; -export default _default; - // @public (undocumented) export type Messages = typeof bulkImportTranslationRef.T; diff --git a/workspaces/bulk-import/plugins/bulk-import/report-legacy.api.md b/workspaces/bulk-import/plugins/bulk-import/report-legacy.api.md new file mode 100644 index 00000000000..d813d4f37eb --- /dev/null +++ b/workspaces/bulk-import/plugins/bulk-import/report-legacy.api.md @@ -0,0 +1,242 @@ +## API Report File for "@red-hat-developer-hub/backstage-plugin-bulk-import" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { JSX as JSX_2 } from 'react/jsx-runtime'; +import { PathParams } from '@backstage/core-plugin-api'; +import { RouteRef } from '@backstage/core-plugin-api'; +import { SubRouteRef } from '@backstage/core-plugin-api'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; +import { TranslationResource } from '@backstage/frontend-plugin-api'; + +// @public +export const BulkImportIcon: () => JSX_2.Element; + +// @public +export const BulkImportPage: () => JSX_2.Element; + +// @public +export const bulkImportPlugin: BackstagePlugin< + { + root: RouteRef; + tasks: SubRouteRef>; + }, + {}, + {} +>; + +// @public +export const BulkImportSidebarItem: () => JSX_2.Element | null; + +// @public +export const bulkImportTranslationRef: TranslationRef< + 'plugin.bulk-import', + { + readonly 'table.headers.name': string; + readonly 'table.headers.group': string; + readonly 'table.headers.status': string; + readonly 'table.headers.url': string; + readonly 'table.headers.organization': string; + readonly 'table.headers.repoUrl': string; + readonly 'table.headers.organizationGroup': string; + readonly 'table.headers.taskStatus': string; + readonly 'table.headers.lastUpdated': string; + readonly 'table.headers.actions': string; + readonly 'table.headers.catalogInfoYaml': string; + readonly 'table.pagination.rows5': string; + readonly 'table.pagination.rows10': string; + readonly 'table.pagination.rows20': string; + readonly 'table.pagination.rows50': string; + readonly 'table.pagination.rows100': string; + readonly 'time.daysAgo': string; + readonly 'time.hoursAgo': string; + readonly 'time.minutesAgo': string; + readonly 'time.secondsAgo': string; + readonly 'page.title': string; + readonly 'page.subtitle': string; + readonly 'page.addRepositoriesTitle': string; + readonly 'page.importEntitiesTitle': string; + readonly 'page.addRepositoriesSubtitle': string; + readonly 'page.importEntitiesSubtitle': string; + readonly 'page.typeLink': string; + readonly 'status.alreadyImported': string; + readonly 'status.added': string; + readonly 'status.waitingForApproval': string; + readonly 'status.imported': string; + readonly 'status.readyToImport': string; + readonly 'status.waitingForPullRequestToStart': string; + readonly 'status.missingConfigurations': string; + readonly 'status.failedCreatingPR': string; + readonly 'status.pullRequestRejected': string; + readonly 'repositories.pr': string; + readonly 'repositories.addedRepositories': string; + readonly 'repositories.importedEntities': string; + readonly 'repositories.addedRepositoriesCount': string; + readonly 'repositories.importedEntitiesCount': string; + readonly 'repositories.noRecordsFound': string; + readonly 'repositories.noProjectsFound': string; + readonly 'repositories.logInToViewProjects': string; + readonly 'repositories.logInToViewRepositories': string; + readonly 'repositories.refresh': string; + readonly 'repositories.import': string; + readonly 'repositories.removing': string; + readonly 'repositories.deleteRepository': string; + readonly 'repositories.removeRepositoryQuestion': string; + readonly 'repositories.repositoryText': string; + readonly 'repositories.removeRepositoryWarningScaffolder': string; + readonly 'repositories.removeRepositoryWarningOrchestrator': string; + readonly 'repositories.removeRepositoryWarning': string; + readonly 'repositories.removeRepositoryWarningGitlab': string; + readonly 'repositories.cannotRemoveRepositoryUrl': string; + readonly 'repositories.unableToRemoveRepository': string; + readonly 'repositories.removeTooltipDisabled': string; + readonly 'repositories.removeTooltipRepositoryScaffolder': string; + readonly 'repositories.removeTooltipRepositoryOrchestrator': string; + readonly 'repositories.errorOccuredWhileFetching': string; + readonly 'repositories.failedToCreatePullRequest': string; + readonly 'repositories.errorOccured': string; + readonly 'repositories.editCatalogInfoTooltip': string; + readonly 'repositories.viewCatalogInfoTooltip': string; + readonly 'sidebar.bulkImport': string; + readonly 'permissions.title': string; + readonly 'permissions.addRepositoriesMessage': string; + readonly 'permissions.viewRepositoriesMessage': string; + readonly 'errors.failedToCreatePullRequest': string; + readonly 'errors.prErrorPermissions': string; + readonly 'errors.catalogInfoExists': string; + readonly 'errors.catalogEntityConflict': string; + readonly 'errors.repoEmpty': string; + readonly 'errors.codeOwnersNotFound': string; + readonly 'errors.errorOccurred': string; + readonly 'errors.noIntegrationsConfigured': string; + readonly 'errors.addIntegrationsToConfig': string; + readonly 'validation.componentNameInvalid': string; + readonly 'validation.componentNameRequired': string; + readonly 'validation.entityOwnerRequired': string; + readonly 'validation.titleRequired': string; + readonly 'validation.descriptionRequired': string; + readonly 'validation.keyValuePairFormat': string; + readonly 'steps.chooseApprovalTool': string; + readonly 'steps.chooseRepositories': string; + readonly 'steps.chooseItems': string; + readonly 'steps.generateCatalogInfo': string; + readonly 'steps.generateCatalogInfoItems': string; + readonly 'steps.editPullRequest': string; + readonly 'steps.trackStatus': string; + readonly 'addRepositories.approvalTool.title': string; + readonly 'addRepositories.approvalTool.tooltip': string; + readonly 'addRepositories.approvalTool.github': string; + readonly 'addRepositories.approvalTool.gitlab': string; + readonly 'addRepositories.approvalTool.description': string; + readonly 'addRepositories.generateCatalogInfo': string; + readonly 'addRepositories.editPullRequest': string; + readonly 'addRepositories.repositoryType.title': string; + readonly 'addRepositories.repositoryType.group': string; + readonly 'addRepositories.repositoryType.repository': string; + readonly 'addRepositories.repositoryType.organization': string; + readonly 'addRepositories.repositoryType.project': string; + readonly 'addRepositories.searchPlaceholder': string; + readonly 'addRepositories.clearSearch': string; + readonly 'addRepositories.noRepositoriesFound': string; + readonly 'addRepositories.allRepositoriesAdded': string; + readonly 'addRepositories.noSelection': string; + readonly 'addRepositories.selectRepositories': string; + readonly 'addRepositories.selectedRepositories': string; + readonly 'addRepositories.selectedProjects': string; + readonly 'addRepositories.selectedLabel': string; + readonly 'addRepositories.selectedCount': string; + readonly 'addRepositories.addSelected': string; + readonly 'addRepositories.preview': string; + readonly 'catalogInfo.status.generating': string; + readonly 'common.select': string; + readonly 'common.filter': string; + readonly 'common.view': string; + readonly 'common.import': string; + readonly 'common.add': string; + readonly 'common.cancel': string; + readonly 'common.close': string; + readonly 'common.delete': string; + readonly 'common.documentation': string; + readonly 'common.edit': string; + readonly 'common.remove': string; + readonly 'common.save': string; + readonly 'common.update': string; + readonly 'previewFile.preview': string; + readonly 'previewFile.previewFile': string; + readonly 'previewFile.previewFiles': string; + readonly 'previewFile.failedToCreatePR': string; + readonly 'previewFile.prCreationUnsuccessful': string; + readonly 'previewFile.failedToFetchPR': string; + readonly 'previewFile.invalidEntityYaml': string; + readonly 'previewFile.pullRequestPendingApproval': string; + readonly 'previewFile.pullRequestText': string; + readonly 'previewFile.viewRepository': string; + readonly 'previewFile.closeDrawer': string; + readonly 'previewFile.keyValuePlaceholder': string; + readonly 'previewFile.useSemicolonSeparator': string; + readonly 'previewFile.pullRequest.details': string; + readonly 'previewFile.pullRequest.title': string; + readonly 'previewFile.pullRequest.mergeRequest': string; + readonly 'previewFile.pullRequest.serviceNowTicket': string; + readonly 'previewFile.pullRequest.titleLabel': string; + readonly 'previewFile.pullRequest.bodyLabel': string; + readonly 'previewFile.pullRequest.titlePlaceholder': string; + readonly 'previewFile.pullRequest.bodyPlaceholder': string; + readonly 'previewFile.pullRequest.entityConfiguration': string; + readonly 'previewFile.pullRequest.componentNameLabel': string; + readonly 'previewFile.pullRequest.componentNamePlaceholder': string; + readonly 'previewFile.pullRequest.entityOwnerLabel': string; + readonly 'previewFile.pullRequest.entityOwnerPlaceholder': string; + readonly 'previewFile.pullRequest.entityOwnerHelper': string; + readonly 'previewFile.pullRequest.loadingText': string; + readonly 'previewFile.pullRequest.previewEntities': string; + readonly 'previewFile.pullRequest.annotations': string; + readonly 'previewFile.pullRequest.labels': string; + readonly 'previewFile.pullRequest.spec': string; + readonly 'previewFile.pullRequest.useCodeOwnersFile': string; + readonly 'previewFile.pullRequest.codeOwnersWarning': string; + readonly 'forms.footer.createServiceNowTicket': string; + readonly 'forms.footer.createServiceNowTickets': string; + readonly 'forms.footer.createPullRequest': string; + readonly 'forms.footer.createPullRequests': string; + readonly 'forms.footer.selectRepositoryTooltip': string; + readonly 'forms.footer.serviceNowTooltip': string; + readonly 'forms.footer.importTooltip': string; + readonly 'forms.footer.pullRequestTooltip': string; + readonly 'tasks.tasksFor': string; + readonly 'tasks.taskId': string; + readonly 'tasks.taskLink': string; + readonly 'tasks.viewTask': string; + readonly 'tasks.taskCancelled': string; + readonly 'tasks.taskCompleted': string; + readonly 'tasks.taskFailed': string; + readonly 'tasks.taskOpen': string; + readonly 'tasks.taskProcessing': string; + readonly 'tasks.taskSkipped': string; + readonly 'workflows.workflowsFor': string; + readonly 'workflows.workflowId': string; + readonly 'workflows.workflowLink': string; + readonly 'workflows.viewWorkflow': string; + readonly 'workflows.workflowPending': string; + readonly 'workflows.workflowActive': string; + readonly 'workflows.workflowCompleted': string; + readonly 'workflows.workflowAborted': string; + readonly 'workflows.workflowError': string; + readonly 'workflows.workflowFetchError': string; + readonly 'workflows.workflowSuspended': string; + readonly 'importActions.loading': string; + readonly 'importActions.errorFetchingData': string; + readonly 'importActions.noActions': string; + } +>; + +// @public +export const bulkImportTranslations: TranslationResource<'plugin.bulk-import'>; + +// @public (undocumented) +export type Messages = typeof bulkImportTranslationRef.T; + +// (No @packageDocumentation comment for this package) +``` diff --git a/workspaces/bulk-import/plugins/bulk-import/report.api.md b/workspaces/bulk-import/plugins/bulk-import/report.api.md index c31bb1f7cb1..9f9e7d7a28c 100644 --- a/workspaces/bulk-import/plugins/bulk-import/report.api.md +++ b/workspaces/bulk-import/plugins/bulk-import/report.api.md @@ -3,30 +3,338 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { JSX as JSX_2 } from 'react/jsx-runtime'; -import { PathParams } from '@backstage/core-plugin-api'; -import { RouteRef } from '@backstage/core-plugin-api'; -import { SubRouteRef } from '@backstage/core-plugin-api'; +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; +import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; +import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionInput } from '@backstage/frontend-plugin-api'; +import { FrontendModule } from '@backstage/frontend-plugin-api'; +import { IconElement } from '@backstage/frontend-plugin-api'; +import { JSX as JSX_2 } from 'react'; +import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; +import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; +import { RouteRef } from '@backstage/frontend-plugin-api'; +import { SubRouteRef } from '@backstage/frontend-plugin-api'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; +import { TranslationResource } from '@backstage/frontend-plugin-api'; // @public -export const BulkImportIcon: () => JSX_2.Element; +export const bulkImportTranslationRef: TranslationRef< + 'plugin.bulk-import', + { + readonly 'table.headers.name': string; + readonly 'table.headers.group': string; + readonly 'table.headers.status': string; + readonly 'table.headers.url': string; + readonly 'table.headers.organization': string; + readonly 'table.headers.repoUrl': string; + readonly 'table.headers.organizationGroup': string; + readonly 'table.headers.taskStatus': string; + readonly 'table.headers.lastUpdated': string; + readonly 'table.headers.actions': string; + readonly 'table.headers.catalogInfoYaml': string; + readonly 'table.pagination.rows5': string; + readonly 'table.pagination.rows10': string; + readonly 'table.pagination.rows20': string; + readonly 'table.pagination.rows50': string; + readonly 'table.pagination.rows100': string; + readonly 'time.daysAgo': string; + readonly 'time.hoursAgo': string; + readonly 'time.minutesAgo': string; + readonly 'time.secondsAgo': string; + readonly 'page.title': string; + readonly 'page.subtitle': string; + readonly 'page.addRepositoriesTitle': string; + readonly 'page.importEntitiesTitle': string; + readonly 'page.addRepositoriesSubtitle': string; + readonly 'page.importEntitiesSubtitle': string; + readonly 'page.typeLink': string; + readonly 'status.alreadyImported': string; + readonly 'status.added': string; + readonly 'status.waitingForApproval': string; + readonly 'status.imported': string; + readonly 'status.readyToImport': string; + readonly 'status.waitingForPullRequestToStart': string; + readonly 'status.missingConfigurations': string; + readonly 'status.failedCreatingPR': string; + readonly 'status.pullRequestRejected': string; + readonly 'repositories.pr': string; + readonly 'repositories.addedRepositories': string; + readonly 'repositories.importedEntities': string; + readonly 'repositories.addedRepositoriesCount': string; + readonly 'repositories.importedEntitiesCount': string; + readonly 'repositories.noRecordsFound': string; + readonly 'repositories.noProjectsFound': string; + readonly 'repositories.logInToViewProjects': string; + readonly 'repositories.logInToViewRepositories': string; + readonly 'repositories.refresh': string; + readonly 'repositories.import': string; + readonly 'repositories.removing': string; + readonly 'repositories.deleteRepository': string; + readonly 'repositories.removeRepositoryQuestion': string; + readonly 'repositories.repositoryText': string; + readonly 'repositories.removeRepositoryWarningScaffolder': string; + readonly 'repositories.removeRepositoryWarningOrchestrator': string; + readonly 'repositories.removeRepositoryWarning': string; + readonly 'repositories.removeRepositoryWarningGitlab': string; + readonly 'repositories.cannotRemoveRepositoryUrl': string; + readonly 'repositories.unableToRemoveRepository': string; + readonly 'repositories.removeTooltipDisabled': string; + readonly 'repositories.removeTooltipRepositoryScaffolder': string; + readonly 'repositories.removeTooltipRepositoryOrchestrator': string; + readonly 'repositories.errorOccuredWhileFetching': string; + readonly 'repositories.failedToCreatePullRequest': string; + readonly 'repositories.errorOccured': string; + readonly 'repositories.editCatalogInfoTooltip': string; + readonly 'repositories.viewCatalogInfoTooltip': string; + readonly 'sidebar.bulkImport': string; + readonly 'permissions.title': string; + readonly 'permissions.addRepositoriesMessage': string; + readonly 'permissions.viewRepositoriesMessage': string; + readonly 'errors.failedToCreatePullRequest': string; + readonly 'errors.prErrorPermissions': string; + readonly 'errors.catalogInfoExists': string; + readonly 'errors.catalogEntityConflict': string; + readonly 'errors.repoEmpty': string; + readonly 'errors.codeOwnersNotFound': string; + readonly 'errors.errorOccurred': string; + readonly 'errors.noIntegrationsConfigured': string; + readonly 'errors.addIntegrationsToConfig': string; + readonly 'validation.componentNameInvalid': string; + readonly 'validation.componentNameRequired': string; + readonly 'validation.entityOwnerRequired': string; + readonly 'validation.titleRequired': string; + readonly 'validation.descriptionRequired': string; + readonly 'validation.keyValuePairFormat': string; + readonly 'steps.chooseApprovalTool': string; + readonly 'steps.chooseRepositories': string; + readonly 'steps.chooseItems': string; + readonly 'steps.generateCatalogInfo': string; + readonly 'steps.generateCatalogInfoItems': string; + readonly 'steps.editPullRequest': string; + readonly 'steps.trackStatus': string; + readonly 'addRepositories.approvalTool.title': string; + readonly 'addRepositories.approvalTool.tooltip': string; + readonly 'addRepositories.approvalTool.github': string; + readonly 'addRepositories.approvalTool.gitlab': string; + readonly 'addRepositories.approvalTool.description': string; + readonly 'addRepositories.generateCatalogInfo': string; + readonly 'addRepositories.editPullRequest': string; + readonly 'addRepositories.repositoryType.title': string; + readonly 'addRepositories.repositoryType.group': string; + readonly 'addRepositories.repositoryType.repository': string; + readonly 'addRepositories.repositoryType.organization': string; + readonly 'addRepositories.repositoryType.project': string; + readonly 'addRepositories.searchPlaceholder': string; + readonly 'addRepositories.clearSearch': string; + readonly 'addRepositories.noRepositoriesFound': string; + readonly 'addRepositories.allRepositoriesAdded': string; + readonly 'addRepositories.noSelection': string; + readonly 'addRepositories.selectRepositories': string; + readonly 'addRepositories.selectedRepositories': string; + readonly 'addRepositories.selectedProjects': string; + readonly 'addRepositories.selectedLabel': string; + readonly 'addRepositories.selectedCount': string; + readonly 'addRepositories.addSelected': string; + readonly 'addRepositories.preview': string; + readonly 'catalogInfo.status.generating': string; + readonly 'common.select': string; + readonly 'common.filter': string; + readonly 'common.view': string; + readonly 'common.import': string; + readonly 'common.add': string; + readonly 'common.cancel': string; + readonly 'common.close': string; + readonly 'common.delete': string; + readonly 'common.documentation': string; + readonly 'common.edit': string; + readonly 'common.remove': string; + readonly 'common.save': string; + readonly 'common.update': string; + readonly 'previewFile.preview': string; + readonly 'previewFile.previewFile': string; + readonly 'previewFile.previewFiles': string; + readonly 'previewFile.failedToCreatePR': string; + readonly 'previewFile.prCreationUnsuccessful': string; + readonly 'previewFile.failedToFetchPR': string; + readonly 'previewFile.invalidEntityYaml': string; + readonly 'previewFile.pullRequestPendingApproval': string; + readonly 'previewFile.pullRequestText': string; + readonly 'previewFile.viewRepository': string; + readonly 'previewFile.closeDrawer': string; + readonly 'previewFile.keyValuePlaceholder': string; + readonly 'previewFile.useSemicolonSeparator': string; + readonly 'previewFile.pullRequest.details': string; + readonly 'previewFile.pullRequest.title': string; + readonly 'previewFile.pullRequest.mergeRequest': string; + readonly 'previewFile.pullRequest.serviceNowTicket': string; + readonly 'previewFile.pullRequest.titleLabel': string; + readonly 'previewFile.pullRequest.bodyLabel': string; + readonly 'previewFile.pullRequest.titlePlaceholder': string; + readonly 'previewFile.pullRequest.bodyPlaceholder': string; + readonly 'previewFile.pullRequest.entityConfiguration': string; + readonly 'previewFile.pullRequest.componentNameLabel': string; + readonly 'previewFile.pullRequest.componentNamePlaceholder': string; + readonly 'previewFile.pullRequest.entityOwnerLabel': string; + readonly 'previewFile.pullRequest.entityOwnerPlaceholder': string; + readonly 'previewFile.pullRequest.entityOwnerHelper': string; + readonly 'previewFile.pullRequest.loadingText': string; + readonly 'previewFile.pullRequest.previewEntities': string; + readonly 'previewFile.pullRequest.annotations': string; + readonly 'previewFile.pullRequest.labels': string; + readonly 'previewFile.pullRequest.spec': string; + readonly 'previewFile.pullRequest.useCodeOwnersFile': string; + readonly 'previewFile.pullRequest.codeOwnersWarning': string; + readonly 'forms.footer.createServiceNowTicket': string; + readonly 'forms.footer.createServiceNowTickets': string; + readonly 'forms.footer.createPullRequest': string; + readonly 'forms.footer.createPullRequests': string; + readonly 'forms.footer.selectRepositoryTooltip': string; + readonly 'forms.footer.serviceNowTooltip': string; + readonly 'forms.footer.importTooltip': string; + readonly 'forms.footer.pullRequestTooltip': string; + readonly 'tasks.tasksFor': string; + readonly 'tasks.taskId': string; + readonly 'tasks.taskLink': string; + readonly 'tasks.viewTask': string; + readonly 'tasks.taskCancelled': string; + readonly 'tasks.taskCompleted': string; + readonly 'tasks.taskFailed': string; + readonly 'tasks.taskOpen': string; + readonly 'tasks.taskProcessing': string; + readonly 'tasks.taskSkipped': string; + readonly 'workflows.workflowsFor': string; + readonly 'workflows.workflowId': string; + readonly 'workflows.workflowLink': string; + readonly 'workflows.viewWorkflow': string; + readonly 'workflows.workflowPending': string; + readonly 'workflows.workflowActive': string; + readonly 'workflows.workflowCompleted': string; + readonly 'workflows.workflowAborted': string; + readonly 'workflows.workflowError': string; + readonly 'workflows.workflowFetchError': string; + readonly 'workflows.workflowSuspended': string; + readonly 'importActions.loading': string; + readonly 'importActions.errorFetchingData': string; + readonly 'importActions.noActions': string; + } +>; + +// @public +export const bulkImportTranslations: TranslationResource<'plugin.bulk-import'>; // @public -export const BulkImportPage: () => JSX_2.Element; +export const bulkImportTranslationsModule: FrontendModule; // @public -export const bulkImportPlugin: BackstagePlugin< +const _default: OverridableFrontendPlugin< { root: RouteRef; - tasks: SubRouteRef>; + tasks: SubRouteRef<{ + repoUrl: string; + }>; }, {}, - {} + { + 'api:bulk-import': OverridableExtensionDefinition<{ + kind: 'api'; + name: undefined; + config: {}; + configInput: {}; + output: ExtensionDataRef; + inputs: {}; + params: < + TApi, + TImpl extends TApi, + TDeps extends { [name in string]: unknown }, + >( + params: ApiFactory, + ) => ExtensionBlueprintParams; + }>; + 'page:bulk-import': OverridableExtensionDefinition<{ + kind: 'page'; + name: undefined; + config: { + path: string | undefined; + title: string | undefined; + }; + configInput: { + path?: string | undefined; + title?: string | undefined; + }; + output: + | ExtensionDataRef + | ExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + > + | ExtensionDataRef + | ExtensionDataRef< + string, + 'core.title', + { + optional: true; + } + > + | ExtensionDataRef< + IconElement, + 'core.icon', + { + optional: true; + } + >; + inputs: { + pages: ExtensionInput< + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'core.title', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + IconElement, + 'core.icon', + { + optional: true; + } + >, + { + singleton: false; + optional: false; + internal: false; + } + >; + }; + params: { + path: string; + title?: string; + icon?: IconElement; + loader?: () => Promise; + routeRef?: RouteRef; + noHeader?: boolean; + }; + }>; + } >; +export default _default; -// @public -export const BulkImportSidebarItem: () => JSX_2.Element | null; +// @public (undocumented) +export type Messages = typeof bulkImportTranslationRef.T; // (No @packageDocumentation comment for this package) ``` diff --git a/workspaces/bulk-import/plugins/bulk-import/src/alpha.ts b/workspaces/bulk-import/plugins/bulk-import/src/alpha.ts new file mode 100644 index 00000000000..0b9bb1f8b7d --- /dev/null +++ b/workspaces/bulk-import/plugins/bulk-import/src/alpha.ts @@ -0,0 +1,17 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 * from './translations'; diff --git a/workspaces/bulk-import/plugins/bulk-import/src/alpha.tsx b/workspaces/bulk-import/plugins/bulk-import/src/index.tsx similarity index 87% rename from workspaces/bulk-import/plugins/bulk-import/src/alpha.tsx rename to workspaces/bulk-import/plugins/bulk-import/src/index.tsx index 69bb431f440..1f3d05852e2 100644 --- a/workspaces/bulk-import/plugins/bulk-import/src/alpha.tsx +++ b/workspaces/bulk-import/plugins/bulk-import/src/index.tsx @@ -34,19 +34,12 @@ import { import BulkImportIcon from './components/BulkImportIcon'; import { bulkImportTranslations } from './translations'; -// NFS Route References - created using @backstage/frontend-plugin-api -// These are separate from the legacy route refs in routes.ts const rootRouteRef = createRouteRef(); const importHistoryRouteRef = createSubRouteRef({ parent: rootRouteRef, path: '/import-history/:repoUrl', }); -/** - * API Extension - * - * Provides the BulkImportAPI for communicating with the bulk-import backend. - */ const bulkImportApi = ApiBlueprint.make({ params: defineParams => defineParams( @@ -63,11 +56,6 @@ const bulkImportApi = ApiBlueprint.make({ ), }); -/** - * Page Extension - * - * Provides the main bulk import page at /bulk-import path. - */ const bulkImportPage = PageBlueprint.make({ params: { title: 'Bulk import', @@ -110,4 +98,9 @@ export const bulkImportTranslationsModule = createFrontendModule({ ], }); -export * from './translations'; +export { + bulkImportTranslationRef, + bulkImportTranslations, +} from './translations'; + +export type { Messages } from './translations'; diff --git a/workspaces/bulk-import/plugins/bulk-import/src/index.ts b/workspaces/bulk-import/plugins/bulk-import/src/legacyExports.ts similarity index 87% rename from workspaces/bulk-import/plugins/bulk-import/src/index.ts rename to workspaces/bulk-import/plugins/bulk-import/src/legacyExports.ts index 93d27b78172..6d9c6aa3b10 100644 --- a/workspaces/bulk-import/plugins/bulk-import/src/index.ts +++ b/workspaces/bulk-import/plugins/bulk-import/src/legacyExports.ts @@ -29,3 +29,10 @@ export { } from './plugin'; export { default as BulkImportIcon } from './components/BulkImportIcon'; + +export { + bulkImportTranslations, + bulkImportTranslationRef, +} from './translations'; + +export type { Messages } from './translations';