@backstage/plugin-techdocs 0.0.0-nightly-20260710031816 → 0.0.0-nightly-20260712031654

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,27 +1,30 @@
1
1
  # @backstage/plugin-techdocs
2
2
 
3
- ## 0.0.0-nightly-20260710031816
3
+ ## 0.0.0-nightly-20260712031654
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 34bda9e: chore(deps): bump `dompurify` from 3.4.5 to 3.4.9
8
+ - f2aa036: chore(deps): bump `dompurify` from 3.4.9 to 3.4.11
7
9
  - b8db4fe: The TechDocs plugin now adds the Documentation result type to the Search page when it is installed.
8
10
  - 65c7f98: Fixed duplicate React key warnings when documentation entities share a name across different namespaces or kinds.
9
- - Updated dependencies
10
- - @backstage/frontend-plugin-api@0.0.0-nightly-20260710031816
11
- - @backstage/ui@0.0.0-nightly-20260710031816
12
- - @backstage/plugin-catalog-react@0.0.0-nightly-20260710031816
13
- - @backstage/core-components@0.0.0-nightly-20260710031816
14
- - @backstage/plugin-techdocs-react@0.0.0-nightly-20260710031816
15
- - @backstage/core-plugin-api@0.0.0-nightly-20260710031816
16
- - @backstage/plugin-search-react@0.0.0-nightly-20260710031816
11
+ - 9459c14: Fixed TechDocs pages sometimes rendering blank due to sanitizer hooks registered by other plugins.
12
+ - Updated dependencies
13
+ - @backstage/frontend-plugin-api@0.0.0-nightly-20260712031654
14
+ - @backstage/ui@0.0.0-nightly-20260712031654
15
+ - @backstage/plugin-catalog-react@0.0.0-nightly-20260712031654
16
+ - @backstage/core-components@0.0.0-nightly-20260712031654
17
+ - @backstage/plugin-techdocs-react@0.0.0-nightly-20260712031654
18
+ - @backstage/core-plugin-api@0.0.0-nightly-20260712031654
19
+ - @backstage/plugin-search-react@0.0.0-nightly-20260712031654
17
20
  - @backstage/integration@2.0.3
18
- - @backstage/catalog-client@0.0.0-nightly-20260710031816
21
+ - @backstage/integration-react@0.0.0-nightly-20260712031654
22
+ - @backstage/plugin-auth-react@0.0.0-nightly-20260712031654
23
+ - @backstage/catalog-client@0.0.0-nightly-20260712031654
19
24
  - @backstage/catalog-model@1.9.0
20
25
  - @backstage/config@1.3.8
21
26
  - @backstage/errors@1.3.1
22
- - @backstage/integration-react@0.0.0-nightly-20260710031816
23
27
  - @backstage/theme@0.7.3
24
- - @backstage/plugin-auth-react@0.0.0-nightly-20260710031816
25
28
  - @backstage/plugin-search-common@1.2.24
26
29
  - @backstage/plugin-techdocs-common@0.1.1
27
30
 
@@ -1,5 +1,5 @@
1
1
  var name = "@backstage/plugin-techdocs";
2
- var version = "0.0.0-nightly-20260710031816";
2
+ var version = "0.0.0-nightly-20260712031654";
3
3
  var description = "The Backstage plugin that renders technical documentation for your components";
