chore: more work for migrating

Signed-off-by: blam <ben@blam.sh>
This commit is contained in:
blam
2024-08-08 11:30:24 +02:00
parent 8d5049b5a5
commit 7a4eb9bcb5
3 changed files with 119 additions and 6 deletions
@@ -0,0 +1,66 @@
/*
* Copyright 2024 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 { createExtensionInput } from '../wiring';
import { ApiBlueprint } from './ApiBlueprint';
import { createApiFactory, createApiRef } from '@backstage/core-plugin-api';
describe('ApiBlueprint', () => {
it('should create an extension with sensible defaults', () => {
const api = createApiRef<{ foo: string }>({ id: 'test' });
const factory = createApiFactory({
api,
deps: {},
factory: () => ({ foo: 'bar' }),
});
const extension = ApiBlueprint.make({
params: {
factory,
},
});
expect(extension).toMatchInlineSnapshot();
});
it('should create an extension with custom factory', () => {
const api = createApiRef<{ foo: string }>({ id: 'test' });
const factory = jest.fn(() => ({ foo: 'bar' }));
const extension = ApiBlueprint.make({
config: {
schema: {
test: z => z.string().default('test'),
},
},
inputs: {
test: createExtensionInput([ApiBlueprint.dataRefs.factory]),
},
factory(originalFactory, { config: _config, inputs: _inputs }) {
return originalFactory({
api,
factory: () =>
createApiFactory({
api,
deps: {},
factory,
}),
});
},
});
expect(extension).toMatchInlineSnapshot();
});
});
@@ -0,0 +1,50 @@
/*
* Copyright 2024 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 { createExtensionBlueprint } from '../wiring';
import { createApiExtension } from './createApiExtension';
import { AnyApiFactory, AnyApiRef } from '@backstage/core-plugin-api';
export const ApiBlueprint = createExtensionBlueprint({
kind: 'api',
attachTo: { id: 'app', input: 'apis' },
output: [createApiExtension.factoryDataRef],
dataRefs: {
factory: createApiExtension.factoryDataRef,
},
*factory(
params: // remove this form.
| {
api: AnyApiRef;
factory: (params: unknown) => AnyApiFactory;
}
| {
factory: AnyApiFactory;
},
{ config, inputs },
) {
yield createApiExtension.factoryDataRef(
typeof params.factory === 'function'
? params.factory({ config, inputs })
: params.factory,
);
},
namespace: params => {
const apiRef =
'api' in params ? params.api : (params.factory as { api: AnyApiRef }).api;
return apiRef.id;
},
});
@@ -38,16 +38,13 @@ export const PageBlueprint = createExtensionBlueprint({
routeRef,
}: {
defaultPath?: string;
loader: (opts: {
config: typeof config;
inputs: typeof inputs;
}) => Promise<JSX.Element>;
loader: () => Promise<JSX.Element>;
routeRef?: RouteRef;
},
{ config, inputs, node },
{ config, node },
) {
const ExtensionComponent = lazy(() =>
loader({ config, inputs }).then(element => ({ default: () => element })),
loader().then(element => ({ default: () => element })),
);
yield coreExtensionData.routePath(config.path ?? defaultPath!);