Merge pull request #30714 from backstage/rugvip/defineparams

frontend-plugin-api: switch naming recommendation from define to defineParams
This commit is contained in:
Patrik Oldsberg
2025-08-05 00:55:41 +02:00
committed by GitHub
41 changed files with 277 additions and 268 deletions
+3 -3
View File
@@ -4,7 +4,7 @@
**BREAKING**: The `ApiBlueprint` has been updated to use the new advanced type parameters through the new `defineParams` blueprint option. This is an immediate breaking change that requires all existing usages of `ApiBlueprint` to switch to the new callback format. Existing extensions created with the old format are still compatible with the latest version of the plugin API however, meaning that this does not break existing plugins.
To update existing usages of `ApiBlueprint`, you remove the outer level of the `params` object and replace `createApiFactory(...)` with `define => define(...)`.
To update existing usages of `ApiBlueprint`, you remove the outer level of the `params` object and replace `createApiFactory(...)` with `defineParams => defineParams(...)`.
For example, the following old usage:
@@ -28,8 +28,8 @@ is migrated to the following:
```ts
ApiBlueprint.make({
name: 'error',
params: define =>
define({
params: defineParams =>
defineParams({
api: errorApiRef,
deps: { alertApi: alertApiRef },
factory: ({ alertApi }) => {
+2 -2
View File
@@ -32,11 +32,11 @@ Usage of the above example looks as follows:
```ts
const example = ExampleBlueprint.make({
params: define => define({
params: defineParams => defineParams({
component: ...,
fetcher: ...,
}),
});
```
This `define => define(<params>)` is also known as the "callback syntax" and is required if a blueprint is created with the new `defineParams` option. The callback syntax can also optionally be used for other blueprints too, which means that it is not a breaking change to remove the `defineParams` option, as long as the external parameter types remain compatible.
This `defineParams => defineParams(<params>)` is also known as the "callback syntax" and is required if a blueprint is created with the new `defineParams` option. The callback syntax can also optionally be used for other blueprints too, which means that it is not a breaking change to remove the `defineParams` option, as long as the external parameter types remain compatible.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': patch
---
Updated the recommended naming of the blueprint param callback from `define` to `defineParams`, making the syntax `defineParams => defineParams(...)`.
@@ -62,14 +62,14 @@ Apart from the addition of the blueprint parameters of the first argument to the
### Creating an extension from a blueprint with advanced parameter types
Some blueprints may be defined with something known as "advanced parameter types". This is a feature that enables type inference and transform of the blueprint parameters, and the way that you pass the parameters look a little bit different. Rather than passing the parameters directly, they are instead passed as a callback function of the form `define => define(<params>)`.
Some blueprints may be defined with something known as "advanced parameter types". This is a feature that enables type inference and transform of the blueprint parameters, and the way that you pass the parameters look a little bit different. Rather than passing the parameters directly, they are instead passed as a callback function of the form `defineParams => defineParams(<params>)`.
An example of a blueprint that uses advanced parameter types is the `ApiBlueprint` blueprint. Using it to create a simple implementation for the `AlertApi` might look like this:
```ts
const alertApiBlueprint = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: alertApiRef,
deps: {},
factory: () => new MyAlertApi(),
@@ -82,8 +82,8 @@ This also works with `makeWithOverrides`, where the define callback is passed as
```ts
const alertApiBlueprint = ApiBlueprint.makeWithOverrides({
factory(originalFactory, { config }) {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: alertApiRef,
deps: {},
factory: () => new MyAlertApi(config),
@@ -199,8 +199,8 @@ import { ApiBlueprint } from '@backstage/frontend-plugin-api';
const scmIntegrationsApi = ApiBlueprint.make({
name: 'scm-integrations',
params: define =>
define({
params: defineParams =>
defineParams({
api: scmIntegrationsApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
@@ -160,8 +160,8 @@ import { exampleApiRef, DefaultExampleApi } from './api';
// highlight-add-start
const exampleApi = ApiBlueprint.make({
name: 'example',
params: define =>
define({
params: defineParams =>
defineParams({
api: exampleApiRef,
deps: {},
factory: () => new DefaultExampleApi(),
@@ -210,8 +210,8 @@ import { workApiRef } from '@internal/plugin-example-react';
import { WorkImpl } from './WorkImpl';
const exampleWorkApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: workApiRef,
deps: { storageApi: storageApiRef },
factory: ({ storageApi }) => new WorkImpl({ storageApi }),
@@ -62,8 +62,8 @@ class WorkImpl implements WorkApi {
const workApi = ApiBlueprint.make({
name: 'work',
params: define =>
define({
params: defineParams =>
defineParams({
api: workApiRef,
deps: { storageApi: storageApiRef },
factory: ({ storageApi }) => {
@@ -51,8 +51,8 @@ import {
import { MyApiImpl } from './MyApiImpl';
const myApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: myApiRef,
deps: {
configApi: configApiRef,
@@ -310,7 +310,7 @@ export function collectLegacyRoutes(
...Array.from(plugin.getApis()).map(factory =>
ApiBlueprint.make({
name: factory.api.id,
params: define => define(factory),
params: defineParams => defineParams(factory),
}),
),
],
@@ -232,8 +232,8 @@ describe('convertLegacyApp', () => {
const catalogOverride = catalogPlugin.withOverrides({
extensions: [
catalogPlugin.getExtension('api:catalog').override({
params: define =>
define({
params: defineParams =>
defineParams({
api: catalogApiRef,
deps: {},
factory: () =>
@@ -76,7 +76,7 @@ export function convertLegacyAppOptions(
const extensions: ExtensionDefinition[] = deduplicatedApis.map(factory =>
ApiBlueprint.make({
name: factory.api.id,
params: define => define(factory),
params: defineParams => defineParams(factory),
}),
);
@@ -31,7 +31,7 @@ export function convertLegacyPlugin(
const apiExtensions = Array.from(legacyPlugin.getApis()).map(factory =>
ApiBlueprint.make({
name: factory.api.id,
params: define => define(factory),
params: defineParams => defineParams(factory),
}),
);
return createFrontendPlugin({
@@ -144,8 +144,8 @@ describe('createSpecializedApp', () => {
],
}),
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: featureFlagsApiRef,
deps: {},
factory: () =>
@@ -253,8 +253,8 @@ describe('createSpecializedApp', () => {
pluginId: 'first',
extensions: [
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: analyticsApiRef,
deps: {},
factory: () => {
@@ -294,8 +294,8 @@ describe('createSpecializedApp', () => {
},
}),
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: analyticsApiRef,
deps: {},
factory: mockAnalyticsApi,
+24 -24
View File
@@ -505,7 +505,7 @@ export function createExtension<
// @public
export function createExtensionBlueprint<
TParams extends object | ExtensionBlueprintParamsDefiner,
TParams extends object | ExtensionBlueprintDefineParams,
UOutput extends ExtensionDataRef,
TInputs extends {
[inputName in string]: ExtensionInput<
@@ -557,7 +557,7 @@ export function createExtensionBlueprint<
// @public (undocumented)
export type CreateExtensionBlueprintOptions<
TKind extends string,
TParams extends object | ExtensionBlueprintParamsDefiner,
TParams extends object | ExtensionBlueprintDefineParams,
UOutput extends ExtensionDataRef,
TInputs extends {
[inputName in string]: ExtensionInput<
@@ -584,11 +584,11 @@ export type CreateExtensionBlueprintOptions<
config?: {
schema: TConfigSchema;
};
defineParams?: TParams extends ExtensionBlueprintParamsDefiner
defineParams?: TParams extends ExtensionBlueprintDefineParams
? TParams
: 'The defineParams option must be a function if provided, see the docs for details';
factory(
params: TParams extends ExtensionBlueprintParamsDefiner
params: TParams extends ExtensionBlueprintDefineParams
? ReturnType<TParams>['T']
: TParams,
context: {
@@ -912,10 +912,10 @@ export interface ExtensionBlueprint<
name?: TName;
attachTo?: ExtensionAttachToSpec;
disabled?: boolean;
params: TParamsInput extends ExtensionBlueprintParamsDefiner
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `<blueprint>.make({ params: define => define(<params>) })`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `<blueprint>.make({ params: defineParams => defineParams(<params>) })`'
: T['params'];
}): ExtensionDefinition<{
kind: T['kind'];
@@ -961,10 +961,10 @@ export interface ExtensionBlueprint<
originalFactory: <
TParamsInput extends AnyParamsInput_2<NonNullable<T['params']>>,
>(
params: TParamsInput extends ExtensionBlueprintParamsDefiner
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: T['params'],
context?: {
config?: T['config'];
@@ -1015,10 +1015,16 @@ export interface ExtensionBlueprint<
}>;
}
// @public
export type ExtensionBlueprintDefineParams<
TParams extends object = object,
TInput = any,
> = (params: TInput) => ExtensionBlueprintParams<TParams>;
// @public (undocumented)
export type ExtensionBlueprintParameters = {
kind: string;
params?: object | ExtensionBlueprintParamsDefiner;
params?: object | ExtensionBlueprintDefineParams;
configInput?: {
[K in string]: any;
};
@@ -1046,12 +1052,6 @@ export type ExtensionBlueprintParams<T extends object = object> = {
T: T;
};
// @public
export type ExtensionBlueprintParamsDefiner<
TParams extends object = object,
TInput = any,
> = (params: TInput) => ExtensionBlueprintParams<TParams>;
// @public (undocumented)
export function ExtensionBoundary(props: ExtensionBoundaryProps): JSX_2.Element;
@@ -1179,10 +1179,10 @@ export type ExtensionDefinition<
} & ([T['params']] extends [never]
? {}
: {
params?: TFactoryParamsReturn extends ExtensionBlueprintParamsDefiner
params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams
? TFactoryParamsReturn
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: Partial<T['params']>;
})
>,
@@ -1201,10 +1201,10 @@ export type ExtensionDefinition<
} & ([T['params']] extends [never]
? {}
: {
params?: TParamsInput extends ExtensionBlueprintParamsDefiner
params?: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: Partial<T['params']>;
})
> &
@@ -1255,7 +1255,7 @@ export type ExtensionDefinitionParameters = {
}
>;
};
params?: object | ExtensionBlueprintParamsDefiner;
params?: object | ExtensionBlueprintDefineParams;
};
// @public (undocumented)
@@ -23,8 +23,8 @@ describe('ApiBlueprint', () => {
const api = createApiRef<{ foo: string }>({ id: 'test' });
const extension = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api,
deps: {},
factory: () => ({ foo: 'bar' }),
@@ -63,13 +63,17 @@ describe('ApiBlueprint', () => {
expect('test').not.toBe('failing without assertions');
ApiBlueprint.make({
params: define =>
define({ api: fooApi, deps: {}, factory: () => ({ foo: 'foo' }) }),
params: defineParams =>
defineParams({
api: fooApi,
deps: {},
factory: () => ({ foo: 'foo' }),
}),
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: {},
// @ts-expect-error missing property
@@ -78,8 +82,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: {},
// @ts-expect-error wrong property
@@ -90,8 +94,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: {},
factory: () => ({
@@ -102,8 +106,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: { bar: barApi },
factory: ({ bar }) => ({ foo: bar.bar }),
@@ -111,8 +115,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: { bar: barApi },
factory: ({ bar }) => ({
@@ -123,8 +127,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: { bar: barApi },
factory: ({ bar }) => ({
@@ -135,8 +139,8 @@ describe('ApiBlueprint', () => {
});
ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: fooApi,
deps: {},
factory: ({ bar }) => ({
@@ -162,7 +166,9 @@ describe('ApiBlueprint', () => {
},
name: api.id,
factory(originalFactory, { config: _config, inputs: _inputs }) {
return originalFactory(define => define({ api, deps: {}, factory }));
return originalFactory(defineParams =>
defineParams({ api, deps: {}, factory }),
);
},
});
@@ -27,7 +27,7 @@ import { z } from 'zod';
import { createSchemaFromZod } from '../schema/createSchemaFromZod';
import { OpaqueExtensionDefinition } from '@internal/frontend';
import { ExtensionDataContainer } from './types';
import { ExtensionBlueprintParamsDefiner } from './createExtensionBlueprint';
import { ExtensionBlueprintDefineParams } from './createExtensionBlueprint';
/**
* This symbol is used to pass parameter overrides from the extension override to the blueprint factory
@@ -159,7 +159,7 @@ export type ExtensionDefinitionParameters = {
{ optional: boolean; singleton: boolean }
>;
};
params?: object | ExtensionBlueprintParamsDefiner;
params?: object | ExtensionBlueprintDefineParams;
};
/**
@@ -167,14 +167,14 @@ export type ExtensionDefinitionParameters = {
* It can't be exported because it breaks API reports.
* @ignore
*/
type AnyParamsInput<TParams extends object | ExtensionBlueprintParamsDefiner> =
TParams extends ExtensionBlueprintParamsDefiner<infer IParams>
type AnyParamsInput<TParams extends object | ExtensionBlueprintDefineParams> =
TParams extends ExtensionBlueprintDefineParams<infer IParams>
? IParams | ((define: TParams) => ReturnType<TParams>)
:
| TParams
| ((
define: ExtensionBlueprintParamsDefiner<TParams, TParams>,
) => ReturnType<ExtensionBlueprintParamsDefiner<TParams, TParams>>);
define: ExtensionBlueprintDefineParams<TParams, TParams>,
) => ReturnType<ExtensionBlueprintDefineParams<TParams, TParams>>);
/** @public */
export type ExtensionDefinition<
@@ -225,10 +225,10 @@ export type ExtensionDefinition<
} & ([T['params']] extends [never]
? {}
: {
params?: TFactoryParamsReturn extends ExtensionBlueprintParamsDefiner
params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams
? TFactoryParamsReturn
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: Partial<T['params']>;
})
>,
@@ -247,10 +247,10 @@ export type ExtensionDefinition<
} & ([T['params']] extends [never]
? {}
: {
params?: TParamsInput extends ExtensionBlueprintParamsDefiner
params?: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: Partial<T['params']>;
})
> &
@@ -881,9 +881,9 @@ describe('createExtensionBlueprint', () => {
});
const extensionDef = blueprint.make({
// Using define is optional in this case
params: define =>
define({
// Using defineParams is optional in this case
params: defineParams =>
defineParams({
test1: 'orig-1',
test2: 'orig-2',
}),
@@ -925,7 +925,7 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Partial override with original define
// Partial override with original defineParams
expect(
getOutputs(
extensionDef.override({
@@ -941,12 +941,12 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override with define
// Override with defineParams
expect(
getOutputs(
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -959,12 +959,12 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override with define with original define
// Override with defineParams with original defineParams
expect(
getOutputs(
extensionDef.override({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1015,7 +1015,7 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Partial override via factory with original define
// Partial override via factory with original defineParams
expect(
getOutputs(
extensionDef.override({
@@ -1035,14 +1035,14 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override via factory with define
// Override via factory with defineParams
expect(
getOutputs(
extension.override({
factory(origFactory) {
return origFactory({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1057,14 +1057,14 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override via factory with define with original define
// Override via factory with defineParams with original defineParams
expect(
getOutputs(
extensionDef.override({
factory(origFactory) {
return origFactory({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1131,9 +1131,9 @@ describe('createExtensionBlueprint', () => {
});
const extensionDef = blueprint.make({
// Using define is optional in this case
params: define =>
define({
// Using defineParams is optional in this case
params: defineParams =>
defineParams({
test1: 'orig-1',
test2: 'orig-2',
}),
@@ -1175,7 +1175,7 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Partial override with original define
// Partial override with original defineParams
expect(
getOutputs(
extensionDef.override({
@@ -1191,12 +1191,12 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override with define
// Override with defineParams
expect(
getOutputs(
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1209,12 +1209,12 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override with define with original define
// Override with defineParams with original defineParams
expect(
getOutputs(
extensionDef.override({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1266,7 +1266,7 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Partial override via factory with original define
// Partial override via factory with original defineParams
expect(
getOutputs(
extensionDef.override({
@@ -1286,14 +1286,14 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override via factory with define
// Override via factory with defineParams
expect(
getOutputs(
extension.override({
factory(origFactory) {
return origFactory({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1308,14 +1308,14 @@ describe('createExtensionBlueprint', () => {
test2: 'override-2',
});
// Override via factory with define with original define
// Override via factory with defineParams with original defineParams
expect(
getOutputs(
extensionDef.override({
factory(origFactory) {
return origFactory({
params: define =>
define({
params: defineParams =>
defineParams({
test1: 'override-1',
test2: 'override-2',
// @ts-expect-error
@@ -1373,8 +1373,8 @@ describe('createExtensionBlueprint', () => {
});
TestExtensionBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'x',
// @ts-expect-error b doesn't match a
b: 'y',
@@ -1382,8 +1382,8 @@ describe('createExtensionBlueprint', () => {
});
TestExtensionBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'x',
b: 'x',
// @ts-expect-error extra param
@@ -1392,8 +1392,8 @@ describe('createExtensionBlueprint', () => {
});
const extension = TestExtensionBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'x',
b: 'x',
}),
@@ -1430,8 +1430,8 @@ describe('createExtensionBlueprint', () => {
});
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'z',
// @ts-expect-error b doesn't match a
b: 'w',
@@ -1439,8 +1439,8 @@ describe('createExtensionBlueprint', () => {
});
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'z',
b: 'z',
// @ts-expect-error extra param
@@ -1449,8 +1449,8 @@ describe('createExtensionBlueprint', () => {
});
const override = extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'z',
b: 'z',
}),
@@ -1472,8 +1472,8 @@ describe('createExtensionBlueprint', () => {
TestExtensionBlueprint.makeWithOverrides({
factory(originalFactory) {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
a: 'x',
// @ts-expect-error b doesn't match a
b: 'y',
@@ -1484,8 +1484,8 @@ describe('createExtensionBlueprint', () => {
const extension = TestExtensionBlueprint.makeWithOverrides({
factory(originalFactory) {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
a: 'x',
b: 'x',
}),
@@ -1524,8 +1524,8 @@ describe('createExtensionBlueprint', () => {
});
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'z',
// @ts-expect-error b doesn't match a
b: 'w',
@@ -1533,8 +1533,8 @@ describe('createExtensionBlueprint', () => {
});
const override = extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 'z',
b: 'z',
}),
@@ -1560,8 +1560,8 @@ describe('createExtensionBlueprint', () => {
});
const extension = TestTransformExtensionBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
a: 0,
b: 10,
}),
@@ -1572,8 +1572,8 @@ describe('createExtensionBlueprint', () => {
expect(
createExtensionTester(
extension.override({
params: define =>
define({
params: defineParams =>
defineParams({
a: 20,
b: 30,
}),
@@ -1597,18 +1597,18 @@ describe('createExtensionBlueprint', () => {
});
const extension = TestTransformExtensionBlueprint.make({
params: define => define({ x: 1 }),
params: defineParams => defineParams({ x: 1 }),
});
expect(createExtensionTester(extension).get(testDataRef)).toBe(`x: 1`);
TestTransformExtensionBlueprint.make({
params: define => define({ x: 2 }),
params: defineParams => defineParams({ x: 2 }),
});
TestTransformExtensionBlueprint.make({
// @ts-expect-error doesn't match any overload
params: define => define({ x: 3 }),
params: defineParams => defineParams({ x: 3 }),
});
});
});
@@ -50,7 +50,7 @@ import { ExtensionDataContainer } from './types';
*
* @public
*/
export type ExtensionBlueprintParamsDefiner<
export type ExtensionBlueprintDefineParams<
TParams extends object = object,
TInput = any,
> = (params: TInput) => ExtensionBlueprintParams<TParams>;
@@ -100,7 +100,7 @@ export function createExtensionBlueprintParams<T extends object = object>(
*/
export type CreateExtensionBlueprintOptions<
TKind extends string,
TParams extends object | ExtensionBlueprintParamsDefiner,
TParams extends object | ExtensionBlueprintDefineParams,
UOutput extends ExtensionDataRef,
TInputs extends {
[inputName in string]: ExtensionInput<
@@ -151,18 +151,18 @@ export type CreateExtensionBlueprintOptions<
* Usage of the above example blueprint:
* ```ts
* const example = ExampleBlueprint.make({
* params: define => define({
* params: defineParams => defineParams({
* component: ...,
* fetcher: ...,
* }),
* });
* ```
*/
defineParams?: TParams extends ExtensionBlueprintParamsDefiner
defineParams?: TParams extends ExtensionBlueprintDefineParams
? TParams
: 'The defineParams option must be a function if provided, see the docs for details';
factory(
params: TParams extends ExtensionBlueprintParamsDefiner
params: TParams extends ExtensionBlueprintDefineParams
? ReturnType<TParams>['T']
: TParams,
context: {
@@ -181,7 +181,7 @@ export type CreateExtensionBlueprintOptions<
/** @public */
export type ExtensionBlueprintParameters = {
kind: string;
params?: object | ExtensionBlueprintParamsDefiner;
params?: object | ExtensionBlueprintDefineParams;
configInput?: { [K in string]: any };
config?: { [K in string]: any };
output?: ExtensionDataRef;
@@ -195,8 +195,8 @@ export type ExtensionBlueprintParameters = {
};
/** @ignore */
type ParamsFactory<TDefiner extends ExtensionBlueprintParamsDefiner> = (
define: TDefiner,
type ParamsFactory<TDefiner extends ExtensionBlueprintDefineParams> = (
defineParams: TDefiner,
) => ReturnType<TDefiner>;
/**
@@ -205,12 +205,10 @@ type ParamsFactory<TDefiner extends ExtensionBlueprintParamsDefiner> = (
*
* @ignore
*/
type AnyParamsInput<TParams extends object | ExtensionBlueprintParamsDefiner> =
TParams extends ExtensionBlueprintParamsDefiner<infer IParams>
type AnyParamsInput<TParams extends object | ExtensionBlueprintDefineParams> =
TParams extends ExtensionBlueprintDefineParams<infer IParams>
? IParams | ParamsFactory<TParams>
:
| TParams
| ParamsFactory<ExtensionBlueprintParamsDefiner<TParams, TParams>>;
: TParams | ParamsFactory<ExtensionBlueprintDefineParams<TParams, TParams>>;
/**
* @public
@@ -228,10 +226,10 @@ export interface ExtensionBlueprint<
name?: TName;
attachTo?: ExtensionAttachToSpec;
disabled?: boolean;
params: TParamsInput extends ExtensionBlueprintParamsDefiner
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `<blueprint>.make({ params: define => define(<params>) })`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `<blueprint>.make({ params: defineParams => defineParams(<params>) })`'
: T['params'];
}): ExtensionDefinition<{
kind: T['kind'];
@@ -281,10 +279,10 @@ export interface ExtensionBlueprint<
originalFactory: <
TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,
>(
params: TParamsInput extends ExtensionBlueprintParamsDefiner
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
: T['params'] extends ExtensionBlueprintParamsDefiner
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(define => define(<params>))`'
: T['params'] extends ExtensionBlueprintDefineParams
? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'
: T['params'],
context?: {
config?: T['config'];
@@ -337,12 +335,12 @@ export interface ExtensionBlueprint<
function unwrapParamsFactory<TParams extends object>(
// Allow `Function` because `typeof <object> === 'function'` allows it, but in practice this should always be a param factory
params: ParamsFactory<ExtensionBlueprintParamsDefiner> | Function,
defineParams: ExtensionBlueprintParamsDefiner,
params: ParamsFactory<ExtensionBlueprintDefineParams> | Function,
defineParams: ExtensionBlueprintDefineParams,
kind: string,
): TParams {
const paramDefinition = (
params as ParamsFactory<ExtensionBlueprintParamsDefiner>
params as ParamsFactory<ExtensionBlueprintDefineParams>
)(defineParams);
try {
return OpaqueBlueprintParams.toInternal(paramDefinition).params as TParams;
@@ -354,14 +352,14 @@ function unwrapParamsFactory<TParams extends object>(
}
function unwrapParams<TParams extends object>(
params: object | ParamsFactory<ExtensionBlueprintParamsDefiner> | string,
params: object | ParamsFactory<ExtensionBlueprintDefineParams> | string,
ctx: { node: AppNode; [ctxParamsSymbol]?: any },
defineParams: ExtensionBlueprintParamsDefiner | undefined,
defineParams: ExtensionBlueprintDefineParams | undefined,
kind: string,
): TParams {
const overrideParams = ctx[ctxParamsSymbol] as
| object
| ParamsFactory<ExtensionBlueprintParamsDefiner>
| ParamsFactory<ExtensionBlueprintDefineParams>
| undefined;
if (defineParams) {
@@ -412,7 +410,7 @@ function unwrapParams<TParams extends object>(
* @public
*/
export function createExtensionBlueprint<
TParams extends object | ExtensionBlueprintParamsDefiner,
TParams extends object | ExtensionBlueprintDefineParams,
UOutput extends ExtensionDataRef,
TInputs extends {
[inputName in string]: ExtensionInput<
@@ -452,7 +450,7 @@ export function createExtensionBlueprint<
dataRefs: TDataRefs;
}> {
const defineParams = options.defineParams as
| ExtensionBlueprintParamsDefiner
| ExtensionBlueprintDefineParams
| undefined;
return {
@@ -67,7 +67,7 @@ export {
type ExtensionBlueprint,
type ExtensionBlueprintParameters,
type ExtensionBlueprintParams,
type ExtensionBlueprintParamsDefiner,
type ExtensionBlueprintDefineParams,
createExtensionBlueprint,
createExtensionBlueprintParams,
} from './createExtensionBlueprint';
+2 -2
View File
@@ -54,8 +54,8 @@ const apiDocsNavItem = NavItemBlueprint.make({
const apiDocsConfigApi = ApiBlueprint.make({
name: 'config',
params: define =>
define({
params: defineParams =>
defineParams({
api: apiDocsConfigRef,
deps: {},
factory: () => {
+41 -41
View File
@@ -74,8 +74,8 @@ import { DefaultDialogApi } from './apis/DefaultDialogApi';
export const apis = [
ApiBlueprint.make({
name: 'dialog',
params: define =>
define({
params: defineParams =>
defineParams({
api: dialogApiRef,
deps: {},
factory: () => new DefaultDialogApi(),
@@ -83,8 +83,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'discovery',
params: define =>
define({
params: defineParams =>
defineParams({
api: discoveryApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) =>
@@ -95,8 +95,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'alert',
params: define =>
define({
params: defineParams =>
defineParams({
api: alertApiRef,
deps: {},
factory: () => new AlertApiForwarder(),
@@ -104,8 +104,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'analytics',
params: define =>
define({
params: defineParams =>
defineParams({
api: analyticsApiRef,
deps: {},
factory: () => new NoOpAnalyticsApi(),
@@ -113,8 +113,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'error',
params: define =>
define({
params: defineParams =>
defineParams({
api: errorApiRef,
deps: { alertApi: alertApiRef },
factory: ({ alertApi }) => {
@@ -126,8 +126,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'storage',
params: define =>
define({
params: defineParams =>
defineParams({
api: storageApiRef,
deps: { errorApi: errorApiRef },
factory: ({ errorApi }) => WebStorage.create({ errorApi }),
@@ -135,8 +135,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'fetch',
params: define =>
define({
params: defineParams =>
defineParams({
api: fetchApiRef,
deps: {
configApi: configApiRef,
@@ -160,8 +160,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'oauth-request',
params: define =>
define({
params: defineParams =>
defineParams({
api: oauthRequestApiRef,
deps: {},
factory: () => new OAuthRequestManager(),
@@ -169,8 +169,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'google-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: googleAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -188,8 +188,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'microsoft-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: microsoftAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -207,8 +207,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'github-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: githubAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -227,8 +227,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'okta-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: oktaAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -246,8 +246,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'gitlab-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: gitlabAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -265,8 +265,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'onelogin-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: oneloginAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -284,8 +284,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'bitbucket-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: bitbucketAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -304,8 +304,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'bitbucket-server-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: bitbucketServerAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -324,8 +324,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'atlassian-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: atlassianAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -344,8 +344,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'vmware-cloud-auth',
params: define =>
define({
params: defineParams =>
defineParams({
api: vmwareCloudAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -364,8 +364,8 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'permission',
params: define =>
define({
params: defineParams =>
defineParams({
api: permissionApiRef,
deps: {
discovery: discoveryApiRef,
@@ -378,12 +378,12 @@ export const apis = [
}),
ApiBlueprint.make({
name: 'scm-auth',
params: define => define(ScmAuth.createDefaultApiFactory()),
params: defineParams => defineParams(ScmAuth.createDefaultApiFactory()),
}),
ApiBlueprint.make({
name: 'scm-integrations',
params: define =>
define({
params: defineParams =>
defineParams({
api: scmIntegrationsApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
+2 -2
View File
@@ -21,8 +21,8 @@ import { ApiBlueprint } from '@backstage/frontend-plugin-api';
export const AppLanguageApi = ApiBlueprint.make({
name: 'app-language',
params: define =>
define({
params: defineParams =>
defineParams({
api: appLanguageApiRef,
deps: {},
factory: () => AppLanguageSelector.createWithStorage(),
+2 -2
View File
@@ -40,8 +40,8 @@ export const AppThemeApi = ApiBlueprint.makeWithOverrides({
}),
},
factory: (originalFactory, { inputs }) => {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: appThemeApiRef,
deps: {},
factory: () =>
+2 -2
View File
@@ -35,8 +35,8 @@ export const ComponentsApi = ApiBlueprint.makeWithOverrides({
),
},
factory: (originalFactory, { inputs }) => {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: componentsApiRef,
deps: {},
factory: () =>
@@ -26,8 +26,8 @@ import { LocalStorageFeatureFlags } from '../../../../packages/core-app-api/src/
*/
export const FeatureFlagsApi = ApiBlueprint.make({
name: 'feature-flags',
params: define =>
define({
params: defineParams =>
defineParams({
// TODO: properly discovery feature flags, maybe rework the whole thing
api: featureFlagsApiRef,
deps: {},
+2 -2
View File
@@ -36,8 +36,8 @@ export const IconsApi = ApiBlueprint.makeWithOverrides({
}),
},
factory: (originalFactory, { inputs }) => {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: iconsApiRef,
deps: {},
factory: () =>
@@ -38,8 +38,8 @@ export const TranslationsApi = ApiBlueprint.makeWithOverrides({
),
},
factory: (originalFactory, { inputs }) => {
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: translationApiRef,
deps: { languageApi: appLanguageApiRef },
factory: ({ languageApi }) =>
+2 -2
View File
@@ -52,8 +52,8 @@ const catalogImportPage = PageBlueprint.make({
});
const catalogImportApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: catalogImportApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -36,8 +36,8 @@ import { rootRouteRef } from '../routes';
/** @alpha */
export const catalogUnprocessedEntitiesApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: catalogUnprocessedEntitiesApiRef,
deps: {
discoveryApi: discoveryApiRef,
+6 -6
View File
@@ -32,8 +32,8 @@ import {
} from '../apis';
export const catalogApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: catalogApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -46,8 +46,8 @@ export const catalogApi = ApiBlueprint.make({
export const catalogStarredEntitiesApi = ApiBlueprint.make({
name: 'starred-entities',
params: define =>
define({
params: defineParams =>
defineParams({
api: starredEntitiesApiRef,
deps: { storageApi: storageApiRef },
factory: ({ storageApi }) =>
@@ -57,8 +57,8 @@ export const catalogStarredEntitiesApi = ApiBlueprint.make({
export const entityPresentationApi = ApiBlueprint.make({
name: 'entity-presentation',
params: define =>
define({
params: defineParams =>
defineParams({
api: entityPresentationApiRef,
deps: { catalogApiImp: catalogApiRef },
factory: ({ catalogApiImp }) =>
+2 -2
View File
@@ -33,8 +33,8 @@ import { rootRouteRef } from '../routes';
/** @alpha */
export const devToolsApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: devToolsApiRef,
deps: {
discoveryApi: discoveryApiRef,
+2 -2
View File
@@ -78,8 +78,8 @@ const visitListenerAppRootElement = AppRootElementBlueprint.make({
const visitsApi = ApiBlueprint.make({
name: 'visits',
params: define =>
define({
params: defineParams =>
defineParams({
api: visitsApiRef,
deps: {
storageApi: storageApiRef,
+8 -8
View File
@@ -40,8 +40,8 @@ import {
} from '@backstage/core-plugin-api';
export const kubernetesApiExtension = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: kubernetesApiRef,
deps: {
discoveryApi: discoveryApiRef,
@@ -59,8 +59,8 @@ export const kubernetesApiExtension = ApiBlueprint.make({
export const kubernetesProxyApi = ApiBlueprint.make({
name: 'proxy',
params: define =>
define({
params: defineParams =>
defineParams({
api: kubernetesProxyApiRef,
deps: {
kubernetesApi: kubernetesApiRef,
@@ -74,8 +74,8 @@ export const kubernetesProxyApi = ApiBlueprint.make({
export const kubernetesAuthProvidersApi = ApiBlueprint.make({
name: 'auth-providers',
params: define =>
define({
params: defineParams =>
defineParams({
api: kubernetesAuthProvidersApiRef,
deps: {
gitlabAuthApi: gitlabAuthApiRef,
@@ -110,8 +110,8 @@ export const kubernetesAuthProvidersApi = ApiBlueprint.make({
export const kubernetesClusterLinkFormatterApi = ApiBlueprint.make({
name: 'cluster-link-formatter',
params: define =>
define({
params: defineParams =>
defineParams({
api: kubernetesClusterLinkFormatterApiRef,
deps: { googleAuthApi: googleAuthApiRef },
factory: deps => {
+2 -2
View File
@@ -40,8 +40,8 @@ const page = PageBlueprint.make({
});
const api = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: notificationsApiRef,
deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },
factory: ({ discoveryApi, fetchApi }) =>
@@ -52,8 +52,8 @@ export const formFieldsApi = ApiBlueprint.makeWithOverrides({
e.get(FormFieldBlueprint.dataRefs.formFieldLoader),
);
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: formFieldsApiRef,
deps: {},
factory: () => new DefaultScaffolderFormFieldsApi(formFieldLoaders),
@@ -57,8 +57,8 @@ export const formDecoratorsApi = ApiBlueprint.makeWithOverrides({
e.get(FormDecoratorBlueprint.dataRefs.formDecoratorLoader),
);
return originalFactory(define =>
define({
return originalFactory(defineParams =>
defineParams({
api: formDecoratorsApiRef,
deps: {},
factory: () =>
+2 -2
View File
@@ -73,8 +73,8 @@ export const repoUrlPickerFormField = FormFieldBlueprint.make({
});
export const scaffolderApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: scaffolderApiRef,
deps: {
discoveryApi: discoveryApiRef,
+2 -2
View File
@@ -76,8 +76,8 @@ import {
/** @alpha */
export const searchApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: searchApiRef,
deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },
factory: ({ discoveryApi, fetchApi }) =>
+2 -2
View File
@@ -27,8 +27,8 @@ import { SignalsDisplay } from './plugin';
import { compatWrapper } from '@backstage/core-compat-api';
const api = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: signalApiRef,
deps: {
identity: identityApiRef,
+4 -4
View File
@@ -67,8 +67,8 @@ const techdocsEntityIconLink = EntityIconLinkBlueprint.make({
/** @alpha */
const techDocsStorageApi = ApiBlueprint.make({
name: 'storage',
params: define =>
define({
params: defineParams =>
defineParams({
api: techdocsStorageApiRef,
deps: {
configApi: configApiRef,
@@ -86,8 +86,8 @@ const techDocsStorageApi = ApiBlueprint.make({
/** @alpha */
const techDocsClientApi = ApiBlueprint.make({
params: define =>
define({
params: defineParams =>
defineParams({
api: techdocsApiRef,
deps: {
configApi: configApiRef,