@anyshift/backstage-plugin-anyshift 0.1.0-beta.3 → 0.1.0-beta.6

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0-beta.6
4
+
5
+ - Add a discoverable global Cloud inventory page.
6
+ - Add generic cloud Resource content with identity, ownership, relations, ARN, and console links.
7
+
8
+ ## 0.1.0-beta.5
9
+
10
+ - Hide entity content for catalog resources without a supported Anyshift brief kind.
11
+ - Preserve the default workload view for GitHub-owned Components.
12
+
3
13
  ## 0.1.0-beta.3
4
14
 
5
15
  - Show durable catalog reconciliation status on the global dashboard.
package/README.md CHANGED
@@ -2,7 +2,12 @@
2
2
 
3
3
  New-frontend-system plugin for the Anyshift infrastructure graph. Installing the package in an app
4
4
  created with `@backstage/frontend-defaults` and configured with `app.packages: all` discovers its
5
- dashboard, navigation item, API factory, and entity content automatically.
5
+ dashboard, Cloud inventory page, navigation items, API factory, and entity content automatically.
6
+
7
+ The Cloud page lists provider-managed infrastructure Resources with searchable type, account,
8
+ region, and ownership metadata. Cloud Resource entities also receive a generic read-only page for
9
+ their ARN, provider console link, and catalog relationships, independently of whether the resource
10
+ supports an Anyshift service brief.
6
11
 
7
12
  The package has no legacy frontend entry point. Add the corresponding
8
13
  `@anyshift/backstage-plugin-anyshift-backend` package to the Backstage backend and configure one
