@backstage/frontend-plugin-api 0.17.3 → 0.18.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/alpha.d.ts +1 -2
- package/dist/alpha.esm.js +0 -2
- package/dist/alpha.esm.js.map +1 -1
- package/dist/blueprints/AnalyticsImplementationBlueprint.esm.js +0 -2
- package/dist/blueprints/AnalyticsImplementationBlueprint.esm.js.map +1 -1
- package/dist/blueprints/ApiBlueprint.esm.js +0 -2
- package/dist/blueprints/ApiBlueprint.esm.js.map +1 -1
- package/dist/blueprints/AppRootElementBlueprint.esm.js +0 -2
- package/dist/blueprints/AppRootElementBlueprint.esm.js.map +1 -1
- package/dist/blueprints/PageBlueprint.esm.js +3 -5
- package/dist/blueprints/PageBlueprint.esm.js.map +1 -1
- package/dist/blueprints/PluginHeaderActionBlueprint.esm.js +0 -2
- package/dist/blueprints/PluginHeaderActionBlueprint.esm.js.map +1 -1
- package/dist/blueprints/PluginWrapperBlueprint.esm.js +0 -2
- package/dist/blueprints/PluginWrapperBlueprint.esm.js.map +1 -1
- package/dist/blueprints/SubPageBlueprint.esm.js +3 -5
- package/dist/blueprints/SubPageBlueprint.esm.js.map +1 -1
- package/dist/components/ExtensionBoundary.esm.js +0 -2
- package/dist/components/ExtensionBoundary.esm.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/schema/assertNoLegacyConfigSchema.esm.js +10 -0
- package/dist/schema/assertNoLegacyConfigSchema.esm.js.map +1 -0
- package/dist/schema/createPortableSchema.esm.js +5 -70
- package/dist/schema/createPortableSchema.esm.js.map +1 -1
- package/dist/schema/optionalStringSchema.esm.js +33 -0
- package/dist/schema/optionalStringSchema.esm.js.map +1 -0
- package/dist/types/{alpha.d-BScvftwR.d.ts → alpha.d-CUDLigYe.d.ts} +1 -192
- package/dist/wiring/createExtension.esm.js +5 -18
- package/dist/wiring/createExtension.esm.js.map +1 -1
- package/dist/wiring/createExtensionBlueprint.esm.js +3 -12
- package/dist/wiring/createExtensionBlueprint.esm.js.map +1 -1
- package/package.json +13 -14
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const optionalStringSchema = {
|
|
2
|
+
"~standard": {
|
|
3
|
+
version: 1,
|
|
4
|
+
vendor: "backstage",
|
|
5
|
+
validate(value) {
|
|
6
|
+
if (typeof value === "string" || value === void 0) {
|
|
7
|
+
return { value };
|
|
8
|
+
}
|
|
9
|
+
let receivedType = typeof value;
|
|
10
|
+
if (value === null) {
|
|
11
|
+
receivedType = "null";
|
|
12
|
+
} else if (Array.isArray(value)) {
|
|
13
|
+
receivedType = "array";
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
issues: [
|
|
17
|
+
{ message: `Expected a string, but received ${receivedType}` }
|
|
18
|
+
]
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
jsonSchema: {
|
|
22
|
+
input() {
|
|
23
|
+
return { type: "string" };
|
|
24
|
+
},
|
|
25
|
+
output() {
|
|
26
|
+
return { type: "string" };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { optionalStringSchema };
|
|
33
|
+
//# sourceMappingURL=optionalStringSchema.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionalStringSchema.esm.js","sources":["../../src/schema/optionalStringSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n StandardJSONSchemaV1,\n StandardSchemaV1,\n} from '@standard-schema/spec';\n\nexport const optionalStringSchema: StandardSchemaV1<string | undefined> &\n StandardJSONSchemaV1<string | undefined> = {\n '~standard': {\n version: 1,\n vendor: 'backstage',\n validate(value) {\n if (typeof value === 'string' || value === undefined) {\n return { value };\n }\n let receivedType: string = typeof value;\n if (value === null) {\n receivedType = 'null';\n } else if (Array.isArray(value)) {\n receivedType = 'array';\n }\n return {\n issues: [\n { message: `Expected a string, but received ${receivedType}` },\n ],\n };\n },\n jsonSchema: {\n input() {\n return { type: 'string' };\n },\n output() {\n return { type: 'string' };\n },\n },\n },\n};\n"],"names":[],"mappings":"AAqBO,MAAM,oBAAA,GACgC;AAAA,EAC3C,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAA,EAAW;AACpD,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB;AACA,MAAA,IAAI,eAAuB,OAAO,KAAA;AAClC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,YAAA,GAAe,MAAA;AAAA,MACjB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,QAAA,YAAA,GAAe,OAAA;AAAA,MACjB;AACA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ;AAAA,UACN,EAAE,OAAA,EAAS,CAAA,gCAAA,EAAmC,YAAY,CAAA,CAAA;AAAG;AAC/D,OACF;AAAA,IACF,CAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,GAAQ;AACN,QAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,MAC1B,CAAA;AAAA,MACA,MAAA,GAAS;AACP,QAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,MAC1B;AAAA;AACF;AAEJ;;;;"}
|
|
@@ -2,7 +2,6 @@ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api'
|
|
|
2
2
|
import { JSX, ComponentType, ReactNode } from 'react';
|
|
3
3
|
import { Expand, JsonObject } from '@backstage/types';
|
|
4
4
|
import { FilterPredicate } from '@backstage/filter-predicates';
|
|
5
|
-
import { z } from 'zod/v3';
|
|
6
5
|
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -733,8 +732,6 @@ declare function createExtensionBlueprintParams<T extends object = object>(param
|
|
|
733
732
|
*/
|
|
734
733
|
type CreateExtensionBlueprintOptions<TKind extends string, TParams extends object | ExtensionBlueprintDefineParams, UOutput extends ExtensionDataRef, TInputs extends {
|
|
735
734
|
[inputName in string]: ExtensionInput;
|
|
736
|
-
}, TConfigSchema extends {
|
|
737
|
-
[key in string]: (zImpl: typeof z) => z.ZodType;
|
|
738
735
|
}, UFactoryOutput extends ExtensionDataValue<any, any>, TDataRefs extends {
|
|
739
736
|
[name in string]: ExtensionDataRef;
|
|
740
737
|
}, UParentInputs extends ExtensionDataRef, TNewConfigSchema extends {
|
|
@@ -747,15 +744,6 @@ type CreateExtensionBlueprintOptions<TKind extends string, TParams extends objec
|
|
|
747
744
|
inputs?: TInputs;
|
|
748
745
|
output: Array<UOutput>;
|
|
749
746
|
configSchema?: TNewConfigSchema;
|
|
750
|
-
/**
|
|
751
|
-
* @deprecated Use {@link CreateExtensionBlueprintOptions.configSchema} instead.
|
|
752
|
-
*/
|
|
753
|
-
config?: {
|
|
754
|
-
/**
|
|
755
|
-
* @deprecated Use {@link CreateExtensionBlueprintOptions.configSchema} instead.
|
|
756
|
-
*/
|
|
757
|
-
schema: TConfigSchema;
|
|
758
|
-
};
|
|
759
747
|
/**
|
|
760
748
|
* This option is used to further refine the blueprint params. When this
|
|
761
749
|
* option is used, the blueprint will require params to be passed in callback
|
|
@@ -800,8 +788,6 @@ type CreateExtensionBlueprintOptions<TKind extends string, TParams extends objec
|
|
|
800
788
|
apis: ApiHolder;
|
|
801
789
|
config: {
|
|
802
790
|
[key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<TNewConfigSchema[key]>;
|
|
803
|
-
} & {
|
|
804
|
-
[key in keyof TConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TConfigSchema[key]>>;
|
|
805
791
|
};
|
|
806
792
|
inputs: Expand<ResolvedExtensionInputs<TInputs>>;
|
|
807
793
|
}): Iterable<UFactoryOutput>;
|
|
@@ -901,52 +887,6 @@ interface ExtensionBlueprint<T extends ExtensionBlueprintParameters = ExtensionB
|
|
|
901
887
|
name: string | undefined extends TName ? undefined : TName;
|
|
902
888
|
params: T['params'];
|
|
903
889
|
}>;
|
|
904
|
-
/**
|
|
905
|
-
* @deprecated Use the `configSchema` option instead of `config.schema`.
|
|
906
|
-
*/
|
|
907
|
-
makeWithOverrides<TName extends string | undefined, TExtensionConfigSchema extends {
|
|
908
|
-
[key in string]: (zImpl: typeof z) => z.ZodType;
|
|
909
|
-
}, UFactoryOutput extends ExtensionDataValue<any, any>, UNewOutput extends ExtensionDataRef, UParentInputs extends ExtensionDataRef, TExtraInputs extends {
|
|
910
|
-
[inputName in string]: ExtensionInput;
|
|
911
|
-
} = {}>(args: {
|
|
912
|
-
name?: TName;
|
|
913
|
-
attachTo?: ExtensionDefinitionAttachTo<UParentInputs> & VerifyExtensionAttachTo<ExtensionDataRef extends UNewOutput ? NonNullable<T['output']> : UNewOutput, UParentInputs>;
|
|
914
|
-
disabled?: boolean;
|
|
915
|
-
if?: FilterPredicate;
|
|
916
|
-
inputs?: TExtraInputs & {
|
|
917
|
-
[KName in keyof T['inputs']]?: `Error: Input '${KName & string}' is already defined in parent definition`;
|
|
918
|
-
};
|
|
919
|
-
output?: Array<UNewOutput>;
|
|
920
|
-
configSchema?: never;
|
|
921
|
-
config?: {
|
|
922
|
-
schema: TExtensionConfigSchema & {
|
|
923
|
-
[KName in keyof T['config']]?: `Error: Config key '${KName & string}' is already defined in parent schema`;
|
|
924
|
-
};
|
|
925
|
-
};
|
|
926
|
-
factory(originalFactory: <TParamsInput extends AnyParamsInput$1<NonNullable<T['params']>>>(params: TParamsInput extends ExtensionBlueprintDefineParams ? TParamsInput : 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?: {
|
|
927
|
-
config?: T['config'];
|
|
928
|
-
inputs?: ResolvedInputValueOverrides<NonNullable<T['inputs']>>;
|
|
929
|
-
}) => ExtensionDataContainer<NonNullable<T['output']>>, context: {
|
|
930
|
-
node: AppNode;
|
|
931
|
-
apis: ApiHolder;
|
|
932
|
-
config: T['config'] & {
|
|
933
|
-
[key in keyof TExtensionConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>>;
|
|
934
|
-
};
|
|
935
|
-
inputs: Expand<ResolvedExtensionInputs<T['inputs'] & TExtraInputs>>;
|
|
936
|
-
}): Iterable<UFactoryOutput> & VerifyExtensionFactoryOutput<ExtensionDataRef extends UNewOutput ? NonNullable<T['output']> : UNewOutput, UFactoryOutput>;
|
|
937
|
-
}): OverridableExtensionDefinition<{
|
|
938
|
-
config: Expand<(string extends keyof TExtensionConfigSchema ? {} : {
|
|
939
|
-
[key in keyof TExtensionConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>>;
|
|
940
|
-
}) & T['config']>;
|
|
941
|
-
configInput: Expand<(string extends keyof TExtensionConfigSchema ? {} : z.input<z.ZodObject<{
|
|
942
|
-
[key in keyof TExtensionConfigSchema]: ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>;
|
|
943
|
-
}>>) & T['configInput']>;
|
|
944
|
-
output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput;
|
|
945
|
-
inputs: Expand<T['inputs'] & TExtraInputs>;
|
|
946
|
-
kind: T['kind'];
|
|
947
|
-
name: string | undefined extends TName ? undefined : TName;
|
|
948
|
-
params: T['params'];
|
|
949
|
-
}>;
|
|
950
890
|
}
|
|
951
891
|
/**
|
|
952
892
|
* Creates a new extension blueprint that encapsulates the creation of
|
|
@@ -1010,7 +950,6 @@ declare function createExtensionBlueprint<TParams extends object | ExtensionBlue
|
|
|
1010
950
|
if?: FilterPredicate;
|
|
1011
951
|
inputs?: TInputs;
|
|
1012
952
|
output: Array<UOutput>;
|
|
1013
|
-
config?: never;
|
|
1014
953
|
configSchema?: TNewConfigSchema;
|
|
1015
954
|
defineParams?: TParams extends ExtensionBlueprintDefineParams ? TParams : 'The defineParams option must be a function if provided, see the docs for details';
|
|
1016
955
|
factory(params: TParams extends ExtensionBlueprintDefineParams ? ReturnType<TParams>['T'] : TParams, context: {
|
|
@@ -1035,50 +974,6 @@ declare function createExtensionBlueprint<TParams extends object | ExtensionBlue
|
|
|
1035
974
|
};
|
|
1036
975
|
dataRefs: TDataRefs;
|
|
1037
976
|
}>;
|
|
1038
|
-
/**
|
|
1039
|
-
* @deprecated Use the top-level `configSchema` option instead of `config.schema`.
|
|
1040
|
-
* @public
|
|
1041
|
-
*/
|
|
1042
|
-
declare function createExtensionBlueprint<TParams extends object | ExtensionBlueprintDefineParams, UOutput extends ExtensionDataRef, TInputs extends {
|
|
1043
|
-
[inputName in string]: ExtensionInput;
|
|
1044
|
-
}, TConfigSchema extends {
|
|
1045
|
-
[key in string]: (zImpl: typeof z) => z.ZodType;
|
|
1046
|
-
}, UFactoryOutput extends ExtensionDataValue<any, any>, TKind extends string, UParentInputs extends ExtensionDataRef, TDataRefs extends {
|
|
1047
|
-
[name in string]: ExtensionDataRef;
|
|
1048
|
-
} = never>(options: {
|
|
1049
|
-
kind: TKind;
|
|
1050
|
-
attachTo: ExtensionDefinitionAttachTo<UParentInputs> & VerifyExtensionAttachTo<UOutput, UParentInputs>;
|
|
1051
|
-
disabled?: boolean;
|
|
1052
|
-
if?: FilterPredicate;
|
|
1053
|
-
inputs?: TInputs;
|
|
1054
|
-
output: Array<UOutput>;
|
|
1055
|
-
configSchema?: never;
|
|
1056
|
-
config?: {
|
|
1057
|
-
schema: TConfigSchema;
|
|
1058
|
-
};
|
|
1059
|
-
defineParams?: TParams extends ExtensionBlueprintDefineParams ? TParams : 'The defineParams option must be a function if provided, see the docs for details';
|
|
1060
|
-
factory(params: TParams extends ExtensionBlueprintDefineParams ? ReturnType<TParams>['T'] : TParams, context: {
|
|
1061
|
-
node: AppNode;
|
|
1062
|
-
apis: ApiHolder;
|
|
1063
|
-
config: {
|
|
1064
|
-
[key in keyof TConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TConfigSchema[key]>>;
|
|
1065
|
-
};
|
|
1066
|
-
inputs: Expand<ResolvedExtensionInputs<TInputs>>;
|
|
1067
|
-
}): Iterable<UFactoryOutput>;
|
|
1068
|
-
dataRefs?: TDataRefs;
|
|
1069
|
-
} & VerifyExtensionFactoryOutput<UOutput, UFactoryOutput>): ExtensionBlueprint<{
|
|
1070
|
-
kind: TKind;
|
|
1071
|
-
params: TParams;
|
|
1072
|
-
output: UOutput extends ExtensionDataRef<infer IData, infer IId, infer IConfig> ? ExtensionDataRef<IData, IId, IConfig> : never;
|
|
1073
|
-
inputs: string extends keyof TInputs ? {} : TInputs;
|
|
1074
|
-
config: string extends keyof TConfigSchema ? {} : {
|
|
1075
|
-
[key in keyof TConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TConfigSchema[key]>>;
|
|
1076
|
-
};
|
|
1077
|
-
configInput: string extends keyof TConfigSchema ? {} : z.input<z.ZodObject<{
|
|
1078
|
-
[key in keyof TConfigSchema]: ReturnType<((...args: any[]) => any) & TConfigSchema[key]>;
|
|
1079
|
-
}>>;
|
|
1080
|
-
dataRefs: TDataRefs;
|
|
1081
|
-
}>;
|
|
1082
977
|
|
|
1083
978
|
/** @ignore */
|
|
1084
979
|
type ResolvedExtensionInput<TExtensionInput extends ExtensionInput> = TExtensionInput['extensionData'] extends Array<ExtensionDataRef> ? {
|
|
@@ -1146,8 +1041,6 @@ type ExtensionDefinitionAttachTo<UParentInputs extends ExtensionDataRef = Extens
|
|
|
1146
1041
|
/** @public */
|
|
1147
1042
|
type CreateExtensionOptions<TKind extends string | undefined, TName extends string | undefined, UOutput extends ExtensionDataRef, TInputs extends {
|
|
1148
1043
|
[inputName in string]: ExtensionInput;
|
|
1149
|
-
}, TConfigSchema extends {
|
|
1150
|
-
[key: string]: (zImpl: typeof z) => z.ZodType;
|
|
1151
1044
|
}, UFactoryOutput extends ExtensionDataValue<any, any>, UParentInputs extends ExtensionDataRef, TNewConfigSchema extends {
|
|
1152
1045
|
[key: string]: StandardSchemaV1;
|
|
1153
1046
|
} = {}> = {
|
|
@@ -1159,22 +1052,11 @@ type CreateExtensionOptions<TKind extends string | undefined, TName extends stri
|
|
|
1159
1052
|
inputs?: TInputs;
|
|
1160
1053
|
output: Array<UOutput>;
|
|
1161
1054
|
configSchema?: TNewConfigSchema;
|
|
1162
|
-
/**
|
|
1163
|
-
* @deprecated Use {@link CreateExtensionOptions.configSchema} instead.
|
|
1164
|
-
*/
|
|
1165
|
-
config?: {
|
|
1166
|
-
/**
|
|
1167
|
-
* @deprecated Use {@link CreateExtensionOptions.configSchema} instead.
|
|
1168
|
-
*/
|
|
1169
|
-
schema: TConfigSchema;
|
|
1170
|
-
};
|
|
1171
1055
|
factory(context: {
|
|
1172
1056
|
node: AppNode;
|
|
1173
1057
|
apis: ApiHolder;
|
|
1174
1058
|
config: {
|
|
1175
1059
|
[key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<TNewConfigSchema[key]>;
|
|
1176
|
-
} & {
|
|
1177
|
-
[key in keyof TConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TConfigSchema[key]>>;
|
|
1178
1060
|
};
|
|
1179
1061
|
inputs: Expand<ResolvedExtensionInputs<TInputs>>;
|
|
1180
1062
|
}): Iterable<UFactoryOutput>;
|
|
@@ -1257,54 +1139,6 @@ interface OverridableExtensionDefinition<T extends ExtensionDefinitionParameters
|
|
|
1257
1139
|
[key in keyof TNewExtensionConfigSchema]?: StandardSchemaV1.InferInput<TNewExtensionConfigSchema[key]>;
|
|
1258
1140
|
};
|
|
1259
1141
|
}>;
|
|
1260
|
-
/**
|
|
1261
|
-
* @deprecated Use the `configSchema` option instead of `config.schema`.
|
|
1262
|
-
*/
|
|
1263
|
-
override<TExtensionConfigSchema extends {
|
|
1264
|
-
[key in string]: (zImpl: typeof z) => z.ZodType;
|
|
1265
|
-
}, UFactoryOutput extends ExtensionDataValue<any, any>, UNewOutput extends ExtensionDataRef, TExtraInputs extends {
|
|
1266
|
-
[inputName in string]: ExtensionInput;
|
|
1267
|
-
}, TParamsInput extends AnyParamsInput<NonNullable<T['params']>>, UParentInputs extends ExtensionDataRef>(args: Expand<{
|
|
1268
|
-
attachTo?: ExtensionDefinitionAttachTo<UParentInputs> & VerifyExtensionAttachTo<ExtensionDataRef extends UNewOutput ? NonNullable<T['output']> : UNewOutput, UParentInputs>;
|
|
1269
|
-
disabled?: boolean;
|
|
1270
|
-
if?: FilterPredicate;
|
|
1271
|
-
inputs?: TExtraInputs & {
|
|
1272
|
-
[KName in keyof T['inputs']]?: `Error: Input '${KName & string}' is already defined in parent definition`;
|
|
1273
|
-
};
|
|
1274
|
-
output?: Array<UNewOutput>;
|
|
1275
|
-
configSchema?: never;
|
|
1276
|
-
config?: {
|
|
1277
|
-
schema: TExtensionConfigSchema & {
|
|
1278
|
-
[KName in keyof T['config']]?: `Error: Config key '${KName & string}' is already defined in parent schema`;
|
|
1279
|
-
};
|
|
1280
|
-
};
|
|
1281
|
-
factory?(originalFactory: <TFactoryParamsReturn extends AnyParamsInput<NonNullable<T['params']>>>(context?: Expand<{
|
|
1282
|
-
config?: T['config'];
|
|
1283
|
-
inputs?: ResolvedInputValueOverrides<NonNullable<T['inputs']>>;
|
|
1284
|
-
} & ([T['params']] extends [never] ? {} : {
|
|
1285
|
-
params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams ? TFactoryParamsReturn : 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']>;
|
|
1286
|
-
})>) => ExtensionDataContainer<NonNullable<T['output']>>, context: {
|
|
1287
|
-
node: AppNode;
|
|
1288
|
-
apis: ApiHolder;
|
|
1289
|
-
config: T['config'] & {
|
|
1290
|
-
[key in keyof TExtensionConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>>;
|
|
1291
|
-
};
|
|
1292
|
-
inputs: Expand<ResolvedExtensionInputs<T['inputs'] & TExtraInputs>>;
|
|
1293
|
-
}): Iterable<UFactoryOutput>;
|
|
1294
|
-
} & ([T['params']] extends [never] ? {} : {
|
|
1295
|
-
params?: TParamsInput extends ExtensionBlueprintDefineParams ? TParamsInput : 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']>;
|
|
1296
|
-
})> & VerifyExtensionFactoryOutput<ExtensionDataRef extends UNewOutput ? NonNullable<T['output']> : UNewOutput, UFactoryOutput>): OverridableExtensionDefinition<{
|
|
1297
|
-
kind: T['kind'];
|
|
1298
|
-
name: T['name'];
|
|
1299
|
-
output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput;
|
|
1300
|
-
inputs: T['inputs'] & TExtraInputs;
|
|
1301
|
-
config: T['config'] & {
|
|
1302
|
-
[key in keyof TExtensionConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>>;
|
|
1303
|
-
};
|
|
1304
|
-
configInput: T['configInput'] & z.input<z.ZodObject<{
|
|
1305
|
-
[key in keyof TExtensionConfigSchema]: ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>;
|
|
1306
|
-
}>>;
|
|
1307
|
-
}>;
|
|
1308
1142
|
}
|
|
1309
1143
|
/**
|
|
1310
1144
|
* Creates a new extension definition for installation in a Backstage app.
|
|
@@ -1345,9 +1179,7 @@ declare function createExtension<UOutput extends ExtensionDataRef, TInputs exten
|
|
|
1345
1179
|
[inputName in string]: ExtensionInput;
|
|
1346
1180
|
}, UFactoryOutput extends ExtensionDataValue<any, any>, const TKind extends string | undefined = undefined, const TName extends string | undefined = undefined, UParentInputs extends ExtensionDataRef = ExtensionDataRef, TNewConfigSchema extends {
|
|
1347
1181
|
[key: string]: StandardSchemaV1;
|
|
1348
|
-
} = {}>(options: CreateExtensionOptions<TKind, TName, UOutput, TInputs,
|
|
1349
|
-
config?: never;
|
|
1350
|
-
}): OverridableExtensionDefinition<{
|
|
1182
|
+
} = {}>(options: CreateExtensionOptions<TKind, TName, UOutput, TInputs, UFactoryOutput, UParentInputs, TNewConfigSchema>): OverridableExtensionDefinition<{
|
|
1351
1183
|
config: {
|
|
1352
1184
|
[key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<TNewConfigSchema[key]>;
|
|
1353
1185
|
};
|
|
@@ -1360,29 +1192,6 @@ declare function createExtension<UOutput extends ExtensionDataRef, TInputs exten
|
|
|
1360
1192
|
kind: string | undefined extends TKind ? undefined : TKind;
|
|
1361
1193
|
name: string | undefined extends TName ? undefined : TName;
|
|
1362
1194
|
}>;
|
|
1363
|
-
/**
|
|
1364
|
-
* @deprecated Use the top-level `configSchema` option instead of `config.schema`.
|
|
1365
|
-
* @public
|
|
1366
|
-
*/
|
|
1367
|
-
declare function createExtension<UOutput extends ExtensionDataRef, TInputs extends {
|
|
1368
|
-
[inputName in string]: ExtensionInput;
|
|
1369
|
-
}, TConfigSchema extends {
|
|
1370
|
-
[key: string]: (zImpl: typeof z) => z.ZodType;
|
|
1371
|
-
}, UFactoryOutput extends ExtensionDataValue<any, any>, const TKind extends string | undefined = undefined, const TName extends string | undefined = undefined, UParentInputs extends ExtensionDataRef = ExtensionDataRef>(options: CreateExtensionOptions<TKind, TName, UOutput, TInputs, TConfigSchema, UFactoryOutput, UParentInputs, {}> & {
|
|
1372
|
-
configSchema?: never;
|
|
1373
|
-
}): OverridableExtensionDefinition<{
|
|
1374
|
-
config: string extends keyof TConfigSchema ? {} : {
|
|
1375
|
-
[key in keyof TConfigSchema]: z.infer<ReturnType<((...args: any[]) => any) & TConfigSchema[key]>>;
|
|
1376
|
-
};
|
|
1377
|
-
configInput: string extends keyof TConfigSchema ? {} : z.input<z.ZodObject<{
|
|
1378
|
-
[key in keyof TConfigSchema]: ReturnType<((...args: any[]) => any) & TConfigSchema[key]>;
|
|
1379
|
-
}>>;
|
|
1380
|
-
output: UOutput extends ExtensionDataRef<infer IData, infer IId, infer IConfig> ? ExtensionDataRef<IData, IId, IConfig> : never;
|
|
1381
|
-
inputs: TInputs;
|
|
1382
|
-
params: never;
|
|
1383
|
-
kind: string | undefined extends TKind ? undefined : TKind;
|
|
1384
|
-
name: string | undefined extends TName ? undefined : TName;
|
|
1385
|
-
}>;
|
|
1386
1195
|
|
|
1387
1196
|
/**
|
|
1388
1197
|
* The specification for this {@link AppNode} in the {@link AppTree}.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveInputOverrides } from './resolveInputOverrides.esm.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createConfigSchema } from '../schema/createPortableSchema.esm.js';
|
|
3
|
+
import { assertNoLegacyConfigSchema } from '../schema/assertNoLegacyConfigSchema.esm.js';
|
|
4
4
|
import { OpaqueExtensionDefinition } from '../frontend-internal/src/wiring/InternalExtensionDefinition.esm.js';
|
|
5
5
|
import { createExtensionDataContainer } from '../frontend-internal/src/wiring/createExtensionDataContainer.esm.js';
|
|
6
6
|
import { OpaqueExtensionInput } from '../frontend-internal/src/wiring/InternalExtensionInput.esm.js';
|
|
@@ -24,13 +24,8 @@ function bindInputs(inputs, kind, name) {
|
|
|
24
24
|
);
|
|
25
25
|
}
|
|
26
26
|
function createExtension(options) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const resolvedConfigSchema = mergePortableSchemas(
|
|
31
|
-
options.config?.schema ? createDeprecatedConfigSchema(options.config.schema) : void 0,
|
|
32
|
-
options.configSchema ? createConfigSchema(options.configSchema) : void 0
|
|
33
|
-
);
|
|
27
|
+
assertNoLegacyConfigSchema(options);
|
|
28
|
+
const resolvedConfigSchema = options.configSchema ? createConfigSchema(options.configSchema) : void 0;
|
|
34
29
|
return OpaqueExtensionDefinition.createInstance("v2", {
|
|
35
30
|
T: void 0,
|
|
36
31
|
kind: options.kind,
|
|
@@ -85,14 +80,12 @@ function createExtension(options) {
|
|
|
85
80
|
return `ExtensionDefinition{${parts.join(",")}}`;
|
|
86
81
|
},
|
|
87
82
|
override(overrideOptions) {
|
|
83
|
+
assertNoLegacyConfigSchema(overrideOptions);
|
|
88
84
|
if (!Array.isArray(options.output)) {
|
|
89
85
|
throw new Error(
|
|
90
86
|
"Cannot override an extension that is not declared using the new format with outputs as an array"
|
|
91
87
|
);
|
|
92
88
|
}
|
|
93
|
-
if (overrideOptions.config?.schema) {
|
|
94
|
-
warnConfigSchemaPropDeprecation(describeParentCallSite());
|
|
95
|
-
}
|
|
96
89
|
if (overrideOptions.output && !overrideOptions.factory) {
|
|
97
90
|
throw new Error(
|
|
98
91
|
"Refused to override output without also overriding factory"
|
|
@@ -122,12 +115,6 @@ function createExtension(options) {
|
|
|
122
115
|
options.name
|
|
123
116
|
),
|
|
124
117
|
output: overrideOptions.output ?? options.output,
|
|
125
|
-
config: options.config?.schema || overrideOptions.config?.schema ? {
|
|
126
|
-
schema: {
|
|
127
|
-
...options.config?.schema,
|
|
128
|
-
...overrideOptions.config?.schema
|
|
129
|
-
}
|
|
130
|
-
} : void 0,
|
|
131
118
|
configSchema: options.configSchema || overrideOptions.configSchema ? {
|
|
132
119
|
...options.configSchema,
|
|
133
120
|
...overrideOptions.configSchema
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExtension.esm.js","sources":["../../src/wiring/createExtension.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ApiHolder, AppNode } from '../apis';\nimport { Expand } from '@backstage/types';\nimport {\n ResolvedInputValueOverrides,\n resolveInputOverrides,\n} from './resolveInputOverrides';\nimport {\n createExtensionDataContainer,\n OpaqueExtensionInput,\n} from '@internal/frontend';\nimport { ExtensionDataRef, ExtensionDataValue } from './createExtensionDataRef';\nimport { ExtensionInput } from './createExtensionInput';\nimport type { z } from 'zod/v3';\nimport {\n createConfigSchema,\n createDeprecatedConfigSchema,\n mergePortableSchemas,\n warnConfigSchemaPropDeprecation,\n} from '../schema/createPortableSchema';\nimport { describeParentCallSite } from '../routing/describeParentCallSite';\nimport { type StandardSchemaV1 } from '@standard-schema/spec';\nimport { OpaqueExtensionDefinition } from '@internal/frontend';\nimport { ExtensionDataContainer } from './types';\nimport {\n ExtensionBlueprint,\n ExtensionBlueprintDefineParams,\n} from './createExtensionBlueprint';\nimport { FrontendPlugin } from './createFrontendPlugin';\nimport { FrontendModule } from './createFrontendModule';\nimport { FilterPredicate } from '@backstage/filter-predicates';\n\n/**\n * This symbol is used to pass parameter overrides from the extension override to the blueprint factory\n * @internal\n */\nexport const ctxParamsSymbol = Symbol('params');\n\n/** @ignore */\ntype ResolvedExtensionInput<TExtensionInput extends ExtensionInput> =\n TExtensionInput['extensionData'] extends Array<ExtensionDataRef>\n ? {\n node: AppNode;\n } & ExtensionDataContainer<TExtensionInput['extensionData'][number]>\n : never;\n\n/**\n * Converts an extension input map into a matching collection of resolved inputs.\n *\n * @ignore\n */\nexport type ResolvedExtensionInputs<\n TInputs extends {\n [name in string]: ExtensionInput;\n },\n> = {\n [InputName in keyof TInputs]: false extends TInputs[InputName]['config']['singleton']\n ? Array<Expand<ResolvedExtensionInput<TInputs[InputName]>>>\n : false extends TInputs[InputName]['config']['optional']\n ? Expand<ResolvedExtensionInput<TInputs[InputName]>>\n : Expand<ResolvedExtensionInput<TInputs[InputName]> | undefined>;\n};\n\ntype ToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\n\ntype PopUnion<U> = ToIntersection<\n U extends any ? () => U : never\n> extends () => infer R\n ? [rest: Exclude<U, R>, next: R]\n : undefined;\n\n/** @ignore */\ntype JoinStringUnion<\n U,\n TDiv extends string = ', ',\n TResult extends string = '',\n> = PopUnion<U> extends [infer IRest extends string, infer INext extends string]\n ? TResult extends ''\n ? JoinStringUnion<IRest, TDiv, INext>\n : JoinStringUnion<IRest, TDiv, `${TResult}${TDiv}${INext}`>\n : TResult;\n\n/** @ignore */\nexport type RequiredExtensionIds<UExtensionData extends ExtensionDataRef> =\n UExtensionData extends any\n ? UExtensionData['config']['optional'] extends true\n ? never\n : UExtensionData['id']\n : never;\n\n/** @ignore */\nexport type VerifyExtensionFactoryOutput<\n UDeclaredOutput extends ExtensionDataRef,\n UFactoryOutput extends ExtensionDataValue<any, any>,\n> = [RequiredExtensionIds<UDeclaredOutput>] extends [UFactoryOutput['id']]\n ? [UFactoryOutput['id']] extends [UDeclaredOutput['id']]\n ? {}\n : `Error: The extension factory has undeclared output(s): ${JoinStringUnion<\n Exclude<UFactoryOutput['id'], UDeclaredOutput['id']>\n >}`\n : `Error: The extension factory is missing the following output(s): ${JoinStringUnion<\n Exclude<RequiredExtensionIds<UDeclaredOutput>, UFactoryOutput['id']>\n >}`;\n\n/** @ignore */\nexport type VerifyExtensionAttachTo<\n UOutput extends ExtensionDataRef,\n UParentInput extends ExtensionDataRef,\n> = ExtensionDataRef extends UParentInput\n ? {}\n : [RequiredExtensionIds<UParentInput>] extends [RequiredExtensionIds<UOutput>]\n ? {}\n : `Error: This parent extension input requires the following extension data, but it is not declared as guaranteed output of this extension: ${JoinStringUnion<\n Exclude<RequiredExtensionIds<UParentInput>, RequiredExtensionIds<UOutput>>\n >}`;\n\n/**\n * Specifies where an extension should attach in the extension tree.\n *\n * @remarks\n *\n * A standard attachment point declaration will specify the ID of the parent extension, as well as the name of the input to attach to.\n *\n * There are two more advanced forms that are available for more complex use-cases:\n *\n * 1. Relative attachment points: using the `relative` property instead of `id`, the attachment point is resolved relative to the current plugin.\n * 2. Extension input references: using a reference in code to another extension's input in the same plugin. These references are always relative.\n *\n * @example\n * ```ts\n * // Attach to a specific extension by full ID\n * { id: 'app/routes', input: 'routes' }\n *\n * // Attach to an extension in the same plugin by kind\n * { relative: { kind: 'page' }, input: 'actions' }\n *\n * // Attach to a specific input of another extension\n * const page = ParentBlueprint.make({ ... });\n * const child = ChildBlueprint.make({ attachTo: page.inputs.children });\n * ```\n *\n * @public\n */\nexport type ExtensionDefinitionAttachTo<\n UParentInputs extends ExtensionDataRef = ExtensionDataRef,\n> =\n | { id: string; input: string; relative?: never }\n | { relative: { kind?: string; name?: string }; input: string; id?: never }\n | ExtensionInput<UParentInputs>;\n\n/** @public */\nexport type CreateExtensionOptions<\n TKind extends string | undefined,\n TName extends string | undefined,\n UOutput extends ExtensionDataRef,\n TInputs extends { [inputName in string]: ExtensionInput },\n TConfigSchema extends { [key: string]: (zImpl: typeof z) => z.ZodType },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n UParentInputs extends ExtensionDataRef,\n TNewConfigSchema extends { [key: string]: StandardSchemaV1 } = {},\n> = {\n kind?: TKind;\n name?: TName;\n attachTo: ExtensionDefinitionAttachTo<UParentInputs> &\n VerifyExtensionAttachTo<UOutput, UParentInputs>;\n disabled?: boolean;\n if?: FilterPredicate;\n inputs?: TInputs;\n output: Array<UOutput>;\n configSchema?: TNewConfigSchema;\n /**\n * @deprecated Use {@link CreateExtensionOptions.configSchema} instead.\n */\n config?: {\n /**\n * @deprecated Use {@link CreateExtensionOptions.configSchema} instead.\n */\n schema: TConfigSchema;\n };\n factory(context: {\n node: AppNode;\n apis: ApiHolder;\n config: {\n [key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<\n TNewConfigSchema[key]\n >;\n } & {\n [key in keyof TConfigSchema]: z.infer<\n ReturnType<((...args: any[]) => any) & TConfigSchema[key]>\n >;\n };\n inputs: Expand<ResolvedExtensionInputs<TInputs>>;\n }): Iterable<UFactoryOutput>;\n} & VerifyExtensionFactoryOutput<UOutput, UFactoryOutput>;\n\n/** @public */\nexport type ExtensionDefinitionParameters = {\n kind?: string;\n name?: string;\n configInput?: { [K in string]: any };\n config?: { [K in string]: any };\n output?: ExtensionDataRef;\n inputs?: { [KName in string]: ExtensionInput };\n params?: object | ExtensionBlueprintDefineParams;\n};\n\n/**\n * Same as the one in `createExtensionBlueprint`, but with `ParamsFactory` inlined.\n * It can't be exported because it breaks API reports.\n * @ignore\n */\ntype AnyParamsInput<TParams extends object | ExtensionBlueprintDefineParams> =\n TParams extends ExtensionBlueprintDefineParams<infer IParams>\n ? IParams | ((define: TParams) => ReturnType<TParams>)\n :\n | TParams\n | ((\n define: ExtensionBlueprintDefineParams<TParams, TParams>,\n ) => ReturnType<ExtensionBlueprintDefineParams<TParams, TParams>>);\n\n/** @public */\nexport interface ExtensionDefinition<\n TParams extends ExtensionDefinitionParameters = ExtensionDefinitionParameters,\n> {\n $$type: '@backstage/ExtensionDefinition';\n readonly T: TParams;\n}\n\n/** @public */\nexport interface OverridableExtensionDefinition<\n T extends ExtensionDefinitionParameters = ExtensionDefinitionParameters,\n> extends ExtensionDefinition<T> {\n /**\n * References to the inputs of this extension, which can be used to attach child extensions.\n */\n readonly inputs: {\n [K in keyof T['inputs']]: ExtensionInput<\n T['inputs'][K] extends ExtensionInput<infer IData> ? IData : never\n >;\n };\n\n override<\n UFactoryOutput extends ExtensionDataValue<any, any>,\n UNewOutput extends ExtensionDataRef,\n TExtraInputs extends { [inputName in string]: ExtensionInput },\n TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,\n UParentInputs extends ExtensionDataRef,\n TNewExtensionConfigSchema extends {\n [key in string]: StandardSchemaV1;\n } = {},\n >(\n args: Expand<\n {\n attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &\n VerifyExtensionAttachTo<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UParentInputs\n >;\n disabled?: boolean;\n if?: FilterPredicate;\n inputs?: TExtraInputs & {\n [KName in keyof T['inputs']]?: `Error: Input '${KName &\n string}' is already defined in parent definition`;\n };\n output?: Array<UNewOutput>;\n config?: never;\n configSchema?: TNewExtensionConfigSchema & {\n [KName in keyof T['config']]?: `Error: Config key '${KName &\n string}' is already defined in parent schema`;\n };\n factory?(\n originalFactory: <\n TFactoryParamsReturn extends AnyParamsInput<\n NonNullable<T['params']>\n >,\n >(\n context?: Expand<\n {\n config?: T['config'];\n inputs?: ResolvedInputValueOverrides<NonNullable<T['inputs']>>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams\n ? TFactoryParamsReturn\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n >,\n ) => ExtensionDataContainer<NonNullable<T['output']>>,\n context: {\n node: AppNode;\n apis: ApiHolder;\n config: T['config'] & {\n [key in keyof TNewExtensionConfigSchema]: StandardSchemaV1.InferOutput<\n TNewExtensionConfigSchema[key]\n >;\n };\n inputs: Expand<ResolvedExtensionInputs<T['inputs'] & TExtraInputs>>;\n },\n ): Iterable<UFactoryOutput>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TParamsInput extends ExtensionBlueprintDefineParams\n ? TParamsInput\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n > &\n VerifyExtensionFactoryOutput<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UFactoryOutput\n >,\n ): OverridableExtensionDefinition<{\n kind: T['kind'];\n name: T['name'];\n output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput;\n inputs: T['inputs'] & TExtraInputs;\n config: T['config'] & {\n [key in keyof TNewExtensionConfigSchema]: StandardSchemaV1.InferOutput<\n TNewExtensionConfigSchema[key]\n >;\n };\n configInput: T['configInput'] & {\n [key in keyof TNewExtensionConfigSchema]?: StandardSchemaV1.InferInput<\n TNewExtensionConfigSchema[key]\n >;\n };\n }>;\n\n /**\n * @deprecated Use the `configSchema` option instead of `config.schema`.\n */\n override<\n TExtensionConfigSchema extends {\n [key in string]: (zImpl: typeof z) => z.ZodType;\n },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n UNewOutput extends ExtensionDataRef,\n TExtraInputs extends { [inputName in string]: ExtensionInput },\n TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,\n UParentInputs extends ExtensionDataRef,\n >(\n args: Expand<\n {\n attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &\n VerifyExtensionAttachTo<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UParentInputs\n >;\n disabled?: boolean;\n if?: FilterPredicate;\n inputs?: TExtraInputs & {\n [KName in keyof T['inputs']]?: `Error: Input '${KName &\n string}' is already defined in parent definition`;\n };\n output?: Array<UNewOutput>;\n configSchema?: never;\n config?: {\n schema: TExtensionConfigSchema & {\n [KName in keyof T['config']]?: `Error: Config key '${KName &\n string}' is already defined in parent schema`;\n };\n };\n factory?(\n originalFactory: <\n TFactoryParamsReturn extends AnyParamsInput<\n NonNullable<T['params']>\n >,\n >(\n context?: Expand<\n {\n config?: T['config'];\n inputs?: ResolvedInputValueOverrides<NonNullable<T['inputs']>>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams\n ? TFactoryParamsReturn\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n >,\n ) => ExtensionDataContainer<NonNullable<T['output']>>,\n context: {\n node: AppNode;\n apis: ApiHolder;\n config: T['config'] & {\n [key in keyof TExtensionConfigSchema]: z.infer<\n ReturnType<\n ((...args: any[]) => any) & TExtensionConfigSchema[key]\n >\n >;\n };\n inputs: Expand<ResolvedExtensionInputs<T['inputs'] & TExtraInputs>>;\n },\n ): Iterable<UFactoryOutput>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TParamsInput extends ExtensionBlueprintDefineParams\n ? TParamsInput\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n > &\n VerifyExtensionFactoryOutput<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UFactoryOutput\n >,\n ): OverridableExtensionDefinition<{\n kind: T['kind'];\n name: T['name'];\n output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput;\n inputs: T['inputs'] & TExtraInputs;\n config: T['config'] & {\n [key in keyof TExtensionConfigSchema]: z.infer<\n ReturnType<((...args: any[]) => any) & TExtensionConfigSchema[key]>\n >;\n };\n configInput: T['configInput'] &\n z.input<\n z.ZodObject<{\n [key in keyof TExtensionConfigSchema]: ReturnType<\n ((...args: any[]) => any) & TExtensionConfigSchema[key]\n >;\n }>\n >;\n }>;\n}\n\n/**\n * @internal\n */\nfunction bindInputs(\n inputs: { [inputName in string]: ExtensionInput } | undefined,\n kind?: string,\n name?: string,\n) {\n if (!inputs) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(inputs).map(([inputName, input]) => [\n inputName,\n OpaqueExtensionInput.toInternal(input).withContext?.({\n kind,\n name,\n input: inputName,\n }) ?? input,\n ]),\n );\n}\n\n/**\n * Creates a new extension definition for installation in a Backstage app.\n *\n * @remarks\n *\n * This is a low-level function for creation of extensions with arbitrary inputs\n * and outputs and is typically only intended to be used for advanced overrides\n * or framework-level extensions. For most extension creation needs, it is\n * recommended to use existing {@link ExtensionBlueprint}s instead. You can find\n * blueprints both in the `@backstage/frontend-plugin-api` package as well as\n * other plugin libraries. There is also a list of\n * {@link https://backstage.io/docs/frontend-system/building-plugins/common-extension-blueprints | commonly used blueprints}\n * in the frontend system documentation.\n *\n * Extension definitions that are created with this function can be installed in\n * a Backstage app via a {@link FrontendPlugin} or {@link FrontendModule}.\n *\n * For more details on how extensions work, see the\n * {@link https://backstage.io/docs/frontend-system/architecture/extensions | documentation for extensions}.\n *\n * @example\n *\n * ```ts\n * const myExtension = createExtension({\n * name: 'example',\n * attachTo: { id: 'app', input: 'root' },\n * output: [coreExtensionData.reactElement],\n * factory() {\n * return [coreExtensionData.reactElement(<h1>Hello, world!</h1>)];\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createExtension<\n UOutput extends ExtensionDataRef,\n TInputs extends { [inputName in string]: ExtensionInput },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n const TKind extends string | undefined = undefined,\n const TName extends string | undefined = undefined,\n UParentInputs extends ExtensionDataRef = ExtensionDataRef,\n TNewConfigSchema extends { [key: string]: StandardSchemaV1 } = {},\n>(\n options: CreateExtensionOptions<\n TKind,\n TName,\n UOutput,\n TInputs,\n {},\n UFactoryOutput,\n UParentInputs,\n TNewConfigSchema\n > & { config?: never },\n): OverridableExtensionDefinition<{\n config: {\n [key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<\n TNewConfigSchema[key]\n >;\n };\n configInput: {\n [key in keyof TNewConfigSchema]?: StandardSchemaV1.InferInput<\n TNewConfigSchema[key]\n >;\n };\n output: UOutput extends ExtensionDataRef<\n infer IData,\n infer IId,\n infer IConfig\n >\n ? ExtensionDataRef<IData, IId, IConfig>\n : never;\n inputs: TInputs;\n params: never;\n kind: string | undefined extends TKind ? undefined : TKind;\n name: string | undefined extends TName ? undefined : TName;\n}>;\n\n/**\n * @deprecated Use the top-level `configSchema` option instead of `config.schema`.\n * @public\n */\nexport function createExtension<\n UOutput extends ExtensionDataRef,\n TInputs extends { [inputName in string]: ExtensionInput },\n TConfigSchema extends { [key: string]: (zImpl: typeof z) => z.ZodType },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n const TKind extends string | undefined = undefined,\n const TName extends string | undefined = undefined,\n UParentInputs extends ExtensionDataRef = ExtensionDataRef,\n>(\n options: CreateExtensionOptions<\n TKind,\n TName,\n UOutput,\n TInputs,\n TConfigSchema,\n UFactoryOutput,\n UParentInputs,\n {}\n > & { configSchema?: never },\n): OverridableExtensionDefinition<{\n config: string extends keyof TConfigSchema\n ? {}\n : {\n [key in keyof TConfigSchema]: z.infer<\n ReturnType<((...args: any[]) => any) & TConfigSchema[key]>\n >;\n };\n configInput: string extends keyof TConfigSchema\n ? {}\n : z.input<\n z.ZodObject<{\n [key in keyof TConfigSchema]: ReturnType<\n ((...args: any[]) => any) & TConfigSchema[key]\n >;\n }>\n >;\n output: UOutput extends ExtensionDataRef<\n infer IData,\n infer IId,\n infer IConfig\n >\n ? ExtensionDataRef<IData, IId, IConfig>\n : never;\n inputs: TInputs;\n params: never;\n kind: string | undefined extends TKind ? undefined : TKind;\n name: string | undefined extends TName ? undefined : TName;\n}>;\n\n/** @internal */\nexport function createExtension(\n options: any,\n): OverridableExtensionDefinition<any> {\n if (options.config?.schema) {\n warnConfigSchemaPropDeprecation(describeParentCallSite());\n }\n const resolvedConfigSchema = mergePortableSchemas(\n options.config?.schema\n ? createDeprecatedConfigSchema(options.config.schema)\n : undefined,\n options.configSchema ? createConfigSchema(options.configSchema) : undefined,\n );\n\n return OpaqueExtensionDefinition.createInstance('v2', {\n T: undefined as any,\n kind: options.kind,\n name: options.name,\n attachTo: options.attachTo,\n disabled: options.disabled ?? false,\n if: options.if,\n inputs: bindInputs(options.inputs, options.kind, options.name),\n output: options.output,\n configSchema: resolvedConfigSchema,\n factory: options.factory,\n toString() {\n const parts: string[] = [];\n if (options.kind) {\n parts.push(`kind=${options.kind}`);\n }\n if (options.name) {\n parts.push(`name=${options.name}`);\n }\n const attachTo = [options.attachTo]\n .flat()\n .map(aAny => {\n const a = aAny as ExtensionDefinitionAttachTo;\n if (OpaqueExtensionInput.isType(a)) {\n const { context } = OpaqueExtensionInput.toInternal(a);\n if (!context) {\n return '<detached-input>';\n }\n let id = '<plugin>';\n if (context?.kind) {\n id = `${context?.kind}:${id}`;\n }\n if (context?.name) {\n id = `${id}/${context?.name}`;\n }\n return `${id}@${context.input}`;\n }\n if ('relative' in a && a.relative) {\n let id = '<plugin>';\n if (a.relative.kind) {\n id = `${a.relative.kind}:${id}`;\n }\n if (a.relative.name) {\n id = `${id}/${a.relative.name}`;\n }\n return `${id}@${a.input}`;\n }\n if ('id' in a) {\n return `${a.id}@${a.input}`;\n }\n throw new Error('Invalid attachment point specification');\n })\n .join('+');\n parts.push(`attachTo=${attachTo}`);\n return `ExtensionDefinition{${parts.join(',')}}`;\n },\n override(overrideOptions: any) {\n if (!Array.isArray(options.output)) {\n throw new Error(\n 'Cannot override an extension that is not declared using the new format with outputs as an array',\n );\n }\n\n if (overrideOptions.config?.schema) {\n warnConfigSchemaPropDeprecation(describeParentCallSite());\n }\n\n // TODO(Rugvip): Making this a type check would be optimal, but it seems\n // like it's tricky to add that and still have the type\n // inference work correctly for the factory output.\n if (overrideOptions.output && !overrideOptions.factory) {\n throw new Error(\n 'Refused to override output without also overriding factory',\n );\n }\n // TODO(Rugvip): Similar to above, would be nice to error during type checking, but don't want to complicate the types too much\n if (overrideOptions.params && overrideOptions.factory) {\n throw new Error(\n 'Refused to override params and factory at the same time',\n );\n }\n\n let ifPredicate = options.if;\n if ('if' in overrideOptions) {\n ifPredicate = overrideOptions.if;\n }\n\n return createExtension({\n kind: options.kind,\n name: options.name,\n attachTo: (overrideOptions.attachTo ??\n options.attachTo) as ExtensionDefinitionAttachTo,\n disabled: overrideOptions.disabled ?? options.disabled,\n if: ifPredicate,\n inputs: bindInputs(\n {\n ...(options.inputs ?? {}),\n ...(overrideOptions.inputs ?? {}),\n },\n options.kind,\n options.name,\n ),\n output: (overrideOptions.output ??\n options.output) as ExtensionDataRef[],\n config:\n options.config?.schema || overrideOptions.config?.schema\n ? {\n schema: {\n ...options.config?.schema,\n ...overrideOptions.config?.schema,\n },\n }\n : undefined,\n configSchema:\n options.configSchema || overrideOptions.configSchema\n ? {\n ...options.configSchema,\n ...overrideOptions.configSchema,\n }\n : undefined,\n factory: ({ node, apis, config, inputs }) => {\n if (!overrideOptions.factory) {\n return options.factory({\n node,\n apis,\n config: config as any,\n inputs: inputs as any,\n [ctxParamsSymbol as any]: overrideOptions.params,\n });\n }\n const parentResult = overrideOptions.factory(\n (innerContext: any): ExtensionDataContainer<any> => {\n return createExtensionDataContainer<any>(\n options.factory({\n node,\n apis,\n config: (innerContext?.config ?? config) as any,\n inputs: resolveInputOverrides(\n options.inputs,\n inputs,\n innerContext?.inputs,\n ) as any,\n [ctxParamsSymbol as any]: innerContext?.params,\n }) as Iterable<any>,\n 'original extension factory',\n options.output,\n );\n },\n {\n node,\n apis,\n config: config as any,\n inputs: inputs as any,\n },\n );\n\n if (\n typeof parentResult !== 'object' ||\n !parentResult?.[Symbol.iterator]\n ) {\n throw new Error(\n 'extension factory override did not provide an iterable object',\n );\n }\n\n const deduplicatedResult = new Map<\n string,\n ExtensionDataValue<any, any>\n >();\n for (const item of parentResult) {\n deduplicatedResult.set(item.id, item);\n }\n\n return deduplicatedResult.values();\n },\n }) as OverridableExtensionDefinition<any>;\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;;;AAmDO,MAAM,eAAA,0BAAyB,QAAQ;AA+Z9C,SAAS,UAAA,CACP,MAAA,EACA,IAAA,EACA,IAAA,EACA;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,KAAM;AAAA,MACjD,SAAA;AAAA,MACA,oBAAA,CAAqB,UAAA,CAAW,KAAK,CAAA,CAAE,WAAA,GAAc;AAAA,QACnD,IAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA,IAAK;AAAA,KACP;AAAA,GACH;AACF;AAsIO,SAAS,gBACd,OAAA,EACqC;AACrC,EAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,EAAQ;AAC1B,IAAA,+BAAA,CAAgC,wBAAwB,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,oBAAA,GAAuB,oBAAA;AAAA,IAC3B,QAAQ,MAAA,EAAQ,MAAA,GACZ,6BAA6B,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,GAClD,MAAA;AAAA,IACJ,OAAA,CAAQ,YAAA,GAAe,kBAAA,CAAmB,OAAA,CAAQ,YAAY,CAAA,GAAI;AAAA,GACpE;AAEA,EAAA,OAAO,yBAAA,CAA0B,eAAe,IAAA,EAAM;AAAA,IACpD,CAAA,EAAG,MAAA;AAAA,IACH,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,IAC9B,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,QAAQ,UAAA,CAAW,OAAA,CAAQ,QAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AAAA,IAC7D,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,YAAA,EAAc,oBAAA;AAAA,IACd,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,GAAW;AACT,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MACnC;AACA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,QAAA,GAAW,CAAC,OAAA,CAAQ,QAAQ,EAC/B,IAAA,EAAK,CACL,IAAI,CAAA,IAAA,KAAQ;AACX,QAAA,MAAM,CAAA,GAAI,IAAA;AACV,QAAA,IAAI,oBAAA,CAAqB,MAAA,CAAO,CAAC,CAAA,EAAG;AAClC,UAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,oBAAA,CAAqB,WAAW,CAAC,CAAA;AACrD,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,OAAO,kBAAA;AAAA,UACT;AACA,UAAA,IAAI,EAAA,GAAK,UAAA;AACT,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,EAAA,GAAK,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,UAC7B;AACA,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,IAAI,CAAA,CAAA;AAAA,UAC7B;AACA,UAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,QAC/B;AACA,QAAA,IAAI,UAAA,IAAc,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU;AACjC,UAAA,IAAI,EAAA,GAAK,UAAA;AACT,UAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,YAAA,EAAA,GAAK,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,IAAI,IAAI,EAAE,CAAA,CAAA;AAAA,UAC/B;AACA,UAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,YAAA,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,IAAI,CAAA,CAAA;AAAA,UAC/B;AACA,UAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,OAAO,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAAA,QAC3B;AACA,QAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,MAC1D,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AACjC,MAAA,OAAO,CAAA,oBAAA,EAAuB,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,SAAS,eAAA,EAAsB;AAC7B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,eAAA,CAAgB,QAAQ,MAAA,EAAQ;AAClC,QAAA,+BAAA,CAAgC,wBAAwB,CAAA;AAAA,MAC1D;AAKA,MAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,CAAC,eAAA,CAAgB,OAAA,EAAS;AACtD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,OAAA,EAAS;AACrD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,cAAc,OAAA,CAAQ,EAAA;AAC1B,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,WAAA,GAAc,eAAA,CAAgB,EAAA;AAAA,MAChC;AAEA,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAA,EAAW,eAAA,CAAgB,QAAA,IACzB,OAAA,CAAQ,QAAA;AAAA,QACV,QAAA,EAAU,eAAA,CAAgB,QAAA,IAAY,OAAA,CAAQ,QAAA;AAAA,QAC9C,EAAA,EAAI,WAAA;AAAA,QACJ,MAAA,EAAQ,UAAA;AAAA,UACN;AAAA,YACE,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAC;AAAA,YACvB,GAAI,eAAA,CAAgB,MAAA,IAAU;AAAC,WACjC;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR,OAAA,CAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAS,eAAA,CAAgB,MAAA,IACvB,OAAA,CAAQ,MAAA;AAAA,QACV,QACE,OAAA,CAAQ,MAAA,EAAQ,MAAA,IAAU,eAAA,CAAgB,QAAQ,MAAA,GAC9C;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAG,QAAQ,MAAA,EAAQ,MAAA;AAAA,YACnB,GAAG,gBAAgB,MAAA,EAAQ;AAAA;AAC7B,SACF,GACA,MAAA;AAAA,QACN,YAAA,EACE,OAAA,CAAQ,YAAA,IAAgB,eAAA,CAAgB,YAAA,GACpC;AAAA,UACE,GAAG,OAAA,CAAQ,YAAA;AAAA,UACX,GAAG,eAAA,CAAgB;AAAA,SACrB,GACA,MAAA;AAAA,QACN,SAAS,CAAC,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,QAAO,KAAM;AAC3C,UAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,YAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,cACrB,IAAA;AAAA,cACA,IAAA;AAAA,cACA,MAAA;AAAA,cACA,MAAA;AAAA,cACA,CAAC,eAAsB,GAAG,eAAA,CAAgB;AAAA,aAC3C,CAAA;AAAA,UACH;AACA,UAAA,MAAM,eAAe,eAAA,CAAgB,OAAA;AAAA,YACnC,CAAC,YAAA,KAAmD;AAClD,cAAA,OAAO,4BAAA;AAAA,gBACL,QAAQ,OAAA,CAAQ;AAAA,kBACd,IAAA;AAAA,kBACA,IAAA;AAAA,kBACA,MAAA,EAAS,cAAc,MAAA,IAAU,MAAA;AAAA,kBACjC,MAAA,EAAQ,qBAAA;AAAA,oBACN,OAAA,CAAQ,MAAA;AAAA,oBACR,MAAA;AAAA,oBACA,YAAA,EAAc;AAAA,mBAChB;AAAA,kBACA,CAAC,eAAsB,GAAG,YAAA,EAAc;AAAA,iBACzC,CAAA;AAAA,gBACD,4BAAA;AAAA,gBACA,OAAA,CAAQ;AAAA,eACV;AAAA,YACF,CAAA;AAAA,YACA;AAAA,cACE,IAAA;AAAA,cACA,IAAA;AAAA,cACA,MAAA;AAAA,cACA;AAAA;AACF,WACF;AAEA,UAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,CAAC,YAAA,GAAe,MAAA,CAAO,QAAQ,CAAA,EAC/B;AACA,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AAEA,UAAA,MAAM,kBAAA,uBAAyB,GAAA,EAG7B;AACF,UAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,YAAA,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,UACtC;AAEA,UAAA,OAAO,mBAAmB,MAAA,EAAO;AAAA,QACnC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"createExtension.esm.js","sources":["../../src/wiring/createExtension.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ApiHolder, AppNode } from '../apis';\nimport { Expand } from '@backstage/types';\nimport {\n ResolvedInputValueOverrides,\n resolveInputOverrides,\n} from './resolveInputOverrides';\nimport {\n createExtensionDataContainer,\n OpaqueExtensionInput,\n} from '@internal/frontend';\nimport { ExtensionDataRef, ExtensionDataValue } from './createExtensionDataRef';\nimport { ExtensionInput } from './createExtensionInput';\nimport { createConfigSchema } from '../schema/createPortableSchema';\nimport { type StandardSchemaV1 } from '@standard-schema/spec';\nimport { OpaqueExtensionDefinition } from '@internal/frontend';\nimport { ExtensionDataContainer } from './types';\nimport {\n ExtensionBlueprint,\n ExtensionBlueprintDefineParams,\n} from './createExtensionBlueprint';\nimport { FrontendPlugin } from './createFrontendPlugin';\nimport { FrontendModule } from './createFrontendModule';\nimport { FilterPredicate } from '@backstage/filter-predicates';\nimport { assertNoLegacyConfigSchema } from '../schema/assertNoLegacyConfigSchema';\n\n/**\n * This symbol is used to pass parameter overrides from the extension override to the blueprint factory\n * @internal\n */\nexport const ctxParamsSymbol = Symbol('params');\n\n/** @ignore */\ntype ResolvedExtensionInput<TExtensionInput extends ExtensionInput> =\n TExtensionInput['extensionData'] extends Array<ExtensionDataRef>\n ? {\n node: AppNode;\n } & ExtensionDataContainer<TExtensionInput['extensionData'][number]>\n : never;\n\n/**\n * Converts an extension input map into a matching collection of resolved inputs.\n *\n * @ignore\n */\nexport type ResolvedExtensionInputs<\n TInputs extends {\n [name in string]: ExtensionInput;\n },\n> = {\n [InputName in keyof TInputs]: false extends TInputs[InputName]['config']['singleton']\n ? Array<Expand<ResolvedExtensionInput<TInputs[InputName]>>>\n : false extends TInputs[InputName]['config']['optional']\n ? Expand<ResolvedExtensionInput<TInputs[InputName]>>\n : Expand<ResolvedExtensionInput<TInputs[InputName]> | undefined>;\n};\n\ntype ToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\n\ntype PopUnion<U> = ToIntersection<\n U extends any ? () => U : never\n> extends () => infer R\n ? [rest: Exclude<U, R>, next: R]\n : undefined;\n\n/** @ignore */\ntype JoinStringUnion<\n U,\n TDiv extends string = ', ',\n TResult extends string = '',\n> = PopUnion<U> extends [infer IRest extends string, infer INext extends string]\n ? TResult extends ''\n ? JoinStringUnion<IRest, TDiv, INext>\n : JoinStringUnion<IRest, TDiv, `${TResult}${TDiv}${INext}`>\n : TResult;\n\n/** @ignore */\nexport type RequiredExtensionIds<UExtensionData extends ExtensionDataRef> =\n UExtensionData extends any\n ? UExtensionData['config']['optional'] extends true\n ? never\n : UExtensionData['id']\n : never;\n\n/** @ignore */\nexport type VerifyExtensionFactoryOutput<\n UDeclaredOutput extends ExtensionDataRef,\n UFactoryOutput extends ExtensionDataValue<any, any>,\n> = [RequiredExtensionIds<UDeclaredOutput>] extends [UFactoryOutput['id']]\n ? [UFactoryOutput['id']] extends [UDeclaredOutput['id']]\n ? {}\n : `Error: The extension factory has undeclared output(s): ${JoinStringUnion<\n Exclude<UFactoryOutput['id'], UDeclaredOutput['id']>\n >}`\n : `Error: The extension factory is missing the following output(s): ${JoinStringUnion<\n Exclude<RequiredExtensionIds<UDeclaredOutput>, UFactoryOutput['id']>\n >}`;\n\n/** @ignore */\nexport type VerifyExtensionAttachTo<\n UOutput extends ExtensionDataRef,\n UParentInput extends ExtensionDataRef,\n> = ExtensionDataRef extends UParentInput\n ? {}\n : [RequiredExtensionIds<UParentInput>] extends [RequiredExtensionIds<UOutput>]\n ? {}\n : `Error: This parent extension input requires the following extension data, but it is not declared as guaranteed output of this extension: ${JoinStringUnion<\n Exclude<RequiredExtensionIds<UParentInput>, RequiredExtensionIds<UOutput>>\n >}`;\n\n/**\n * Specifies where an extension should attach in the extension tree.\n *\n * @remarks\n *\n * A standard attachment point declaration will specify the ID of the parent extension, as well as the name of the input to attach to.\n *\n * There are two more advanced forms that are available for more complex use-cases:\n *\n * 1. Relative attachment points: using the `relative` property instead of `id`, the attachment point is resolved relative to the current plugin.\n * 2. Extension input references: using a reference in code to another extension's input in the same plugin. These references are always relative.\n *\n * @example\n * ```ts\n * // Attach to a specific extension by full ID\n * { id: 'app/routes', input: 'routes' }\n *\n * // Attach to an extension in the same plugin by kind\n * { relative: { kind: 'page' }, input: 'actions' }\n *\n * // Attach to a specific input of another extension\n * const page = ParentBlueprint.make({ ... });\n * const child = ChildBlueprint.make({ attachTo: page.inputs.children });\n * ```\n *\n * @public\n */\nexport type ExtensionDefinitionAttachTo<\n UParentInputs extends ExtensionDataRef = ExtensionDataRef,\n> =\n | { id: string; input: string; relative?: never }\n | { relative: { kind?: string; name?: string }; input: string; id?: never }\n | ExtensionInput<UParentInputs>;\n\n/** @public */\nexport type CreateExtensionOptions<\n TKind extends string | undefined,\n TName extends string | undefined,\n UOutput extends ExtensionDataRef,\n TInputs extends { [inputName in string]: ExtensionInput },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n UParentInputs extends ExtensionDataRef,\n TNewConfigSchema extends { [key: string]: StandardSchemaV1 } = {},\n> = {\n kind?: TKind;\n name?: TName;\n attachTo: ExtensionDefinitionAttachTo<UParentInputs> &\n VerifyExtensionAttachTo<UOutput, UParentInputs>;\n disabled?: boolean;\n if?: FilterPredicate;\n inputs?: TInputs;\n output: Array<UOutput>;\n configSchema?: TNewConfigSchema;\n factory(context: {\n node: AppNode;\n apis: ApiHolder;\n config: {\n [key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<\n TNewConfigSchema[key]\n >;\n };\n inputs: Expand<ResolvedExtensionInputs<TInputs>>;\n }): Iterable<UFactoryOutput>;\n} & VerifyExtensionFactoryOutput<UOutput, UFactoryOutput>;\n\n/** @public */\nexport type ExtensionDefinitionParameters = {\n kind?: string;\n name?: string;\n configInput?: { [K in string]: any };\n config?: { [K in string]: any };\n output?: ExtensionDataRef;\n inputs?: { [KName in string]: ExtensionInput };\n params?: object | ExtensionBlueprintDefineParams;\n};\n\n/**\n * Same as the one in `createExtensionBlueprint`, but with `ParamsFactory` inlined.\n * It can't be exported because it breaks API reports.\n * @ignore\n */\ntype AnyParamsInput<TParams extends object | ExtensionBlueprintDefineParams> =\n TParams extends ExtensionBlueprintDefineParams<infer IParams>\n ? IParams | ((define: TParams) => ReturnType<TParams>)\n :\n | TParams\n | ((\n define: ExtensionBlueprintDefineParams<TParams, TParams>,\n ) => ReturnType<ExtensionBlueprintDefineParams<TParams, TParams>>);\n\n/** @public */\nexport interface ExtensionDefinition<\n TParams extends ExtensionDefinitionParameters = ExtensionDefinitionParameters,\n> {\n $$type: '@backstage/ExtensionDefinition';\n readonly T: TParams;\n}\n\n/** @public */\nexport interface OverridableExtensionDefinition<\n T extends ExtensionDefinitionParameters = ExtensionDefinitionParameters,\n> extends ExtensionDefinition<T> {\n /**\n * References to the inputs of this extension, which can be used to attach child extensions.\n */\n readonly inputs: {\n [K in keyof T['inputs']]: ExtensionInput<\n T['inputs'][K] extends ExtensionInput<infer IData> ? IData : never\n >;\n };\n\n override<\n UFactoryOutput extends ExtensionDataValue<any, any>,\n UNewOutput extends ExtensionDataRef,\n TExtraInputs extends { [inputName in string]: ExtensionInput },\n TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,\n UParentInputs extends ExtensionDataRef,\n TNewExtensionConfigSchema extends {\n [key in string]: StandardSchemaV1;\n } = {},\n >(\n args: Expand<\n {\n attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &\n VerifyExtensionAttachTo<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UParentInputs\n >;\n disabled?: boolean;\n if?: FilterPredicate;\n inputs?: TExtraInputs & {\n [KName in keyof T['inputs']]?: `Error: Input '${KName &\n string}' is already defined in parent definition`;\n };\n output?: Array<UNewOutput>;\n config?: never;\n configSchema?: TNewExtensionConfigSchema & {\n [KName in keyof T['config']]?: `Error: Config key '${KName &\n string}' is already defined in parent schema`;\n };\n factory?(\n originalFactory: <\n TFactoryParamsReturn extends AnyParamsInput<\n NonNullable<T['params']>\n >,\n >(\n context?: Expand<\n {\n config?: T['config'];\n inputs?: ResolvedInputValueOverrides<NonNullable<T['inputs']>>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TFactoryParamsReturn extends ExtensionBlueprintDefineParams\n ? TFactoryParamsReturn\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n >,\n ) => ExtensionDataContainer<NonNullable<T['output']>>,\n context: {\n node: AppNode;\n apis: ApiHolder;\n config: T['config'] & {\n [key in keyof TNewExtensionConfigSchema]: StandardSchemaV1.InferOutput<\n TNewExtensionConfigSchema[key]\n >;\n };\n inputs: Expand<ResolvedExtensionInputs<T['inputs'] & TExtraInputs>>;\n },\n ): Iterable<UFactoryOutput>;\n } & ([T['params']] extends [never]\n ? {}\n : {\n params?: TParamsInput extends ExtensionBlueprintDefineParams\n ? TParamsInput\n : T['params'] extends ExtensionBlueprintDefineParams\n ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `originalFactory(defineParams => defineParams(<params>))`'\n : Partial<T['params']>;\n })\n > &\n VerifyExtensionFactoryOutput<\n ExtensionDataRef extends UNewOutput\n ? NonNullable<T['output']>\n : UNewOutput,\n UFactoryOutput\n >,\n ): OverridableExtensionDefinition<{\n kind: T['kind'];\n name: T['name'];\n output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput;\n inputs: T['inputs'] & TExtraInputs;\n config: T['config'] & {\n [key in keyof TNewExtensionConfigSchema]: StandardSchemaV1.InferOutput<\n TNewExtensionConfigSchema[key]\n >;\n };\n configInput: T['configInput'] & {\n [key in keyof TNewExtensionConfigSchema]?: StandardSchemaV1.InferInput<\n TNewExtensionConfigSchema[key]\n >;\n };\n }>;\n}\n\n/**\n * @internal\n */\nfunction bindInputs(\n inputs: { [inputName in string]: ExtensionInput } | undefined,\n kind?: string,\n name?: string,\n) {\n if (!inputs) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(inputs).map(([inputName, input]) => [\n inputName,\n OpaqueExtensionInput.toInternal(input).withContext?.({\n kind,\n name,\n input: inputName,\n }) ?? input,\n ]),\n );\n}\n\n/**\n * Creates a new extension definition for installation in a Backstage app.\n *\n * @remarks\n *\n * This is a low-level function for creation of extensions with arbitrary inputs\n * and outputs and is typically only intended to be used for advanced overrides\n * or framework-level extensions. For most extension creation needs, it is\n * recommended to use existing {@link ExtensionBlueprint}s instead. You can find\n * blueprints both in the `@backstage/frontend-plugin-api` package as well as\n * other plugin libraries. There is also a list of\n * {@link https://backstage.io/docs/frontend-system/building-plugins/common-extension-blueprints | commonly used blueprints}\n * in the frontend system documentation.\n *\n * Extension definitions that are created with this function can be installed in\n * a Backstage app via a {@link FrontendPlugin} or {@link FrontendModule}.\n *\n * For more details on how extensions work, see the\n * {@link https://backstage.io/docs/frontend-system/architecture/extensions | documentation for extensions}.\n *\n * @example\n *\n * ```ts\n * const myExtension = createExtension({\n * name: 'example',\n * attachTo: { id: 'app', input: 'root' },\n * output: [coreExtensionData.reactElement],\n * factory() {\n * return [coreExtensionData.reactElement(<h1>Hello, world!</h1>)];\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createExtension<\n UOutput extends ExtensionDataRef,\n TInputs extends { [inputName in string]: ExtensionInput },\n UFactoryOutput extends ExtensionDataValue<any, any>,\n const TKind extends string | undefined = undefined,\n const TName extends string | undefined = undefined,\n UParentInputs extends ExtensionDataRef = ExtensionDataRef,\n TNewConfigSchema extends { [key: string]: StandardSchemaV1 } = {},\n>(\n options: CreateExtensionOptions<\n TKind,\n TName,\n UOutput,\n TInputs,\n UFactoryOutput,\n UParentInputs,\n TNewConfigSchema\n >,\n): OverridableExtensionDefinition<{\n config: {\n [key in keyof TNewConfigSchema]: StandardSchemaV1.InferOutput<\n TNewConfigSchema[key]\n >;\n };\n configInput: {\n [key in keyof TNewConfigSchema]?: StandardSchemaV1.InferInput<\n TNewConfigSchema[key]\n >;\n };\n output: UOutput extends ExtensionDataRef<\n infer IData,\n infer IId,\n infer IConfig\n >\n ? ExtensionDataRef<IData, IId, IConfig>\n : never;\n inputs: TInputs;\n params: never;\n kind: string | undefined extends TKind ? undefined : TKind;\n name: string | undefined extends TName ? undefined : TName;\n}>;\n\n/** @internal */\nexport function createExtension(\n options: any,\n): OverridableExtensionDefinition<any> {\n assertNoLegacyConfigSchema(options);\n\n const resolvedConfigSchema = options.configSchema\n ? createConfigSchema(options.configSchema)\n : undefined;\n\n return OpaqueExtensionDefinition.createInstance('v2', {\n T: undefined as any,\n kind: options.kind,\n name: options.name,\n attachTo: options.attachTo,\n disabled: options.disabled ?? false,\n if: options.if,\n inputs: bindInputs(options.inputs, options.kind, options.name),\n output: options.output,\n configSchema: resolvedConfigSchema,\n factory: options.factory,\n toString() {\n const parts: string[] = [];\n if (options.kind) {\n parts.push(`kind=${options.kind}`);\n }\n if (options.name) {\n parts.push(`name=${options.name}`);\n }\n const attachTo = [options.attachTo]\n .flat()\n .map(aAny => {\n const a = aAny as ExtensionDefinitionAttachTo;\n if (OpaqueExtensionInput.isType(a)) {\n const { context } = OpaqueExtensionInput.toInternal(a);\n if (!context) {\n return '<detached-input>';\n }\n let id = '<plugin>';\n if (context?.kind) {\n id = `${context?.kind}:${id}`;\n }\n if (context?.name) {\n id = `${id}/${context?.name}`;\n }\n return `${id}@${context.input}`;\n }\n if ('relative' in a && a.relative) {\n let id = '<plugin>';\n if (a.relative.kind) {\n id = `${a.relative.kind}:${id}`;\n }\n if (a.relative.name) {\n id = `${id}/${a.relative.name}`;\n }\n return `${id}@${a.input}`;\n }\n if ('id' in a) {\n return `${a.id}@${a.input}`;\n }\n throw new Error('Invalid attachment point specification');\n })\n .join('+');\n parts.push(`attachTo=${attachTo}`);\n return `ExtensionDefinition{${parts.join(',')}}`;\n },\n override(overrideOptions: any) {\n assertNoLegacyConfigSchema(overrideOptions);\n\n if (!Array.isArray(options.output)) {\n throw new Error(\n 'Cannot override an extension that is not declared using the new format with outputs as an array',\n );\n }\n\n // TODO(Rugvip): Making this a type check would be optimal, but it seems\n // like it's tricky to add that and still have the type\n // inference work correctly for the factory output.\n if (overrideOptions.output && !overrideOptions.factory) {\n throw new Error(\n 'Refused to override output without also overriding factory',\n );\n }\n // TODO(Rugvip): Similar to above, would be nice to error during type checking, but don't want to complicate the types too much\n if (overrideOptions.params && overrideOptions.factory) {\n throw new Error(\n 'Refused to override params and factory at the same time',\n );\n }\n\n let ifPredicate = options.if;\n if ('if' in overrideOptions) {\n ifPredicate = overrideOptions.if;\n }\n\n return createExtension({\n kind: options.kind,\n name: options.name,\n attachTo: (overrideOptions.attachTo ??\n options.attachTo) as ExtensionDefinitionAttachTo,\n disabled: overrideOptions.disabled ?? options.disabled,\n if: ifPredicate,\n inputs: bindInputs(\n {\n ...(options.inputs ?? {}),\n ...(overrideOptions.inputs ?? {}),\n },\n options.kind,\n options.name,\n ),\n output: (overrideOptions.output ??\n options.output) as ExtensionDataRef[],\n configSchema:\n options.configSchema || overrideOptions.configSchema\n ? {\n ...options.configSchema,\n ...overrideOptions.configSchema,\n }\n : undefined,\n factory: ({ node, apis, config, inputs }) => {\n if (!overrideOptions.factory) {\n return options.factory({\n node,\n apis,\n config: config as any,\n inputs: inputs as any,\n [ctxParamsSymbol as any]: overrideOptions.params,\n });\n }\n const parentResult = overrideOptions.factory(\n (innerContext: any): ExtensionDataContainer<any> => {\n return createExtensionDataContainer<any>(\n options.factory({\n node,\n apis,\n config: (innerContext?.config ?? config) as any,\n inputs: resolveInputOverrides(\n options.inputs,\n inputs,\n innerContext?.inputs,\n ) as any,\n [ctxParamsSymbol as any]: innerContext?.params,\n }) as Iterable<any>,\n 'original extension factory',\n options.output,\n );\n },\n {\n node,\n apis,\n config: config as any,\n inputs: inputs as any,\n },\n );\n\n if (\n typeof parentResult !== 'object' ||\n !parentResult?.[Symbol.iterator]\n ) {\n throw new Error(\n 'extension factory override did not provide an iterable object',\n );\n }\n\n const deduplicatedResult = new Map<\n string,\n ExtensionDataValue<any, any>\n >();\n for (const item of parentResult) {\n deduplicatedResult.set(item.id, item);\n }\n\n return deduplicatedResult.values();\n },\n }) as OverridableExtensionDefinition<any>;\n },\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createExtension, ctxParamsSymbol } from './createExtension.esm.js';
|
|
2
2
|
import { resolveInputOverrides } from './resolveInputOverrides.esm.js';
|
|
3
|
-
import {
|
|
4
|
-
import { describeParentCallSite } from '../routing/describeParentCallSite.esm.js';
|
|
3
|
+
import { assertNoLegacyConfigSchema } from '../schema/assertNoLegacyConfigSchema.esm.js';
|
|
5
4
|
import { OpaqueType } from '../opaque-internal/src/OpaqueType.esm.js';
|
|
6
5
|
import { createExtensionDataContainer } from '../frontend-internal/src/wiring/createExtensionDataContainer.esm.js';
|
|
7
6
|
import '../frontend-internal/src/wiring/InternalExtensionDefinition.esm.js';
|
|
@@ -60,6 +59,7 @@ function unwrapParams(params, ctx, defineParams, kind) {
|
|
|
60
59
|
};
|
|
61
60
|
}
|
|
62
61
|
function createExtensionBlueprint(options) {
|
|
62
|
+
assertNoLegacyConfigSchema(options);
|
|
63
63
|
const defineParams = options.defineParams;
|
|
64
64
|
return {
|
|
65
65
|
dataRefs: options.dataRefs,
|
|
@@ -72,7 +72,6 @@ function createExtensionBlueprint(options) {
|
|
|
72
72
|
if: args.if ?? options.if,
|
|
73
73
|
inputs: options.inputs,
|
|
74
74
|
output: options.output,
|
|
75
|
-
config: options.config,
|
|
76
75
|
configSchema: options.configSchema,
|
|
77
76
|
factory: (ctx) => options.factory(
|
|
78
77
|
unwrapParams(args.params, ctx, defineParams, options.kind),
|
|
@@ -81,9 +80,7 @@ function createExtensionBlueprint(options) {
|
|
|
81
80
|
});
|
|
82
81
|
},
|
|
83
82
|
makeWithOverrides(args) {
|
|
84
|
-
|
|
85
|
-
warnConfigSchemaPropDeprecation(describeParentCallSite());
|
|
86
|
-
}
|
|
83
|
+
assertNoLegacyConfigSchema(args);
|
|
87
84
|
return createExtension({
|
|
88
85
|
kind: options.kind,
|
|
89
86
|
name: args.name,
|
|
@@ -92,12 +89,6 @@ function createExtensionBlueprint(options) {
|
|
|
92
89
|
if: args.if ?? options.if,
|
|
93
90
|
inputs: { ...args.inputs, ...options.inputs },
|
|
94
91
|
output: args.output ?? options.output,
|
|
95
|
-
config: options.config?.schema || args.config?.schema ? {
|
|
96
|
-
schema: {
|
|
97
|
-
...options.config?.schema,
|
|
98
|
-
...args.config?.schema
|
|
99
|
-
}
|
|
100
|
-
} : void 0,
|
|
101
92
|
configSchema: options.configSchema || args.configSchema ? {
|
|
102
93
|
...options.configSchema,
|
|
103
94
|
...args.configSchema
|