4
4
  var backstage = {
5
5
  role: "frontend-plugin",
@@ -81,7 +81,7 @@ var dependencies = {
81
81
  "@material-ui/styles": "^4.10.0",
82
82
  "@microsoft/fetch-event-source": "^2.0.1",
83
83
  "@remixicon/react": ">=4.6.0 <4.9.0",
84
- dompurify: "^3.3.2",
84
+ dompurify: "^3.4.11",
85
85
  "git-url-parse": "^15.0.0",
86
86
  lodash: "^4.17.21",
87
87
  "react-helmet": "6.1.0",
@@ -1,5 +1,5 @@
1
1
  import DOMPurify from 'dompurify';
2
- import { useCallback, useMemo } from 'react';
2
+ import { useMemo, useCallback } from 'react';
3
3
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
4
4
  import { removeUnsafeLinks } from './hooks/links.esm.js';
5
5
  import { removeUnsafeIframes } from './hooks/iframes.esm.js';
@@ -14,17 +14,24 @@ const useSanitizerConfig = () => {
14
14
  };
15
15
  const useSanitizerTransformer = () => {
16
16
  const config = useSanitizerConfig();
17
+ const purify = useMemo(() => {
18
+ const instance = DOMPurify();
19
+ instance.addHook("beforeSanitizeElements", removeUnsafeLinks);
20
+ const hosts = config?.getOptionalStringArray("allowedIframeHosts");
21
+ if (hosts) {
22
+ instance.addHook("beforeSanitizeElements", removeUnsafeIframes(hosts));
23
+ }
24
+ instance.addHook("uponSanitizeElement", removeUnsafeMetaTags);
25
+ instance.addHook("uponSanitizeAttribute", removeRestrictedAttributes);
26
+ return instance;
27
+ }, [config]);
17
28
  return useCallback(
18
29
  async (dom) => {
19
30
  const hosts = config?.getOptionalStringArray("allowedIframeHosts");
20
- DOMPurify.addHook("beforeSanitizeElements", removeUnsafeLinks);
21
31
  const tags = ["link", "meta"];
22
32
  if (hosts) {
23
33
  tags.push("iframe");
24
- DOMPurify.addHook("beforeSanitizeElements", removeUnsafeIframes(hosts));
25
34
  }
26
- DOMPurify.addHook("uponSanitizeElement", removeUnsafeMetaTags);
27
- DOMPurify.addHook("uponSanitizeAttribute", removeRestrictedAttributes);
28
35
  const tagNameCheck = config?.getOptionalString(
29
36
  "allowedCustomElementTagNameRegExp"
30
37
  );
@@ -55,7 +62,7 @@ const useSanitizerTransformer = () => {
55
62
  )}:|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))`,
56
63
  "i"
57
64
  );
58
- return DOMPurify.sanitize(dom.outerHTML, {
65
+ return purify.sanitize(dom.outerHTML, {
59
66
  ADD_TAGS: tags,
60
67
  FORBID_TAGS: ["style"],
61
68
  ADD_ATTR: ["http-equiv", "content", "dominant-baseline"],
@@ -68,7 +75,7 @@ const useSanitizerTransformer = () => {
68
75
  }
69
76
  });
70
77
  },
71
- [config]
78
+ [config, purify]
72
79
  );
73
80
  };
74
81
 
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.esm.js","sources":["../../../../src/reader/transformers/html/transformer.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport DOMPurify from 'dompurify';\nimport { useCallback, useMemo } from 'react';\n\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { Transformer } from '../transformer';\nimport {\n removeRestrictedAttributes,\n removeUnsafeIframes,\n removeUnsafeLinks,\n removeUnsafeMetaTags,\n} from './hooks';\n\n/**\n * Returns html sanitizer configuration\n */\nconst useSanitizerConfig = () => {\n const configApi = useApi(configApiRef);\n\n return useMemo(() => {\n return configApi.getOptionalConfig('techdocs.sanitizer');\n }, [configApi]);\n};\n\n/**\n * Returns a transformer that sanitizes the dom\n */\nexport const useSanitizerTransformer = (): Transformer => {\n const config = useSanitizerConfig();\n\n return useCallback(\n async (dom: Element) => {\n const hosts = config?.getOptionalStringArray('allowedIframeHosts');\n\n DOMPurify.addHook('beforeSanitizeElements', removeUnsafeLinks);\n const tags = ['link', 'meta'];\n\n if (hosts) {\n tags.push('iframe');\n DOMPurify.addHook('beforeSanitizeElements', removeUnsafeIframes(hosts));\n }\n\n DOMPurify.addHook('uponSanitizeElement', removeUnsafeMetaTags);\n\n DOMPurify.addHook('uponSanitizeAttribute', removeRestrictedAttributes);\n\n const tagNameCheck = config?.getOptionalString(\n 'allowedCustomElementTagNameRegExp',\n );\n const attributeNameCheck = config?.getOptionalString(\n 'allowedCustomElementAttributeNameRegExp',\n );\n const additionalAllowedURIProtocols =\n config?.getOptionalStringArray('additionalAllowedURIProtocols') || [];\n\n // Define allowed URI protocols, including any additional ones from the config.\n // The default protocols are based on the DOMPurify defaults.\n const allowedURIProtocols = [\n 'callto',\n 'cid',\n 'ftp',\n 'ftps',\n 'http',\n 'https',\n 'mailto',\n 'matrix',\n 'sms',\n 'tel',\n 'xmpp',\n ...additionalAllowedURIProtocols,\n ].filter(Boolean);\n\n const allowedURIRegExp = new RegExp(\n // This regex is not exposed by DOMPurify, so we need to define it ourselves.\n // It is possible for this to drift from the default in future versions of DOMPurify.\n // See: https://raw.githubusercontent.com/cure53/DOMPurify/master/src/regexp.ts\n `^(?:${allowedURIProtocols.join(\n '|',\n )}:|[^a-z]|[a-z+.-]+(?:[^a-z+.\\\\-:]|$))`,\n 'i',\n );\n\n // using outerHTML as we want to preserve the html tag attributes (lang)\n return DOMPurify.sanitize(dom.outerHTML, {\n ADD_TAGS: tags,\n FORBID_TAGS: ['style'],\n ADD_ATTR: ['http-equiv', 'content', 'dominant-baseline'],\n WHOLE_DOCUMENT: true,\n RETURN_DOM: true,\n ALLOWED_URI_REGEXP: allowedURIRegExp,\n CUSTOM_ELEMENT_HANDLING: {\n tagNameCheck: tagNameCheck ? new RegExp(tagNameCheck) : undefined,\n attributeNameCheck: attributeNameCheck\n ? new RegExp(attributeNameCheck)\n : undefined,\n },\n }) as Element;\n },\n [config],\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAgCA,MAAM,qBAAqB,MAAM;AAC/B,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AAErC,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,OAAO,SAAA,CAAU,kBAAkB,oBAAoB,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB,CAAA;AAKO,MAAM,0BAA0B,MAAmB;AACxD,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAElC,EAAA,OAAO,WAAA;AAAA,IACL,OAAO,GAAA,KAAiB;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,sBAAA,CAAuB,oBAAoB,CAAA;AAEjE,MAAA,SAAA,CAAU,OAAA,CAAQ,0BAA0B,iBAAiB,CAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAQ,MAAM,CAAA;AAE5B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAClB,QAAA,SAAA,CAAU,OAAA,CAAQ,wBAAA,EAA0B,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,SAAA,CAAU,OAAA,CAAQ,uBAAuB,oBAAoB,CAAA;AAE7D,MAAA,SAAA,CAAU,OAAA,CAAQ,yBAAyB,0BAA0B,CAAA;AAErE,MAAA,MAAM,eAAe,MAAA,EAAQ,iBAAA;AAAA,QAC3B;AAAA,OACF;AACA,MAAA,MAAM,qBAAqB,MAAA,EAAQ,iBAAA;AAAA,QACjC;AAAA,OACF;AACA,MAAA,MAAM,6BAAA,GACJ,MAAA,EAAQ,sBAAA,CAAuB,+BAA+B,KAAK,EAAC;AAItE,MAAA,MAAM,mBAAA,GAAsB;AAAA,QAC1B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAG;AAAA,OACL,CAAE,OAAO,OAAO,CAAA;AAEhB,MAAA,MAAM,mBAAmB,IAAI,MAAA;AAAA;AAAA;AAAA;AAAA,QAI3B,OAAO,mBAAA,CAAoB,IAAA;AAAA,UACzB;AAAA,SACD,CAAA,qCAAA,CAAA;AAAA,QACD;AAAA,OACF;AAGA,MAAA,OAAO,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW;AAAA,QACvC,QAAA,EAAU,IAAA;AAAA,QACV,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,YAAA,EAAc,SAAA,EAAW,mBAAmB,CAAA;AAAA,QACvD,cAAA,EAAgB,IAAA;AAAA,QAChB,UAAA,EAAY,IAAA;AAAA,QACZ,kBAAA,EAAoB,gBAAA;AAAA,QACpB,uBAAA,EAAyB;AAAA,UACvB,YAAA,EAAc,YAAA,GAAe,IAAI,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAAA,UACxD,kBAAA,EAAoB,kBAAA,GAChB,IAAI,MAAA,CAAO,kBAAkB,CAAA,GAC7B;AAAA;AACN,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACF;;;;"}
1
+ {"version":3,"file":"transformer.esm.js","sources":["../../../../src/reader/transformers/html/transformer.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport DOMPurify from 'dompurify';\nimport { useCallback, useMemo } from 'react';\n\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { Transformer } from '../transformer';\nimport {\n removeRestrictedAttributes,\n removeUnsafeIframes,\n removeUnsafeLinks,\n removeUnsafeMetaTags,\n} from './hooks';\n\n/**\n * Returns html sanitizer configuration\n */\nconst useSanitizerConfig = () => {\n const configApi = useApi(configApiRef);\n\n return useMemo(() => {\n return configApi.getOptionalConfig('techdocs.sanitizer');\n }, [configApi]);\n};\n\n/**\n * Returns a transformer that sanitizes the dom\n */\nexport const useSanitizerTransformer = (): Transformer => {\n const config = useSanitizerConfig();\n\n const purify = useMemo(() => {\n // eslint-disable-next-line new-cap\n const instance = DOMPurify();\n\n instance.addHook('beforeSanitizeElements', removeUnsafeLinks);\n\n const hosts = config?.getOptionalStringArray('allowedIframeHosts');\n if (hosts) {\n instance.addHook('beforeSanitizeElements', removeUnsafeIframes(hosts));\n }\n\n instance.addHook('uponSanitizeElement', removeUnsafeMetaTags);\n\n instance.addHook('uponSanitizeAttribute', removeRestrictedAttributes);\n\n return instance;\n }, [config]);\n\n return useCallback(\n async (dom: Element) => {\n const hosts = config?.getOptionalStringArray('allowedIframeHosts');\n const tags = ['link', 'meta'];\n\n if (hosts) {\n tags.push('iframe');\n }\n\n const tagNameCheck = config?.getOptionalString(\n 'allowedCustomElementTagNameRegExp',\n );\n const attributeNameCheck = config?.getOptionalString(\n 'allowedCustomElementAttributeNameRegExp',\n );\n const additionalAllowedURIProtocols =\n config?.getOptionalStringArray('additionalAllowedURIProtocols') || [];\n\n // Define allowed URI protocols, including any additional ones from the config.\n // The default protocols are based on the DOMPurify defaults.\n const allowedURIProtocols = [\n 'callto',\n 'cid',\n 'ftp',\n 'ftps',\n 'http',\n 'https',\n 'mailto',\n 'matrix',\n 'sms',\n 'tel',\n 'xmpp',\n ...additionalAllowedURIProtocols,\n ].filter(Boolean);\n\n const allowedURIRegExp = new RegExp(\n // This regex is not exposed by DOMPurify, so we need to define it ourselves.\n // It is possible for this to drift from the default in future versions of DOMPurify.\n // See: https://raw.githubusercontent.com/cure53/DOMPurify/master/src/regexp.ts\n `^(?:${allowedURIProtocols.join(\n '|',\n )}:|[^a-z]|[a-z+.-]+(?:[^a-z+.\\\\-:]|$))`,\n 'i',\n );\n\n // using outerHTML as we want to preserve the html tag attributes (lang)\n return purify.sanitize(dom.outerHTML, {\n ADD_TAGS: tags,\n FORBID_TAGS: ['style'],\n ADD_ATTR: ['http-equiv', 'content', 'dominant-baseline'],\n WHOLE_DOCUMENT: true,\n RETURN_DOM: true,\n ALLOWED_URI_REGEXP: allowedURIRegExp,\n CUSTOM_ELEMENT_HANDLING: {\n tagNameCheck: tagNameCheck ? new RegExp(tagNameCheck) : undefined,\n attributeNameCheck: attributeNameCheck\n ? new RegExp(attributeNameCheck)\n : undefined,\n },\n }) as Element;\n },\n [config, purify],\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAgCA,MAAM,qBAAqB,MAAM;AAC/B,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AAErC,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,OAAO,SAAA,CAAU,kBAAkB,oBAAoB,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB,CAAA;AAKO,MAAM,0BAA0B,MAAmB;AACxD,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAElC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AAE3B,IAAA,MAAM,WAAW,SAAA,EAAU;AAE3B,IAAA,QAAA,CAAS,OAAA,CAAQ,0BAA0B,iBAAiB,CAAA;AAE5D,IAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,sBAAA,CAAuB,oBAAoB,CAAA;AACjE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,uBAAuB,oBAAoB,CAAA;AAE5D,IAAA,QAAA,CAAS,OAAA,CAAQ,yBAAyB,0BAA0B,CAAA;AAEpE,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,WAAA;AAAA,IACL,OAAO,GAAA,KAAiB;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,sBAAA,CAAuB,oBAAoB,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAQ,MAAM,CAAA;AAE5B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MACpB;AAEA,MAAA,MAAM,eAAe,MAAA,EAAQ,iBAAA;AAAA,QAC3B;AAAA,OACF;AACA,MAAA,MAAM,qBAAqB,MAAA,EAAQ,iBAAA;AAAA,QACjC;AAAA,OACF;AACA,MAAA,MAAM,6BAAA,GACJ,MAAA,EAAQ,sBAAA,CAAuB,+BAA+B,KAAK,EAAC;AAItE,MAAA,MAAM,mBAAA,GAAsB;AAAA,QAC1B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAG;AAAA,OACL,CAAE,OAAO,OAAO,CAAA;AAEhB,MAAA,MAAM,mBAAmB,IAAI,MAAA;AAAA;AAAA;AAAA;AAAA,QAI3B,OAAO,mBAAA,CAAoB,IAAA;AAAA,UACzB;AAAA,SACD,CAAA,qCAAA,CAAA;AAAA,QACD;AAAA,OACF;AAGA,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW;AAAA,QACpC,QAAA,EAAU,IAAA;AAAA,QACV,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,YAAA,EAAc,SAAA,EAAW,mBAAmB,CAAA;AAAA,QACvD,cAAA,EAAgB,IAAA;AAAA,QAChB,UAAA,EAAY,IAAA;AAAA,QACZ,kBAAA,EAAoB,gBAAA;AAAA,QACpB,uBAAA,EAAyB;AAAA,UACvB,YAAA,EAAc,YAAA,GAAe,IAAI,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAAA,UACxD,kBAAA,EAAoB,kBAAA,GAChB,IAAI,MAAA,CAAO,kBAAkB,CAAA,GAC7B;AAAA;AACN,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,GACjB;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs",
3
- "version": "0.0.0-nightly-20260710031816",
3
+ "version": "0.0.0-nightly-20260712031654",
4
4
  "description": "The Backstage plugin that renders technical documentation for your components",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -71,30 +71,30 @@
71
71
  "test": "backstage-cli package test"
72
72
  },
73
73
  "dependencies": {
74
- "@backstage/catalog-client": "0.0.0-nightly-20260710031816",
74
+ "@backstage/catalog-client": "0.0.0-nightly-20260712031654",
75
75
  "@backstage/catalog-model": "1.9.0",
76
76
  "@backstage/config": "1.3.8",
77
- "@backstage/core-components": "0.0.0-nightly-20260710031816",
78
- "@backstage/core-plugin-api": "0.0.0-nightly-20260710031816",
77
+ "@backstage/core-components": "0.0.0-nightly-20260712031654",
78
+ "@backstage/core-plugin-api": "0.0.0-nightly-20260712031654",
79
79
  "@backstage/errors": "1.3.1",
80
- "@backstage/frontend-plugin-api": "0.0.0-nightly-20260710031816",
80
+ "@backstage/frontend-plugin-api": "0.0.0-nightly-20260712031654",
81
81
  "@backstage/integration": "2.0.3",
82
- "@backstage/integration-react": "0.0.0-nightly-20260710031816",
83
- "@backstage/plugin-auth-react": "0.0.0-nightly-20260710031816",
84
- "@backstage/plugin-catalog-react": "0.0.0-nightly-20260710031816",
82
+ "@backstage/integration-react": "0.0.0-nightly-20260712031654",
83
+ "@backstage/plugin-auth-react": "0.0.0-nightly-20260712031654",
84
+ "@backstage/plugin-catalog-react": "0.0.0-nightly-20260712031654",
85
85
  "@backstage/plugin-search-common": "1.2.24",
86
- "@backstage/plugin-search-react": "0.0.0-nightly-20260710031816",
86
+ "@backstage/plugin-search-react": "0.0.0-nightly-20260712031654",
87
87
  "@backstage/plugin-techdocs-common": "0.1.1",
88
- "@backstage/plugin-techdocs-react": "0.0.0-nightly-20260710031816",
88
+ "@backstage/plugin-techdocs-react": "0.0.0-nightly-20260712031654",
89
89
  "@backstage/theme": "0.7.3",
90
- "@backstage/ui": "0.0.0-nightly-20260710031816",
90
+ "@backstage/ui": "0.0.0-nightly-20260712031654",
91
91
  "@material-ui/core": "^4.12.2",
92
92
  "@material-ui/icons": "^4.9.1",
93
93
  "@material-ui/lab": "4.0.0-alpha.61",
94
94
  "@material-ui/styles": "^4.10.0",
95
95
  "@microsoft/fetch-event-source": "^2.0.1",
96
96
  "@remixicon/react": ">=4.6.0 <4.9.0",
97
- "dompurify": "^3.3.2",
97
+ "dompurify": "^3.4.11",
98
98
  "git-url-parse": "^15.0.0",
99
99
  "lodash": "^4.17.21",
100
100
  "react-helmet": "6.1.0",
@@ -102,12 +102,12 @@
102
102
  "zod": "^4.0.0"
103
103
  },
104
104
  "devDependencies": {
105
- "@backstage/cli": "0.0.0-nightly-20260710031816",
106
- "@backstage/core-app-api": "0.0.0-nightly-20260710031816",
107
- "@backstage/dev-utils": "0.0.0-nightly-20260710031816",
108
- "@backstage/plugin-catalog": "0.0.0-nightly-20260710031816",
109
- "@backstage/plugin-techdocs-module-addons-contrib": "0.0.0-nightly-20260710031816",
110
- "@backstage/test-utils": "0.0.0-nightly-20260710031816",
105
+ "@backstage/cli": "0.0.0-nightly-20260712031654",
106
+ "@backstage/core-app-api": "0.0.0-nightly-20260712031654",
107
+ "@backstage/dev-utils": "0.0.0-nightly-20260712031654",
108
+ "@backstage/plugin-catalog": "0.0.0-nightly-20260712031654",
109
+ "@backstage/plugin-techdocs-module-addons-contrib": "0.0.0-nightly-20260712031654",
110
+ "@backstage/test-utils": "0.0.0-nightly-20260712031654",
111
111
  "@testing-library/dom": "^10.0.0",
112
112
  "@testing-library/jest-dom": "^6.0.0",
113
113
  "@testing-library/react": "^16.0.0",