@@ -0,0 +1,104 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { Typography, Grid } from '@material-ui/core';
4
+ import { Page, Header, Content, ContentHeader, Progress, InfoCard, Table } from '@backstage/core-components';
5
+ import { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
6
+ import { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';
7
+ import { useApi } from '@backstage/frontend-plugin-api';
8
+
9
+ function isCloudResource(entity) {
10
+ return entity.kind.toLocaleLowerCase("en-US") === "resource" && Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]);
11
+ }
12
+ function cloudResourceRows(entities) {
13
+ return entities.filter(isCloudResource).map((entity) => {
14
+ const annotations = entity.metadata.annotations ?? {};
15
+ return {
16
+ entity,
17
+ name: entity.metadata.title || entity.metadata.name,
18
+ provider: annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]?.toUpperCase() || "Unknown",
19
+ resourceType: annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] || String(entity.spec?.type || "resource"),
20
+ region: annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || "Global",
21
+ account: annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION] || "Not available",
22
+ owner: typeof entity.spec?.owner === "string" ? entity.spec.owner : "Not assigned"
23
+ };
24
+ }).sort((a, b) => a.name.localeCompare(b.name));
25
+ }
26
+ const columns = [
27
+ {
28
+ title: "Resource",
29
+ field: "name",
30
+ render: (row) => /* @__PURE__ */ jsx(EntityRefLink, { entityRef: row.entity, title: row.name })
31
+ },
32
+ { title: "Type", field: "resourceType" },
33
+ { title: "Provider", field: "provider" },
34
+ { title: "Region", field: "region" },
35
+ { title: "Account", field: "account" },
36
+ { title: "Owner", field: "owner" }
37
+ ];
38
+ const CloudPage = () => {
39
+ const catalogApi = useApi(catalogApiRef);
40
+ const [entities, setEntities] = useState();
41
+ const [error, setError] = useState();
42
+ useEffect(() => {
43
+ catalogApi.getEntities({ filter: { kind: "Resource" } }).then((response) => setEntities(response.items)).catch(
44
+ (cause) => setError(cause instanceof Error ? cause.message : String(cause))
45
+ );
46
+ }, [catalogApi]);
47
+ const rows = useMemo(() => cloudResourceRows(entities ?? []), [entities]);
48
+ const summary = useMemo(
49
+ () => ({
50
+ resources: rows.length,
51
+ types: new Set(rows.map((row) => row.resourceType)).size,
52
+ accounts: new Set(
53
+ rows.map((row) => row.account).filter((account) => account !== "Not available")
54
+ ).size,
55
+ regions: new Set(
56
+ rows.map((row) => row.region).filter((region) => region !== "Global")
57
+ ).size
58
+ }),
59
+ [rows]
60
+ );
61
+ return /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
62
+ /* @__PURE__ */ jsx(
63
+ Header,
64
+ {
65
+ title: "Cloud",
66
+ subtitle: "Read-only cloud inventory synchronized through Anyshift"
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsxs(Content, { children: [
70
+ /* @__PURE__ */ jsx(ContentHeader, { title: "Cloud inventory" }),
71
+ error ? /* @__PURE__ */ jsx(Typography, { color: "error", children: error }) : !entities ? /* @__PURE__ */ jsx(Progress, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
72
+ /* @__PURE__ */ jsx(InfoCard, { children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
73
+ /* @__PURE__ */ jsx(Summary, { label: "Resources", value: summary.resources }),
74
+ /* @__PURE__ */ jsx(Summary, { label: "Types", value: summary.types }),
75
+ /* @__PURE__ */ jsx(Summary, { label: "Accounts", value: summary.accounts }),
76
+ /* @__PURE__ */ jsx(Summary, { label: "Regions", value: summary.regions })
77
+ ] }) }),
78
+ /* @__PURE__ */ jsx(
79
+ Table,
80
+ {
81
+ title: "Cloud resources",
82
+ columns,
83
+ data: rows,
84
+ options: {
85
+ filtering: true,
86
+ paging: true,
87
+ pageSize: 20,
88
+ pageSizeOptions: [20, 50, 100],
89
+ search: true
90
+ },
91
+ emptyContent: /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: "No cloud resources have been synchronized yet." })
92
+ }
93
+ )
94
+ ] })
95
+ ] })
96
+ ] });
97
+ };
98
+ const Summary = ({ label, value }) => /* @__PURE__ */ jsxs(Grid, { item: true, xs: 6, md: 3, children: [
99
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: value }),
100
+ /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: label })
101
+ ] });
102
+
103
+ export { CloudPage, cloudResourceRows, isCloudResource };
104
+ //# sourceMappingURL=CloudPage.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudPage.esm.js","sources":["../../../src/components/cloud/CloudPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n Table,\n type TableColumn,\n} from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_CLOUD_REGION_ANNOTATION,\n ANYSHIFT_RESOURCE_TYPE_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/frontend-plugin-api';\n\nexport interface CloudResourceRow {\n entity: Entity;\n name: string;\n provider: string;\n resourceType: string;\n region: string;\n account: string;\n owner: string;\n}\n\nexport function isCloudResource(entity: Entity): boolean {\n return (\n entity.kind.toLocaleLowerCase('en-US') === 'resource' &&\n Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION])\n );\n}\n\nexport function cloudResourceRows(entities: Entity[]): CloudResourceRow[] {\n return entities\n .filter(isCloudResource)\n .map(entity => {\n const annotations = entity.metadata.annotations ?? {};\n return {\n entity,\n name: entity.metadata.title || entity.metadata.name,\n provider:\n annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]?.toUpperCase() ||\n 'Unknown',\n resourceType:\n annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] ||\n String(entity.spec?.type || 'resource'),\n region: annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || 'Global',\n account:\n annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION] || 'Not available',\n owner:\n typeof entity.spec?.owner === 'string'\n ? entity.spec.owner\n : 'Not assigned',\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nconst columns: TableColumn<CloudResourceRow>[] = [\n {\n title: 'Resource',\n field: 'name',\n render: row => <EntityRefLink entityRef={row.entity} title={row.name} />,\n },\n { title: 'Type', field: 'resourceType' },\n { title: 'Provider', field: 'provider' },\n { title: 'Region', field: 'region' },\n { title: 'Account', field: 'account' },\n { title: 'Owner', field: 'owner' },\n];\n\nexport const CloudPage = () => {\n const catalogApi = useApi(catalogApiRef);\n const [entities, setEntities] = useState<Entity[]>();\n const [error, setError] = useState<string>();\n\n useEffect(() => {\n catalogApi\n .getEntities({ filter: { kind: 'Resource' } })\n .then(response => setEntities(response.items))\n .catch(cause =>\n setError(cause instanceof Error ? cause.message : String(cause)),\n );\n }, [catalogApi]);\n\n const rows = useMemo(() => cloudResourceRows(entities ?? []), [entities]);\n const summary = useMemo(\n () => ({\n resources: rows.length,\n types: new Set(rows.map(row => row.resourceType)).size,\n accounts: new Set(\n rows\n .map(row => row.account)\n .filter(account => account !== 'Not available'),\n ).size,\n regions: new Set(\n rows.map(row => row.region).filter(region => region !== 'Global'),\n ).size,\n }),\n [rows],\n );\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Cloud\"\n subtitle=\"Read-only cloud inventory synchronized through Anyshift\"\n />\n <Content>\n <ContentHeader title=\"Cloud inventory\" />\n {error ? (\n <Typography color=\"error\">{error}</Typography>\n ) : !entities ? (\n <Progress />\n ) : (\n <>\n <InfoCard>\n <Grid container spacing={2}>\n <Summary label=\"Resources\" value={summary.resources} />\n <Summary label=\"Types\" value={summary.types} />\n <Summary label=\"Accounts\" value={summary.accounts} />\n <Summary label=\"Regions\" value={summary.regions} />\n </Grid>\n </InfoCard>\n <Table\n title=\"Cloud resources\"\n columns={columns}\n data={rows}\n options={{\n filtering: true,\n paging: true,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n search: true,\n }}\n emptyContent={\n <Typography color=\"textSecondary\">\n No cloud resources have been synchronized yet.\n </Typography>\n }\n />\n </>\n )}\n </Content>\n </Page>\n );\n};\n\nconst Summary = ({ label, value }: { label: string; value: number }) => (\n <Grid item xs={6} md={3}>\n <Typography variant=\"h5\">{value}</Typography>\n <Typography color=\"textSecondary\">{label}</Typography>\n </Grid>\n);\n"],"names":[],"mappings":";;;;;;;;AAgCO,SAAS,gBAAgB,MAAA,EAAyB;AACvD,EAAA,OACE,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,KAAM,UAAA,IAC3C,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,kCAAkC,CAAC,CAAA;AAE7E;AAEO,SAAS,kBAAkB,QAAA,EAAwC;AACxE,EAAA,OAAO,QAAA,CACJ,MAAA,CAAO,eAAe,CAAA,CACtB,IAAI,CAAA,MAAA,KAAU;AACb,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,OAAO,QAAA,CAAS,IAAA;AAAA,MAC/C,QAAA,EACE,WAAA,CAAY,kCAAkC,CAAA,EAAG,aAAY,IAC7D,SAAA;AAAA,MACF,YAAA,EACE,YAAY,iCAAiC,CAAA,IAC7C,OAAO,MAAA,CAAO,IAAA,EAAM,QAAQ,UAAU,CAAA;AAAA,MACxC,MAAA,EAAQ,WAAA,CAAY,gCAAgC,CAAA,IAAK,QAAA;AAAA,MACzD,OAAA,EACE,WAAA,CAAY,iCAAiC,CAAA,IAAK,eAAA;AAAA,MACpD,KAAA,EACE,OAAO,MAAA,CAAO,IAAA,EAAM,UAAU,QAAA,GAC1B,MAAA,CAAO,KAAK,KAAA,GACZ;AAAA,KACR;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAChD;AAEA,MAAM,OAAA,GAA2C;AAAA,EAC/C;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,yBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,WAAW,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM;AAAA,GACxE;AAAA,EACA,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,EACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC3B,CAAA;AAEO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAmB;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAiB;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CACG,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAE,MAAM,UAAA,EAAW,EAAG,CAAA,CAC5C,KAAK,CAAA,QAAA,KAAY,WAAA,CAAY,QAAA,CAAS,KAAK,CAAC,CAAA,CAC5C,KAAA;AAAA,MAAM,CAAA,KAAA,KACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC;AAAA,KACjE;AAAA,EACJ,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAM,iBAAA,CAAkB,QAAA,IAAY,EAAE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,KAAA,EAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,CAAC,CAAA,CAAE,IAAA;AAAA,MAClD,UAAU,IAAI,GAAA;AAAA,QACZ,IAAA,CACG,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,OAAO,CAAA,CACtB,MAAA,CAAO,CAAA,OAAA,KAAW,OAAA,KAAY,eAAe;AAAA,OAClD,CAAE,IAAA;AAAA,MACF,SAAS,IAAI,GAAA;AAAA,QACX,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,KAAW,QAAQ;AAAA,OAClE,CAAE;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAS;AAAA;AAAA,KACX;AAAA,yBACC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAM,iBAAA,EAAkB,CAAA;AAAA,MACtC,KAAA,mBACC,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM,CAAA,GAC/B,CAAC,QAAA,mBACH,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA,mBAEV,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,WAAA,EAAY,KAAA,EAAO,QAAQ,SAAA,EAAW,CAAA;AAAA,8BACpD,OAAA,EAAA,EAAQ,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO,CAAA;AAAA,8BAC5C,OAAA,EAAA,EAAQ,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,QAAQ,QAAA,EAAU,CAAA;AAAA,8BAClD,OAAA,EAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,KAAA,EAAO,QAAQ,OAAA,EAAS;AAAA,SAAA,EACnD,CAAA,EACF,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iBAAA;AAAA,YACN,OAAA;AAAA,YACA,IAAA,EAAM,IAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,SAAA,EAAW,IAAA;AAAA,cACX,MAAA,EAAQ,IAAA;AAAA,cACR,QAAA,EAAU,EAAA;AAAA,cACV,eAAA,EAAiB,CAAC,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,cAC7B,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,YAAA,kBACE,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,gDAAA,EAElC;AAAA;AAAA;AAEJ,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,MAAM,OAAA,GAAU,CAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBAC9B,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACpB,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kBAChC,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,eAAA,EAAiB,QAAA,EAAA,KAAA,EAAM;AAAA,CAAA,EAC3C,CAAA;;;;"}
@@ -0,0 +1,96 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Grid, Typography, Chip } from '@material-ui/core';
3
+ import { InfoCard, Link } from '@backstage/core-components';
4
+ import { ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
5
+ import { useEntity, EntityRefLink } from '@backstage/plugin-catalog-react';
6
+
7
+ const CloudResourceContent = () => {
8
+ const { entity } = useEntity();
9
+ const annotations = entity.metadata.annotations ?? {};
10
+ const relationships = (entity.relations ?? []).filter(
11
+ (relation) => ["dependencyOf", "dependsOn"].includes(relation.type)
12
+ );
13
+ const consoleLink = entity.metadata.links?.find(
14
+ (link) => link.url.startsWith("https://console.aws.amazon.com/")
15
+ );
16
+ return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
17
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(InfoCard, { title: "Cloud identity", children: [
18
+ /* @__PURE__ */ jsx(
19
+ Definition,
20
+ {
21
+ label: "Provider",
22
+ value: annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(
26
+ Definition,
27
+ {
28
+ label: "Resource type",
29
+ value: annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] || String(entity.spec?.type || "")
30
+ }
31
+ ),
32
+ /* @__PURE__ */ jsx(
33
+ Definition,
34
+ {
35
+ label: "Region",
36
+ value: annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || "Global"
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsx(
40
+ Definition,
41
+ {
42
+ label: "Account",
43
+ value: annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION]
44
+ }
45
+ ),
46
+ consoleLink && /* @__PURE__ */ jsx(Link, { to: consoleLink.url, children: "Open in AWS Console" })
47
+ ] }) }),
48
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(InfoCard, { title: "Catalog context", children: [
49
+ /* @__PURE__ */ jsx(
50
+ Definition,
51
+ {
52
+ label: "Owner",
53
+ value: typeof entity.spec?.owner === "string" ? entity.spec.owner : void 0
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ Definition,
58
+ {
59
+ label: "Namespace",
60
+ value: entity.metadata.namespace || "default"
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", children: "Relationships" }),
64
+ relationships.length === 0 ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: "No component or resource relationships are available yet." }) : /* @__PURE__ */ jsx("ul", { children: relationships.map((relation) => /* @__PURE__ */ jsxs("li", { children: [
65
+ /* @__PURE__ */ jsx(
66
+ Chip,
67
+ {
68
+ size: "small",
69
+ label: relation.type,
70
+ style: { marginRight: 8 }
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsx(EntityRefLink, { entityRef: relation.targetRef })
74
+ ] }, `${relation.type}:${relation.targetRef}`)) })
75
+ ] }) }),
76
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(InfoCard, { title: "Cloud resource ARN", children: /* @__PURE__ */ jsx(
77
+ Typography,
78
+ {
79
+ component: "code",
80
+ style: { overflowWrap: "anywhere", whiteSpace: "pre-wrap" },
81
+ children: annotations[ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION] || "No ARN is available for this resource."
82
+ }
83
+ ) }) })
84
+ ] });
85
+ };
86
+ const Definition = ({ label, value }) => /* @__PURE__ */ jsxs(Typography, { paragraph: true, children: [
87
+ /* @__PURE__ */ jsxs("strong", { children: [
88
+ label,
89
+ ":"
90
+ ] }),
91
+ " ",
92
+ value || "Not available"
93
+ ] });
94
+
95
+ export { CloudResourceContent };
96
+ //# sourceMappingURL=CloudResourceContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudResourceContent.esm.js","sources":["../../../src/components/cloud/CloudResourceContent.tsx"],"sourcesContent":["import { Chip, Grid, Typography } from '@material-ui/core';\nimport { InfoCard, Link } from '@backstage/core-components';\nimport {\n ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_CLOUD_REGION_ANNOTATION,\n ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION,\n ANYSHIFT_RESOURCE_TYPE_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { EntityRefLink, useEntity } from '@backstage/plugin-catalog-react';\n\nexport const CloudResourceContent = () => {\n const { entity } = useEntity();\n const annotations = entity.metadata.annotations ?? {};\n const relationships = (entity.relations ?? []).filter(relation =>\n ['dependencyOf', 'dependsOn'].includes(relation.type),\n );\n const consoleLink = entity.metadata.links?.find(link =>\n link.url.startsWith('https://console.aws.amazon.com/'),\n );\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Cloud identity\">\n <Definition\n label=\"Provider\"\n value={annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]}\n />\n <Definition\n label=\"Resource type\"\n value={\n annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] ||\n String(entity.spec?.type || '')\n }\n />\n <Definition\n label=\"Region\"\n value={annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || 'Global'}\n />\n <Definition\n label=\"Account\"\n value={annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION]}\n />\n {consoleLink && <Link to={consoleLink.url}>Open in AWS Console</Link>}\n </InfoCard>\n </Grid>\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Catalog context\">\n <Definition\n label=\"Owner\"\n value={\n typeof entity.spec?.owner === 'string'\n ? entity.spec.owner\n : undefined\n }\n />\n <Definition\n label=\"Namespace\"\n value={entity.metadata.namespace || 'default'}\n />\n <Typography variant=\"subtitle2\">Relationships</Typography>\n {relationships.length === 0 ? (\n <Typography color=\"textSecondary\">\n No component or resource relationships are available yet.\n </Typography>\n ) : (\n <ul>\n {relationships.map(relation => (\n <li key={`${relation.type}:${relation.targetRef}`}>\n <Chip\n size=\"small\"\n label={relation.type}\n style={{ marginRight: 8 }}\n />\n <EntityRefLink entityRef={relation.targetRef} />\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Cloud resource ARN\">\n <Typography\n component=\"code\"\n style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}\n >\n {annotations[ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION] ||\n 'No ARN is available for this resource.'}\n </Typography>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};\n\nconst Definition = ({ label, value }: { label: string; value?: string }) => (\n <Typography paragraph>\n <strong>{label}:</strong> {value || 'Not available'}\n </Typography>\n);\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- import * as _backstage_catalog_model from '@backstage/catalog-model';
2
1
  import * as react from 'react';
