@backstage/plugin-catalog-react 2.1.2-next.2 → 2.1.3

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 CHANGED
@@ -1,5 +1,42 @@
1
1
  # @backstage/plugin-catalog-react
2
2
 
3
+ ## 2.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 6b60bd7: Replaced old config schema values from existing extensions and blueprints.
8
+ - Updated dependencies
9
+ - @backstage/ui@0.14.1
10
+ - @backstage/frontend-plugin-api@0.16.1
11
+
12
+ ## 2.1.2
13
+
14
+ ### Patch Changes
15
+
16
+ - 540a031: Migrated alpha entity blueprints to use the new `configSchema` option with zod v4 schema values.
17
+ - 482ceed: Migrated from `assertError` to `toError` for error handling.
18
+ - 51aacae: Fixed a UI flicker in the catalog entity list where changing a filter would briefly flash stale data before showing the new results.
19
+ - eba2f61: Fixed `EntityInfoCard` header overflowing on narrow screens.
20
+ - 7308885: Updated `catalogApiMock` to include the new `updateLocation` method stub, keeping it in sync with the `CatalogApi` interface.
21
+ - 5f9a531: Deprecated `humanizeEntityRef` and `humanizeEntity` in favor of the Catalog Presentation API. Use `useEntityPresentation`, `EntityDisplayName`, or `entityPresentationApiRef` instead.
22
+ - 0416216: Fixed entity relation cards (e.g., "Has components") only showing one entity at a time by using `paginationOptions: { type: 'none' }` instead of deriving page size from data length.
23
+ - fa232da: Migrated `InspectEntityDialog` from Material UI to Backstage UI components. Added new translation keys: `inspectEntityDialog.overviewPage.copyAriaLabel`, `inspectEntityDialog.overviewPage.copiedStatus`, `inspectEntityDialog.overviewPage.helpLinkAriaLabel`, and `inspectEntityDialog.colocatedPage.entityListAriaLabel`.
24
+ - Updated dependencies
25
+ - @backstage/ui@0.14.0
26
+ - @backstage/errors@1.3.0
27
+ - @backstage/catalog-model@1.8.0
28
+ - @backstage/frontend-plugin-api@0.16.0
29
+ - @backstage/core-components@0.18.9
30
+ - @backstage/filter-predicates@0.1.2
31
+ - @backstage/core-compat-api@0.5.10
32
+ - @backstage/catalog-client@1.15.0
33
+ - @backstage/plugin-permission-react@0.5.0
34
+ - @backstage/frontend-test-utils@0.5.2
35
+ - @backstage/core-plugin-api@1.12.5
36
+ - @backstage/integration-react@1.2.17
37
+ - @backstage/plugin-catalog-common@1.1.9
38
+ - @backstage/plugin-permission-common@0.9.8
39
+
3
40
  ## 2.1.2-next.2
4
41
 
5
42
  ### Patch Changes
@@ -1,7 +1,8 @@
1
1
  import { createExtensionBlueprint, coreExtensionData, ExtensionBoundary } from '@backstage/frontend-plugin-api';
2
2
  import { entityCardTypeDataRef, entityFilterExpressionDataRef, entityFilterFunctionDataRef, entityCardTypes } from './extensionData.esm.js';
