diff --git a/plugins/home/README.md b/plugins/home/README.md index af3b3a12f6..d70667e886 100644 --- a/plugins/home/README.md +++ b/plugins/home/README.md @@ -274,8 +274,8 @@ documentation for more information. Bellow you can see an example for two option // packages/app/src/apis.ts // ... import { - CoreStorageVisitsApi, - LocalStoreVisitsApi, + VisitsStorageApi, + VisitsWebStorageApi, visitsApiRef, } from '@backstage/plugin-home'; // ... @@ -288,17 +288,17 @@ export const apis: AnyApiFactory[] = [ identityApi: identityApiRef, }, factory: ({ storageApi, identityApi }) => - CoreStorageVisitsApi.create({ storageApi, identityApi }), + VisitsStorageApi.create({ storageApi, identityApi }), }), - // Or a local data implementation, relies on WebStorage implementation of storageApi + // Or a localStorage data implementation, relies on WebStorage implementation of storageApi createApiFactory({ api: visitsApiRef, deps: { identityApi: identityApiRef, errorApi: errorApiRef }, - factory: ({ identityApi, errorApi }) => LocalStoreVisitsApi.create({ identityApi, errorApi }), + factory: ({ identityApi, errorApi }) => VisitsWebStorageApi.create({ identityApi, errorApi }), }), // ... ``` @@ -308,14 +308,14 @@ See the example usage: ```ts // packages/app/src/App.tsx -import { VisitsListener } from '@backstage/plugin-home'; +import { VisitListener } from '@backstage/plugin-home'; // ... export default app.createRoot( <> - + {routes} , diff --git a/plugins/home/api-report.md b/plugins/home/api-report.md index 5da8f912a5..e3f789c2af 100644 --- a/plugins/home/api-report.md +++ b/plugins/home/api-report.md @@ -77,21 +77,6 @@ export const ComponentTabs: (props: { }[]; }) => JSX_2.Element; -// @public -export class CoreStorageVisitsApi implements VisitsApi { - // (undocumented) - static create(options: CoreStorageVisitsApiOptions): CoreStorageVisitsApi; - list(queryParams?: VisitsApiQueryParams): Promise; - save(saveParams: VisitsApiSaveParams): Promise; -} - -// @public (undocumented) -export type CoreStorageVisitsApiOptions = { - limit?: number; - storageApi: StorageApi; - identityApi: IdentityApi; -}; - // @public @deprecated (undocumented) export const createCardExtension: typeof createCardExtension_2; @@ -179,19 +164,6 @@ export type LayoutConfiguration = { resizable?: boolean; }; -// @public -export class LocalStorageVisitsApi { - // (undocumented) - static create(options: LocalStorageVisitsApiOptions): CoreStorageVisitsApi; -} - -// @public (undocumented) -export type LocalStorageVisitsApiOptions = { - limit?: number; - identityApi: IdentityApi; - errorApi: ErrorApi; -}; - // @public @deprecated (undocumented) export type RendererProps = RendererProps_2; @@ -289,6 +261,34 @@ export type VisitsApiSaveParams = { visit: Omit; }; +// @public +export class VisitsStorageApi implements VisitsApi { + // (undocumented) + static create(options: VisitsStorageApiOptions): VisitsStorageApi; + list(queryParams?: VisitsApiQueryParams): Promise; + save(saveParams: VisitsApiSaveParams): Promise; +} + +// @public (undocumented) +export type VisitsStorageApiOptions = { + limit?: number; + storageApi: StorageApi; + identityApi: IdentityApi; +}; + +// @public +export class VisitsWebStorageApi { + // (undocumented) + static create(options: VisitsWebStorageApiOptions): VisitsStorageApi; +} + +// @public (undocumented) +export type VisitsWebStorageApiOptions = { + limit?: number; + identityApi: IdentityApi; + errorApi: ErrorApi; +}; + // @public export const WelcomeTitle: ({ language, diff --git a/plugins/home/src/api/CoreStorageVisitsApi.test.ts b/plugins/home/src/api/VisitsStorageApi.test.ts similarity index 97% rename from plugins/home/src/api/CoreStorageVisitsApi.test.ts rename to plugins/home/src/api/VisitsStorageApi.test.ts index 9118b2546b..6faeb62350 100644 --- a/plugins/home/src/api/CoreStorageVisitsApi.test.ts +++ b/plugins/home/src/api/VisitsStorageApi.test.ts @@ -15,11 +15,11 @@ */ import { BackstageUserIdentity, IdentityApi } from '@backstage/core-plugin-api'; -import { CoreStorageVisitsApi } from './CoreStorageVisitsApi'; +import { VisitsStorageApi } from './VisitsStorageApi'; import { MockStorageApi } from '@backstage/test-utils'; import { Visit, VisitsApi } from './VisitsApi'; -describe('CoreStorageVisitsApi.create', () => { +describe('VisitsStorageApi.create', () => { const mockRandomUUID = () => '068f3129-7440-4e0e-8fd4-xxxxxxxxxxxx'.replace( /x/g, @@ -46,7 +46,7 @@ describe('CoreStorageVisitsApi.create', () => { }); it('instantiates', () => { - const api = CoreStorageVisitsApi.create({ + const api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, }); @@ -55,7 +55,7 @@ describe('CoreStorageVisitsApi.create', () => { describe('.save()', () => { it('saves a visit', async () => { - const api = CoreStorageVisitsApi.create({ + const api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, }); @@ -72,7 +72,7 @@ describe('CoreStorageVisitsApi.create', () => { }); it('can control the number of stored entities', async () => { - const api = CoreStorageVisitsApi.create({ + const api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, limit: 2, @@ -106,7 +106,7 @@ describe('CoreStorageVisitsApi.create', () => { }); it('correctly bumps the hits from a previous visit', async () => { - const api = CoreStorageVisitsApi.create({ + const api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, }); @@ -135,7 +135,7 @@ describe('CoreStorageVisitsApi.create', () => { let baseDate: number; beforeEach(() => { - api = CoreStorageVisitsApi.create({ + api = VisitsStorageApi.create({ storageApi: MockStorageApi.create(), identityApi: mockIdentityApi, }); diff --git a/plugins/home/src/api/CoreStorageVisitsApi.ts b/plugins/home/src/api/VisitsStorageApi.ts similarity index 92% rename from plugins/home/src/api/CoreStorageVisitsApi.ts rename to plugins/home/src/api/VisitsStorageApi.ts index 2707a50b87..daf24d716b 100644 --- a/plugins/home/src/api/CoreStorageVisitsApi.ts +++ b/plugins/home/src/api/VisitsStorageApi.ts @@ -22,7 +22,7 @@ import { } from './VisitsApi'; /** @public */ -export type CoreStorageVisitsApiOptions = { +export type VisitsStorageApiOptions = { limit?: number; storageApi: StorageApi; identityApi: IdentityApi; @@ -36,18 +36,17 @@ type ArrayElement = A extends readonly (infer T)[] ? T : never; * Beware that filtering and ordering are done in memory therefore it is * prudent to keep limit to a reasonable size. */ -export class CoreStorageVisitsApi implements VisitsApi { - private readonly randomUUID = window.crypto.randomUUID; +export class VisitsStorageApi implements VisitsApi { private readonly limit: number; private readonly storageApi: StorageApi; private readonly storageKeyPrefix = '@backstage/plugin-home:visits'; private readonly identityApi: IdentityApi; - static create(options: CoreStorageVisitsApiOptions) { - return new CoreStorageVisitsApi(options); + static create(options: VisitsStorageApiOptions) { + return new VisitsStorageApi(options); } - private constructor(options: CoreStorageVisitsApiOptions) { + private constructor(options: VisitsStorageApiOptions) { this.limit = Math.abs(options.limit ?? 100); this.storageApi = options.storageApi; this.identityApi = options.identityApi; @@ -95,7 +94,7 @@ export class CoreStorageVisitsApi implements VisitsApi { const visit: Visit = { ...saveParams.visit, - id: this.randomUUID(), + id: window.crypto.randomUUID(), hits: 1, timestamp: Date.now(), }; diff --git a/plugins/home/src/api/LocalStorageVisitsApi.test.ts b/plugins/home/src/api/VisitsWebStorageApi.test.ts similarity index 91% rename from plugins/home/src/api/LocalStorageVisitsApi.test.ts rename to plugins/home/src/api/VisitsWebStorageApi.test.ts index b646af209e..1cf1fa3129 100644 --- a/plugins/home/src/api/LocalStorageVisitsApi.test.ts +++ b/plugins/home/src/api/VisitsWebStorageApi.test.ts @@ -15,9 +15,9 @@ */ import { BackstageUserIdentity, IdentityApi } from '@backstage/core-plugin-api'; -import { LocalStorageVisitsApi } from './LocalStorageVisitsApi'; +import { VisitsWebStorageApi } from './VisitsWebStorageApi'; -describe('LocalStorageVisitsApi.create()', () => { +describe('VisitsWebStorageApi.create()', () => { const mockRandomUUID = () => '068f3129-7440-4e0e-8fd4-xxxxxxxxxxxx'.replace( /x/g, @@ -44,7 +44,7 @@ describe('LocalStorageVisitsApi.create()', () => { }); it('instantiates with only identitiyApi', () => { - const api = LocalStorageVisitsApi.create({ + const api = VisitsWebStorageApi.create({ identityApi: mockIdentityApi, errorApi: mockErrorApi, }); @@ -52,7 +52,7 @@ describe('LocalStorageVisitsApi.create()', () => { }); it('saves a visit', async () => { - const api = LocalStorageVisitsApi.create({ + const api = VisitsWebStorageApi.create({ identityApi: mockIdentityApi, errorApi: mockErrorApi, }); @@ -69,7 +69,7 @@ describe('LocalStorageVisitsApi.create()', () => { }); it('retrieves visits', async () => { - const api = LocalStorageVisitsApi.create({ + const api = VisitsWebStorageApi.create({ identityApi: mockIdentityApi, errorApi: mockErrorApi, }); diff --git a/plugins/home/src/api/LocalStorageVisitsApi.ts b/plugins/home/src/api/VisitsWebStorageApi.ts similarity index 81% rename from plugins/home/src/api/LocalStorageVisitsApi.ts rename to plugins/home/src/api/VisitsWebStorageApi.ts index 01d57b93d9..56b3ae53c5 100644 --- a/plugins/home/src/api/LocalStorageVisitsApi.ts +++ b/plugins/home/src/api/VisitsWebStorageApi.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { ErrorApi, IdentityApi } from '@backstage/core-plugin-api'; -import { CoreStorageVisitsApi } from './CoreStorageVisitsApi'; +import { VisitsStorageApi } from './VisitsStorageApi'; import { WebStorage } from '@backstage/core-app-api'; /** @public */ -export type LocalStorageVisitsApiOptions = { +export type VisitsWebStorageApiOptions = { limit?: number; identityApi: IdentityApi; errorApi: ErrorApi; @@ -28,9 +28,9 @@ export type LocalStorageVisitsApiOptions = { * @public * This is a reference implementation of VisitsApi using WebStorage. */ -export class LocalStorageVisitsApi { - static create(options: LocalStorageVisitsApiOptions) { - return CoreStorageVisitsApi.create({ +export class VisitsWebStorageApi { + static create(options: VisitsWebStorageApiOptions) { + return VisitsStorageApi.create({ limit: options.limit, identityApi: options.identityApi, storageApi: WebStorage.create({ errorApi: options.errorApi }), diff --git a/plugins/home/src/api/index.ts b/plugins/home/src/api/index.ts index 50b48e3204..944fa65330 100644 --- a/plugins/home/src/api/index.ts +++ b/plugins/home/src/api/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export * from './CoreStorageVisitsApi'; -export * from './LocalStorageVisitsApi'; +export * from './VisitsStorageApi'; +export * from './VisitsWebStorageApi'; export * from './VisitsApi'; diff --git a/plugins/home/src/plugin.ts b/plugins/home/src/plugin.ts index 3bbfd9d544..d4ed401c86 100644 --- a/plugins/home/src/plugin.ts +++ b/plugins/home/src/plugin.ts @@ -25,7 +25,7 @@ import { import { createCardExtension } from '@backstage/plugin-home-react'; import { ToolkitContentProps, VisitedByTypeProps } from './homePageComponents'; import { rootRouteRef } from './routes'; -import { CoreStorageVisitsApi, visitsApiRef } from './api'; +import { VisitsStorageApi, visitsApiRef } from './api'; /** @public */ export const homePlugin = createPlugin({ @@ -38,7 +38,7 @@ export const homePlugin = createPlugin({ identityApi: identityApiRef, }, factory: ({ storageApi, identityApi }) => - CoreStorageVisitsApi.create({ storageApi, identityApi }), + VisitsStorageApi.create({ storageApi, identityApi }), }), ], routes: {