diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 02ae36727e..f7b3529b74 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -18,13 +18,3 @@ template: | ## Changes since $PREVIOUS_TAG $CHANGES - - ### Download - - - Lens v$RESOLVED_VERSION - Linux - - [AppImage](https://github.com/lensapp/lens/releases/download/v$RESOLVED_VERSION/Lens-$RESOLVED_VERSION.x86_64.AppImage) - - [DEB](https://github.com/lensapp/lens/releases/download/v$RESOLVED_VERSION/Lens-$RESOLVED_VERSION.amd64.deb) - - [RPM](https://github.com/lensapp/lens/releases/download/v$RESOLVED_VERSION/Lens-$RESOLVED_VERSION.x86_64.rpm) - - [Snapcraft](https://snapcraft.io/kontena-lens) - - [Lens v$RESOLVED_VERSION - MacOS](https://github.com/lensapp/lens/releases/download/v$RESOLVED_VERSION/Lens-$RESOLVED_VERSION.dmg) - - [Lens v$RESOLVED_VERSION - Windows](https://github.com/lensapp/lens/releases/download/v$RESOLVED_VERSION/Lens-Setup-$RESOLVED_VERSION.exe) diff --git a/Makefile b/Makefile index 428a70ae23..d8a6a35462 100644 --- a/Makefile +++ b/Makefile @@ -73,10 +73,10 @@ else endif $(extension_node_modules): - cd $(@:/node_modules=) && npm install --no-audit --no-fund + cd $(@:/node_modules=) && ../../node_modules/.bin/npm install --no-audit --no-fund $(extension_dists): src/extensions/npm/extensions/dist - cd $(@:/dist=) && npm run build + cd $(@:/dist=) && ../../node_modules/.bin/npm run build .PHONY: build-extensions build-extensions: node_modules $(extension_node_modules) $(extension_dists) @@ -104,8 +104,8 @@ build-npm: build-extension-types copy-extension-themes src/extensions/npm/extens build-extension-types: src/extensions/npm/extensions/dist .PHONY: publish-npm -publish-npm: build-npm - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" +publish-npm: node_modules build-npm + ./node_modules/.bin/npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" cd src/extensions/npm/extensions && npm publish --access=public .PHONY: docs diff --git a/package.json b/package.json index 0527ff362c..cec4e86300 100644 --- a/package.json +++ b/package.json @@ -327,7 +327,7 @@ "prettier": "^2.2.0", "progress-bar-webpack-plugin": "^2.1.0", "raw-loader": "^4.0.1", - "react-beautiful-dnd": "^13.0.0", + "react-beautiful-dnd": "^13.1.0", "react-refresh": "^0.9.0", "react-router-dom": "^5.2.0", "react-select": "^3.1.0", @@ -341,7 +341,7 @@ "ts-jest": "^26.1.0", "ts-loader": "^7.0.5", "ts-node": "^8.10.2", - "type-fest": "^0.18.0", + "type-fest": "^1.0.2", "typedoc": "0.17.0-3", "typedoc-plugin-markdown": "^2.4.0", "typeface-roboto": "^0.0.75", diff --git a/src/common/catalog-entities/icons/kubernetes.svg b/src/common/catalog-entities/icons/kubernetes.svg new file mode 100644 index 0000000000..b4a9068420 --- /dev/null +++ b/src/common/catalog-entities/icons/kubernetes.svg @@ -0,0 +1,46 @@ + + + + + + diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 29b8940a53..6857f4ef6b 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -87,7 +87,8 @@ export class KubernetesClusterCategory extends EventEmitter implements CatalogCa public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; public readonly kind = "CatalogCategory"; public metadata = { - name: "Kubernetes Clusters" + name: "Kubernetes Clusters", + icon: require(`!!raw-loader!./icons/kubernetes.svg`).default // eslint-disable-line }; public spec = { group: "entity.k8slens.dev", diff --git a/src/common/catalog-entities/web-link.ts b/src/common/catalog-entities/web-link.ts index 86a1a991c2..a2204ea3e8 100644 --- a/src/common/catalog-entities/web-link.ts +++ b/src/common/catalog-entities/web-link.ts @@ -49,7 +49,8 @@ export class WebLinkCategory implements CatalogCategory { public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; public readonly kind = "CatalogCategory"; public metadata = { - name: "Web Links" + name: "Web Links", + icon: "link" }; public spec = { group: "entity.k8slens.dev", diff --git a/src/common/catalog-entity.ts b/src/common/catalog-entity.ts index 8430381368..f18f0fccca 100644 --- a/src/common/catalog-entity.ts +++ b/src/common/catalog-entity.ts @@ -8,6 +8,7 @@ export interface CatalogCategory { kind: string; metadata: { name: string; + icon: string; } spec: { group: string; diff --git a/src/extensions/registries/entity-setting-registry.ts b/src/extensions/registries/entity-setting-registry.ts index 8dd5ce6f25..9ad873ce67 100644 --- a/src/extensions/registries/entity-setting-registry.ts +++ b/src/extensions/registries/entity-setting-registry.ts @@ -15,8 +15,9 @@ export interface EntitySettingRegistration { kind: string; apiVersions: string[]; source?: string; - id?: string; components: EntitySettingComponents; + id?: string; + priority?: number; } export interface RegisteredEntitySetting extends EntitySettingRegistration { @@ -32,17 +33,21 @@ export class EntitySettingRegistry extends BaseRegistry { + let items = this.getItems().filter((item) => { return item.kind === kind && item.apiVersions.includes(apiVersion); + }).map((item) => { + item.priority = item.priority ?? 50; + + return item; }); if (source) { - return items.filter((item) => { + items = items.filter((item) => { return !item.source || item.source === source; }); - } else { - return items; } + + return items.sort((a, b) => b.priority - a.priority); } } diff --git a/src/main/helm/helm-repo-manager.ts b/src/main/helm/helm-repo-manager.ts index 5761ac5dec..53826bf1bf 100644 --- a/src/main/helm/helm-repo-manager.ts +++ b/src/main/helm/helm-repo-manager.ts @@ -35,7 +35,7 @@ export class HelmRepoManager extends Singleton { protected helmEnv: HelmEnv; protected initialized: boolean; - async loadAvailableRepos(): Promise { + public static async loadAvailableRepos(): Promise { const res = await customRequestPromise({ uri: "https://github.com/lensapp/artifact-hub-repositories/releases/download/latest/repositories.json", json: true, @@ -46,18 +46,18 @@ export class HelmRepoManager extends Singleton { return orderBy(res.body, repo => repo.name); } - async init() { + private async init() { helmCli.setLogger(logger); await helmCli.ensureBinary(); if (!this.initialized) { - this.helmEnv = await this.parseHelmEnv(); - await this.update(); + this.helmEnv = await HelmRepoManager.parseHelmEnv(); + await HelmRepoManager.update(); this.initialized = true; } } - protected async parseHelmEnv() { + protected static async parseHelmEnv() { const helm = await helmCli.binaryPath(); const { stdout } = await promiseExec(`"${helm}" env`).catch((error) => { throw(error.stderr); @@ -78,6 +78,10 @@ export class HelmRepoManager extends Singleton { public async repositories(): Promise { try { + if (!this.initialized) { + await this.init(); + } + const repoConfigFile = this.helmEnv.HELM_REPOSITORY_CONFIG; const { repositories }: HelmRepoConfig = await readFile(repoConfigFile, "utf8") .then((yamlContent: string) => yaml.safeLoad(yamlContent)) @@ -86,7 +90,7 @@ export class HelmRepoManager extends Singleton { })); if (!repositories.length) { - await this.addRepo({ name: "bitnami", url: "https://charts.bitnami.com/bitnami" }); + await HelmRepoManager.addRepo({ name: "bitnami", url: "https://charts.bitnami.com/bitnami" }); return await this.repositories(); } @@ -102,13 +106,7 @@ export class HelmRepoManager extends Singleton { } } - public async repository(name: string) { - const repositories = await this.repositories(); - - return repositories.find(repo => repo.name == name); - } - - public async update() { + public static async update() { const helm = await helmCli.binaryPath(); const { stdout } = await promiseExec(`"${helm}" repo update`).catch((error) => { return { stdout: error.stdout }; @@ -117,7 +115,7 @@ export class HelmRepoManager extends Singleton { return stdout; } - public async addRepo({ name, url }: HelmRepo) { + public static async addRepo({ name, url }: HelmRepo) { logger.info(`[HELM]: adding repo "${name}" from ${url}`); const helm = await helmCli.binaryPath(); const { stdout } = await promiseExec(`"${helm}" repo add ${name} ${url}`).catch((error) => { @@ -127,7 +125,7 @@ export class HelmRepoManager extends Singleton { return stdout; } - public async addСustomRepo(repoAttributes : HelmRepo) { + public static async addСustomRepo(repoAttributes : HelmRepo) { logger.info(`[HELM]: adding repo "${repoAttributes.name}" from ${repoAttributes.url}`); const helm = await helmCli.binaryPath(); @@ -146,7 +144,7 @@ export class HelmRepoManager extends Singleton { return stdout; } - public async removeRepo({ name, url }: HelmRepo): Promise { + public static async removeRepo({ name, url }: HelmRepo): Promise { logger.info(`[HELM]: removing repo "${name}" from ${url}`); const helm = await helmCli.binaryPath(); const { stdout } = await promiseExec(`"${helm}" repo remove ${name}`).catch((error) => { diff --git a/src/main/helm/helm-service.ts b/src/main/helm/helm-service.ts index 9a42616c89..e933447593 100644 --- a/src/main/helm/helm-service.ts +++ b/src/main/helm/helm-service.ts @@ -34,7 +34,8 @@ class HelmService { readme: "", versions: {} }; - const repo = await HelmRepoManager.getInstance().repository(repoName); + const repos = await HelmRepoManager.getInstance().repositories(); + const repo = repos.find(repo => repo.name === repoName); const chartManager = new HelmChartManager(repo); const chart = await chartManager.chart(chartName); @@ -45,7 +46,8 @@ class HelmService { } public async getChartValues(repoName: string, chartName: string, version = "") { - const repo = await HelmRepoManager.getInstance().repository(repoName); + const repos = await HelmRepoManager.getInstance().repositories(); + const repo = repos.find(repo => repo.name === repoName); const chartManager = new HelmChartManager(repo); return chartManager.getValues(chartName, version); diff --git a/src/main/index.ts b/src/main/index.ts index c1d99cbd76..2eeeb76636 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -33,6 +33,7 @@ import { IpcRendererNavigationEvents } from "../renderer/navigation/events"; import { CatalogPusher } from "./catalog-pusher"; import { catalogEntityRegistry } from "../common/catalog-entity-registry"; import { HotbarStore } from "../common/hotbar-store"; +import { HelmRepoManager } from "./helm/helm-repo-manager"; const workingDir = path.join(app.getPath("appData"), appName); @@ -105,6 +106,8 @@ app.on("ready", async () => { const extensionsStore = ExtensionsStore.createInstance(); const filesystemStore = FilesystemProvisionerStore.createInstance(); + HelmRepoManager.createInstance(); // create the instance + logger.info("💾 Loading stores"); // preload await Promise.all([ diff --git a/src/renderer/api/catalog-category-registry.ts b/src/renderer/api/catalog-category-registry.ts new file mode 100644 index 0000000000..2e80789851 --- /dev/null +++ b/src/renderer/api/catalog-category-registry.ts @@ -0,0 +1 @@ +export { catalogCategoryRegistry } from "../../common/catalog-category-registry"; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 18cc3e92a5..f856d50f1e 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -60,7 +60,8 @@ export async function bootstrap(App: AppComponent) { const filesystemStore = FilesystemProvisionerStore.createInstance(); const themeStore = ThemeStore.createInstance(); const hotbarStore = HotbarStore.createInstance(); - const helmRepoManager = HelmRepoManager.createInstance(); + + HelmRepoManager.createInstance(); // initialize the manager // preload common stores await Promise.all([ @@ -70,7 +71,6 @@ export async function bootstrap(App: AppComponent) { extensionsStore.load(), filesystemStore.load(), themeStore.init(), - helmRepoManager.init(), ]); // Register additional store listeners diff --git a/src/renderer/components/+catalog/catalog-entity.store.ts b/src/renderer/components/+catalog/catalog-entity.store.ts index 30983f1456..239c93f717 100644 --- a/src/renderer/components/+catalog/catalog-entity.store.ts +++ b/src/renderer/components/+catalog/catalog-entity.store.ts @@ -45,6 +45,15 @@ export class CatalogEntityItem implements ItemObject { return this.entity.metadata.source || "unknown"; } + get searchFields() { + return [ + this.name, + this.id, + this.phase, + ...this.labels.map((value, key) => `${key}=${value}`) + ]; + } + onRun(ctx: CatalogEntityActionContext) { this.entity.onRun(ctx); } diff --git a/src/renderer/components/+catalog/catalog.tsx b/src/renderer/components/+catalog/catalog.tsx index e81004e97a..93fa7f213c 100644 --- a/src/renderer/components/+catalog/catalog.tsx +++ b/src/renderer/components/+catalog/catalog.tsx @@ -168,9 +168,12 @@ export class Catalog extends React.Component { [sortBy.source]: (item: CatalogEntityItem) => item.source, [sortBy.status]: (item: CatalogEntityItem) => item.phase, }} + searchFilters={[ + (entity: CatalogEntityItem) => entity.searchFields, + ]} renderTableHeader={[ { title: "Name", className: "name", sortBy: sortBy.name }, - { title: "Source", className: "source" }, + { title: "Source", className: "source", sortBy: sortBy.source }, { title: "Labels", className: "labels" }, { title: "Status", className: "status", sortBy: sortBy.status }, ]} diff --git a/src/renderer/components/+preferences/add-helm-repo-dialog.tsx b/src/renderer/components/+preferences/add-helm-repo-dialog.tsx index 21fc6cd9fa..5ffec819f8 100644 --- a/src/renderer/components/+preferences/add-helm-repo-dialog.tsx +++ b/src/renderer/components/+preferences/add-helm-repo-dialog.tsx @@ -84,7 +84,7 @@ export class AddHelmRepoDialog extends React.Component { async addCustomRepo() { try { - await HelmRepoManager.getInstance().addСustomRepo(this.helmRepo); + await HelmRepoManager.addСustomRepo(this.helmRepo); Notifications.ok(<>Helm repository {this.helmRepo.name} has added); this.props.onAddRepo(); this.close(); diff --git a/src/renderer/components/+preferences/helm-charts.tsx b/src/renderer/components/+preferences/helm-charts.tsx index 67661fa549..e86badeb7d 100644 --- a/src/renderer/components/+preferences/helm-charts.tsx +++ b/src/renderer/components/+preferences/helm-charts.tsx @@ -39,7 +39,7 @@ export class HelmCharts extends React.Component { try { if (!this.repos.length) { - this.repos = await HelmRepoManager.getInstance().loadAvailableRepos(); // via https://helm.sh + this.repos = await HelmRepoManager.loadAvailableRepos(); } const repos = await HelmRepoManager.getInstance().repositories(); // via helm-cli @@ -54,7 +54,7 @@ export class HelmCharts extends React.Component { async addRepo(repo: HelmRepo) { try { - await HelmRepoManager.getInstance().addRepo(repo); + await HelmRepoManager.addRepo(repo); this.addedRepos.set(repo.name, repo); } catch (err) { Notifications.error(<>Adding helm branch {repo.name} has failed: {String(err)}); @@ -63,7 +63,7 @@ export class HelmCharts extends React.Component { async removeRepo(repo: HelmRepo) { try { - await HelmRepoManager.getInstance().removeRepo(repo); + await HelmRepoManager.removeRepo(repo); this.addedRepos.delete(repo.name); } catch (err) { Notifications.error( diff --git a/src/renderer/components/hotbar/hotbar-icon.scss b/src/renderer/components/hotbar/hotbar-icon.scss index bce7070ad1..80252addae 100644 --- a/src/renderer/components/hotbar/hotbar-icon.scss +++ b/src/renderer/components/hotbar/hotbar-icon.scss @@ -38,6 +38,22 @@ } } + .badge { + color: $textColorAccent; + position: absolute; + right: 0; + bottom: 0; + margin: -$padding; + font-size: $font-size-small; + background: $clusterMenuBackground; + color: white; + padding: 0px; + border-radius: 50%; + svg { + width: 13px; + } + } + img { width: var(--size); height: var(--size); diff --git a/src/renderer/components/hotbar/hotbar-icon.tsx b/src/renderer/components/hotbar/hotbar-icon.tsx index b11c5975d9..45f9535644 100644 --- a/src/renderer/components/hotbar/hotbar-icon.tsx +++ b/src/renderer/components/hotbar/hotbar-icon.tsx @@ -12,6 +12,7 @@ import { observable, makeObservable } from "mobx"; import { navigate } from "../../navigation"; import { HotbarStore } from "../../../common/hotbar-store"; import { ConfirmDialog } from "../confirm-dialog"; +import { catalogCategoryRegistry } from "../../api/catalog-category-registry"; interface Props extends DOMAttributes { entity: CatalogEntity; @@ -60,6 +61,21 @@ export class HotbarIcon extends React.Component { } } + get badgeIcon() { + const className = "badge"; + const category = catalogCategoryRegistry.getCategoryForEntity(this.props.entity); + + if (!category) { + return ; + } + + if (category.metadata.icon.includes("; + } else { + return ; + } + } + toggleMenu() { this.menuOpen = !this.menuOpen; } @@ -111,6 +127,7 @@ export class HotbarIcon extends React.Component {
{entity.metadata.name} {this.iconString} + { this.badgeIcon } { // render as inline svg-icon if (svg) { - const svgIconText = require(`!!raw-loader!./${svg}.svg`).default; + const svgIconText = svg.includes("; } diff --git a/src/renderer/utils/createStorage.ts b/src/renderer/utils/createStorage.ts index 78d6e3b0e3..f7e6e91ece 100755 --- a/src/renderer/utils/createStorage.ts +++ b/src/renderer/utils/createStorage.ts @@ -33,7 +33,7 @@ export function createStorage(key: string, defaultValue: T, observableOptions // remove json-file when cluster deleted if (clusterId !== undefined) { - when(() => ClusterStore.getInstance().removedClusters.has(clusterId)).then(removeFile); + when(() => ClusterStore.getInstance(false)?.removedClusters.has(clusterId)).then(removeFile); } } diff --git a/yarn.lock b/yarn.lock index dee59f42b6..5f20b956ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -253,10 +253,10 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" + integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== dependencies: regenerator-runtime "^0.13.4" @@ -1274,7 +1274,7 @@ resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== -"@types/hoist-non-react-statics@^3.3.1": +"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -1584,6 +1584,16 @@ dependencies: "@types/react" "*" +"@types/react-redux@^7.1.16": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21" + integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react-router-dom@^5.1.6": version "5.1.6" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.6.tgz#07b14e7ab1893a837c8565634960dc398564b1fb" @@ -11522,16 +11532,16 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-beautiful-dnd@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40" - integrity sha512-87It8sN0ineoC3nBW0SbQuTFXM6bUqM62uJGY4BtTf0yzPl8/3+bHMWkgIe0Z6m8e+gJgjWxefGRVfpE3VcdEg== +react-beautiful-dnd@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d" + integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== dependencies: - "@babel/runtime" "^7.8.4" + "@babel/runtime" "^7.9.2" css-box-model "^1.2.0" memoize-one "^5.1.1" raf-schd "^4.0.2" - react-redux "^7.1.1" + react-redux "^7.2.0" redux "^4.0.4" use-memo-one "^1.1.1" @@ -11551,7 +11561,7 @@ react-input-autosize@^2.2.2: dependencies: prop-types "^15.5.8" -react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -11561,16 +11571,17 @@ react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-i resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== -react-redux@^7.1.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985" - integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg== +react-redux@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9" + integrity sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w== dependencies: - "@babel/runtime" "^7.5.5" - hoist-non-react-statics "^3.3.0" + "@babel/runtime" "^7.12.1" + "@types/react-redux" "^7.1.16" + hoist-non-react-statics "^3.3.2" loose-envify "^1.4.0" prop-types "^15.7.2" - react-is "^16.9.0" + react-is "^16.13.1" react-refresh@^0.9.0: version "0.9.0" @@ -11875,7 +11886,7 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redux@^4.0.4: +redux@^4.0.0, redux@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== @@ -13858,11 +13869,6 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.0.tgz#2edfa6382d48653707344f7fccdb0443d460e8d6" - integrity sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -13878,6 +13884,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.0.2.tgz#3f9c39982859f385c77c38b7e5f1432b8a3661c6" + integrity sha512-a720oz3Kjbp3ll0zkeN9qjRhO7I34MKMhPGQiQJAmaZQZQ1lo+NWThK322f7sXV+kTg9B1Ybt16KgBXWgteT8w== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"