@axis-backstage/plugin-readme 0.18.0 → 0.18.2

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,36 @@
1
1
  # @axis-backstage/plugin-readme
2
2
 
3
+ ## 0.18.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 36858a7: Bumped to backstage 1.50.2
8
+
9
+ ## 0.18.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 199bd49: Fix critical security vulnerabilities by upgrading Backstage dependencies:
14
+
15
+ **Security Fixes:**
16
+
17
+ - Fixed CVE-2025-8101 (High Severity) in linkifyjs/linkify-react by upgrading @backstage/core-components from ^0.18.4 to ^0.18.6
18
+ - Fixed CVE-2026-24046 (High Severity) - UNIX Symbolic Link Following in @backstage/backend-plugin-api by upgrading from ^1.6.0 to ^1.6.2
19
+ - Fixed CVE-2026-24047 (High Severity) - Symlink Attack in @backstage/backend-defaults by upgrading from ^0.14.0 to ^0.15.1
20
+ - Fixed SNYK-JS-QS-14724253 (High Severity) - Allocation of Resources Without Limits or Throttling in qs by adding resolution to ^6.14.1
21
+
22
+ **Additional Package Upgrades:**
23
+ Upgraded packages to versions that depend on patched Backstage core packages:
24
+
25
+ - @backstage/plugin-mcp-actions-backend: ^0.1.6 → ^0.1.8
26
+ - @backstage/plugin-search-backend: ^2.0.9 → ^2.0.11
27
+ - @backstage/plugin-techdocs-backend: ^2.1.3 → ^2.1.4
28
+ - @backstage/backend-test-utils: ^1.10.2 → ^1.10.4 (in jira-dashboard-backend and readme-backend)
29
+
30
+ **Code Improvements:**
31
+
32
+ - Removed redundant @backstage/backend-defaults imports from production code paths in backend plugins (jira-dashboard-backend, readme-backend, statuspage-backend)
33
+
3
34
  ## 0.18.0
4
35
 
5
36
  ### Minor Changes
package/dist/alpha.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- /// <reference types="react" />
1
+ import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
2
2
  import * as _backstage_catalog_model from '@backstage/catalog-model';
3
3
  import * as react from 'react';
4
- import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
4
+ import * as _backstage_filter_predicates from '@backstage/filter-predicates';
5
5
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
6
6
 
