@rwdocs/backstage-plugin-rw 0.1.4 → 0.1.5

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.
@@ -4,10 +4,9 @@ import { useApi } from '@backstage/core-plugin-api';
4
4
  import { useEntity } from '@backstage/plugin-catalog-react';
5
5
  import { getCompoundEntityRef } from '@backstage/catalog-model';
6
6
  import { ErrorPanel, Progress } from '@backstage/core-components';
7
+ import { toEntityPath, parseAnnotation } from '@rwdocs/backstage-plugin-rw-common';
7
8
  import { rwApiRef } from '../api/RwClient.esm.js';
8
- import { toEntityPath } from './entityPath.esm.js';
9
9
  import { ANNOTATION_KEY } from './constants.esm.js';
10
- import { parseAnnotation } from './parseAnnotation.esm.js';
11
10
  import { RwDocsViewer } from './RwDocsViewer.esm.js';
12
11
 
13
12
  function RwEntityDocsViewer() {
@@ -1 +1 @@
1
- {"version":3,"file":"RwEntityDocsViewer.esm.js","sources":["../../src/components/RwEntityDocsViewer.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport { getCompoundEntityRef } from \"@backstage/catalog-model\";\nimport { ErrorPanel, Progress } from \"@backstage/core-components\";\nimport { rwApiRef } from \"../api/RwClient\";\nimport { toEntityPath } from \"./entityPath\";\nimport { ANNOTATION_KEY } from \"./constants\";\nimport { parseAnnotation } from \"./parseAnnotation\";\nimport { RwDocsViewer } from \"./RwDocsViewer\";\n\nexport function RwEntityDocsViewer() {\n const { entity } = useEntity();\n const rwApi = useApi(rwApiRef);\n const [apiBaseUrl, setApiBaseUrl] = useState<string | null>(null);\n const [fetchError, setFetchError] = useState<Error | null>(null);\n\n const annotationValue = entity.metadata.annotations?.[ANNOTATION_KEY];\n const selfEntityRef = useMemo(() => toEntityPath(getCompoundEntityRef(entity)), [entity]);\n const parsed = parseAnnotation(annotationValue, selfEntityRef);\n\n useEffect(() => {\n if (!parsed) return undefined;\n\n let cancelled = false;\n rwApi\n .getSiteBaseUrl(parsed.entityPath)\n .then((url) => {\n if (!cancelled) setApiBaseUrl(url);\n })\n .catch((err) => {\n if (!cancelled) setFetchError(err);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- parsed is derived from annotationValue+selfEntityRef; using entityPath avoids object-identity churn\n }, [rwApi, parsed?.entityPath]);\n\n if (!parsed) {\n return <ErrorPanel error={new Error(`Entity is missing the \"${ANNOTATION_KEY}\" annotation`)} />;\n }\n\n if (fetchError) {\n return <ErrorPanel error={fetchError} />;\n }\n\n if (!apiBaseUrl) {\n return <Progress />;\n }\n\n const sectionRef = parsed.sectionRef ?? selfEntityRef;\n return (\n <RwDocsViewer\n apiBaseUrl={apiBaseUrl}\n sectionRef={sectionRef}\n sourceEntityRef={parsed.entityRef}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAWO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAM,YAAA,CAAa,oBAAA,CAAqB,MAAM,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACxF,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,eAAA,EAAiB,aAAa,CAAA;AAE7D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CACG,eAAe,MAAA,CAAO,UAAU,CAAA,CAChC,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,GAAG,CAAA;AAAA,IACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,GAAG,CAAA;AAAA,IACnC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE9B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBAAO,GAAA,CAAC,cAAW,KAAA,EAAO,IAAI,MAAM,CAAA,uBAAA,EAA0B,cAAc,cAAc,CAAA,EAAG,CAAA;AAAA,EAC/F;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,aAAA;AACxC,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAiB,MAAA,CAAO;AAAA;AAAA,GAC1B;AAEJ;;;;"}
1
+ {"version":3,"file":"RwEntityDocsViewer.esm.js","sources":["../../src/components/RwEntityDocsViewer.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport { getCompoundEntityRef } from \"@backstage/catalog-model\";\nimport { ErrorPanel, Progress } from \"@backstage/core-components\";\nimport { toEntityPath, parseAnnotation } from \"@rwdocs/backstage-plugin-rw-common\";\nimport { rwApiRef } from \"../api/RwClient\";\nimport { ANNOTATION_KEY } from \"./constants\";\nimport { RwDocsViewer } from \"./RwDocsViewer\";\n\nexport function RwEntityDocsViewer() {\n const { entity } = useEntity();\n const rwApi = useApi(rwApiRef);\n const [apiBaseUrl, setApiBaseUrl] = useState<string | null>(null);\n const [fetchError, setFetchError] = useState<Error | null>(null);\n\n const annotationValue = entity.metadata.annotations?.[ANNOTATION_KEY];\n const selfEntityRef = useMemo(() => toEntityPath(getCompoundEntityRef(entity)), [entity]);\n const parsed = parseAnnotation(annotationValue, selfEntityRef);\n\n useEffect(() => {\n if (!parsed) return undefined;\n\n let cancelled = false;\n rwApi\n .getSiteBaseUrl(parsed.entityPath)\n .then((url) => {\n if (!cancelled) setApiBaseUrl(url);\n })\n .catch((err) => {\n if (!cancelled) setFetchError(err);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- parsed is derived from annotationValue+selfEntityRef; using entityPath avoids object-identity churn\n }, [rwApi, parsed?.entityPath]);\n\n if (!parsed) {\n return <ErrorPanel error={new Error(`Entity is missing the \"${ANNOTATION_KEY}\" annotation`)} />;\n }\n\n if (fetchError) {\n return <ErrorPanel error={fetchError} />;\n }\n\n if (!apiBaseUrl) {\n return <Progress />;\n }\n\n const sectionRef = parsed.sectionRef ?? selfEntityRef;\n return (\n <RwDocsViewer\n apiBaseUrl={apiBaseUrl}\n sectionRef={sectionRef}\n sourceEntityRef={parsed.entityRef}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAUO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAM,YAAA,CAAa,oBAAA,CAAqB,MAAM,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACxF,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,eAAA,EAAiB,aAAa,CAAA;AAE7D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CACG,eAAe,MAAA,CAAO,UAAU,CAAA,CAChC,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,GAAG,CAAA;AAAA,IACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,GAAG,CAAA;AAAA,IACnC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE9B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBAAO,GAAA,CAAC,cAAW,KAAA,EAAO,IAAI,MAAM,CAAA,uBAAA,EAA0B,cAAc,cAAc,CAAA,EAAG,CAAA;AAAA,EAC/F;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,aAAA;AACxC,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAiB,MAAA,CAAO;AAAA;AAAA,GAC1B;AAEJ;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import * as _backstage_plugin_search_react_alpha from '@backstage/plugin-search-react/alpha';
1
2
  import * as _backstage_core_components from '@backstage/core-components';
2
3
  import * as _backstage_catalog_model from '@backstage/catalog-model';
3
4
  import * as react from 'react';
@@ -81,6 +82,19 @@ declare const rwPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlugin
81
82
  filter?: _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
82
83
  };
83
84
  }>;
85
+ "search-filter-result-type:rw": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
86
+ kind: "search-filter-result-type";
87
+ name: undefined;
88
+ config: {};
89
+ configInput: {};
90
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<{
91
+ value: string;
92
+ name: string;
93
+ icon: react.JSX.Element;
94
+ }, "search.filters.result-types.type", {}>;
95
+ inputs: {};
96
+ params: _backstage_plugin_search_react_alpha.SearchFilterResultTypeBlueprintParams;
97
+ }>;
84
98
  }>;