3
2
  import * as _backstage_filter_predicates from '@backstage/filter-predicates';
4
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
4
+ import { Entity } from '@backstage/catalog-model';
5
5
  import { AnyshiftCapabilities, ServiceBrief, BriefSectionName, BriefSectionResponse, EstateInsights, DatadogSignals, CatalogSummary, QueryResult, CatalogSyncReport } from '@anyshift/backstage-plugin-anyshift-common';
6
- export { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
6
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
7
7
 
8
8
  declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
9
9
  root: _backstage_frontend_plugin_api.RouteRef<undefined>;
10
+ cloud: _backstage_frontend_plugin_api.RouteRef<undefined>;
10
11
  }, {}, {
11
12
  "api:anyshift": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
12
13
  kind: "api";
@@ -17,6 +18,48 @@ declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontend
17
18
  inputs: {};
18
19
  params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
19
20
  }>;
21
+ "entity-content:anyshift/cloud-resource-content": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
22
+ kind: "entity-content";
23
+ name: "cloud-resource-content";
24
+ config: {
25
+ path: string | undefined;
26
+ title: string | undefined;
27
+ filter: _backstage_filter_predicates.FilterPredicate | undefined;
28
+ group: string | false | undefined;
29
+ icon: string | undefined;
30
+ };
31
+ configInput: {
32
+ path?: string | undefined;
33
+ title?: string | undefined;
34
+ filter?: _backstage_filter_predicates.FilterPredicate | undefined;
35
+ group?: string | false | undefined;
36
+ icon?: string | undefined;
37
+ };
38
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
39
+ optional: true;
40
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: Entity) => boolean, "catalog.entity-filter-function", {
41
+ optional: true;
42
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
43
+ optional: true;
44
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
45
+ optional: true;
46
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string | react.ReactElement<any, string | react.JSXElementConstructor<any>>, "catalog.entity-content-icon", {
47
+ optional: true;
48
+ }>;
49
+ inputs: {};
50
+ params: {
51
+ defaultPath?: [Error: `Use the 'path' param instead`];
52
+ path: string;
53
+ defaultTitle?: [Error: `Use the 'title' param instead`];
54
+ title: string;
55
+ defaultGroup?: [Error: `Use the 'group' param instead`];
56
+ group?: ("development" | "deployment" | "overview" | "documentation" | "operation" | "observability") | (string & {});
57
+ icon?: string | react.ReactElement;
58
+ loader: () => Promise<JSX.Element>;
59
+ routeRef?: _backstage_frontend_plugin_api.RouteRef;
60
+ filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: Entity) => boolean);
61
+ };
62
+ }>;
20
63
  "entity-content:anyshift/entity-content": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