7
7
  /**
@@ -17,20 +17,18 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
17
17
  configInput: {};
18
18
  output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
19
19
  inputs: {};
20
- params: <TApi, TImpl extends TApi, TDeps extends {
21
- [x: string]: unknown;
22
- }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
20
+ 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>;
23
21
  }>;
24
22
  "entity-card:readme": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
25
23
  kind: "entity-card";
26
24
  name: undefined;
27
25
  config: {
28
- filter: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
29
- type: "summary" | "content" | "info" | undefined;
26
+ filter: _backstage_filter_predicates.FilterPredicate | undefined;
27
+ type: "content" | "info" | undefined;
30
28
  };
31
29
  configInput: {
32
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
33
- type?: "summary" | "content" | "info" | undefined;
30
+ filter?: _backstage_filter_predicates.FilterPredicate | undefined;
31
+ type?: "content" | "info" | undefined;
34
32
  };
35
33
  output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
36
34
  optional: true;
@@ -42,8 +40,8 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
42
40
  inputs: {};
43
41
  params: {
44
42
  loader: () => Promise<JSX.Element>;
45
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean) | undefined;
46
- type?: _backstage_plugin_catalog_react_alpha.EntityCardType | undefined;
43
+ filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
44
+ type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
47
45
  };
48
46
  }>;
49
47
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["/**\n * Frontend plugin that fetches and displays the readme for an entity\n *\n * @packageDocumentation\n */\n\nimport {\n ApiBlueprint,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { readmeApiRef } from './api/ReadmeApi';\nimport { ReadmeClient } from './api/ReadmeClient';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\nconst readmeApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: readmeApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new ReadmeClient({ discoveryApi, fetchApi, identityApi }),\n }),\n});\n\nconst readmeCard = EntityCardBlueprint.make({\n params: {\n loader: async () =>\n import('./components/ReadmeCard').then(m => <m.ReadmeCard />),\n },\n});\n\nexport default createFrontendPlugin({\n pluginId: 'readme',\n extensions: [readmeApi, readmeCard],\n});\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,SAAA,GAAY,aAAa,IAAK,CAAA;AAAA,EAClC,MAAA,EAAQ,kBACN,YAAa,CAAA;AAAA,IACX,GAAK,EAAA,YAAA;AAAA,IACL,IAAM,EAAA;AAAA,MACJ,YAAc,EAAA,eAAA;AAAA,MACd,QAAU,EAAA,WAAA;AAAA,MACV,WAAa,EAAA;AAAA,KACf;AAAA,IACA,OAAS,EAAA,CAAC,EAAE,YAAA,EAAc,QAAU,EAAA,WAAA,EAClC,KAAA,IAAI,YAAa,CAAA,EAAE,YAAc,EAAA,QAAA,EAAU,aAAa;AAAA,GAC3D;AACL,CAAC,CAAA;AAED,MAAM,UAAA,GAAa,oBAAoB,IAAK,CAAA;AAAA,EAC1C,MAAQ,EAAA;AAAA,IACN,MAAA,EAAQ,YACN,OAAO,sCAAyB,CAAA,CAAE,IAAK,CAAA,CAAA,CAAA,qBAAM,GAAA,CAAA,CAAA,CAAE,UAAF,EAAA,EAAa,CAAE;AAAA;AAElE,CAAC,CAAA;AAED,YAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,QAAA;AAAA,EACV,UAAA,EAAY,CAAC,SAAA,EAAW,UAAU;AACpC,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["/**\n * Frontend plugin that fetches and displays the readme for an entity\n *\n * @packageDocumentation\n */\n\nimport {\n ApiBlueprint,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { readmeApiRef } from './api/ReadmeApi';\nimport { ReadmeClient } from './api/ReadmeClient';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\nconst readmeApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: readmeApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new ReadmeClient({ discoveryApi, fetchApi, identityApi }),\n }),\n});\n\nconst readmeCard = EntityCardBlueprint.make({\n params: {\n loader: async () =>\n import('./components/ReadmeCard').then(m => <m.ReadmeCard />),\n },\n});\n\nexport default createFrontendPlugin({\n pluginId: 'readme',\n extensions: [readmeApi, readmeCard],\n});\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK;AAAA,EAClC,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,eAAA;AAAA,MACd,QAAA,EAAU,WAAA;AAAA,MACV,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAU,WAAA,EAAY,KAC9C,IAAI,YAAA,CAAa,EAAE,YAAA,EAAc,QAAA,EAAU,aAAa;AAAA,GAC3D;AACL,CAAC,CAAA;AAED,MAAM,UAAA,GAAa,oBAAoB,IAAA,CAAK;AAAA,EAC1C,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,YACN,OAAO,sCAAyB,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBAAK,GAAA,CAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAE;AAAA;AAElE,CAAC,CAAA;AAED,YAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,CAAC,SAAA,EAAW,UAAU;AACpC,CAAC,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReadmeApi.esm.js","sources":["../../src/api/ReadmeApi.tsx"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\n\nexport const readmeApiRef = createApiRef<ReadmeApi>({\n id: 'plugin.readme',\n});\n\nexport type ReadmeApi = {\n getReadmeContent(entityRef: string): Promise<[string, string]>;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,YAAwB,CAAA;AAAA,EAClD,EAAI,EAAA;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"ReadmeApi.esm.js","sources":["../../src/api/ReadmeApi.tsx"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\n\nexport const readmeApiRef = createApiRef<ReadmeApi>({\n id: 'plugin.readme',\n});\n\nexport type ReadmeApi = {\n getReadmeContent(entityRef: string): Promise<[string, string]>;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,YAAA,CAAwB;AAAA,EAClD,EAAA,EAAI;AACN,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReadmeClient.esm.js","sources":["../../src/api/ReadmeClient.tsx"],"sourcesContent":["import {\n ApiHolder,\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { ResponseError } from '@backstage/errors';\nimport { ReadmeApi, readmeApiRef } from './ReadmeApi';\n\n/**\n * Checks if a README is available for the given entity by making a request to the backend.\nIf the backend returns a 404 NotFound error, it indicates that no README is available for the entity.\n@param entity - The entity for which to check the README availability.\n@param context - The context providing access to the API holder.\n@returns A promise that resolves to true if the README is available, or false if not found (404).\n * @public\n */\nexport const isReadmeAvailable = async (\n entity: Entity,\n context: { apis: ApiHolder },\n): Promise<boolean> => {\n const readmeClient = context.apis.get(readmeApiRef);\n\n if (readmeClient === undefined) {\n return false;\n }\n\n try {\n await readmeClient.getReadmeContent(stringifyEntityRef(entity));\n } catch (error) {\n if (error instanceof ResponseError && error.statusCode === 404) {\n return false;\n }\n }\n return true;\n};\n\nexport class ReadmeClient implements ReadmeApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n this.identityApi = options.identityApi;\n }\n\n async getReadmeContent(entityRef: string): Promise<[string, string]> {\n const { token } = await this.identityApi.getCredentials();\n const baseUrl = await this.discoveryApi.getBaseUrl('readme');\n\n const { kind, name, namespace } = parseEntityRef(entityRef, {\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n\n const resp = await this.fetchApi.fetch(\n `${baseUrl}/${kind}/${namespace}/${name}`,\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${token}` },\n },\n );\n\n if (resp.ok) {\n return [\n await resp.text(),\n resp.headers.get('Content-Type') || 'text/plain',\n ];\n }\n\n throw await ResponseError.fromResponse(resp);\n }\n}\n"],"names":[],"mappings":";;;;AAuBa,MAAA,iBAAA,GAAoB,OAC/B,MAAA,EACA,OACqB,KAAA;AACrB,EAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,IAAK,CAAA,GAAA,CAAI,YAAY,CAAA;AAElD,EAAA,IAAI,iBAAiB,MAAW,EAAA;AAC9B,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA;AACF,IAAA,MAAM,YAAa,CAAA,gBAAA,CAAiB,kBAAmB,CAAA,MAAM,CAAC,CAAA;AAAA,WACvD,KAAO,EAAA;AACd,IAAA,IAAI,KAAiB,YAAA,aAAA,IAAiB,KAAM,CAAA,UAAA,KAAe,GAAK,EAAA;AAC9D,MAAO,OAAA,KAAA;AAAA;AACT;AAEF,EAAO,OAAA,IAAA;AACT;AAEO,MAAM,YAAkC,CAAA;AAAA,EAC5B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,OAIT,EAAA;AACD,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AACxB,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA;AAAA;AAC7B,EAEA,MAAM,iBAAiB,SAA8C,EAAA;AACnE,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAM,IAAA,CAAK,YAAY,cAAe,EAAA;AACxD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,QAAQ,CAAA;AAE3D,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,SAAU,EAAA,GAAI,eAAe,SAAW,EAAA;AAAA,MAC1D,gBAAkB,EAAA;AAAA,KACnB,CAAA;AAED,IAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA;AAAA,MAC/B,GAAG,OAAO,CAAA,CAAA,EAAI,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MACvC;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,KAAK,CAAG,CAAA;AAAA;AAC9C,KACF;AAEA,IAAA,IAAI,KAAK,EAAI,EAAA;AACX,MAAO,OAAA;AAAA,QACL,MAAM,KAAK,IAAK,EAAA;AAAA,QAChB,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,cAAc,CAAK,IAAA;AAAA,OACtC;AAAA;AAGF,IAAM,MAAA,MAAM,aAAc,CAAA,YAAA,CAAa,IAAI,CAAA;AAAA;AAE/C;;;;"}
1
+ {"version":3,"file":"ReadmeClient.esm.js","sources":["../../src/api/ReadmeClient.tsx"],"sourcesContent":["import {\n ApiHolder,\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { ResponseError } from '@backstage/errors';\nimport { ReadmeApi, readmeApiRef } from './ReadmeApi';\n\n/**\n * Checks if a README is available for the given entity by making a request to the backend.\nIf the backend returns a 404 NotFound error, it indicates that no README is available for the entity.\n@param entity - The entity for which to check the README availability.\n@param context - The context providing access to the API holder.\n@returns A promise that resolves to true if the README is available, or false if not found (404).\n * @public\n */\nexport const isReadmeAvailable = async (\n entity: Entity,\n context: { apis: ApiHolder },\n): Promise<boolean> => {\n const readmeClient = context.apis.get(readmeApiRef);\n\n if (readmeClient === undefined) {\n return false;\n }\n\n try {\n await readmeClient.getReadmeContent(stringifyEntityRef(entity));\n } catch (error) {\n if (error instanceof ResponseError && error.statusCode === 404) {\n return false;\n }\n }\n return true;\n};\n\nexport class ReadmeClient implements ReadmeApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n this.identityApi = options.identityApi;\n }\n\n async getReadmeContent(entityRef: string): Promise<[string, string]> {\n const { token } = await this.identityApi.getCredentials();\n const baseUrl = await this.discoveryApi.getBaseUrl('readme');\n\n const { kind, name, namespace } = parseEntityRef(entityRef, {\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n\n const resp = await this.fetchApi.fetch(\n `${baseUrl}/${kind}/${namespace}/${name}`,\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${token}` },\n },\n );\n\n if (resp.ok) {\n return [\n await resp.text(),\n resp.headers.get('Content-Type') || 'text/plain',\n ];\n }\n\n throw await ResponseError.fromResponse(resp);\n }\n}\n"],"names":[],"mappings":";;;;AAuBO,MAAM,iBAAA,GAAoB,OAC/B,MAAA,EACA,OAAA,KACqB;AACrB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AAElD,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,CAAa,gBAAA,CAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,EAChE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,CAAM,UAAA,KAAe,GAAA,EAAK;AAC9D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,MAAM,YAAA,CAAkC;AAAA,EAC5B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,OAAA,EAIT;AACD,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAA8C;AACnE,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,YAAY,cAAA,EAAe;AACxD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,QAAQ,CAAA;AAE3D,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU,GAAI,eAAe,SAAA,EAAW;AAAA,MAC1D,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA;AAAA,MAC/B,GAAG,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MACvC;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG;AAC9C,KACF;AAEA,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,OAAO;AAAA,QACL,MAAM,KAAK,IAAA,EAAK;AAAA,QAChB,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK;AAAA,OACtC;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,aAAA,CAAc,YAAA,CAAa,IAAI,CAAA;AAAA,EAC7C;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"FetchComponent.esm.js","sources":["../../../src/components/FetchComponent/FetchComponent.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n CodeSnippet,\n ErrorPanel,\n Link,\n MarkdownContent,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { readmeApiRef } from '../../api/ReadmeApi';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { getEntitySourceLocation } from '@backstage/catalog-model';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { ResponseError } from '@backstage/errors';\n\nexport const FetchComponent = () => {\n const { entity } = useEntity();\n const readmeApi = useApi(readmeApiRef);\n let location;\n\n try {\n const { target } = getEntitySourceLocation(entity);\n location = target ?? target;\n } catch (err) {\n location = ': Unknown';\n }\n\n const {\n value: content,\n loading,\n error,\n } = useAsync(\n async (): Promise<string[]> =>\n await readmeApi.getReadmeContent(stringifyEntityRef(entity)),\n [entity],\n );\n\n if (loading) {\n return <Progress />;\n }\n\n if (error instanceof ResponseError) {\n if (error.statusCode === 404) {\n return (\n <Box>\n <Typography pb={2} variant=\"body2\">\n No README.md file found at source location:{' '}\n {location && <strong>{location}</strong>}\n </Typography>\n <Typography variant=\"body2\">\n Need help? Go to our{' '}\n <Link to=\"https://github.com/AxisCommunications/backstage-plugins/blob/main/plugins/readme/README.md\">\n documentation\n </Link>\n </Typography>\n </Box>\n );\n }\n return <ResponseErrorPanel error={error} />;\n }\n\n if (error) {\n return <ErrorPanel error={error} />;\n }\n if (!content) {\n return <ErrorPanel error={Error('Unknown error')} />;\n }\n if (!content[1] || content[1] === 'error') {\n return <ErrorPanel error={Error(content[1] ?? 'Unknown error')} />;\n } else if (content[1].startsWith('text/markdown')) {\n return <MarkdownContent content={content[0]} />;\n }\n // probably text/plain\n return (\n <div data-testid=\"readme-content\">\n <CodeSnippet text={content[0]} language=\"plaintext\" />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAkBO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAI,IAAA,QAAA;AAEJ,EAAI,IAAA;AACF,IAAA,MAAM,EAAE,MAAA,EAAW,GAAA,uBAAA,CAAwB,MAAM,CAAA;AACjD,IAAA,QAAA,GAAW,MAAU,IAAA,MAAA;AAAA,WACd,GAAK,EAAA;AACZ,IAAW,QAAA,GAAA,WAAA;AAAA;AAGb,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,OAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACE,GAAA,QAAA;AAAA,IACF,YACE,MAAM,SAAA,CAAU,gBAAiB,CAAA,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,IAC7D,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAGnB,EAAA,IAAI,iBAAiB,aAAe,EAAA;AAClC,IAAI,IAAA,KAAA,CAAM,eAAe,GAAK,EAAA;AAC5B,MAAA,4BACG,GACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAI,CAAG,EAAA,OAAA,EAAQ,OAAQ,EAAA,QAAA,EAAA;AAAA,UAAA,6CAAA;AAAA,UACW,GAAA;AAAA,UAC3C,QAAA,oBAAa,GAAA,CAAA,QAAA,EAAA,EAAQ,QAAS,EAAA,QAAA,EAAA;AAAA,SACjC,EAAA,CAAA;AAAA,wBACA,IAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,QAAA,EAAA;AAAA,UAAA,sBAAA;AAAA,UACL,GAAA;AAAA,0BACpB,GAAA,CAAA,IAAA,EAAA,EAAK,EAAG,EAAA,4FAAA,EAA6F,QAEtG,EAAA,eAAA,EAAA;AAAA,SACF,EAAA;AAAA,OACF,EAAA,CAAA;AAAA;AAGJ,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,cAAW,KAAc,EAAA,CAAA;AAAA;AAEnC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,uBAAQ,GAAA,CAAA,UAAA,EAAA,EAAW,KAAO,EAAA,KAAA,CAAM,eAAe,CAAG,EAAA,CAAA;AAAA;AAEpD,EAAA,IAAI,CAAC,OAAQ,CAAA,CAAC,KAAK,OAAQ,CAAA,CAAC,MAAM,OAAS,EAAA;AACzC,IAAO,uBAAA,GAAA,CAAC,cAAW,KAAO,EAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,eAAe,CAAG,EAAA,CAAA;AAAA,aACvD,OAAQ,CAAA,CAAC,CAAE,CAAA,UAAA,CAAW,eAAe,CAAG,EAAA;AACjD,IAAA,uBAAQ,GAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,OAAA,CAAQ,CAAC,CAAG,EAAA,CAAA;AAAA;AAG/C,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAI,aAAY,EAAA,gBAAA,EACf,QAAC,kBAAA,GAAA,CAAA,WAAA,EAAA,EAAY,IAAM,EAAA,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAS,EAAA,WAAA,EAAY,CACtD,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"FetchComponent.esm.js","sources":["../../../src/components/FetchComponent/FetchComponent.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n CodeSnippet,\n ErrorPanel,\n Link,\n MarkdownContent,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { readmeApiRef } from '../../api/ReadmeApi';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { getEntitySourceLocation } from '@backstage/catalog-model';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { ResponseError } from '@backstage/errors';\n\nexport const FetchComponent = () => {\n const { entity } = useEntity();\n const readmeApi = useApi(readmeApiRef);\n let location;\n\n try {\n const { target } = getEntitySourceLocation(entity);\n location = target ?? target;\n } catch (err) {\n location = ': Unknown';\n }\n\n const {\n value: content,\n loading,\n error,\n } = useAsync(\n async (): Promise<string[]> =>\n await readmeApi.getReadmeContent(stringifyEntityRef(entity)),\n [entity],\n );\n\n if (loading) {\n return <Progress />;\n }\n\n if (error instanceof ResponseError) {\n if (error.statusCode === 404) {\n return (\n <Box>\n <Typography pb={2} variant=\"body2\">\n No README.md file found at source location:{' '}\n {location && <strong>{location}</strong>}\n </Typography>\n <Typography variant=\"body2\">\n Need help? Go to our{' '}\n <Link to=\"https://github.com/AxisCommunications/backstage-plugins/blob/main/plugins/readme/README.md\">\n documentation\n </Link>\n </Typography>\n </Box>\n );\n }\n return <ResponseErrorPanel error={error} />;\n }\n\n if (error) {\n return <ErrorPanel error={error} />;\n }\n if (!content) {\n return <ErrorPanel error={Error('Unknown error')} />;\n }\n if (!content[1] || content[1] === 'error') {\n return <ErrorPanel error={Error(content[1] ?? 'Unknown error')} />;\n } else if (content[1].startsWith('text/markdown')) {\n return <MarkdownContent content={content[0]} />;\n }\n // probably text/plain\n return (\n <div data-testid=\"readme-content\">\n <CodeSnippet text={content[0]} language=\"plaintext\" />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAkBO,MAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,uBAAA,CAAwB,MAAM,CAAA;AACjD,IAAA,QAAA,GAAW,MAAA,IAAU,MAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,QAAA,GAAW,WAAA;AAAA,EACb;AAEA,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,OAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,QAAA;AAAA,IACF,YACE,MAAM,SAAA,CAAU,gBAAA,CAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,IAC7D,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,IAAA,IAAI,KAAA,CAAM,eAAe,GAAA,EAAK;AAC5B,MAAA,4BACG,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,UAAA,EAAA,EAAW,EAAA,EAAI,CAAA,EAAG,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,UAAA,6CAAA;AAAA,UACW,GAAA;AAAA,UAC3C,QAAA,oBAAY,GAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,QAAA,EAAS;AAAA,SAAA,EACjC,CAAA;AAAA,wBACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,UAAA,sBAAA;AAAA,UACL,GAAA;AAAA,0BACrB,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,4FAAA,EAA6F,QAAA,EAAA,eAAA,EAEtG;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AACA,IAAA,uBAAO,GAAA,CAAC,sBAAmB,KAAA,EAAc,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO,GAAA,CAAC,cAAW,KAAA,EAAc,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,CAAM,eAAe,CAAA,EAAG,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,CAAC,KAAK,OAAA,CAAQ,CAAC,MAAM,OAAA,EAAS;AACzC,IAAA,uBAAO,GAAA,CAAC,cAAW,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,eAAe,CAAA,EAAG,CAAA;AAAA,EAClE,WAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAA,CAAW,eAAe,CAAA,EAAG;AACjD,IAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,gBAAA,EACf,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAA,EAAS,WAAA,EAAY,CAAA,EACtD,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReadmeCard.esm.js","sources":["../../../src/components/ReadmeCard/ReadmeCard.tsx"],"sourcesContent":["import IconButton from '@mui/material/IconButton';\nimport Box from '@mui/material/Box';\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport { InfoCard, InfoCardVariants } from '@backstage/core-components';\nimport { FetchComponent } from '../FetchComponent';\nimport { ReadmeDialog } from '../ReadmeDialog/ReadmeDialog';\nimport { useFullViewParam } from '../../hooks/useFullViewParam';\n\n/**\n * ReadmeCardProps props.\n *\n * @public\n */\nexport type ReadmeCardProps = {\n variant?: InfoCardVariants;\n maxHeight?: string | number;\n};\n\nexport const ReadmeCard = (props: ReadmeCardProps) => {\n const { variant = 'gridItem', maxHeight: propMaxHeight } = props;\n const [isFullViewOpen, setIsFullViewOpen] = useFullViewParam();\n\n const maxHeight =\n variant === 'fullHeight' ? 'none' : propMaxHeight ?? '235px';\n\n return (\n <>\n <InfoCard\n title=\"README\"\n variant={variant}\n action={\n variant !== 'fullHeight' ? (\n <IconButton\n onClick={() => setIsFullViewOpen(true)}\n aria-label=\"Open full view\"\n title=\"Open full view\"\n size=\"large\"\n >\n <FullscreenIcon />\n </IconButton>\n ) : undefined\n }\n >\n <div style={{ overflow: 'auto' }}>\n <Box maxHeight={maxHeight}>\n <FetchComponent />\n </Box>\n </div>\n </InfoCard>\n\n <ReadmeDialog\n open={isFullViewOpen}\n onClose={() => setIsFullViewOpen(false)}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAkBa,MAAA,UAAA,GAAa,CAAC,KAA2B,KAAA;AACpD,EAAA,MAAM,EAAE,OAAA,GAAU,UAAY,EAAA,SAAA,EAAW,eAAkB,GAAA,KAAA;AAC3D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,gBAAiB,EAAA;AAE7D,EAAA,MAAM,SACJ,GAAA,OAAA,KAAY,YAAe,GAAA,MAAA,GAAS,aAAiB,IAAA,OAAA;AAEvD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,QAAA;AAAA,QACN,OAAA;AAAA,QACA,MAAA,EACE,YAAY,YACV,mBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,YACrC,YAAW,EAAA,gBAAA;AAAA,YACX,KAAM,EAAA,gBAAA;AAAA,YACN,IAAK,EAAA,OAAA;AAAA,YAEL,8BAAC,cAAe,EAAA,EAAA;AAAA;AAAA,SAEhB,GAAA,MAAA;AAAA,QAGN,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,EAAE,QAAU,EAAA,MAAA,EACtB,EAAA,QAAA,kBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,SAAA,EACH,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA,EAAe,GAClB,CACF,EAAA;AAAA;AAAA,KACF;AAAA,oBAEA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,cAAA;AAAA,QACN,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK;AAAA;AAAA;AACxC,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ReadmeCard.esm.js","sources":["../../../src/components/ReadmeCard/ReadmeCard.tsx"],"sourcesContent":["import IconButton from '@mui/material/IconButton';\nimport Box from '@mui/material/Box';\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport { InfoCard, InfoCardVariants } from '@backstage/core-components';\nimport { FetchComponent } from '../FetchComponent';\nimport { ReadmeDialog } from '../ReadmeDialog/ReadmeDialog';\nimport { useFullViewParam } from '../../hooks/useFullViewParam';\n\n/**\n * ReadmeCardProps props.\n *\n * @public\n */\nexport type ReadmeCardProps = {\n variant?: InfoCardVariants;\n maxHeight?: string | number;\n};\n\nexport const ReadmeCard = (props: ReadmeCardProps) => {\n const { variant = 'gridItem', maxHeight: propMaxHeight } = props;\n const [isFullViewOpen, setIsFullViewOpen] = useFullViewParam();\n\n const maxHeight =\n variant === 'fullHeight' ? 'none' : propMaxHeight ?? '235px';\n\n return (\n <>\n <InfoCard\n title=\"README\"\n variant={variant}\n action={\n variant !== 'fullHeight' ? (\n <IconButton\n onClick={() => setIsFullViewOpen(true)}\n aria-label=\"Open full view\"\n title=\"Open full view\"\n size=\"large\"\n >\n <FullscreenIcon />\n </IconButton>\n ) : undefined\n }\n >\n <div style={{ overflow: 'auto' }}>\n <Box maxHeight={maxHeight}>\n <FetchComponent />\n </Box>\n </div>\n </InfoCard>\n\n <ReadmeDialog\n open={isFullViewOpen}\n onClose={() => setIsFullViewOpen(false)}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAkBO,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AACpD,EAAA,MAAM,EAAE,OAAA,GAAU,UAAA,EAAY,SAAA,EAAW,eAAc,GAAI,KAAA;AAC3D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,gBAAA,EAAiB;AAE7D,EAAA,MAAM,SAAA,GACJ,OAAA,KAAY,YAAA,GAAe,MAAA,GAAS,aAAA,IAAiB,OAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,QAAA;AAAA,QACN,OAAA;AAAA,QACA,MAAA,EACE,YAAY,YAAA,mBACV,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,YACrC,YAAA,EAAW,gBAAA;AAAA,YACX,KAAA,EAAM,gBAAA;AAAA,YACN,IAAA,EAAK,OAAA;AAAA,YAEL,8BAAC,cAAA,EAAA,EAAe;AAAA;AAAA,SAClB,GACE,MAAA;AAAA,QAGN,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAO,EAC7B,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,GAClB,CAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAEA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK;AAAA;AAAA;AACxC,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,2 +1,6 @@
1
- export { ReadmeCard } from './ReadmeCard.esm.js';
1
+ import { ReadmeCard } from './ReadmeCard.esm.js';
2
+
3
+
4
+
5
+ export { ReadmeCard };
2
6
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReadmeDialog.esm.js","sources":["../../../src/components/ReadmeDialog/ReadmeDialog.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Box from '@mui/material/Box';\nimport { FetchComponent } from '../FetchComponent';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nexport const ReadmeDialog = ({ open, onClose }: Props) => {\n return (\n <Dialog\n maxWidth=\"md\"\n open={open}\n onClose={onClose}\n data-testid=\"content-dialog\"\n >\n <DialogTitle>README</DialogTitle>\n <DialogContent dividers>\n <Box minWidth={650}>\n <FetchComponent />\n </Box>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n aria-label=\"close\"\n onClick={onClose}\n >\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAaO,MAAM,YAAe,GAAA,CAAC,EAAE,IAAA,EAAM,SAAqB,KAAA;AACxD,EACE,uBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAY,EAAA,gBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAY,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,wBACnB,GAAA,CAAC,aAAc,EAAA,EAAA,QAAA,EAAQ,IACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,QAAA,EAAU,GACb,EAAA,QAAA,kBAAA,GAAA,CAAC,cAAe,EAAA,EAAA,CAAA,EAClB,CACF,EAAA,CAAA;AAAA,4BACC,aACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAQ,EAAA,WAAA;AAAA,YACR,KAAM,EAAA,SAAA;AAAA,YACN,YAAW,EAAA,OAAA;AAAA,YACX,OAAS,EAAA,OAAA;AAAA,YACV,QAAA,EAAA;AAAA;AAAA,SAGH,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"ReadmeDialog.esm.js","sources":["../../../src/components/ReadmeDialog/ReadmeDialog.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Box from '@mui/material/Box';\nimport { FetchComponent } from '../FetchComponent';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nexport const ReadmeDialog = ({ open, onClose }: Props) => {\n return (\n <Dialog\n maxWidth=\"md\"\n open={open}\n onClose={onClose}\n data-testid=\"content-dialog\"\n >\n <DialogTitle>README</DialogTitle>\n <DialogContent dividers>\n <Box minWidth={650}>\n <FetchComponent />\n </Box>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n aria-label=\"close\"\n onClick={onClose}\n >\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAaO,MAAM,YAAA,GAAe,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AACxD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAY,gBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAY,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,wBACnB,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAQ,IAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,QAAA,EAAU,GAAA,EACb,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EAClB,CAAA,EACF,CAAA;AAAA,4BACC,aAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAM,SAAA;AAAA,YACN,YAAA,EAAW,OAAA;AAAA,YACX,OAAA,EAAS,OAAA;AAAA,YACV,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFullViewParam.esm.js","sources":["../../src/hooks/useFullViewParam.ts"],"sourcesContent":["import { useLocation, useNavigate } from 'react-router-dom';\nimport { useMemo } from 'react';\n\nexport const useFullViewParam = (): [boolean, (open: boolean) => void] => {\n const location = useLocation();\n const navigate = useNavigate();\n\n const isFullView = useMemo(() => {\n const params = new URLSearchParams(location.search);\n return params.get('fullView') === 'true';\n }, [location.search]);\n\n const setFullView = (open: boolean) => {\n const params = new URLSearchParams(location.search);\n if (open) {\n params.set('fullView', 'true');\n } else {\n params.delete('fullView');\n }\n navigate({ search: params.toString() }, { replace: true });\n };\n\n return [isFullView, setFullView];\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,mBAAmB,MAA0C;AACxE,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,WAAW,WAAY,EAAA;AAE7B,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA;AAClD,IAAO,OAAA,MAAA,CAAO,GAAI,CAAA,UAAU,CAAM,KAAA,MAAA;AAAA,GACjC,EAAA,CAAC,QAAS,CAAA,MAAM,CAAC,CAAA;AAEpB,EAAM,MAAA,WAAA,GAAc,CAAC,IAAkB,KAAA;AACrC,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA;AAClD,IAAA,IAAI,IAAM,EAAA;AACR,MAAO,MAAA,CAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AAAA,KACxB,MAAA;AACL,MAAA,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA;AAE1B,IAAS,QAAA,CAAA,EAAE,QAAQ,MAAO,CAAA,QAAA,IAAc,EAAA,EAAE,OAAS,EAAA,IAAA,EAAM,CAAA;AAAA,GAC3D;AAEA,EAAO,OAAA,CAAC,YAAY,WAAW,CAAA;AACjC;;;;"}
1
+ {"version":3,"file":"useFullViewParam.esm.js","sources":["../../src/hooks/useFullViewParam.ts"],"sourcesContent":["import { useLocation, useNavigate } from 'react-router-dom';\nimport { useMemo } from 'react';\n\nexport const useFullViewParam = (): [boolean, (open: boolean) => void] => {\n const location = useLocation();\n const navigate = useNavigate();\n\n const isFullView = useMemo(() => {\n const params = new URLSearchParams(location.search);\n return params.get('fullView') === 'true';\n }, [location.search]);\n\n const setFullView = (open: boolean) => {\n const params = new URLSearchParams(location.search);\n if (open) {\n params.set('fullView', 'true');\n } else {\n params.delete('fullView');\n }\n navigate({ search: params.toString() }, { replace: true });\n };\n\n return [isFullView, setFullView];\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,mBAAmB,MAA0C;AACxE,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,QAAA,CAAS,MAAM,CAAA;AAClD,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,CAAS,MAAM,CAAC,CAAA;AAEpB,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAkB;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,QAAA,CAAS,MAAM,CAAA;AAClD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,CAAO,GAAA,CAAI,YAAY,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,IAC1B;AACA,IAAA,QAAA,CAAS,EAAE,QAAQ,MAAA,CAAO,QAAA,IAAW,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,OAAO,CAAC,YAAY,WAAW,CAAA;AACjC;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,19 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { InfoCardVariants } from '@backstage/core-components';
3
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
4
3
  import { ApiHolder } from '@backstage/core-plugin-api';
4
+ import { InfoCardVariants } from '@backstage/core-components';
5
5
  import { Entity } from '@backstage/catalog-model';
6
6
 
7
- /**
8
- * ReadmeCardProps props.
9
- *
10
- * @public
11
- */
12
- type ReadmeCardProps = {
13
- variant?: InfoCardVariants;
14
- maxHeight?: string | number;
15
- };
16
-
17
7
  /**
18
8
  * Plugin that provides the Readme api
19
9
  * @public */
@@ -25,6 +15,16 @@ declare const readmePlugin: _backstage_core_plugin_api.BackstagePlugin<{
25
15
  * @public */
26
16
  declare const ReadmeCard: (props: ReadmeCardProps) => react_jsx_runtime.JSX.Element;
27
17
 
18
+ /**
19
+ * ReadmeCardProps props.
20
+ *
21
+ * @public
22
+ */
23
+ type ReadmeCardProps = {
24
+ variant?: InfoCardVariants;
25
+ maxHeight?: string | number;
26
+ };
27
+
28
28
  /**
29
29
  * Checks if a README is available for the given entity by making a request to the backend.
30
30
  If the backend returns a 404 NotFound error, it indicates that no README is available for the entity.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { readmeApiRef } from './api/ReadmeApi';\nimport { ReadmeClient } from './api/ReadmeClient';\n\n/**\n * Plugin that provides the Readme api\n * @public */\nexport const readmePlugin = createPlugin({\n id: 'readme',\n apis: [\n createApiFactory({\n api: readmeApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new ReadmeClient({ discoveryApi, fetchApi, identityApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\n/**\n * Readme card exported from the Readme plugin\n * @public */\nexport const ReadmeCard = readmePlugin.provide(\n createRoutableExtension({\n name: 'ReadmeCard',\n component: () => import('./components/ReadmeCard').then(m => m.ReadmeCard),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAgBO,MAAM,eAAe,YAAa,CAAA;AAAA,EACvC,EAAI,EAAA,QAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,YAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA,WAAA;AAAA,QACV,WAAa,EAAA;AAAA,OACf;AAAA,MACA,OAAS,EAAA,CAAC,EAAE,YAAA,EAAc,QAAU,EAAA,WAAA,EAClC,KAAA,IAAI,YAAa,CAAA,EAAE,YAAc,EAAA,QAAA,EAAU,aAAa;AAAA,KAC3D;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV,CAAC;AAKM,MAAM,aAAa,YAAa,CAAA,OAAA;AAAA,EACrC,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,YAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,sCAAyB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAAA,IACzE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { readmeApiRef } from './api/ReadmeApi';\nimport { ReadmeClient } from './api/ReadmeClient';\n\n/**\n * Plugin that provides the Readme api\n * @public */\nexport const readmePlugin = createPlugin({\n id: 'readme',\n apis: [\n createApiFactory({\n api: readmeApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new ReadmeClient({ discoveryApi, fetchApi, identityApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\n/**\n * Readme card exported from the Readme plugin\n * @public */\nexport const ReadmeCard = readmePlugin.provide(\n createRoutableExtension({\n name: 'ReadmeCard',\n component: () => import('./components/ReadmeCard').then(m => m.ReadmeCard),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAgBO,MAAM,eAAe,YAAA,CAAa;AAAA,EACvC,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,YAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAU,WAAA,EAAY,KAC9C,IAAI,YAAA,CAAa,EAAE,YAAA,EAAc,QAAA,EAAU,aAAa;AAAA,KAC3D;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAKM,MAAM,aAAa,YAAA,CAAa,OAAA;AAAA,EACrC,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,sCAAyB,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAAA,IACzE,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'readme',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'readme',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-backstage/plugin-readme",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/index.esm.js",
@@ -56,14 +56,14 @@
56
56
  "postpack": "backstage-cli package postpack"
57
57
  },
58
58
  "dependencies": {
59
- "@backstage/catalog-model": "^1.7.6",
60
- "@backstage/core-compat-api": "^0.5.5",
61
- "@backstage/core-components": "^0.18.4",
62
- "@backstage/core-plugin-api": "^1.12.1",
63
- "@backstage/errors": "^1.2.7",
64
- "@backstage/frontend-plugin-api": "^0.13.2",
65
- "@backstage/plugin-catalog-react": "^1.21.4",
66
- "@backstage/theme": "^0.7.1",
59
+ "@backstage/catalog-model": "^1.8.0",
60
+ "@backstage/core-compat-api": "^0.5.10",
61
+ "@backstage/core-components": "^0.18.9",
62
+ "@backstage/core-plugin-api": "^1.12.5",
63
+ "@backstage/errors": "^1.3.0",
64
+ "@backstage/frontend-plugin-api": "^0.16.2",
65
+ "@backstage/plugin-catalog-react": "^2.1.4",
66
+ "@backstage/theme": "^0.7.3",
67
67
  "@mui/icons-material": "^5.15.7",
68
68
  "@mui/material": "^5.15.7",
69
69
  "react-use": "^17.2.4"
@@ -75,10 +75,10 @@
75
75
  "react-router-dom": "^6.3.0"
76
76
  },
77
77
  "devDependencies": {
78
- "@backstage/cli": "^0.35.1",
79
- "@backstage/core-app-api": "^1.19.3",
80
- "@backstage/dev-utils": "^1.1.18",
81
- "@backstage/test-utils": "^1.7.14",
78
+ "@backstage/cli": "^0.36.1",
79
+ "@backstage/core-app-api": "^1.20.0",
80
+ "@backstage/dev-utils": "^1.1.22",
81
+ "@backstage/test-utils": "^1.7.17",
82
82
  "@testing-library/dom": "^10.0.0",
83
83
  "@testing-library/jest-dom": "^6.0.0",
84
84
  "@testing-library/react": "^16.0.0",