85
99
 
86
100
  interface RwApi {
@@ -2,6 +2,8 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { ApiBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
3
  import { createApiFactory, fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api';
4
4
  import { EntityContentBlueprint, EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';
5
+ import { SearchFilterResultTypeBlueprint } from '@backstage/plugin-search-react/alpha';
6
+ import DocsIcon from '@material-ui/icons/Description';
5
7
  import { RwClient, rwApiRef } from './api/RwClient.esm.js';
6
8
  import { ANNOTATION_KEY } from './components/constants.esm.js';
7
9
  import { useRwDocsIconLinkProps } from './hooks/useRwDocsIconLinkProps.esm.js';
@@ -31,9 +33,16 @@ const rwEntityIconLink = EntityIconLinkBlueprint.make({
31
33
  useProps: useRwDocsIconLinkProps
32
34
  }
33
35
  });
36
+ const rwSearchResultType = SearchFilterResultTypeBlueprint.make({
37
+ params: {
38
+ value: "rw",
39
+ name: "Documentation",
40
+ icon: /* @__PURE__ */ jsx(DocsIcon, {})
41
+ }
42
+ });
34
43
  const rwPlugin = createFrontendPlugin({
35
44
  pluginId: "rw",
36
- extensions: [rwApi, rwEntityContent, rwEntityIconLink]
45
+ extensions: [rwApi, rwEntityContent, rwEntityIconLink, rwSearchResultType]
37
46
  });
38
47
 
39
48
  export { rwPlugin };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import { createFrontendPlugin, ApiBlueprint } from \"@backstage/frontend-plugin-api\";\nimport { createApiFactory, discoveryApiRef, fetchApiRef } from \"@backstage/core-plugin-api\";\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from \"@backstage/plugin-catalog-react/alpha\";\nimport { rwApiRef, RwClient } from \"./api/RwClient\";\nimport { ANNOTATION_KEY } from \"./components/constants\";\nimport { useRwDocsIconLinkProps } from \"./hooks/useRwDocsIconLinkProps\";\n\nconst rwApi = ApiBlueprint.make({\n params: (defineParams) =>\n defineParams(\n createApiFactory({\n api: rwApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) => new RwClient({ discoveryApi, fetchApi }),\n }),\n ),\n});\n\nconst rwEntityContent = EntityContentBlueprint.make({\n params: {\n path: \"docs\",\n title: \"Docs\",\n group: \"documentation\",\n filter: (entity) => Boolean(entity.metadata.annotations?.[ANNOTATION_KEY]),\n loader: () => import(\"./components/RwEntityDocsViewer\").then((m) => <m.RwEntityDocsViewer />),\n },\n});\n\nconst rwEntityIconLink = EntityIconLinkBlueprint.make({\n name: \"view-docs\",\n params: {\n filter: (entity) => Boolean(entity.metadata.annotations?.[ANNOTATION_KEY]),\n useProps: useRwDocsIconLinkProps,\n },\n});\n\nexport const rwPlugin = createFrontendPlugin({\n pluginId: \"rw\",\n extensions: [rwApi, rwEntityContent, rwEntityIconLink],\n});\n\nexport default rwPlugin;\n"],"names":[],"mappings":";;;;;;;;AAUA,MAAM,KAAA,GAAQ,aAAa,IAAA,CAAK;AAAA,EAC9B,MAAA,EAAQ,CAAC,YAAA,KACP,YAAA;AAAA,IACE,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,UAAU,WAAA,EAAY;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KAAM,IAAI,QAAA,CAAS,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,KACjF;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,eAAA,GAAkB,uBAAuB,IAAA,CAAK;AAAA,EAClD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,KAAW,OAAA,CAAQ,OAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAC,CAAA;AAAA,IACzE,MAAA,EAAQ,MAAM,OAAO,wCAAiC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,qBAAM,GAAA,CAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CAAE;AAAA;AAEhG,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,CAAK;AAAA,EACpD,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,CAAC,MAAA,KAAW,OAAA,CAAQ,OAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAC,CAAA;AAAA,IACzE,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAEM,MAAM,WAAW,oBAAA,CAAqB;AAAA,EAC3C,QAAA,EAAU,IAAA;AAAA,EACV,UAAA,EAAY,CAAC,KAAA,EAAO,eAAA,EAAiB,gBAAgB;AACvD,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import { createFrontendPlugin, ApiBlueprint } from \"@backstage/frontend-plugin-api\";\nimport { createApiFactory, discoveryApiRef, fetchApiRef } from \"@backstage/core-plugin-api\";\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from \"@backstage/plugin-catalog-react/alpha\";\nimport { SearchFilterResultTypeBlueprint } from \"@backstage/plugin-search-react/alpha\";\nimport DocsIcon from \"@material-ui/icons/Description\";\nimport { rwApiRef, RwClient } from \"./api/RwClient\";\nimport { ANNOTATION_KEY } from \"./components/constants\";\nimport { useRwDocsIconLinkProps } from \"./hooks/useRwDocsIconLinkProps\";\n\nconst rwApi = ApiBlueprint.make({\n params: (defineParams) =>\n defineParams(\n createApiFactory({\n api: rwApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) => new RwClient({ discoveryApi, fetchApi }),\n }),\n ),\n});\n\nconst rwEntityContent = EntityContentBlueprint.make({\n params: {\n path: \"docs\",\n title: \"Docs\",\n group: \"documentation\",\n filter: (entity) => Boolean(entity.metadata.annotations?.[ANNOTATION_KEY]),\n loader: () => import(\"./components/RwEntityDocsViewer\").then((m) => <m.RwEntityDocsViewer />),\n },\n});\n\nconst rwEntityIconLink = EntityIconLinkBlueprint.make({\n name: \"view-docs\",\n params: {\n filter: (entity) => Boolean(entity.metadata.annotations?.[ANNOTATION_KEY]),\n useProps: useRwDocsIconLinkProps,\n },\n});\n\nconst rwSearchResultType = SearchFilterResultTypeBlueprint.make({\n params: {\n value: \"rw\",\n name: \"Documentation\",\n icon: <DocsIcon />,\n },\n});\n\nexport const rwPlugin = createFrontendPlugin({\n pluginId: \"rw\",\n extensions: [rwApi, rwEntityContent, rwEntityIconLink, rwSearchResultType],\n});\n\nexport default rwPlugin;\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,KAAA,GAAQ,aAAa,IAAA,CAAK;AAAA,EAC9B,MAAA,EAAQ,CAAC,YAAA,KACP,YAAA;AAAA,IACE,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,UAAU,WAAA,EAAY;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KAAM,IAAI,QAAA,CAAS,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,KACjF;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,eAAA,GAAkB,uBAAuB,IAAA,CAAK;AAAA,EAClD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,KAAW,OAAA,CAAQ,OAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAC,CAAA;AAAA,IACzE,MAAA,EAAQ,MAAM,OAAO,wCAAiC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,qBAAM,GAAA,CAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CAAE;AAAA;AAEhG,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,CAAK;AAAA,EACpD,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,CAAC,MAAA,KAAW,OAAA,CAAQ,OAAO,QAAA,CAAS,WAAA,GAAc,cAAc,CAAC,CAAA;AAAA,IACzE,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAED,MAAM,kBAAA,GAAqB,gCAAgC,IAAA,CAAK;AAAA,EAC9D,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,sBAAO,QAAA,EAAA,EAAS;AAAA;AAEpB,CAAC,CAAA;AAEM,MAAM,WAAW,oBAAA,CAAqB;AAAA,EAC3C,QAAA,EAAU,IAAA;AAAA,EACV,UAAA,EAAY,CAAC,KAAA,EAAO,eAAA,EAAiB,kBAAkB,kBAAkB;AAC3E,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rwdocs/backstage-plugin-rw",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "license": "MIT OR Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,15 +29,14 @@
29
29
  "pluginId": "rw",
30
30
  "pluginPackages": [
31
31
  "@rwdocs/backstage-plugin-rw",
32
- "@rwdocs/backstage-plugin-rw-backend"
32
+ "@rwdocs/backstage-plugin-rw-backend",
33
+ "@rwdocs/backstage-plugin-rw-common"
33
34
  ],
34
35
  "features": {
35
36
  ".": "@backstage/FrontendPlugin"
36
37
  }
37
38
  },
38
- "configSchema": "config.d.ts",
39
39
  "files": [
40
- "config.d.ts",
41
40
  "dist",
42
41
  "LICENSE-MIT",
43
42
  "LICENSE-APACHE"
@@ -56,13 +55,15 @@
56
55
  "dependencies": {
57
56
  "@backstage/catalog-model": "^1.7.6",
58
57
  "@material-ui/icons": "^4.11.3",
59
- "@rwdocs/viewer": "^0.1.21"
58
+ "@rwdocs/backstage-plugin-rw-common": "^0.1.5",
59
+ "@rwdocs/viewer": "^0.1.23"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "@backstage/core-components": "^0.18.0",
63
63
  "@backstage/core-plugin-api": "^1.0.0",
64
64
  "@backstage/frontend-plugin-api": "^0.14.0 || ^0.15.0",
65
65
  "@backstage/plugin-catalog-react": "^2.0.0",
66
+ "@backstage/plugin-search-react": "^1.11.0",
66
67
  "@material-ui/core": "^4.12.2",
67
68
  "react": "^18.0.0",
68
69
  "react-dom": "^18.0.0",
@@ -80,6 +81,7 @@
80
81
  "@backstage/core-plugin-api": "^1.0.0",
81
82
  "@backstage/frontend-plugin-api": "^0.15.0",
82
83
  "@backstage/plugin-catalog-react": "^2.0.0",
84
+ "@backstage/plugin-search-react": "^1.11.0",
83
85
  "@backstage/test-utils": "^1.7.0",
84
86
  "@testing-library/dom": "^10.0.0",
85
87
  "@testing-library/jest-dom": "^6.0.0",
package/config.d.ts DELETED
@@ -1 +0,0 @@
1
- export interface Config {}
@@ -1,10 +0,0 @@
1
- import { parseEntityRef } from '@backstage/catalog-model';
2
-
3
- function toEntityPath(ref) {
4
- const parsed = typeof ref === "string" ? parseEntityRef(ref) : ref;
5
- const ns = parsed.namespace ?? "default";
6
- return `${ns}/${parsed.kind}/${parsed.name}`.toLocaleLowerCase("en-US");
7
- }
8
-
9
- export { toEntityPath };
10
- //# sourceMappingURL=entityPath.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entityPath.esm.js","sources":["../../src/components/entityPath.ts"],"sourcesContent":["import { parseEntityRef } from \"@backstage/catalog-model\";\n\n/**\n * Converts an entity ref (e.g. \"component:default/arch\") or a compound ref\n * object to the slash-delimited, lowercased path used in API URLs\n * (e.g. \"default/component/arch\").\n *\n * Uses namespace/kind/name ordering to match Backstage catalog URL convention.\n *\n * NOTE: The backend plugin has a similar utility at\n * plugins/rw-backend/src/entityPath.ts — keep in sync if changing logic.\n */\nexport function toEntityPath(\n ref: string | { kind: string; namespace?: string; name: string },\n): string {\n const parsed = typeof ref === \"string\" ? parseEntityRef(ref) : ref;\n const ns = parsed.namespace ?? \"default\";\n return `${ns}/${parsed.kind}/${parsed.name}`.toLocaleLowerCase(\"en-US\");\n}\n"],"names":[],"mappings":";;AAYO,SAAS,aACd,GAAA,EACQ;AACR,EAAA,MAAM,SAAS,OAAO,GAAA,KAAQ,QAAA,GAAW,cAAA,CAAe,GAAG,CAAA,GAAI,GAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,OAAO,SAAA,IAAa,SAAA;AAC/B,EAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,iBAAA,CAAkB,OAAO,CAAA;AACxE;;;;"}
@@ -1,35 +0,0 @@
1
- import { stringifyEntityRef, parseEntityRef } from '@backstage/catalog-model';
2
- import { toEntityPath } from './entityPath.esm.js';
3
-
4
- function parseAnnotation(value, selfEntityRef) {
5
- if (!value) return void 0;
6
- const hashIndex = value.indexOf("#");
7
- let entity;
8
- let sectionRef;
9
- if (hashIndex === -1) {
10
- entity = value;
11
- sectionRef = void 0;
12
- } else {
13
- entity = value.slice(0, hashIndex);
14
- sectionRef = value.slice(hashIndex + 1) || void 0;
15
- }
16
- if (entity === ".") {
17
- return { entityPath: selfEntityRef, entityRef: fromEntityPath(selfEntityRef), sectionRef };
18
- }
19
- try {
20
- return {
21
- entityPath: toEntityPath(entity),
22
- entityRef: stringifyEntityRef(parseEntityRef(entity)),
23
- sectionRef
24
- };
25
- } catch {
26
- return void 0;
27
- }
28
- }
29
- function fromEntityPath(path) {
30
- const [namespace, kind, name] = path.split("/");
31
- return stringifyEntityRef({ kind, namespace, name });
32
- }
33
-
34
- export { parseAnnotation };
35
- //# sourceMappingURL=parseAnnotation.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseAnnotation.esm.js","sources":["../../src/components/parseAnnotation.ts"],"sourcesContent":["import { parseEntityRef, stringifyEntityRef } from \"@backstage/catalog-model\";\nimport { toEntityPath } from \"./entityPath\";\n\nexport interface ParsedAnnotation {\n /** Slash-delimited path for API URLs (e.g. \"default/component/arch\"). */\n entityPath: string;\n /** Standard Backstage entity ref (e.g. \"component:default/arch\"). */\n entityRef: string;\n sectionRef: string | undefined;\n}\n\nexport function parseAnnotation(\n value: string | undefined,\n selfEntityRef: string,\n): ParsedAnnotation | undefined {\n if (!value) return undefined;\n\n const hashIndex = value.indexOf(\"#\");\n let entity: string;\n let sectionRef: string | undefined;\n\n if (hashIndex === -1) {\n entity = value;\n sectionRef = undefined;\n } else {\n entity = value.slice(0, hashIndex);\n sectionRef = value.slice(hashIndex + 1) || undefined;\n }\n\n if (entity === \".\") {\n return { entityPath: selfEntityRef, entityRef: fromEntityPath(selfEntityRef), sectionRef };\n }\n\n try {\n return {\n entityPath: toEntityPath(entity),\n entityRef: stringifyEntityRef(parseEntityRef(entity)),\n sectionRef,\n };\n } catch {\n return undefined;\n }\n}\n\n/** Convert slash-delimited path (namespace/kind/name) back to colon-format entity ref. */\nfunction fromEntityPath(path: string): string {\n const [namespace, kind, name] = path.split(\"/\");\n return stringifyEntityRef({ kind, namespace, name });\n}\n"],"names":[],"mappings":";;;AAWO,SAAS,eAAA,CACd,OACA,aAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACnC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,UAAA,GAAa,MAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACjC,IAAA,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,MAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,EAAE,UAAA,EAAY,aAAA,EAAe,WAAW,cAAA,CAAe,aAAa,GAAG,UAAA,EAAW;AAAA,EAC3F;AAEA,EAAA,IAAI;AACF,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,aAAa,MAAM,CAAA;AAAA,MAC/B,SAAA,EAAW,kBAAA,CAAmB,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAGA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC9C,EAAA,OAAO,kBAAA,CAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,CAAA;AACrD;;;;"}