diff --git a/.changeset/chilly-meals-sniff.md b/.changeset/chilly-meals-sniff.md new file mode 100644 index 0000000000..6776f93154 --- /dev/null +++ b/.changeset/chilly-meals-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-test-utils': patch +--- + +Disable the built-in `SignInPage` in `createExtensionTester` in order to not mess with existing tests diff --git a/.changeset/pretty-pans-exist.md b/.changeset/pretty-pans-exist.md new file mode 100644 index 0000000000..e9ccdda0e0 --- /dev/null +++ b/.changeset/pretty-pans-exist.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app': patch +--- + +Added missing default `SignInPageExtension` which by default uses guest auth, missing `ApiExtensions` for `scmAuth` diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 79adc13daf..1992d5b35f 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -26,7 +26,6 @@ import homePlugin, { import { coreExtensionData, createExtension, - ApiBlueprint, createFrontendModule, } from '@backstage/frontend-plugin-api'; import { @@ -41,14 +40,7 @@ import { convertLegacyApp } from '@backstage/core-compat-api'; import { FlatRoutes } from '@backstage/core-app-api'; import { Route } from 'react-router'; import { CatalogImportPage } from '@backstage/plugin-catalog-import'; -import { createApiFactory, configApiRef } from '@backstage/core-plugin-api'; -import { - ScmAuth, - ScmIntegrationsApi, - scmIntegrationsApiRef, -} from '@backstage/integration-react'; import kubernetesPlugin from '@backstage/plugin-kubernetes/alpha'; -import { signInPageModule } from './overrides/SignInPage'; import { convertLegacyPlugin } from '@backstage/core-compat-api'; import { convertLegacyPageExtension } from '@backstage/core-compat-api'; import { convertLegacyEntityContentExtension } from '@backstage/plugin-catalog-react/alpha'; @@ -118,28 +110,6 @@ const customHomePageModule = createFrontendModule({ ], }); -const scmModule = createFrontendModule({ - pluginId: 'app', - extensions: [ - ApiBlueprint.make({ - name: 'scm-auth', - params: { - factory: ScmAuth.createDefaultApiFactory(), - }, - }), - ApiBlueprint.make({ - name: 'scm-integrations', - params: { - factory: createApiFactory({ - api: scmIntegrationsApiRef, - deps: { configApi: configApiRef }, - factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), - }), - }, - }), - ], -}); - const notFoundErrorPageModule = createFrontendModule({ pluginId: 'app', extensions: [notFoundErrorPage], @@ -159,8 +129,6 @@ const app = createApp({ homePlugin, appVisualizerPlugin, kubernetesPlugin, - signInPageModule, - scmModule, notFoundErrorPageModule, customHomePageModule, ...collectedLegacyPlugins, diff --git a/packages/app-next/src/index-public-experimental.tsx b/packages/app-next/src/index-public-experimental.tsx index f258a660e3..16535dae98 100644 --- a/packages/app-next/src/index-public-experimental.tsx +++ b/packages/app-next/src/index-public-experimental.tsx @@ -15,11 +15,8 @@ */ import ReactDOM from 'react-dom/client'; -import { signInPageModule } from './overrides/SignInPage'; import { createPublicSignInApp } from '@backstage/frontend-defaults'; -const app = createPublicSignInApp({ - features: [signInPageModule], -}); +const app = createPublicSignInApp(); ReactDOM.createRoot(document.getElementById('root')!).render(app.createRoot()); diff --git a/packages/frontend-defaults/src/createApp.test.tsx b/packages/frontend-defaults/src/createApp.test.tsx index 06872a5691..899d5d1640 100644 --- a/packages/frontend-defaults/src/createApp.test.tsx +++ b/packages/frontend-defaults/src/createApp.test.tsx @@ -29,9 +29,17 @@ import { CreateAppFeatureLoader, createApp } from './createApp'; import { mockApis, renderWithEffects } from '@backstage/test-utils'; import React from 'react'; import { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api'; -import appPlugin from '@backstage/plugin-app'; +import { default as appPluginOriginal } from '@backstage/plugin-app'; describe('createApp', () => { + const appPlugin = appPluginOriginal.withOverrides({ + extensions: [ + appPluginOriginal + .getExtension('sign-in-page:app') + .override({ disabled: true }), + ], + }); + it('should allow themes to be installed', async () => { const app = createApp({ configLoader: async () => ({ @@ -98,6 +106,7 @@ describe('createApp', () => { }), ], }), + appPlugin, ], }); @@ -231,6 +240,7 @@ describe('createApp', () => { const app = createApp({ configLoader: async () => ({ config: mockApis.config() }), features: [ + appPlugin, createFrontendPlugin({ id: 'my-plugin', extensions: [ @@ -277,6 +287,8 @@ describe('createApp', () => { + + themes [ @@ -317,6 +329,9 @@ describe('createApp', () => { ] + signInPage [ + + ] ] diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.tsx index e53566a118..7f03921077 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.tsx @@ -96,6 +96,9 @@ const NavItem = (props: { const appPluginOverride = appPlugin.withOverrides({ extensions: [ + appPlugin.getExtension('sign-in-page:app').override({ + disabled: true, + }), appPlugin.getExtension('app/nav').override({ output: [coreExtensionData.reactElement], factory(_originalFactory, { inputs }) { diff --git a/plugins/app/package.json b/plugins/app/package.json index d45f08b5df..a14e1eab43 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -40,6 +40,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", + "@backstage/integration-react": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.9.13", diff --git a/plugins/app/report.api.md b/plugins/app/report.api.md index 1ff398a346..208f9dcfb0 100644 --- a/plugins/app/report.api.md +++ b/plugins/app/report.api.md @@ -383,6 +383,21 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'sign-in-page:app': ExtensionDefinition<{ + kind: 'sign-in-page'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + ComponentType, + 'core.sign-in-page.component', + {} + >; + inputs: {}; + params: { + loader: () => Promise>; + }; + }>; 'app-root-element:app/oauth-request-dialog': ExtensionDefinition<{ kind: 'app-root-element'; name: 'oauth-request-dialog'; @@ -705,6 +720,36 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:app/scm-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'scm-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/scm-integrations': ExtensionDefinition<{ + kind: 'api'; + name: 'scm-integrations'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; } >; export default appPlugin; diff --git a/plugins/app/src/defaultApis.ts b/plugins/app/src/defaultApis.ts index 85c89a6278..b4f6fa0b48 100644 --- a/plugins/app/src/defaultApis.ts +++ b/plugins/app/src/defaultApis.ts @@ -61,6 +61,11 @@ import { vmwareCloudAuthApiRef, } from '@backstage/core-plugin-api'; import { ApiBlueprint } from '@backstage/frontend-plugin-api'; +import { + ScmAuth, + ScmIntegrationsApi, + scmIntegrationsApiRef, +} from '@backstage/integration-react'; import { permissionApiRef, IdentityPermissionApi, @@ -380,4 +385,20 @@ export const apis = [ }), }, }), + ApiBlueprint.make({ + name: 'scm-auth', + params: { + factory: ScmAuth.createDefaultApiFactory(), + }, + }), + ApiBlueprint.make({ + name: 'scm-integrations', + params: { + factory: createApiFactory({ + api: scmIntegrationsApiRef, + deps: { configApi: configApiRef }, + factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), + }), + }, + }), ] as const; diff --git a/packages/app-next/src/overrides/SignInPage.tsx b/plugins/app/src/extensions/DefaultSignInPage.tsx similarity index 74% rename from packages/app-next/src/overrides/SignInPage.tsx rename to plugins/app/src/extensions/DefaultSignInPage.tsx index f1e37a241b..29b384c7a2 100644 --- a/packages/app-next/src/overrides/SignInPage.tsx +++ b/plugins/app/src/extensions/DefaultSignInPage.tsx @@ -13,23 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import React from 'react'; +import { SignInPageBlueprint } from '@backstage/frontend-plugin-api'; import { SignInPage } from '@backstage/core-components'; -import { - SignInPageBlueprint, - createFrontendModule, -} from '@backstage/frontend-plugin-api'; -const signInPage = SignInPageBlueprint.make({ - name: 'guest', +export const DefaultSignInPage = SignInPageBlueprint.make({ params: { loader: async () => props => , }, }); - -export const signInPageModule = createFrontendModule({ - pluginId: 'app', - extensions: [signInPage], -}); diff --git a/plugins/app/src/extensions/index.ts b/plugins/app/src/extensions/index.ts index 157f7ddb62..22b020a441 100644 --- a/plugins/app/src/extensions/index.ts +++ b/plugins/app/src/extensions/index.ts @@ -24,6 +24,7 @@ export { ComponentsApi } from './ComponentsApi'; export { IconsApi } from './IconsApi'; export { FeatureFlagsApi } from './FeatureFlagsApi'; export { TranslationsApi } from './TranslationsApi'; +export { DefaultSignInPage } from './DefaultSignInPage'; export { DefaultProgressComponent, DefaultErrorBoundaryComponent, diff --git a/plugins/app/src/plugin.ts b/plugins/app/src/plugin.ts index ff0c69faec..18c412bf77 100644 --- a/plugins/app/src/plugin.ts +++ b/plugins/app/src/plugin.ts @@ -34,6 +34,7 @@ import { DefaultErrorBoundaryComponent, oauthRequestDialogAppRootElement, alertDisplayAppRootElement, + DefaultSignInPage, } from './extensions'; import { apis } from './defaultApis'; @@ -58,6 +59,7 @@ export const appPlugin = createFrontendPlugin({ DefaultProgressComponent, DefaultNotFoundErrorPageComponent, DefaultErrorBoundaryComponent, + DefaultSignInPage, oauthRequestDialogAppRootElement, alertDisplayAppRootElement, ], diff --git a/yarn.lock b/yarn.lock index f8618cba94..f50c38ad17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4978,6 +4978,7 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" "@backstage/frontend-test-utils": "workspace:^" + "@backstage/integration-react": "workspace:^" "@backstage/plugin-permission-react": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": ^4.9.13