21
64
  kind: "entity-content";
22
65
  name: "entity-content";
@@ -36,7 +79,7 @@ declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontend
36
79
  };
37
80
  output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
38
81
  optional: true;
39
- }> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
82
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: Entity) => boolean, "catalog.entity-filter-function", {
40
83
  optional: true;
41
84
  }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
42
85
  optional: true;
@@ -56,7 +99,7 @@ declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontend
56
99
  icon?: string | react.ReactElement;
57
100
  loader: () => Promise<JSX.Element>;
58
101
  routeRef?: _backstage_frontend_plugin_api.RouteRef;
59
- filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
102
+ filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: Entity) => boolean);
60
103
  };
61
104
  }>;
62
105
  "page:anyshift": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
@@ -99,6 +142,46 @@ declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontend
99
142
  noHeader?: boolean;
100
143
  };
101
144
  }>;
145
+ "page:anyshift/cloud": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
146
+ kind: "page";
147
+ name: "cloud";
148
+ config: {
149
+ path: string | undefined;
150
+ title: string | undefined;
151
+ };
152
+ configInput: {
153
+ path?: string | undefined;
154
+ title?: string | undefined;
155
+ };
156
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
157
+ optional: true;
158
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.title", {
159
+ optional: true;
160
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
161
+ optional: true;
162
+ }>;
163
+ inputs: {
164
+ pages: _backstage_frontend_plugin_api.ExtensionInput<_backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
165
+ optional: true;
166
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.title", {
167
+ optional: true;
168
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
169
+ optional: true;
170
+ }>, {
171
+ singleton: false;
172
+ optional: false;
173
+ internal: false;
174
+ }>;
175
+ };
176
+ params: {
177
+ path: string;
178
+ title?: string;
179
+ icon?: _backstage_frontend_plugin_api.IconElement;
180
+ loader?: () => Promise<react.JSX.Element>;
181
+ routeRef?: _backstage_frontend_plugin_api.RouteRef;
182
+ noHeader?: boolean;
183
+ };
184
+ }>;
102
185
  }>;