3
- import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
3
+ import { createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
4
4
  import { resolveEntityFilterData } from './resolveEntityFilterData.esm.js';
5
+ import { z } from 'zod/v4';
5
6
 
6
7
  const EntityCardBlueprint = createExtensionBlueprint({
7
8
  kind: "entity-card",
@@ -17,11 +18,9 @@ const EntityCardBlueprint = createExtensionBlueprint({
17
18
  filterExpression: entityFilterExpressionDataRef,
18
19
  type: entityCardTypeDataRef
19
20
  },
20
- config: {
21
- schema: {
22
- filter: (z) => z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional(),
23
- type: (z) => z.enum(entityCardTypes).optional()
24
- }
21
+ configSchema: {
22
+ filter: z.union([z.string(), createZodV4FilterPredicateSchema()]).optional(),
23
+ type: z.enum(entityCardTypes).optional()
25
24
  },
26
25
  *factory({
27
26
  loader,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityCardBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityCardBlueprint.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n ExtensionBoundary,\n coreExtensionData,\n createExtensionBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityFilterFunctionDataRef,\n entityFilterExpressionDataRef,\n entityCardTypeDataRef,\n entityCardTypes,\n EntityCardType,\n} from './extensionData';\nimport {\n FilterPredicate,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\n\n/**\n * @alpha\n * A blueprint for creating cards for the entity pages in the catalog.\n */\nexport const EntityCardBlueprint = createExtensionBlueprint({\n kind: 'entity-card',\n attachTo: { id: 'entity-content:catalog/overview', input: 'cards' },\n output: [\n coreExtensionData.reactElement,\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityCardTypeDataRef.optional(),\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n type: entityCardTypeDataRef,\n },\n config: {\n schema: {\n filter: z =>\n z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional(),\n type: z => z.enum(entityCardTypes).optional(),\n },\n },\n *factory(\n {\n loader,\n filter,\n type,\n }: {\n loader: () => Promise<JSX.Element>;\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n type?: EntityCardType;\n },\n { node, config },\n ) {\n yield coreExtensionData.reactElement(ExtensionBoundary.lazy(node, loader));\n\n yield* resolveEntityFilterData(filter, config, node);\n\n const finalType = config.type ?? type;\n if (finalType) {\n yield entityCardTypeDataRef(finalType);\n }\n },\n});\n"],"names":[],"mappings":";;;;;AAuCO,MAAM,sBAAsB,wBAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,iCAAA,EAAmC,OAAO,OAAA,EAAQ;AAAA,EAClE,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,sBAAsB,QAAA;AAAS,GACjC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAA,CAAA,KACN,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,CAAiC,CAAC,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,MACtE,MAAM,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,eAAe,EAAE,QAAA;AAAS;AAC9C,GACF;AAAA,EACA,CAAC,OAAA,CACC;AAAA,IACE,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAKA,EAAE,IAAA,EAAM,MAAA,EAAO,EACf;AACA,IAAA,MAAM,kBAAkB,YAAA,CAAa,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAEzE,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,IAAQ,IAAA;AACjC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,sBAAsB,SAAS,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityCardBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityCardBlueprint.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n ExtensionBoundary,\n coreExtensionData,\n createExtensionBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityFilterFunctionDataRef,\n entityFilterExpressionDataRef,\n entityCardTypeDataRef,\n entityCardTypes,\n EntityCardType,\n} from './extensionData';\nimport {\n FilterPredicate,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\nimport { z } from 'zod/v4';\n\n/**\n * @alpha\n * A blueprint for creating cards for the entity pages in the catalog.\n */\nexport const EntityCardBlueprint = createExtensionBlueprint({\n kind: 'entity-card',\n attachTo: { id: 'entity-content:catalog/overview', input: 'cards' },\n output: [\n coreExtensionData.reactElement,\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityCardTypeDataRef.optional(),\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n type: entityCardTypeDataRef,\n },\n configSchema: {\n filter: z\n .union([z.string(), createZodV4FilterPredicateSchema()])\n .optional(),\n type: z.enum(entityCardTypes).optional(),\n },\n *factory(\n {\n loader,\n filter,\n type,\n }: {\n loader: () => Promise<JSX.Element>;\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n type?: EntityCardType;\n },\n { node, config },\n ) {\n yield coreExtensionData.reactElement(ExtensionBoundary.lazy(node, loader));\n\n yield* resolveEntityFilterData(filter, config, node);\n\n const finalType = config.type ?? type;\n if (finalType) {\n yield entityCardTypeDataRef(finalType);\n }\n },\n});\n"],"names":[],"mappings":";;;;;;AAwCO,MAAM,sBAAsB,wBAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,iCAAA,EAAmC,OAAO,OAAA,EAAQ;AAAA,EAClE,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,sBAAsB,QAAA;AAAS,GACjC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,IAAA,EAAM;AAAA,GACR;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,EAAkC,CAAC,CAAA,CACtD,QAAA,EAAS;AAAA,IACZ,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,eAAe,EAAE,QAAA;AAAS,GACzC;AAAA,EACA,CAAC,OAAA,CACC;AAAA,IACE,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAKA,EAAE,IAAA,EAAM,MAAA,EAAO,EACf;AACA,IAAA,MAAM,kBAAkB,YAAA,CAAa,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAEzE,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,IAAQ,IAAA;AACjC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,sBAAsB,SAAS,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAC;;;;"}
@@ -1,7 +1,8 @@
1
1
  import { createExtensionBlueprint, coreExtensionData, ExtensionBoundary } from '@backstage/frontend-plugin-api';
2
2
  import { entityContentIconDataRef, entityContentGroupDataRef, entityFilterExpressionDataRef, entityFilterFunctionDataRef, entityContentTitleDataRef } from './extensionData.esm.js';
3
- import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
3
+ import { createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
4
4
  import { resolveEntityFilterData } from './resolveEntityFilterData.esm.js';
5
+ import { z } from 'zod/v4';
5
6
 
6
7
  const EntityContentBlueprint = createExtensionBlueprint({
7
8
  kind: "entity-content",
@@ -23,14 +24,12 @@ const EntityContentBlueprint = createExtensionBlueprint({
23
24
  group: entityContentGroupDataRef,
24
25
  icon: entityContentIconDataRef
25
26
  },
26
- config: {
27
- schema: {
28
- path: (z) => z.string().optional(),
29
- title: (z) => z.string().optional(),
30
- filter: (z) => z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional(),
31
- group: (z) => z.literal(false).or(z.string()).optional(),
32
- icon: (z) => z.string().optional()
33
- }
27
+ configSchema: {
28
+ path: z.string().optional(),
29
+ title: z.string().optional(),
30
+ filter: z.union([z.string(), createZodV4FilterPredicateSchema()]).optional(),
31
+ group: z.literal(false).or(z.string()).optional(),
32
+ icon: z.string().optional()
34
33
  },
35
34
  *factory(params, { node, config }) {
36
35
  const path = config.path ?? params.path ?? params.defaultPath;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityContentBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContentBlueprint.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n coreExtensionData,\n createExtensionBlueprint,\n ExtensionBoundary,\n RouteRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityContentTitleDataRef,\n entityFilterFunctionDataRef,\n entityFilterExpressionDataRef,\n entityContentGroupDataRef,\n defaultEntityContentGroups,\n entityContentIconDataRef,\n} from './extensionData';\nimport {\n FilterPredicate,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\nimport { ReactElement } from 'react';\n\n/**\n * @alpha\n * Creates an EntityContent extension.\n */\nexport const EntityContentBlueprint = createExtensionBlueprint({\n kind: 'entity-content',\n attachTo: { id: 'page:catalog/entity', input: 'contents' },\n output: [\n coreExtensionData.reactElement,\n coreExtensionData.routePath,\n entityContentTitleDataRef,\n coreExtensionData.routeRef.optional(),\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityContentGroupDataRef.optional(),\n entityContentIconDataRef.optional(),\n ],\n dataRefs: {\n title: entityContentTitleDataRef,\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n group: entityContentGroupDataRef,\n icon: entityContentIconDataRef,\n },\n config: {\n schema: {\n path: z => z.string().optional(),\n title: z => z.string().optional(),\n filter: z =>\n z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional(),\n group: z => z.literal(false).or(z.string()).optional(),\n icon: z => z.string().optional(),\n },\n },\n *factory(\n params: {\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultPath?: [Error: `Use the 'path' param instead`];\n path: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultTitle?: [Error: `Use the 'title' param instead`];\n title: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultGroup?: [Error: `Use the 'group' param instead`];\n group?: keyof typeof defaultEntityContentGroups | (string & {});\n icon?: string | ReactElement;\n loader: () => Promise<JSX.Element>;\n routeRef?: RouteRef;\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n },\n { node, config },\n ) {\n // TODO(blam): Remove support for all the `default*` props in the future, this breaks backwards compatibility without it\n // As this is marked as BREAKING ALPHA, it doesn't affect the public API so it falls in range and gets picked\n // up by packages that depend on `catalog-react`.\n const path = config.path ?? params.path ?? params.defaultPath;\n const title = config.title ?? params.title ?? params.defaultTitle;\n const icon = config.icon ?? params.icon;\n const group = config.group ?? params.group ?? params.defaultGroup;\n\n yield coreExtensionData.reactElement(\n ExtensionBoundary.lazy(node, params.loader),\n );\n\n yield coreExtensionData.routePath(path);\n\n yield entityContentTitleDataRef(title);\n\n if (params.routeRef) {\n yield coreExtensionData.routeRef(params.routeRef);\n }\n\n yield* resolveEntityFilterData(params.filter, config, node);\n\n if (group && typeof group === 'string') {\n yield entityContentGroupDataRef(group);\n }\n if (icon) {\n yield entityContentIconDataRef(icon);\n }\n },\n});\n"],"names":[],"mappings":";;;;;AA0CO,MAAM,yBAAyB,wBAAA,CAAyB;AAAA,EAC7D,IAAA,EAAM,gBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,UAAA,EAAW;AAAA,EACzD,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,iBAAA,CAAkB,SAAA;AAAA,IAClB,yBAAA;AAAA,IACA,iBAAA,CAAkB,SAAS,QAAA,EAAS;AAAA,IACpC,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,0BAA0B,QAAA,EAAS;AAAA,IACnC,yBAAyB,QAAA;AAAS,GACpC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,yBAAA;AAAA,IACP,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,KAAA,EAAO,yBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,MAC/B,KAAA,EAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,MAChC,MAAA,EAAQ,CAAA,CAAA,KACN,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,CAAiC,CAAC,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,MACtE,KAAA,EAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,EAAA,CAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,MACrD,IAAA,EAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA;AAAS;AACjC,GACF;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAqBA,EAAE,IAAA,EAAM,QAAO,EACf;AAIA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,SAAS,MAAA,CAAO,YAAA;AACrD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,SAAS,MAAA,CAAO,YAAA;AAErD,IAAA,MAAM,iBAAA,CAAkB,YAAA;AAAA,MACtB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,MAAM;AAAA,KAC5C;AAEA,IAAA,MAAM,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAEtC,IAAA,MAAM,0BAA0B,KAAK,CAAA;AAErC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAM,iBAAA,CAAkB,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,uBAAA,CAAwB,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAE1D,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,0BAA0B,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,yBAAyB,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityContentBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContentBlueprint.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n coreExtensionData,\n createExtensionBlueprint,\n ExtensionBoundary,\n RouteRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityContentTitleDataRef,\n entityFilterFunctionDataRef,\n entityFilterExpressionDataRef,\n entityContentGroupDataRef,\n defaultEntityContentGroups,\n entityContentIconDataRef,\n} from './extensionData';\nimport {\n FilterPredicate,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\nimport { ReactElement } from 'react';\nimport { z } from 'zod/v4';\n\n/**\n * @alpha\n * Creates an EntityContent extension.\n */\nexport const EntityContentBlueprint = createExtensionBlueprint({\n kind: 'entity-content',\n attachTo: { id: 'page:catalog/entity', input: 'contents' },\n output: [\n coreExtensionData.reactElement,\n coreExtensionData.routePath,\n entityContentTitleDataRef,\n coreExtensionData.routeRef.optional(),\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityContentGroupDataRef.optional(),\n entityContentIconDataRef.optional(),\n ],\n dataRefs: {\n title: entityContentTitleDataRef,\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n group: entityContentGroupDataRef,\n icon: entityContentIconDataRef,\n },\n configSchema: {\n path: z.string().optional(),\n title: z.string().optional(),\n filter: z\n .union([z.string(), createZodV4FilterPredicateSchema()])\n .optional(),\n group: z.literal(false).or(z.string()).optional(),\n icon: z.string().optional(),\n },\n *factory(\n params: {\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultPath?: [Error: `Use the 'path' param instead`];\n path: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultTitle?: [Error: `Use the 'title' param instead`];\n title: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultGroup?: [Error: `Use the 'group' param instead`];\n group?: keyof typeof defaultEntityContentGroups | (string & {});\n icon?: string | ReactElement;\n loader: () => Promise<JSX.Element>;\n routeRef?: RouteRef;\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n },\n { node, config },\n ) {\n // TODO(blam): Remove support for all the `default*` props in the future, this breaks backwards compatibility without it\n // As this is marked as BREAKING ALPHA, it doesn't affect the public API so it falls in range and gets picked\n // up by packages that depend on `catalog-react`.\n const path = config.path ?? params.path ?? params.defaultPath;\n const title = config.title ?? params.title ?? params.defaultTitle;\n const icon = config.icon ?? params.icon;\n const group = config.group ?? params.group ?? params.defaultGroup;\n\n yield coreExtensionData.reactElement(\n ExtensionBoundary.lazy(node, params.loader),\n );\n\n yield coreExtensionData.routePath(path);\n\n yield entityContentTitleDataRef(title);\n\n if (params.routeRef) {\n yield coreExtensionData.routeRef(params.routeRef);\n }\n\n yield* resolveEntityFilterData(params.filter, config, node);\n\n if (group && typeof group === 'string') {\n yield entityContentGroupDataRef(group);\n }\n if (icon) {\n yield entityContentIconDataRef(icon);\n }\n },\n});\n"],"names":[],"mappings":";;;;;;AA2CO,MAAM,yBAAyB,wBAAA,CAAyB;AAAA,EAC7D,IAAA,EAAM,gBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,UAAA,EAAW;AAAA,EACzD,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,iBAAA,CAAkB,SAAA;AAAA,IAClB,yBAAA;AAAA,IACA,iBAAA,CAAkB,SAAS,QAAA,EAAS;AAAA,IACpC,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,0BAA0B,QAAA,EAAS;AAAA,IACnC,yBAAyB,QAAA;AAAS,GACpC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,yBAAA;AAAA,IACP,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,KAAA,EAAO,yBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,EAAkC,CAAC,CAAA,CACtD,QAAA,EAAS;AAAA,IACZ,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,IAChD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC5B;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAqBA,EAAE,IAAA,EAAM,QAAO,EACf;AAIA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,SAAS,MAAA,CAAO,YAAA;AACrD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,SAAS,MAAA,CAAO,YAAA;AAErD,IAAA,MAAM,iBAAA,CAAkB,YAAA;AAAA,MACtB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,MAAM;AAAA,KAC5C;AAEA,IAAA,MAAM,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAEtC,IAAA,MAAM,0BAA0B,KAAK,CAAA;AAErC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAM,iBAAA,CAAkB,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,uBAAA,CAAwB,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAE1D,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,0BAA0B,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,yBAAyB,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AACF,CAAC;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { createExtensionDataRef, createExtensionBlueprint, ExtensionBoundary } from '@backstage/frontend-plugin-api';
2
2
  import { entityFilterExpressionDataRef, entityFilterFunctionDataRef } from './extensionData.esm.js';
3
- import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
3
+ import { createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
4
+ import { z } from 'zod/v4';
4
5
  import { resolveEntityFilterData } from './resolveEntityFilterData.esm.js';
5
6
 
6
7
  const entityCardLayoutComponentDataRef = createExtensionDataRef().with({
@@ -19,11 +20,9 @@ const EntityContentLayoutBlueprint = createExtensionBlueprint({
19
20
  filterExpression: entityFilterExpressionDataRef,
20
21
  component: entityCardLayoutComponentDataRef
21
22
  },
22
- config: {
23
- schema: {
24
- type: (z) => z.string().optional(),
25
- filter: (z) => z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional()
26
- }
23
+ configSchema: {
24
+ type: z.string().optional(),
25
+ filter: z.union([z.string(), createZodV4FilterPredicateSchema()]).optional()
27
26
  },
28
27
  *factory({
29
28
  loader,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityContentLayoutBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContentLayoutBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n createExtensionDataRef,\n createExtensionBlueprint,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n EntityCardType,\n} from './extensionData';\nimport { JSX } from 'react';\nimport {\n FilterPredicate,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\n\n/** @alpha */\nexport interface EntityContentLayoutProps {\n cards: Array<{\n type?: EntityCardType;\n element: JSX.Element;\n }>;\n}\n\nconst entityCardLayoutComponentDataRef = createExtensionDataRef<\n (props: EntityContentLayoutProps) => React.JSX.Element\n>().with({\n id: 'catalog.entity-content-layout.component',\n});\n\n/** @alpha */\nexport const EntityContentLayoutBlueprint = createExtensionBlueprint({\n kind: 'entity-content-layout',\n attachTo: { id: 'entity-content:catalog/overview', input: 'layouts' },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityCardLayoutComponentDataRef,\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n component: entityCardLayoutComponentDataRef,\n },\n config: {\n schema: {\n type: z => z.string().optional(),\n filter: z =>\n z.union([z.string(), createZodV3FilterPredicateSchema(z)]).optional(),\n },\n },\n *factory(\n {\n loader,\n filter,\n }: {\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n loader: () => Promise<(props: EntityContentLayoutProps) => JSX.Element>;\n },\n { node, config },\n ) {\n yield* resolveEntityFilterData(filter, config, node);\n\n yield entityCardLayoutComponentDataRef(\n ExtensionBoundary.lazyComponent(node, loader),\n );\n },\n});\n"],"names":[],"mappings":";;;;;AA0CA,MAAM,gCAAA,GAAmC,sBAAA,EAEvC,CAAE,IAAA,CAAK;AAAA,EACP,EAAA,EAAI;AACN,CAAC,CAAA;AAGM,MAAM,+BAA+B,wBAAA,CAAyB;AAAA,EACnE,IAAA,EAAM,uBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,iCAAA,EAAmC,OAAO,SAAA,EAAU;AAAA,EACpE,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,MAC/B,MAAA,EAAQ,CAAA,CAAA,KACN,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,CAAiC,CAAC,CAAC,CAAC,EAAE,QAAA;AAAS;AACxE,GACF;AAAA,EACA,CAAC,OAAA,CACC;AAAA,IACE,MAAA;AAAA,IACA;AAAA,GACF,EAIA,EAAE,IAAA,EAAM,MAAA,EAAO,EACf;AACA,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,MAAM,gCAAA;AAAA,MACJ,iBAAA,CAAkB,aAAA,CAAc,IAAA,EAAM,MAAM;AAAA,KAC9C;AAAA,EACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityContentLayoutBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContentLayoutBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n createExtensionDataRef,\n createExtensionBlueprint,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n EntityCardType,\n} from './extensionData';\nimport { JSX } from 'react';\nimport {\n FilterPredicate,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { z } from 'zod/v4';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport { Entity } from '@backstage/catalog-model';\n\n/** @alpha */\nexport interface EntityContentLayoutProps {\n cards: Array<{\n type?: EntityCardType;\n element: JSX.Element;\n }>;\n}\n\nconst entityCardLayoutComponentDataRef = createExtensionDataRef<\n (props: EntityContentLayoutProps) => React.JSX.Element\n>().with({\n id: 'catalog.entity-content-layout.component',\n});\n\n/** @alpha */\nexport const EntityContentLayoutBlueprint = createExtensionBlueprint({\n kind: 'entity-content-layout',\n attachTo: { id: 'entity-content:catalog/overview', input: 'layouts' },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityCardLayoutComponentDataRef,\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n component: entityCardLayoutComponentDataRef,\n },\n configSchema: {\n type: z.string().optional(),\n filter: z\n .union([z.string(), createZodV4FilterPredicateSchema()])\n .optional(),\n },\n *factory(\n {\n loader,\n filter,\n }: {\n filter?: string | FilterPredicate | ((entity: Entity) => boolean);\n loader: () => Promise<(props: EntityContentLayoutProps) => JSX.Element>;\n },\n { node, config },\n ) {\n yield* resolveEntityFilterData(filter, config, node);\n\n yield entityCardLayoutComponentDataRef(\n ExtensionBoundary.lazyComponent(node, loader),\n );\n },\n});\n"],"names":[],"mappings":";;;;;;AA2CA,MAAM,gCAAA,GAAmC,sBAAA,EAEvC,CAAE,IAAA,CAAK;AAAA,EACP,EAAA,EAAI;AACN,CAAC,CAAA;AAGM,MAAM,+BAA+B,wBAAA,CAAyB;AAAA,EACnE,IAAA,EAAM,uBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,iCAAA,EAAmC,OAAO,SAAA,EAAU;AAAA,EACpE,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB,6BAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,gCAAA,EAAkC,CAAC,CAAA,CACtD,QAAA;AAAS,GACd;AAAA,EACA,CAAC,OAAA,CACC;AAAA,IACE,MAAA;AAAA,IACA;AAAA,GACF,EAIA,EAAE,IAAA,EAAM,MAAA,EAAO,EACf;AACA,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,MAAM,gCAAA;AAAA,MACJ,iBAAA,CAAkB,aAAA,CAAc,IAAA,EAAM,MAAM;AAAA,KAC9C;AAAA,EACF;AACF,CAAC;;;;"}
@@ -4,7 +4,7 @@ import MenuItem from '@material-ui/core/MenuItem';
4
4
  import ListItemIcon from '@material-ui/core/ListItemIcon';
5
5
  import ListItemText from '@material-ui/core/ListItemText';
6
6
  import { useEntityContextMenu } from '../../hooks/useEntityContextMenu.esm.js';
7
- import { filterPredicateToFilterFunction, createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
7
+ import { filterPredicateToFilterFunction, createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
8
8
  import { entityFilterFunctionDataRef } from './extensionData.esm.js';
9
9
 
10
10
  const EntityContextMenuItemBlueprint = createExtensionBlueprint({
@@ -17,10 +17,8 @@ const EntityContextMenuItemBlueprint = createExtensionBlueprint({
17
17
  dataRefs: {
18
18
  filterFunction: entityFilterFunctionDataRef
19
19
  },
20
- config: {
21
- schema: {
22
- filter: (z) => createZodV3FilterPredicateSchema(z).optional()
23
- }
20
+ configSchema: {
21
+ filter: createZodV4FilterPredicateSchema().optional()
24
22
  },
25
23
  *factory(params, { node, config }) {
26
24
  const loader = async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityContextMenuItemBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContextMenuItemBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { ReactNode, JSX } from 'react';\nimport {\n coreExtensionData,\n createExtensionBlueprint,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { useEntityContextMenu } from '../../hooks/useEntityContextMenu';\nimport {\n FilterPredicate,\n filterPredicateToFilterFunction,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport type { Entity } from '@backstage/catalog-model';\nimport { entityFilterFunctionDataRef } from './extensionData';\n/** @alpha */\nexport type UseProps = () =>\n | {\n title: ReactNode;\n href: string;\n disabled?: boolean;\n }\n | {\n title: ReactNode;\n onClick: () => void | Promise<void>;\n disabled?: boolean;\n };\n\n/** @alpha */\nexport type EntityContextMenuItemParams = {\n useProps: UseProps;\n icon: JSX.Element;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n};\n\n/** @alpha */\nexport const EntityContextMenuItemBlueprint = createExtensionBlueprint({\n kind: 'entity-context-menu-item',\n attachTo: { id: 'page:catalog/entity', input: 'contextMenuItems' },\n output: [\n coreExtensionData.reactElement,\n entityFilterFunctionDataRef.optional(),\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n },\n config: {\n schema: {\n filter: z => createZodV3FilterPredicateSchema(z).optional(),\n },\n },\n *factory(params: EntityContextMenuItemParams, { node, config }) {\n const loader = async () => {\n const Component = () => {\n const { onMenuClose } = useEntityContextMenu();\n const { title, ...menuItemProps } = params.useProps();\n let handleClick = undefined;\n\n if ('onClick' in menuItemProps) {\n handleClick = () => {\n const result = menuItemProps.onClick();\n if (result && 'then' in result) {\n result.then(onMenuClose, onMenuClose);\n } else {\n onMenuClose();\n }\n };\n }\n\n return (\n <MenuItem {...menuItemProps} onClick={handleClick}>\n <ListItemIcon>{params.icon}</ListItemIcon>\n <ListItemText primary={title} />\n </MenuItem>\n );\n };\n\n return <Component />;\n };\n\n yield coreExtensionData.reactElement(ExtensionBoundary.lazy(node, loader));\n\n if (config.filter) {\n yield entityFilterFunctionDataRef(\n filterPredicateToFilterFunction(config.filter),\n );\n } else if (typeof params.filter === 'function') {\n yield entityFilterFunctionDataRef(params.filter);\n } else if (params.filter) {\n yield entityFilterFunctionDataRef(\n filterPredicateToFilterFunction(params.filter),\n );\n }\n },\n});\n"],"names":[],"mappings":";;;;;;;;;AAsDO,MAAM,iCAAiC,wBAAA,CAAyB;AAAA,EACrE,IAAA,EAAM,0BAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,kBAAA,EAAmB;AAAA,EACjE,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,4BAA4B,QAAA;AAAS,GACvC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAA,CAAA,KAAK,gCAAA,CAAiC,CAAC,EAAE,QAAA;AAAS;AAC5D,GACF;AAAA,EACA,CAAC,OAAA,CAAQ,MAAA,EAAqC,EAAE,IAAA,EAAM,QAAO,EAAG;AAC9D,IAAA,MAAM,SAAS,YAAY;AACzB,MAAA,MAAM,YAAY,MAAM;AACtB,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,oBAAA,EAAqB;AAC7C,QAAA,MAAM,EAAE,KAAA,EAAO,GAAG,aAAA,EAAc,GAAI,OAAO,QAAA,EAAS;AACpD,QAAA,IAAI,WAAA,GAAc,MAAA;AAElB,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,WAAA,GAAc,MAAM;AAClB,YAAA,MAAM,MAAA,GAAS,cAAc,OAAA,EAAQ;AACrC,YAAA,IAAI,MAAA,IAAU,UAAU,MAAA,EAAQ;AAC9B,cAAA,MAAA,CAAO,IAAA,CAAK,aAAa,WAAW,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,WAAA,EAAY;AAAA,YACd;AAAA,UACF,CAAA;AAAA,QACF;AAEA,QAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EAAU,GAAG,aAAA,EAAe,SAAS,WAAA,EACpC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAc,iBAAO,IAAA,EAAK,CAAA;AAAA,0BAC3B,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,KAAA,EAAO;AAAA,SAAA,EAChC,CAAA;AAAA,MAEJ,CAAA;AAEA,MAAA,2BAAQ,SAAA,EAAA,EAAU,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,kBAAkB,YAAA,CAAa,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAEzE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,2BAAA;AAAA,QACJ,+BAAA,CAAgC,OAAO,MAAM;AAAA,OAC/C;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AAC9C,MAAA,MAAM,2BAAA,CAA4B,OAAO,MAAM,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,MAAM,2BAAA;AAAA,QACJ,+BAAA,CAAgC,OAAO,MAAM;AAAA,OAC/C;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityContextMenuItemBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityContextMenuItemBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { ReactNode, JSX } from 'react';\nimport {\n coreExtensionData,\n createExtensionBlueprint,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { useEntityContextMenu } from '../../hooks/useEntityContextMenu';\nimport {\n FilterPredicate,\n filterPredicateToFilterFunction,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport type { Entity } from '@backstage/catalog-model';\nimport { entityFilterFunctionDataRef } from './extensionData';\n/** @alpha */\nexport type UseProps = () =>\n | {\n title: ReactNode;\n href: string;\n disabled?: boolean;\n }\n | {\n title: ReactNode;\n onClick: () => void | Promise<void>;\n disabled?: boolean;\n };\n\n/** @alpha */\nexport type EntityContextMenuItemParams = {\n useProps: UseProps;\n icon: JSX.Element;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n};\n\n/** @alpha */\nexport const EntityContextMenuItemBlueprint = createExtensionBlueprint({\n kind: 'entity-context-menu-item',\n attachTo: { id: 'page:catalog/entity', input: 'contextMenuItems' },\n output: [\n coreExtensionData.reactElement,\n entityFilterFunctionDataRef.optional(),\n ],\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n },\n configSchema: {\n filter: createZodV4FilterPredicateSchema().optional(),\n },\n *factory(params: EntityContextMenuItemParams, { node, config }) {\n const loader = async () => {\n const Component = () => {\n const { onMenuClose } = useEntityContextMenu();\n const { title, ...menuItemProps } = params.useProps();\n let handleClick = undefined;\n\n if ('onClick' in menuItemProps) {\n handleClick = () => {\n const result = menuItemProps.onClick();\n if (result && 'then' in result) {\n result.then(onMenuClose, onMenuClose);\n } else {\n onMenuClose();\n }\n };\n }\n\n return (\n <MenuItem {...menuItemProps} onClick={handleClick}>\n <ListItemIcon>{params.icon}</ListItemIcon>\n <ListItemText primary={title} />\n </MenuItem>\n );\n };\n\n return <Component />;\n };\n\n yield coreExtensionData.reactElement(ExtensionBoundary.lazy(node, loader));\n\n if (config.filter) {\n yield entityFilterFunctionDataRef(\n filterPredicateToFilterFunction(config.filter),\n );\n } else if (typeof params.filter === 'function') {\n yield entityFilterFunctionDataRef(params.filter);\n } else if (params.filter) {\n yield entityFilterFunctionDataRef(\n filterPredicateToFilterFunction(params.filter),\n );\n }\n },\n});\n"],"names":[],"mappings":";;;;;;;;;AAsDO,MAAM,iCAAiC,wBAAA,CAAyB;AAAA,EACrE,IAAA,EAAM,0BAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,kBAAA,EAAmB;AAAA,EACjE,MAAA,EAAQ;AAAA,IACN,iBAAA,CAAkB,YAAA;AAAA,IAClB,4BAA4B,QAAA;AAAS,GACvC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,gCAAA,EAAiC,CAAE,QAAA;AAAS,GACtD;AAAA,EACA,CAAC,OAAA,CAAQ,MAAA,EAAqC,EAAE,IAAA,EAAM,QAAO,EAAG;AAC9D,IAAA,MAAM,SAAS,YAAY;AACzB,MAAA,MAAM,YAAY,MAAM;AACtB,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,oBAAA,EAAqB;AAC7C,QAAA,MAAM,EAAE,KAAA,EAAO,GAAG,aAAA,EAAc,GAAI,OAAO,QAAA,EAAS;AACpD,QAAA,IAAI,WAAA,GAAc,MAAA;AAElB,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,WAAA,GAAc,MAAM;AAClB,YAAA,MAAM,MAAA,GAAS,cAAc,OAAA,EAAQ;AACrC,YAAA,IAAI,MAAA,IAAU,UAAU,MAAA,EAAQ;AAC9B,cAAA,MAAA,CAAO,IAAA,CAAK,aAAa,WAAW,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,WAAA,EAAY;AAAA,YACd;AAAA,UACF,CAAA;AAAA,QACF;AAEA,QAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EAAU,GAAG,aAAA,EAAe,SAAS,WAAA,EACpC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAc,iBAAO,IAAA,EAAK,CAAA;AAAA,0BAC3B,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,KAAA,EAAO;AAAA,SAAA,EAChC,CAAA;AAAA,MAEJ,CAAA;AAEA,MAAA,2BAAQ,SAAA,EAAA,EAAU,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,kBAAkB,YAAA,CAAa,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAEzE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,2BAAA;AAAA,QACJ,+BAAA,CAAgC,OAAO,MAAM;AAAA,OAC/C;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AAC9C,MAAA,MAAM,2BAAA,CAA4B,OAAO,MAAM,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,MAAM,2BAAA;AAAA,QACJ,+BAAA,CAAgC,OAAO,MAAM;AAAA,OAC/C;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { createExtensionBlueprint, coreExtensionData, ExtensionBoundary } from '@backstage/frontend-plugin-api';
2
- import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
2
+ import { createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
3
3
  import { resolveEntityFilterData } from './resolveEntityFilterData.esm.js';
4
4
  import { entityFilterFunctionDataRef, entityFilterExpressionDataRef } from './extensionData.esm.js';
5
5
 
@@ -10,10 +10,8 @@ const EntityHeaderBlueprint = createExtensionBlueprint({
10
10
  filterFunction: entityFilterFunctionDataRef,
11
11
  element: coreExtensionData.reactElement
12
12
  },
13
- config: {
14
- schema: {
15
- filter: (z) => createZodV3FilterPredicateSchema(z).optional()
16
- }
13
+ configSchema: {
14
+ filter: createZodV4FilterPredicateSchema().optional()
17
15
  },
18
16
  output: [
19
17
  entityFilterFunctionDataRef.optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"EntityHeaderBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityHeaderBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n createExtensionBlueprint,\n coreExtensionData,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport {\n FilterPredicate,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { Entity } from '@backstage/catalog-model';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n} from './extensionData';\n\n/** @alpha */\nexport const EntityHeaderBlueprint = createExtensionBlueprint({\n kind: 'entity-header',\n attachTo: { id: 'page:catalog/entity', input: 'headers' },\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n element: coreExtensionData.reactElement,\n },\n config: {\n schema: {\n filter: z => createZodV3FilterPredicateSchema(z).optional(),\n },\n },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n coreExtensionData.reactElement.optional(),\n ],\n *factory(\n params: {\n loader: () => Promise<JSX.Element>;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n },\n { node, config },\n ) {\n const { loader, filter } = params;\n\n yield* resolveEntityFilterData(filter, config, node);\n\n if (loader) {\n yield coreExtensionData.reactElement(\n ExtensionBoundary.lazy(node, loader),\n );\n }\n },\n});\n"],"names":[],"mappings":";;;;;AAiCO,MAAM,wBAAwB,wBAAA,CAAyB;AAAA,EAC5D,IAAA,EAAM,eAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,SAAA,EAAU;AAAA,EACxD,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,SAAS,iBAAA,CAAkB;AAAA,GAC7B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAA,CAAA,KAAK,gCAAA,CAAiC,CAAC,EAAE,QAAA;AAAS;AAC5D,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,iBAAA,CAAkB,aAAa,QAAA;AAAS,GAC1C;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAIA,EAAE,IAAA,EAAM,QAAO,EACf;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,iBAAA,CAAkB,YAAA;AAAA,QACtB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM;AAAA,OACrC;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityHeaderBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityHeaderBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n createExtensionBlueprint,\n coreExtensionData,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\nimport {\n FilterPredicate,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\nimport { Entity } from '@backstage/catalog-model';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n} from './extensionData';\n\n/** @alpha */\nexport const EntityHeaderBlueprint = createExtensionBlueprint({\n kind: 'entity-header',\n attachTo: { id: 'page:catalog/entity', input: 'headers' },\n dataRefs: {\n filterFunction: entityFilterFunctionDataRef,\n element: coreExtensionData.reactElement,\n },\n configSchema: {\n filter: createZodV4FilterPredicateSchema().optional(),\n },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n coreExtensionData.reactElement.optional(),\n ],\n *factory(\n params: {\n loader: () => Promise<JSX.Element>;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n },\n { node, config },\n ) {\n const { loader, filter } = params;\n\n yield* resolveEntityFilterData(filter, config, node);\n\n if (loader) {\n yield coreExtensionData.reactElement(\n ExtensionBoundary.lazy(node, loader),\n );\n }\n },\n});\n"],"names":[],"mappings":";;;;;AAiCO,MAAM,wBAAwB,wBAAA,CAAyB;AAAA,EAC5D,IAAA,EAAM,eAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAO,SAAA,EAAU;AAAA,EACxD,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,2BAAA;AAAA,IAChB,SAAS,iBAAA,CAAkB;AAAA,GAC7B;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,gCAAA,EAAiC,CAAE,QAAA;AAAS,GACtD;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC,iBAAA,CAAkB,aAAa,QAAA;AAAS,GAC1C;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAIA,EAAE,IAAA,EAAM,QAAO,EACf;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,iBAAA,CAAkB,YAAA;AAAA,QACtB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM;AAAA,OACrC;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { createExtensionDataRef, createExtensionBlueprint } from '@backstage/frontend-plugin-api';
2
- import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates';
2
+ import { createZodV4FilterPredicateSchema } from '@backstage/filter-predicates';
3
+ import { z } from 'zod/v4';
3
4
  import { entityFilterExpressionDataRef, entityFilterFunctionDataRef } from './extensionData.esm.js';
4
5
  import { resolveEntityFilterData } from './resolveEntityFilterData.esm.js';
5
6
 
@@ -19,12 +20,10 @@ const EntityIconLinkBlueprint = createExtensionBlueprint({
19
20
  filterFunction: entityFilterFunctionDataRef,
20
21
  filterExpression: entityFilterExpressionDataRef
21
22
  },
22
- config: {
23
- schema: {
24
- label: (z) => z.string().optional(),
25
- title: (z) => z.string().optional(),
26
- filter: (z) => createZodV3FilterPredicateSchema(z).optional()
27
- }
23
+ configSchema: {
24
+ label: z.string().optional(),
25
+ title: z.string().optional(),
26
+ filter: createZodV4FilterPredicateSchema().optional()
28
27
  },
29
28
  *factory(params, { config, node }) {
30
29
  const { filter, useProps } = params;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIconLinkBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityIconLinkBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { IconLinkVerticalProps } from '@backstage/core-components';\nimport {\n createExtensionBlueprint,\n createExtensionDataRef,\n} from '@backstage/frontend-plugin-api';\n\nimport {\n FilterPredicate,\n createZodV3FilterPredicateSchema,\n} from '@backstage/filter-predicates';\n\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n} from './extensionData';\nimport { Entity } from '@backstage/catalog-model';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\n\nconst entityIconLinkPropsDataRef = createExtensionDataRef<\n () => IconLinkVerticalProps\n>().with({\n id: 'entity-icon-link-props',\n});\n\n/** @alpha */\nexport const EntityIconLinkBlueprint = createExtensionBlueprint({\n kind: 'entity-icon-link',\n attachTo: { id: 'entity-card:catalog/about', input: 'iconLinks' },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityIconLinkPropsDataRef,\n ],\n dataRefs: {\n useProps: entityIconLinkPropsDataRef,\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n },\n config: {\n schema: {\n label: z => z.string().optional(),\n title: z => z.string().optional(),\n filter: z => createZodV3FilterPredicateSchema(z).optional(),\n },\n },\n *factory(\n params: {\n useProps: () => Omit<IconLinkVerticalProps, 'color'>;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n },\n { config, node },\n ) {\n const { filter, useProps } = params;\n yield* resolveEntityFilterData(filter, config, node);\n // Only include properties that are defined in the config\n // to avoid overriding defaults with undefined values\n const configProps = Object.entries(config).reduce(\n (rest, [key, value]) =>\n value !== undefined\n ? {\n ...rest,\n [key]: value,\n }\n : rest,\n {},\n );\n yield entityIconLinkPropsDataRef(() => ({ ...useProps(), ...configProps }));\n },\n});\n"],"names":[],"mappings":";;;;;AAkCA,MAAM,0BAAA,GAA6B,sBAAA,EAEjC,CAAE,IAAA,CAAK;AAAA,EACP,EAAA,EAAI;AACN,CAAC,CAAA;AAGM,MAAM,0BAA0B,wBAAA,CAAyB;AAAA,EAC9D,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,2BAAA,EAA6B,OAAO,WAAA,EAAY;AAAA,EAChE,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,0BAAA;AAAA,IACV,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,MAChC,KAAA,EAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,MAChC,MAAA,EAAQ,CAAA,CAAA,KAAK,gCAAA,CAAiC,CAAC,EAAE,QAAA;AAAS;AAC5D,GACF;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAIA,EAAE,MAAA,EAAQ,MAAK,EACf;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,MAAA;AAC7B,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAGnD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,MACzC,CAAC,IAAA,EAAM,CAAC,KAAK,KAAK,CAAA,KAChB,UAAU,MAAA,GACN;AAAA,QACE,GAAG,IAAA;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,OACT,GACA,IAAA;AAAA,MACN;AAAC,KACH;AACA,IAAA,MAAM,0BAAA,CAA2B,OAAO,EAAE,GAAG,UAAS,EAAG,GAAG,aAAY,CAAE,CAAA;AAAA,EAC5E;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"EntityIconLinkBlueprint.esm.js","sources":["../../../src/alpha/blueprints/EntityIconLinkBlueprint.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { IconLinkVerticalProps } from '@backstage/core-components';\nimport {\n createExtensionBlueprint,\n createExtensionDataRef,\n} from '@backstage/frontend-plugin-api';\n\nimport {\n FilterPredicate,\n createZodV4FilterPredicateSchema,\n} from '@backstage/filter-predicates';\n\nimport { z } from 'zod/v4';\n\nimport {\n entityFilterExpressionDataRef,\n entityFilterFunctionDataRef,\n} from './extensionData';\nimport { Entity } from '@backstage/catalog-model';\nimport { resolveEntityFilterData } from './resolveEntityFilterData';\n\nconst entityIconLinkPropsDataRef = createExtensionDataRef<\n () => IconLinkVerticalProps\n>().with({\n id: 'entity-icon-link-props',\n});\n\n/** @alpha */\nexport const EntityIconLinkBlueprint = createExtensionBlueprint({\n kind: 'entity-icon-link',\n attachTo: { id: 'entity-card:catalog/about', input: 'iconLinks' },\n output: [\n entityFilterFunctionDataRef.optional(),\n entityFilterExpressionDataRef.optional(),\n entityIconLinkPropsDataRef,\n ],\n dataRefs: {\n useProps: entityIconLinkPropsDataRef,\n filterFunction: entityFilterFunctionDataRef,\n filterExpression: entityFilterExpressionDataRef,\n },\n configSchema: {\n label: z.string().optional(),\n title: z.string().optional(),\n filter: createZodV4FilterPredicateSchema().optional(),\n },\n *factory(\n params: {\n useProps: () => Omit<IconLinkVerticalProps, 'color'>;\n filter?: FilterPredicate | ((entity: Entity) => boolean);\n },\n { config, node },\n ) {\n const { filter, useProps } = params;\n yield* resolveEntityFilterData(filter, config, node);\n // Only include properties that are defined in the config\n // to avoid overriding defaults with undefined values\n const configProps = Object.entries(config).reduce(\n (rest, [key, value]) =>\n value !== undefined\n ? {\n ...rest,\n [key]: value,\n }\n : rest,\n {},\n );\n yield entityIconLinkPropsDataRef(() => ({ ...useProps(), ...configProps }));\n },\n});\n"],"names":[],"mappings":";;;;;;AAoCA,MAAM,0BAAA,GAA6B,sBAAA,EAEjC,CAAE,IAAA,CAAK;AAAA,EACP,EAAA,EAAI;AACN,CAAC,CAAA;AAGM,MAAM,0BAA0B,wBAAA,CAAyB;AAAA,EAC9D,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU,EAAE,EAAA,EAAI,2BAAA,EAA6B,OAAO,WAAA,EAAY;AAAA,EAChE,MAAA,EAAQ;AAAA,IACN,4BAA4B,QAAA,EAAS;AAAA,IACrC,8BAA8B,QAAA,EAAS;AAAA,IACvC;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,0BAAA;AAAA,IACV,cAAA,EAAgB,2BAAA;AAAA,IAChB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQ,gCAAA,EAAiC,CAAE,QAAA;AAAS,GACtD;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAIA,EAAE,MAAA,EAAQ,MAAK,EACf;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,MAAA;AAC7B,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAGnD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,MACzC,CAAC,IAAA,EAAM,CAAC,KAAK,KAAK,CAAA,KAChB,UAAU,MAAA,GACN;AAAA,QACE,GAAG,IAAA;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,OACT,GACA,IAAA;AAAA,MACN;AAAC,KACH;AACA,IAAA,MAAM,0BAAA,CAA2B,OAAO,EAAE,GAAG,UAAS,EAAG,GAAG,aAAY,CAAE,CAAA;AAAA,EAC5E;AACF,CAAC;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -160,9 +160,9 @@ declare const EntityContentBlueprint: _backstage_frontend_plugin_api.ExtensionBl
160
160
  icon: string | undefined;
161
161
  };
162
162
  configInput: {
163
- filter?: FilterPredicate | undefined;
164
- title?: string | undefined;
165
163
  path?: string | undefined;
164
+ title?: string | undefined;
165
+ filter?: FilterPredicate | undefined;
166
166
  group?: string | false | undefined;
167
167
  icon?: string | undefined;
168
168
  };
@@ -200,8 +200,8 @@ declare const EntityContentLayoutBlueprint: _backstage_frontend_plugin_api.Exten
200
200
  filter: FilterPredicate | undefined;
201
201
  };
202
202
  configInput: {
203
- filter?: FilterPredicate | undefined;
204
203
  type?: string | undefined;
204
+ filter?: FilterPredicate | undefined;
205
205
  };
206
206
  dataRefs: {
207
207
  filterFunction: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: Entity) => boolean, "catalog.entity-filter-function", {}>;
@@ -291,9 +291,9 @@ declare const EntityIconLinkBlueprint: _backstage_frontend_plugin_api.ExtensionB
291
291
  filter: FilterPredicate | undefined;
292
292
  };
293
293
  configInput: {
294
- filter?: FilterPredicate | undefined;
295
294
  label?: string | undefined;
296
295
  title?: string | undefined;
296
+ filter?: FilterPredicate | undefined;
297
297
  };
298
298
  dataRefs: {
299
299
  useProps: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<() => IconLinkVerticalProps, "entity-icon-link-props", {}>;
@@ -479,10 +479,10 @@ declare const catalogReactTranslationRef: _backstage_frontend_plugin_api.Transla
479
479
  readonly "inspectEntityDialog.overviewPage.identity.title": "Identity";
480
480
  readonly "inspectEntityDialog.overviewPage.annotations": "Annotations";
481
481
  readonly "inspectEntityDialog.overviewPage.tags": "Tags";
482
+ readonly "inspectEntityDialog.overviewPage.relation.title": "Relations";
482
483
  readonly "inspectEntityDialog.overviewPage.copyAriaLabel": "Copy {{label}}";
483
484
  readonly "inspectEntityDialog.overviewPage.copiedStatus": "Copied";
484
485
  readonly "inspectEntityDialog.overviewPage.helpLinkAriaLabel": "Learn more";
485
- readonly "inspectEntityDialog.overviewPage.relation.title": "Relations";
486
486
  readonly "inspectEntityDialog.yamlPage.title": "Entity as YAML";
487
487
  readonly "inspectEntityDialog.yamlPage.description": "This is the raw entity data as received from the catalog, on YAML form.";
488
488
  readonly "inspectEntityDialog.tabNames.json": "Raw JSON";
package/dist/index.d.ts CHANGED
@@ -1193,10 +1193,10 @@ declare const catalogReactTranslationRef: _backstage_frontend_plugin_api.Transla
1193
1193
  readonly "inspectEntityDialog.overviewPage.identity.title": "Identity";
1194
1194
  readonly "inspectEntityDialog.overviewPage.annotations": "Annotations";
1195
1195
  readonly "inspectEntityDialog.overviewPage.tags": "Tags";
1196
+ readonly "inspectEntityDialog.overviewPage.relation.title": "Relations";
1196
1197
  readonly "inspectEntityDialog.overviewPage.copyAriaLabel": "Copy {{label}}";
1197
1198
  readonly "inspectEntityDialog.overviewPage.copiedStatus": "Copied";
1198
1199
  readonly "inspectEntityDialog.overviewPage.helpLinkAriaLabel": "Learn more";
1199
- readonly "inspectEntityDialog.overviewPage.relation.title": "Relations";
1200
1200
  readonly "inspectEntityDialog.yamlPage.title": "Entity as YAML";
1201
1201
  readonly "inspectEntityDialog.yamlPage.description": "This is the raw entity data as received from the catalog, on YAML form.";
1202
1202
  readonly "inspectEntityDialog.tabNames.json": "Raw JSON";
@@ -29,6 +29,7 @@ function catalogApiMock(options) {
29
29
  getLocationByRef: jest.fn(),
30
30
  addLocation: jest.fn(),
31
31
  removeLocationById: jest.fn(),
32
+ updateLocation: jest.fn(),
32
33
  getLocationByEntity: jest.fn(),
33
34
  validateEntity: jest.fn(),
34
35
  analyzeLocation: jest.fn(),
@@ -1 +1 @@
1
- {"version":3,"file":"catalogApiMock.esm.js","sources":["../../src/testUtils/catalogApiMock.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { ApiFactory, createApiFactory } from '@backstage/frontend-plugin-api';\nimport { InMemoryCatalogClient } from '@backstage/catalog-client/testUtils';\nimport { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n createApiMock,\n attachMockApiFactory,\n type MockWithApiFactory,\n} from '@backstage/frontend-test-utils';\n\n/**\n * Creates a fake catalog client that handles entities in memory storage. Note\n * that this client may be severely limited in functionality, and advanced\n * functions may not be available at all.\n *\n * @public\n */\nexport function catalogApiMock(options?: {\n entities?: Entity[];\n}): MockWithApiFactory<CatalogApi> {\n const instance = new InMemoryCatalogClient(options);\n return attachMockApiFactory(catalogApiRef, instance);\n}\n\n/**\n * A collection of mock functionality for the catalog service.\n *\n * @public\n */\nexport namespace catalogApiMock {\n /**\n * Creates a fake catalog client that handles entities in memory storage. Note\n * that this client may be severely limited in functionality, and advanced\n * functions may not be available at all.\n */\n export const factory = (options?: {\n entities?: Entity[];\n }): ApiFactory<CatalogApi, CatalogApi, {}> =>\n createApiFactory({\n api: catalogApiRef,\n deps: {},\n factory: () => new InMemoryCatalogClient(options),\n });\n /**\n * Creates a catalog client whose methods are mock functions, possibly with\n * some of them overloaded by the caller.\n */\n export const mock = createApiMock(catalogApiRef, () => ({\n getEntities: jest.fn(),\n getEntitiesByRefs: jest.fn(),\n queryEntities: jest.fn(),\n getEntityAncestors: jest.fn(),\n getEntityByRef: jest.fn(),\n removeEntityByUid: jest.fn(),\n refreshEntity: jest.fn(),\n getEntityFacets: jest.fn(),\n getLocations: jest.fn(),\n queryLocations: jest.fn(),\n streamLocations: jest.fn(),\n getLocationById: jest.fn(),\n getLocationByRef: jest.fn(),\n addLocation: jest.fn(),\n removeLocationById: jest.fn(),\n getLocationByEntity: jest.fn(),\n validateEntity: jest.fn(),\n analyzeLocation: jest.fn(),\n streamEntities: jest.fn(),\n streamEntityPages: jest.fn(),\n }));\n}\n"],"names":["catalogApiMock"],"mappings":";;;;;AAkCO,SAAS,eAAe,OAAA,EAEI;AACjC,EAAA,MAAM,QAAA,GAAW,IAAI,qBAAA,CAAsB,OAAO,CAAA;AAClD,EAAA,OAAO,oBAAA,CAAqB,eAAe,QAAQ,CAAA;AACrD;AAAA,CAOO,CAAUA,eAAAA,KAAV;AAME,EAAMA,eAAAA,CAAA,OAAA,GAAU,CAAC,OAAA,KAGtB,gBAAA,CAAiB;AAAA,IACf,GAAA,EAAK,aAAA;AAAA,IACL,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,MAAM,IAAI,qBAAA,CAAsB,OAAO;AAAA,GACjD,CAAA;AAKI,EAAMA,eAAAA,CAAA,IAAA,GAAO,aAAA,CAAc,aAAA,EAAe,OAAO;AAAA,IACtD,WAAA,EAAa,KAAK,EAAA,EAAG;AAAA,IACrB,iBAAA,EAAmB,KAAK,EAAA,EAAG;AAAA,IAC3B,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,IACvB,kBAAA,EAAoB,KAAK,EAAA,EAAG;AAAA,IAC5B,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,iBAAA,EAAmB,KAAK,EAAA,EAAG;AAAA,IAC3B,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,IACvB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,YAAA,EAAc,KAAK,EAAA,EAAG;AAAA,IACtB,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,gBAAA,EAAkB,KAAK,EAAA,EAAG;AAAA,IAC1B,WAAA,EAAa,KAAK,EAAA,EAAG;AAAA,IACrB,kBAAA,EAAoB,KAAK,EAAA,EAAG;AAAA,IAC5B,mBAAA,EAAqB,KAAK,EAAA,EAAG;AAAA,IAC7B,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,iBAAA,EAAmB,KAAK,EAAA;AAAG,GAC7B,CAAE,CAAA;AAAA,CAAA,EAvCa,cAAA,KAAA,cAAA,GAAA,EAAA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"catalogApiMock.esm.js","sources":["../../src/testUtils/catalogApiMock.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { ApiFactory, createApiFactory } from '@backstage/frontend-plugin-api';\nimport { InMemoryCatalogClient } from '@backstage/catalog-client/testUtils';\nimport { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n createApiMock,\n attachMockApiFactory,\n type MockWithApiFactory,\n} from '@backstage/frontend-test-utils';\n\n/**\n * Creates a fake catalog client that handles entities in memory storage. Note\n * that this client may be severely limited in functionality, and advanced\n * functions may not be available at all.\n *\n * @public\n */\nexport function catalogApiMock(options?: {\n entities?: Entity[];\n}): MockWithApiFactory<CatalogApi> {\n const instance = new InMemoryCatalogClient(options);\n return attachMockApiFactory(catalogApiRef, instance);\n}\n\n/**\n * A collection of mock functionality for the catalog service.\n *\n * @public\n */\nexport namespace catalogApiMock {\n /**\n * Creates a fake catalog client that handles entities in memory storage. Note\n * that this client may be severely limited in functionality, and advanced\n * functions may not be available at all.\n */\n export const factory = (options?: {\n entities?: Entity[];\n }): ApiFactory<CatalogApi, CatalogApi, {}> =>\n createApiFactory({\n api: catalogApiRef,\n deps: {},\n factory: () => new InMemoryCatalogClient(options),\n });\n /**\n * Creates a catalog client whose methods are mock functions, possibly with\n * some of them overloaded by the caller.\n */\n export const mock = createApiMock(catalogApiRef, () => ({\n getEntities: jest.fn(),\n getEntitiesByRefs: jest.fn(),\n queryEntities: jest.fn(),\n getEntityAncestors: jest.fn(),\n getEntityByRef: jest.fn(),\n removeEntityByUid: jest.fn(),\n refreshEntity: jest.fn(),\n getEntityFacets: jest.fn(),\n getLocations: jest.fn(),\n queryLocations: jest.fn(),\n streamLocations: jest.fn(),\n getLocationById: jest.fn(),\n getLocationByRef: jest.fn(),\n addLocation: jest.fn(),\n removeLocationById: jest.fn(),\n updateLocation: jest.fn(),\n getLocationByEntity: jest.fn(),\n validateEntity: jest.fn(),\n analyzeLocation: jest.fn(),\n streamEntities: jest.fn(),\n streamEntityPages: jest.fn(),\n }));\n}\n"],"names":["catalogApiMock"],"mappings":";;;;;AAkCO,SAAS,eAAe,OAAA,EAEI;AACjC,EAAA,MAAM,QAAA,GAAW,IAAI,qBAAA,CAAsB,OAAO,CAAA;AAClD,EAAA,OAAO,oBAAA,CAAqB,eAAe,QAAQ,CAAA;AACrD;AAAA,CAOO,CAAUA,eAAAA,KAAV;AAME,EAAMA,eAAAA,CAAA,OAAA,GAAU,CAAC,OAAA,KAGtB,gBAAA,CAAiB;AAAA,IACf,GAAA,EAAK,aAAA;AAAA,IACL,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,MAAM,IAAI,qBAAA,CAAsB,OAAO;AAAA,GACjD,CAAA;AAKI,EAAMA,eAAAA,CAAA,IAAA,GAAO,aAAA,CAAc,aAAA,EAAe,OAAO;AAAA,IACtD,WAAA,EAAa,KAAK,EAAA,EAAG;AAAA,IACrB,iBAAA,EAAmB,KAAK,EAAA,EAAG;AAAA,IAC3B,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,IACvB,kBAAA,EAAoB,KAAK,EAAA,EAAG;AAAA,IAC5B,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,iBAAA,EAAmB,KAAK,EAAA,EAAG;AAAA,IAC3B,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,IACvB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,YAAA,EAAc,KAAK,EAAA,EAAG;AAAA,IACtB,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,gBAAA,EAAkB,KAAK,EAAA,EAAG;AAAA,IAC1B,WAAA,EAAa,KAAK,EAAA,EAAG;AAAA,IACrB,kBAAA,EAAoB,KAAK,EAAA,EAAG;AAAA,IAC5B,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,mBAAA,EAAqB,KAAK,EAAA,EAAG;AAAA,IAC7B,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,eAAA,EAAiB,KAAK,EAAA,EAAG;AAAA,IACzB,cAAA,EAAgB,KAAK,EAAA,EAAG;AAAA,IACxB,iBAAA,EAAmB,KAAK,EAAA;AAAG,GAC7B,CAAE,CAAA;AAAA,CAAA,EAxCa,cAAA,KAAA,cAAA,GAAA,EAAA,CAAA,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-react",
3
- "version": "2.1.2-next.2",
3
+ "version": "2.1.3",
4
4
  "description": "A frontend library that helps other Backstage plugins interact with the catalog",
5
5
  "backstage": {
6
6
  "role": "web-library",
@@ -73,21 +73,21 @@
73
73
  "test": "backstage-cli package test"
74
74
  },
75
75
  "dependencies": {
76
- "@backstage/catalog-client": "1.14.1-next.0",
77
- "@backstage/catalog-model": "1.7.8-next.0",
78
- "@backstage/core-compat-api": "0.5.10-next.2",
79
- "@backstage/core-components": "0.18.9-next.1",
80
- "@backstage/core-plugin-api": "1.12.5-next.2",
81
- "@backstage/errors": "1.3.0-next.0",
82
- "@backstage/filter-predicates": "0.1.2-next.0",
83
- "@backstage/frontend-plugin-api": "0.16.0-next.2",
84
- "@backstage/integration-react": "1.2.17-next.1",
85
- "@backstage/plugin-catalog-common": "1.1.9-next.0",
86
- "@backstage/plugin-permission-common": "0.9.8-next.0",
87
- "@backstage/plugin-permission-react": "0.4.42-next.1",
88
- "@backstage/types": "1.2.2",
89
- "@backstage/ui": "0.14.0-next.2",
90
- "@backstage/version-bridge": "1.0.12",
76
+ "@backstage/catalog-client": "^1.15.0",
77
+ "@backstage/catalog-model": "^1.8.0",
78
+ "@backstage/core-compat-api": "^0.5.10",
79
+ "@backstage/core-components": "^0.18.9",
80
+ "@backstage/core-plugin-api": "^1.12.5",
81
+ "@backstage/errors": "^1.3.0",
82
+ "@backstage/filter-predicates": "^0.1.2",
83
+ "@backstage/frontend-plugin-api": "^0.16.1",
84
+ "@backstage/integration-react": "^1.2.17",
85
+ "@backstage/plugin-catalog-common": "^1.1.9",
86
+ "@backstage/plugin-permission-common": "^0.9.8",
87
+ "@backstage/plugin-permission-react": "^0.5.0",
88
+ "@backstage/types": "^1.2.2",
89
+ "@backstage/ui": "^0.14.1",
90
+ "@backstage/version-bridge": "^1.0.12",
91
91
  "@material-ui/core": "^4.12.2",
92
92
  "@material-ui/icons": "^4.9.1",
93
93
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -99,15 +99,16 @@
99
99
  "qs": "^6.9.4",
100
100
  "react-use": "^17.2.4",
101
101
  "yaml": "^2.0.0",
102
- "zen-observable": "^0.10.0"
102
+ "zen-observable": "^0.10.0",
103
+ "zod": "^3.25.76 || ^4.0.0"
103
104
  },
104
105
  "devDependencies": {
105
- "@backstage/cli": "0.36.1-next.2",
106
- "@backstage/core-app-api": "1.20.0-next.2",
107
- "@backstage/frontend-test-utils": "0.5.2-next.2",
108
- "@backstage/plugin-catalog-common": "1.1.9-next.0",
109
- "@backstage/plugin-scaffolder-common": "2.0.1-next.0",
110
- "@backstage/test-utils": "1.7.17-next.2",
106
+ "@backstage/cli": "^0.36.1",
107
+ "@backstage/core-app-api": "^1.20.0",
108
+ "@backstage/frontend-test-utils": "^0.5.2",
109
+ "@backstage/plugin-catalog-common": "^1.1.9",
110
+ "@backstage/plugin-scaffolder-common": "^2.1.0",
111
+ "@backstage/test-utils": "^1.7.17",
111
112
  "@testing-library/dom": "^10.0.0",
112
113
  "@testing-library/jest-dom": "^6.0.0",
113
114
  "@testing-library/react": "^16.0.0",
@@ -117,11 +118,10 @@
117
118
  "react": "^18.0.2",
118
119
  "react-dom": "^18.0.2",
119
120
  "react-router-dom": "^6.30.2",
120
- "react-test-renderer": "^16.13.1",
121
- "zod": "^3.25.76 || ^4.0.0"
121
+ "react-test-renderer": "^16.13.1"
122
122
  },
123
123
  "peerDependencies": {
124
- "@backstage/frontend-test-utils": "0.5.2-next.2",
124
+ "@backstage/frontend-test-utils": "^0.5.2",
125
125
  "@types/react": "^17.0.0 || ^18.0.0",
126
126
  "react": "^17.0.0 || ^18.0.0",
127
127
  "react-dom": "^17.0.0 || ^18.0.0",