diff --git a/app-config.yaml b/app-config.yaml
index 1911dfde8d..0845666f1d 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -115,3 +115,9 @@ kubernetes:
authProvider: 'serviceAccount'
skipTLSVerify: true
serviceAccountToken: ${K8S_CLUSTER_TOKEN}
+
+ocm:
+ hub:
+ name: ${OCM_HUB_NAME}
+ url: ${OCM_HUB_URL}
+ serviceAccountToken: ${moc_infra_token}
diff --git a/manifests/base/externalsecret.yaml b/manifests/base/externalsecret.yaml
index 5ea24f8e57..3c9a5c35df 100644
--- a/manifests/base/externalsecret.yaml
+++ b/manifests/base/externalsecret.yaml
@@ -7,6 +7,8 @@ spec:
- extract:
conversionStrategy: Default
key: moc/smaug/janus-idp/values-app-config
+ - extract:
+ key: moc/smaug/service-catalog/k8s-plugin-tokens
refreshInterval: 60s
secretStoreRef:
kind: SecretStore
diff --git a/packages/app/package.json b/packages/app/package.json
index b12b7e2316..b8ec7ec61a 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -42,6 +42,7 @@
"@backstage/plugin-techdocs-react": "^1.1.2",
"@backstage/plugin-user-settings": "^0.6.2",
"@backstage/theme": "^0.2.16",
+ "@janus-idp/backstage-plugin-ocm": "^1.1.1",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@roadiehq/backstage-plugin-argo-cd": "^2.2.6",
diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx
index c8b1c77f21..23630bae69 100644
--- a/packages/app/src/App.tsx
+++ b/packages/app/src/App.tsx
@@ -37,6 +37,8 @@ import { CssBaseline, ThemeProvider } from '@material-ui/core';
import { janusTheme } from './themes/janus';
import { HomePage } from './components/home/HomePage';
import { HomepageCompositionRoot } from '@backstage/plugin-home';
+import { OcmPage } from '@janus-idp/backstage-plugin-ocm';
+import Logo from './components/Root/LogoIcon';
const app = createApp({
apis,
@@ -110,6 +112,7 @@ const routes = (
} />
} />
+ } />} />
);
diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx
index 1cd4ba32f1..6dd396e9e7 100644
--- a/packages/app/src/components/Root/Root.tsx
+++ b/packages/app/src/components/Root/Root.tsx
@@ -3,6 +3,7 @@ import { makeStyles } from '@material-ui/core';
import AppsIcon from '@material-ui/icons/Apps';
import HomeIcon from '@material-ui/icons/Home';
import ExtensionIcon from '@material-ui/icons/Extension';
+import StorageIcon from '@material-ui/icons/Storage';
import MapIcon from '@material-ui/icons/MyLocation';
import LibraryBooks from '@material-ui/icons/LibraryBooks';
import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
@@ -70,6 +71,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
+
{/* End global nav */}
diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx
index 2fabe82741..a61123e8a5 100644
--- a/packages/app/src/components/catalog/EntityPage.tsx
+++ b/packages/app/src/components/catalog/EntityPage.tsx
@@ -70,6 +70,14 @@ import {
EntityArgoCDOverviewCard,
EntityArgoCDHistoryCard,
} from '@roadiehq/backstage-plugin-argo-cd';
+import {
+ ClusterAllocatableResourceCard,
+ ClusterAvailableResourceCard,
+ ClusterContextProvider,
+ ClusterInfoCard,
+ ClusterStatusCard,
+} from '@janus-idp/backstage-plugin-ocm';
+import { isType } from './utils';
const techdocsContent = (
@@ -420,6 +428,49 @@ const domainPage = (
);
+const resourcePage = (
+
+
+
+ {entityWarningContent}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
export const entityPage = (
@@ -428,6 +479,7 @@ export const entityPage = (
+
{defaultEntityPage}
diff --git a/packages/app/src/components/catalog/utils.tsx b/packages/app/src/components/catalog/utils.tsx
new file mode 100644
index 0000000000..4b03fa3955
--- /dev/null
+++ b/packages/app/src/components/catalog/utils.tsx
@@ -0,0 +1,10 @@
+import { Entity } from '@backstage/catalog-model';
+
+export const isType = (types: string | string[]) => (entity: Entity) => {
+ if (!entity?.spec?.type) {
+ return false;
+ }
+ return typeof types === 'string'
+ ? entity?.spec?.type === types
+ : types.includes(entity.spec.type as string);
+};
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 2c5a525c53..15b0510449 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -34,6 +34,7 @@
"@backstage/plugin-search-backend-module-pg": "^0.5.2",
"@backstage/plugin-search-backend-node": "^1.1.2",
"@backstage/plugin-techdocs-backend": "^1.5.2",
+ "@janus-idp/backstage-plugin-ocm-backend": "^1.3.0",
"app": "link:../app",
"better-sqlite3": "^8.0.0",
"dockerode": "^3.3.1",
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index 55934641bb..290d9d33dd 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -32,6 +32,7 @@ import kubernetes from './plugins/kubernetes';
import { PluginEnvironment } from './types';
import { ServerPermissionClient } from '@backstage/plugin-permission-node';
import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
+import ocm from './plugins/ocm';
function makeCreateEnv(config: Config) {
const root = getRootLogger();
@@ -87,6 +88,7 @@ async function main() {
const searchEnv = useHotMemoize(module, () => createEnv('search'));
const appEnv = useHotMemoize(module, () => createEnv('app'));
const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes'));
+ const ocmEnv = useHotMemoize(module, () => createEnv('ocm'));
const apiRouter = Router();
apiRouter.use('/catalog', await catalog(catalogEnv));
@@ -96,6 +98,7 @@ async function main() {
apiRouter.use('/proxy', await proxy(proxyEnv));
apiRouter.use('/search', await search(searchEnv));
apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv));
+ apiRouter.use('/ocm', await ocm(ocmEnv));
// Add backends ABOVE this line; this 404 handler is the catch-all fallback
apiRouter.use(notFoundHandler());
diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts
index 876cb6bccc..f074d79ce1 100644
--- a/packages/backend/src/plugins/catalog.ts
+++ b/packages/backend/src/plugins/catalog.ts
@@ -1,5 +1,6 @@
import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend';
+import { ManagedClusterProvider } from '@janus-idp/backstage-plugin-ocm-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
@@ -7,8 +8,20 @@ export default async function createPlugin(
env: PluginEnvironment,
): Promise {
const builder = await CatalogBuilder.create(env);
+ const ocm = ManagedClusterProvider.fromConfig(env.config, {
+ logger: env.logger,
+ });
+ builder.addEntityProvider(ocm);
builder.addProcessor(new ScaffolderEntitiesProcessor());
const { processingEngine, router } = await builder.build();
await processingEngine.start();
+ await env.scheduler.scheduleTask({
+ id: 'run_ocm_refresh',
+ fn: async () => {
+ await ocm.run();
+ },
+ frequency: { minutes: 30 },
+ timeout: { minutes: 10 },
+ });
return router;
}
diff --git a/packages/backend/src/plugins/ocm.ts b/packages/backend/src/plugins/ocm.ts
new file mode 100644
index 0000000000..43bb9920aa
--- /dev/null
+++ b/packages/backend/src/plugins/ocm.ts
@@ -0,0 +1,12 @@
+import { createRouter } from '@janus-idp/backstage-plugin-ocm-backend';
+import { Router } from 'express';
+import { PluginEnvironment } from '../types';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ config: env.config,
+ });
+}
diff --git a/yarn.lock b/yarn.lock
index e421f6e220..39ef4ce464 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4182,6 +4182,49 @@
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+"@janus-idp/backstage-plugin-ocm-backend@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@janus-idp/backstage-plugin-ocm-backend/-/backstage-plugin-ocm-backend-1.3.0.tgz#1a22a1deb9a0e9e1521471e76ad06081535872e9"
+ integrity sha512-Q1RWZQIw+/47mEemcBm+cln/aykQ/in/RIkobjFk54/oalAQQVCdPdIoz1fvaZ1w0pB1h5jOH0D3doK7ZCeEZA==
+ dependencies:
+ "@backstage/backend-common" "^0.18.1"
+ "@backstage/catalog-client" "^1.3.0"
+ "@backstage/catalog-model" "^1.1.5"
+ "@backstage/config" "^1.0.6"
+ "@backstage/plugin-catalog-node" "^1.3.2"
+ "@janus-idp/backstage-plugin-ocm-common" "1.1.1"
+ "@kubernetes/client-node" "^0.18.0"
+ express "^4.17.1"
+ express-promise-router "^4.1.0"
+ node-fetch "^3.0.0"
+ semver "^7.3.8"
+ winston "^3.2.1"
+ yn "^5.0.0"
+
+"@janus-idp/backstage-plugin-ocm-common@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@janus-idp/backstage-plugin-ocm-common/-/backstage-plugin-ocm-common-1.1.1.tgz#84ac3da62bcff79169c3c0546a46ea3081d3e75d"
+ integrity sha512-Rr3bmBQ+opyum58lZf0FdEIUDKlM3mpE4NMTIIcV+S5Jlmpnl1U7T6Etuf3XOHX9/5unnDzP0ILp2fLHwMqQ3g==
+
+"@janus-idp/backstage-plugin-ocm@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@janus-idp/backstage-plugin-ocm/-/backstage-plugin-ocm-1.1.1.tgz#9629d25dcd9094b5ad00711a11055f42ded2df34"
+ integrity sha512-HzFB07e+pvbJdIYu+jwIKaW1Iov3gxcMgTzVZflHgW7sdp+qXgaSByZso6glhkTRvk2FPVoLH1IIEKw6TTdDUg==
+ dependencies:
+ "@backstage/catalog-model" "^1.1.5"
+ "@backstage/core-components" "^0.12.3"
+ "@backstage/core-plugin-api" "^1.3.0"
+ "@backstage/errors" "^1.1.4"
+ "@backstage/plugin-catalog-react" "^1.2.4"
+ "@backstage/plugin-home" "^0.4.30"
+ "@backstage/plugin-search-react" "^1.4.0"
+ "@backstage/theme" "^0.2.16"
+ "@janus-idp/backstage-plugin-ocm-common" "1.1.1"
+ "@material-ui/core" "^4.9.13"
+ "@material-ui/icons" "^4.9.1"
+ "@material-ui/lab" "^4.0.0-alpha.45"
+ react-use "^17.2.4"
+
"@jest-mock/express@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@jest-mock/express/-/express-2.0.1.tgz#5985ad42e00394a375592596bcf15f00064bac20"
@@ -4513,6 +4556,30 @@
optionalDependencies:
openid-client "^5.3.0"
+"@kubernetes/client-node@^0.18.0":
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/@kubernetes/client-node/-/client-node-0.18.1.tgz#58d864c8f584efd0f8670f6c46bb8e9d5abd58f6"
+ integrity sha512-F3JiK9iZnbh81O/da1tD0h8fQMi/MDttWc/JydyUVnjPEom55wVfnpl4zQ/sWD4uKB8FlxYRPiLwV2ZXB+xPKw==
+ dependencies:
+ "@types/js-yaml" "^4.0.1"
+ "@types/node" "^18.11.17"
+ "@types/request" "^2.47.1"
+ "@types/ws" "^8.5.3"
+ byline "^5.0.0"
+ isomorphic-ws "^5.0.0"
+ js-yaml "^4.1.0"
+ jsonpath-plus "^7.2.0"
+ request "^2.88.0"
+ rfc4648 "^1.3.0"
+ stream-buffers "^3.0.2"
+ tar "^6.1.11"
+ tmp-promise "^3.0.2"
+ tslib "^2.4.1"
+ underscore "^1.13.6"
+ ws "^8.11.0"
+ optionalDependencies:
+ openid-client "^5.3.0"
+
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
@@ -6201,6 +6268,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65"
integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==
+"@types/node@^18.11.17":
+ version "18.14.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.0.tgz#94c47b9217bbac49d4a67a967fdcdeed89ebb7d0"
+ integrity sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==
+
"@types/oauth@*":
version "0.9.1"
resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.1.tgz#e17221e7f7936b0459ae7d006255dff61adca305"
@@ -6249,7 +6321,7 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
-"@types/react-dom@*", "@types/react-dom@<18.0.0":
+"@types/react-dom@*", "@types/react-dom@<18.0.0", "@types/react-dom@^17":
version "17.0.19"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.19.tgz#36feef3aa35d045cacd5ed60fe0eef5272f19492"
integrity sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==
@@ -6462,7 +6534,7 @@
dependencies:
"@types/node" "*"
-"@types/ws@^8.5.1":
+"@types/ws@^8.5.1", "@types/ws@^8.5.3":
version "8.5.4"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5"
integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==
@@ -7014,6 +7086,7 @@ anymatch@^3.0.3, anymatch@~3.1.2:
"@backstage/plugin-techdocs-react" "^1.1.2"
"@backstage/plugin-user-settings" "^0.6.2"
"@backstage/theme" "^0.2.16"
+ "@janus-idp/backstage-plugin-ocm" "^1.1.1"
"@material-ui/core" "^4.12.2"
"@material-ui/icons" "^4.9.1"
"@roadiehq/backstage-plugin-argo-cd" "^2.2.6"
@@ -9018,6 +9091,11 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
+data-uri-to-buffer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
+ integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
+
data-urls@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
@@ -10431,6 +10509,14 @@ fecha@^4.2.0:
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
+fetch-blob@^3.1.2, fetch-blob@^3.1.4:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9"
+ integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
+ dependencies:
+ node-domexception "^1.0.0"
+ web-streams-polyfill "^3.0.3"
+
figures@^3.0.0, figures@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
@@ -10655,6 +10741,13 @@ formdata-node@^4.0.0:
node-domexception "1.0.0"
web-streams-polyfill "4.0.0-beta.3"
+formdata-polyfill@^4.0.10:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423"
+ integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
+ dependencies:
+ fetch-blob "^3.1.2"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -12233,6 +12326,11 @@ isomorphic-ws@^4.0.1:
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
+isomorphic-ws@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf"
+ integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==
+
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -13001,6 +13099,11 @@ jsonpath-plus@^0.19.0:
resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz#b901e57607055933dc9a8bef0cc25160ee9dd64c"
integrity sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==
+jsonpath-plus@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz#7ad94e147b3ed42f7939c315d2b9ce490c5a3899"
+ integrity sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==
+
jsonpointer@^5.0.0, jsonpointer@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
@@ -14549,7 +14652,7 @@ node-cache@^5.1.2:
dependencies:
clone "2.x"
-node-domexception@1.0.0:
+node-domexception@1.0.0, node-domexception@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
@@ -14568,6 +14671,15 @@ node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
+node-fetch@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.0.tgz#37e71db4ecc257057af828d523a7243d651d91e4"
+ integrity sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==
+ dependencies:
+ data-uri-to-buffer "^4.0.0"
+ fetch-blob "^3.1.4"
+ formdata-polyfill "^4.0.10"
+
node-forge@^1, node-forge@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
@@ -19106,6 +19218,11 @@ web-streams-polyfill@4.0.0-beta.3:
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38"
integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==
+web-streams-polyfill@^3.0.3:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
+ integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==
+
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -19601,6 +19718,11 @@ yn@^4.0.0:
resolved "https://registry.yarnpkg.com/yn/-/yn-4.0.0.tgz#611480051ea43b510da1dfdbe177ed159f00a979"
integrity sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==
+yn@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-5.0.0.tgz#63fc2e2e0056cf294397eed6ad4a3fbdf707f26f"
+ integrity sha512-+l37+9TyGEsyxGLaTg6QgYy5KnOp74ZZl4dPFLQpBWSkO99uBC5jnS0pOGwXFViPbiaEtWbParH2KrgWWF2duQ==
+
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"