103
186
 
104
187
  interface AnyshiftApi {
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { anyshiftPlugin, anyshiftPlugin as default } from './plugin.esm.js';
2
2
  export { anyshiftApiRef } from './api/AnyshiftApi.esm.js';
3
- export { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
3
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
4
4
  //# sourceMappingURL=index.esm.js.map
@@ -1,5 +1,5 @@
1
1
  var name = "@anyshift/backstage-plugin-anyshift";
2
- var version = "0.1.0-beta.3";
2
+ var version = "0.1.0-beta.6";
3
3
  var description = "Read-only Anyshift infrastructure context for Backstage";
4
4
  var main = "src/index.ts";
5
5
  var types = "src/index.ts";
@@ -1,11 +1,12 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import DeviceHubIcon from '@material-ui/icons/DeviceHub';
3
+ import CloudQueueIcon from '@material-ui/icons/CloudQueue';
3
4
  import { ApiBlueprint, fetchApiRef, discoveryApiRef, PageBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
4
5
  import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
5
- import { anyshiftViewPermission, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
6
+ import { anyshiftViewPermission, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, isAnyshiftResourceKind, ANYSHIFT_MANAGED_BY_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
6
7
  import { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary.esm.js';
7
8
  import { AnyshiftClient, anyshiftApiRef } from './api/AnyshiftApi.esm.js';
8
- import { rootRouteRef } from './routes.esm.js';
9
+ import { rootRouteRef, cloudRouteRef } from './routes.esm.js';
9
10
 
10
11
  const anyshiftApi = ApiBlueprint.make({
11
12
  params: (defineParams) => defineParams({
@@ -24,26 +25,64 @@ const anyshiftPage = PageBlueprint.make({
24
25
  loader: () => import('./components/explorer/AnyshiftExplorerPage.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.AnyshiftExplorerPage, {}) }))
25
26
  }
26
27
  });
28
+ const cloudPage = PageBlueprint.make({
29
+ name: "cloud",
30
+ params: {
31
+ path: "/cloud",
32
+ title: "Cloud",
33
+ icon: /* @__PURE__ */ jsx(CloudQueueIcon, { fontSize: "inherit" }),
34
+ routeRef: cloudRouteRef,
35
+ noHeader: true,
36
+ loader: () => import('./components/cloud/CloudPage.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.CloudPage, {}) }))
37
+ }
38
+ });
27
39
  const anyshiftEntityContent = EntityContentBlueprint.make({
28
40
  name: "entity-content",
29
41
  params: {
30
42
  path: "/anyshift",
31
43
  title: "Anyshift",
32
44
  group: "observability",
33
- filter: (entity) => Boolean(
34
- entity.metadata.annotations?.[ANYSHIFT_TARGET_ANNOTATION] || entity.metadata.annotations?.[GITHUB_PROJECT_SLUG_ANNOTATION]
35
- ),
45
+ filter: isAnyshiftEntityContentAvailable,
36
46
  loader: () => import('./components/entity/AnyshiftEntityContent.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.AnyshiftEntityContent, {}) }))
37
47
  }
38
48
  });
49
+ const cloudEntityContent = EntityContentBlueprint.make({
50
+ name: "cloud-resource-content",
51
+ params: {
52
+ path: "/cloud",
53
+ title: "Cloud",
54
+ group: "observability",
55
+ filter: isCloudResourceContentAvailable,
56
+ loader: () => import('./components/cloud/CloudResourceContent.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.CloudResourceContent, {}) }))
57
+ }
58
+ });
59
+ function isAnyshiftEntityContentAvailable(entity) {
60
+ const annotations = entity.metadata.annotations ?? {};
61
+ const hasTarget = Boolean(
62
+ annotations[ANYSHIFT_TARGET_ANNOTATION] || annotations[GITHUB_PROJECT_SLUG_ANNOTATION]
63
+ );
64
+ if (!hasTarget) return false;
65
+ const kind = annotations[ANYSHIFT_KIND_ANNOTATION];
66
+ if (kind) return isAnyshiftResourceKind(kind);
67
+ return annotations[ANYSHIFT_MANAGED_BY_ANNOTATION] !== "catalog-provider";
68
+ }
69
+ function isCloudResourceContentAvailable(entity) {
70
+ return entity.kind.toLocaleLowerCase("en-US") === "resource" && Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]);
71
+ }
39
72
  const anyshiftPlugin = createFrontendPlugin({
40
73
  pluginId: "anyshift",
41
74
  info: {
42
75
  packageJson: () => import('./package.json.esm.js')
43
76
  },
44
- routes: { root: rootRouteRef },
45
- extensions: [anyshiftApi, anyshiftPage, anyshiftEntityContent]
77
+ routes: { root: rootRouteRef, cloud: cloudRouteRef },
78
+ extensions: [
79
+ anyshiftApi,
80
+ anyshiftPage,
81
+ cloudPage,
82
+ anyshiftEntityContent,
83
+ cloudEntityContent
84
+ ]
46
85
  });
47
86
 
48
- export { anyshiftPlugin };
87
+ export { anyshiftPlugin, isAnyshiftEntityContentAvailable, isCloudResourceContentAvailable };
49
88
  //# sourceMappingURL=plugin.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import DeviceHubIcon from '@material-ui/icons/DeviceHub';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport {\n ANYSHIFT_TARGET_ANNOTATION,\n GITHUB_PROJECT_SLUG_ANNOTATION,\n anyshiftViewPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary';\nimport { anyshiftApiRef, AnyshiftClient } from './api/AnyshiftApi';\nimport { rootRouteRef } from './routes';\n\nconst anyshiftApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: anyshiftApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) =>\n new AnyshiftClient({ discoveryApi, fetchApi }),\n }),\n});\n\nconst anyshiftPage = PageBlueprint.make({\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n icon: <DeviceHubIcon fontSize=\"inherit\" />,\n routeRef: rootRouteRef,\n noHeader: true,\n loader: () =>\n import('./components/explorer/AnyshiftExplorerPage').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftExplorerPage />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nconst anyshiftEntityContent = EntityContentBlueprint.make({\n name: 'entity-content',\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n group: 'observability',\n filter: entity =>\n Boolean(\n entity.metadata.annotations?.[ANYSHIFT_TARGET_ANNOTATION] ||\n entity.metadata.annotations?.[GITHUB_PROJECT_SLUG_ANNOTATION],\n ),\n loader: () =>\n import('./components/entity/AnyshiftEntityContent').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftEntityContent />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nexport const anyshiftPlugin = createFrontendPlugin({\n pluginId: 'anyshift',\n info: {\n packageJson: () => import('../package.json'),\n },\n routes: { root: rootRouteRef },\n extensions: [anyshiftApi, anyshiftPage, anyshiftEntityContent],\n});\n\nexport default anyshiftPlugin;\n"],"names":[],"mappings":";;;;;;;;;AAkBA,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK;AAAA,EACpC,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,cAAA;AAAA,IACL,IAAA,EAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,UAAU,WAAA,EAAY;AAAA,IAC7D,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KACjC,IAAI,cAAA,CAAe,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,GAChD;AACL,CAAC,CAAA;AAED,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK;AAAA,EACtC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,kBAAM,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,IACxC,QAAA,EAAU,YAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,QAAQ,MACN,OAAO,mDAA4C,CAAA,CAAE,KAAK,CAAA,MAAA,qBACxD,GAAA,CAAC,0BAAA,EAAA,EAA2B,UAAA,EAAY,wBACtC,QAAA,kBAAA,GAAA,CAAC,MAAA,CAAO,oBAAA,EAAP,EAA4B,GAC/B,CACD;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,qBAAA,GAAwB,uBAAuB,IAAA,CAAK;AAAA,EACxD,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,QAAQ,CAAA,MAAA,KACN,OAAA;AAAA,MACE,MAAA,CAAO,SAAS,WAAA,GAAc,0BAA0B,KACtD,MAAA,CAAO,QAAA,CAAS,cAAc,8BAA8B;AAAA,KAChE;AAAA,IACF,QAAQ,MACN,OAAO,kDAA2C,CAAA,CAAE,KAAK,CAAA,MAAA,qBACvD,GAAA,CAAC,0BAAA,EAAA,EAA2B,UAAA,EAAY,wBACtC,QAAA,kBAAA,GAAA,CAAC,MAAA,CAAO,qBAAA,EAAP,EAA6B,GAChC,CACD;AAAA;AAEP,CAAC,CAAA;AAEM,MAAM,iBAAiB,oBAAA,CAAqB;AAAA,EACjD,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,MAAM,OAAO,uBAAiB;AAAA,GAC7C;AAAA,EACA,MAAA,EAAQ,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,EAC7B,UAAA,EAAY,CAAC,WAAA,EAAa,YAAA,EAAc,qBAAqB;AAC/D,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import DeviceHubIcon from '@material-ui/icons/DeviceHub';\nimport CloudQueueIcon from '@material-ui/icons/CloudQueue';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_KIND_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_MANAGED_BY_ANNOTATION,\n ANYSHIFT_TARGET_ANNOTATION,\n GITHUB_PROJECT_SLUG_ANNOTATION,\n anyshiftViewPermission,\n isAnyshiftResourceKind,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary';\nimport { anyshiftApiRef, AnyshiftClient } from './api/AnyshiftApi';\nimport { cloudRouteRef, rootRouteRef } from './routes';\n\nconst anyshiftApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: anyshiftApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) =>\n new AnyshiftClient({ discoveryApi, fetchApi }),\n }),\n});\n\nconst anyshiftPage = PageBlueprint.make({\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n icon: <DeviceHubIcon fontSize=\"inherit\" />,\n routeRef: rootRouteRef,\n noHeader: true,\n loader: () =>\n import('./components/explorer/AnyshiftExplorerPage').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftExplorerPage />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nconst cloudPage = PageBlueprint.make({\n name: 'cloud',\n params: {\n path: '/cloud',\n title: 'Cloud',\n icon: <CloudQueueIcon fontSize=\"inherit\" />,\n routeRef: cloudRouteRef,\n noHeader: true,\n loader: () =>\n import('./components/cloud/CloudPage').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.CloudPage />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nconst anyshiftEntityContent = EntityContentBlueprint.make({\n name: 'entity-content',\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n group: 'observability',\n filter: isAnyshiftEntityContentAvailable,\n loader: () =>\n import('./components/entity/AnyshiftEntityContent').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftEntityContent />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nconst cloudEntityContent = EntityContentBlueprint.make({\n name: 'cloud-resource-content',\n params: {\n path: '/cloud',\n title: 'Cloud',\n group: 'observability',\n filter: isCloudResourceContentAvailable,\n loader: () =>\n import('./components/cloud/CloudResourceContent').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.CloudResourceContent />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nexport function isAnyshiftEntityContentAvailable(entity: Entity): boolean {\n const annotations = entity.metadata.annotations ?? {};\n const hasTarget = Boolean(\n annotations[ANYSHIFT_TARGET_ANNOTATION] ||\n annotations[GITHUB_PROJECT_SLUG_ANNOTATION],\n );\n if (!hasTarget) return false;\n\n const kind = annotations[ANYSHIFT_KIND_ANNOTATION];\n if (kind) return isAnyshiftResourceKind(kind);\n\n return annotations[ANYSHIFT_MANAGED_BY_ANNOTATION] !== 'catalog-provider';\n}\n\nexport function isCloudResourceContentAvailable(entity: Entity): boolean {\n return (\n entity.kind.toLocaleLowerCase('en-US') === 'resource' &&\n Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION])\n );\n}\n\nexport const anyshiftPlugin = createFrontendPlugin({\n pluginId: 'anyshift',\n info: {\n packageJson: () => import('../package.json'),\n },\n routes: { root: rootRouteRef, cloud: cloudRouteRef },\n extensions: [\n anyshiftApi,\n anyshiftPage,\n cloudPage,\n anyshiftEntityContent,\n cloudEntityContent,\n ],\n});\n\nexport default anyshiftPlugin;\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { createRouteRef } from '@backstage/frontend-plugin-api';
2
2
 
3
3
  const rootRouteRef = createRouteRef();
4
+ const cloudRouteRef = createRouteRef();
4
5
 
5
- export { rootRouteRef };
6
+ export { cloudRouteRef, rootRouteRef };
6
7
  //# sourceMappingURL=routes.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/frontend-plugin-api';\n\nexport const rootRouteRef = createRouteRef();\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/frontend-plugin-api';\n\nexport const rootRouteRef = createRouteRef();\nexport const cloudRouteRef = createRouteRef();\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA;AACrB,MAAM,gBAAgB,cAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anyshift/backstage-plugin-anyshift",
3
- "version": "0.1.0-beta.3",
3
+ "version": "0.1.0-beta.6",
4
4
  "description": "Read-only Anyshift infrastructure context for Backstage",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,7 +45,7 @@
45
45
  "clean": "backstage-cli package clean"
46
46
  },
47
47
  "dependencies": {
48
- "@anyshift/backstage-plugin-anyshift-common": "^0.1.0-beta.3",
48
+ "@anyshift/backstage-plugin-anyshift-common": "^0.1.0-beta.6",
49
49
  "@backstage/catalog-model": "^1.9.0",
50
50
  "@backstage/core-components": "^0.18.11",
51
51
  "@backstage/frontend-plugin-api": "^0.17.2",