From 884f8ae5237af33a4e1a03a69d2dcce0ee844566 Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 6 May 2021 17:07:57 +0300 Subject: [PATCH] mobx-6 migration -- remove @autobind as class-decorator Signed-off-by: Roman --- package.json | 2 +- src/common/configure-packages.ts | 1 + src/common/ipc/ipc.ts | 1 + src/common/utils/autobind.ts | 20 ++++++--- src/extensions/registries/page-registry.ts | 2 +- src/renderer/api/api-manager.ts | 4 +- .../api/endpoints/cluster-role.api.ts | 2 - src/renderer/api/endpoints/configmap.api.ts | 2 - src/renderer/api/endpoints/cron-job.api.ts | 25 +++-------- src/renderer/api/endpoints/daemon-set.api.ts | 9 +++- src/renderer/api/endpoints/deployment.api.ts | 9 +++- src/renderer/api/endpoints/endpoint.api.ts | 9 +++- src/renderer/api/endpoints/events.api.ts | 9 +++- src/renderer/api/endpoints/helm-charts.api.ts | 4 +- .../api/endpoints/helm-releases.api.ts | 4 +- src/renderer/api/endpoints/ingress.api.ts | 9 +++- src/renderer/api/endpoints/job.api.ts | 9 +++- src/renderer/api/endpoints/limit-range.api.ts | 9 +++- src/renderer/api/endpoints/namespaces.api.ts | 9 +++- .../api/endpoints/network-policy.api.ts | 9 +++- src/renderer/api/endpoints/nodes.api.ts | 9 +++- .../endpoints/persistent-volume-claims.api.ts | 9 +++- .../api/endpoints/persistent-volume.api.ts | 9 +++- .../api/endpoints/poddisruptionbudget.api.ts | 9 +++- src/renderer/api/endpoints/pods.api.ts | 9 +++- .../api/endpoints/podsecuritypolicy.api.ts | 9 +++- src/renderer/api/endpoints/replica-set.api.ts | 10 ++++- .../api/endpoints/role-binding.api.ts | 9 +++- src/renderer/api/endpoints/secret.api.ts | 15 +++---- .../api/endpoints/service-accounts.api.ts | 9 +++- src/renderer/api/endpoints/service.api.ts | 9 +++- .../api/endpoints/stateful-set.api.ts | 9 +++- .../api/endpoints/storage-class.api.ts | 9 +++- src/renderer/api/kube-object.ts | 4 +- src/renderer/api/kube-watch-api.ts | 4 +- .../+apps-helm-charts/helm-chart.store.ts | 4 +- .../+apps-releases/release.store.ts | 5 ++- .../+catalog/catalog-entity.store.ts | 4 +- .../+cluster/cluster-overview.store.ts | 5 ++- .../+config-autoscalers/hpa.store.ts | 2 - .../limit-ranges.store.ts | 2 - .../+config-maps/config-maps.store.ts | 2 - .../pod-disruption-budgets.store.ts | 4 +- .../resource-quotas.store.ts | 2 - .../+config-secrets/secrets.store.ts | 2 - .../+custom-resources/crd-resource.store.ts | 2 - .../components/+custom-resources/crd.store.ts | 4 +- .../components/+events/event.store.ts | 8 +++- .../components/+namespaces/namespace.store.ts | 5 ++- .../+network-endpoints/endpoints.store.ts | 2 - .../+network-ingresses/ingress.store.ts | 4 +- .../+network-policies/network-policy.store.ts | 2 - .../+network-services/services.store.ts | 2 - src/renderer/components/+nodes/nodes.store.ts | 4 +- .../pod-security-policies.store.ts | 2 - .../+storage-classes/storage-class.store.ts | 8 +++- .../volume-claim.store.ts | 4 +- .../+storage-volumes/volumes.store.ts | 8 +++- .../role-bindings.store.ts | 8 +++- .../+user-management-roles/roles.store.ts | 8 +++- .../service-accounts.store.ts | 8 +++- .../+workloads-cronjobs/cronjob.store.ts | 8 +++- .../+workloads-daemonsets/daemonsets.store.ts | 4 +- .../deployments.store.ts | 4 +- .../components/+workloads-jobs/job.store.ts | 8 +++- .../components/+workloads-pods/pods.store.ts | 4 +- .../replicasets.store.ts | 4 +- .../statefulset.store.ts | 5 ++- .../components/dock/create-resource.store.ts | 5 +-- .../components/dock/dock-tab.store.ts | 5 ++- src/renderer/components/dock/dock.store.ts | 14 +++--- .../components/dock/edit-resource.store.ts | 4 +- src/renderer/components/dock/log.store.ts | 5 ++- .../components/dock/terminal.store.ts | 5 ++- .../item-object-list/page-filters.store.ts | 5 ++- src/renderer/components/menu/menu.tsx | 15 +++++-- .../notifications/notifications.store.tsx | 4 +- src/renderer/navigation/page-param.ts | 1 + src/renderer/theme.store.ts | 4 +- yarn.lock | 44 +++---------------- 80 files changed, 316 insertions(+), 223 deletions(-) diff --git a/package.json b/package.json index 73993aeedb..ed5174145d 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "@kubernetes/client-node": "^0.12.0", "abort-controller": "^3.0.0", "array-move": "^3.0.0", - "autobind-decorator": "^2.4.0", + "auto-bind": "^4.0.0", "await-lock": "^2.1.0", "byline": "^5.0.0", "chalk": "^4.1.0", diff --git a/src/common/configure-packages.ts b/src/common/configure-packages.ts index 2483e79b92..4274df149b 100644 --- a/src/common/configure-packages.ts +++ b/src/common/configure-packages.ts @@ -15,6 +15,7 @@ Object.defineProperty(Mobx, "toJS", { if (typeof data === "object" && !isObservable(data)) { return toJS(observable.box(data).get()); } + return toJS(data); } }); diff --git a/src/common/ipc/ipc.ts b/src/common/ipc/ipc.ts index 5b9adb7c85..b0bf845a19 100644 --- a/src/common/ipc/ipc.ts +++ b/src/common/ipc/ipc.ts @@ -12,6 +12,7 @@ const subFramesChannel = "ipc:get-sub-frames"; export function handleRequest(channel: string, listener: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any) { ipcMain.handle(channel, (event: Electron.IpcMainInvokeEvent, ...args: any[]) => { args = toJS(args); // unwrap possibly leaking observable values + return listener(event, ...args); }); } diff --git a/src/common/utils/autobind.ts b/src/common/utils/autobind.ts index e8160d5aac..9df08427d9 100644 --- a/src/common/utils/autobind.ts +++ b/src/common/utils/autobind.ts @@ -1,8 +1,16 @@ -// Decorator for binding class methods to proper "this"-context. -// API: https://github.com/andreypopp/autobind-decorator -import bindMethodOrClass from "autobind-decorator" +// Automatically bind methods to their class instance +// API: https://github.com/sindresorhus/auto-bind +import autoBindClass, { Options } from "auto-bind"; +import autoBindReactClass from "auto-bind/react"; -// TODO: unwrap, replace calls @autobind() to @autobind -export function autobind() { - return bindMethodOrClass; +export function autoBind(obj: T, opts?: Options): T { + if ("componentWillUnmount" in obj) { + return autoBindReactClass(obj as any, opts); + } + + return autoBindClass(obj, opts); +} + +export function autobind(): any { + return (): void => undefined; // noop } diff --git a/src/extensions/registries/page-registry.ts b/src/extensions/registries/page-registry.ts index 93d28f4fb0..db3e2eef4f 100644 --- a/src/extensions/registries/page-registry.ts +++ b/src/extensions/registries/page-registry.ts @@ -117,7 +117,7 @@ export class PageRegistry extends BaseRegistry throw new Error( `PageRegistry: param's "${paramName}" initialization has failed: paramInit.parse() and paramInit.stringify() are required for non string | string[] "defaultValue"` - ) + ); } paramInit.defaultValue = value; diff --git a/src/renderer/api/api-manager.ts b/src/renderer/api/api-manager.ts index f30e0816ed..7d829ada88 100644 --- a/src/renderer/api/api-manager.ts +++ b/src/renderer/api/api-manager.ts @@ -1,16 +1,16 @@ import type { KubeObjectStore } from "../kube-object.store"; import { action, observable, makeObservable } from "mobx"; -import { autobind } from "../utils"; +import { autoBind } from "../utils"; import { KubeApi, parseKubeApi } from "./kube-api"; -@autobind() export class ApiManager { private apis = observable.map(); private stores = observable.map(); constructor() { makeObservable(this); + autoBind(this); } getApi(pathOrCallback: string | ((api: KubeApi) => boolean)) { diff --git a/src/renderer/api/endpoints/cluster-role.api.ts b/src/renderer/api/endpoints/cluster-role.api.ts index 9e3c90ca2e..34397ab94c 100644 --- a/src/renderer/api/endpoints/cluster-role.api.ts +++ b/src/renderer/api/endpoints/cluster-role.api.ts @@ -1,8 +1,6 @@ -import { autobind } from "../../utils"; import { Role } from "./role.api"; import { KubeApi } from "../kube-api"; -@autobind() export class ClusterRole extends Role { static kind = "ClusterRole"; static namespaced = false; diff --git a/src/renderer/api/endpoints/configmap.api.ts b/src/renderer/api/endpoints/configmap.api.ts index 042fb59d86..ab3c7562b7 100644 --- a/src/renderer/api/endpoints/configmap.api.ts +++ b/src/renderer/api/endpoints/configmap.api.ts @@ -1,9 +1,7 @@ import { KubeObject } from "../kube-object"; import { KubeJsonApiData } from "../kube-json-api"; -import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; -@autobind() export class ConfigMap extends KubeObject { static kind = "ConfigMap"; static namespaced = true; diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index 5063fbd66c..4b317eac62 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -2,8 +2,9 @@ import moment from "moment"; import { KubeObject } from "../kube-object"; import { IPodContainer } from "./pods.api"; import { formatDuration } from "../../utils/formatDuration"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class CronJobApi extends KubeApi { suspend(params: { namespace: string; name: string }) { @@ -37,28 +38,16 @@ export class CronJobApi extends KubeApi { } } -@autobind() export class CronJob extends KubeObject { static kind = "CronJob"; static namespaced = true; static apiBase = "/apis/batch/v1beta1/cronjobs"; - kind: string; - apiVersion: string; - metadata: { - name: string; - namespace: string; - selfLink: string; - uid: string; - resourceVersion: string; - creationTimestamp: string; - labels: { - [key: string]: string; - }; - annotations: { - [key: string]: string; - }; - }; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { schedule: string; concurrencyPolicy: string; diff --git a/src/renderer/api/endpoints/daemon-set.api.ts b/src/renderer/api/endpoints/daemon-set.api.ts index 8dab807517..1a114174cb 100644 --- a/src/renderer/api/endpoints/daemon-set.api.ts +++ b/src/renderer/api/endpoints/daemon-set.api.ts @@ -1,15 +1,20 @@ import get from "lodash/get"; import { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class DaemonSet extends WorkloadKubeObject { static kind = "DaemonSet"; static namespaced = true; static apiBase = "/apis/apps/v1/daemonsets"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { selector: { matchLabels: { diff --git a/src/renderer/api/endpoints/deployment.api.ts b/src/renderer/api/endpoints/deployment.api.ts index 107e970d98..fa67953312 100644 --- a/src/renderer/api/endpoints/deployment.api.ts +++ b/src/renderer/api/endpoints/deployment.api.ts @@ -1,8 +1,9 @@ import moment from "moment"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class DeploymentApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -66,12 +67,16 @@ interface IContainerProbe { failureThreshold?: number; } -@autobind() export class Deployment extends WorkloadKubeObject { static kind = "Deployment"; static namespaced = true; static apiBase = "/apis/apps/v1/deployments"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { replicas: number; selector: { matchLabels: { [app: string]: string } }; diff --git a/src/renderer/api/endpoints/endpoint.api.ts b/src/renderer/api/endpoints/endpoint.api.ts index d19c2f127e..15821d4442 100644 --- a/src/renderer/api/endpoints/endpoint.api.ts +++ b/src/renderer/api/endpoints/endpoint.api.ts @@ -1,6 +1,7 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export interface IEndpointPort { name?: string; @@ -100,7 +101,6 @@ export class EndpointSubset implements IEndpointSubset { } } -@autobind() export class Endpoint extends KubeObject { static kind = "Endpoints"; static namespaced = true; @@ -108,6 +108,11 @@ export class Endpoint extends KubeObject { subsets: IEndpointSubset[]; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + getEndpointSubsets(): EndpointSubset[] { const subsets = this.subsets || []; diff --git a/src/renderer/api/endpoints/events.api.ts b/src/renderer/api/endpoints/events.api.ts index 4fb21aaaa5..bbb2606928 100644 --- a/src/renderer/api/endpoints/events.api.ts +++ b/src/renderer/api/endpoints/events.api.ts @@ -1,15 +1,20 @@ import moment from "moment"; import { KubeObject } from "../kube-object"; import { formatDuration } from "../../utils/formatDuration"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class KubeEvent extends KubeObject { static kind = "Event"; static namespaced = true; static apiBase = "/api/v1/events"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + involvedObject: { kind: string; namespace: string; diff --git a/src/renderer/api/endpoints/helm-charts.api.ts b/src/renderer/api/endpoints/helm-charts.api.ts index 9d4b5d4575..b57e3ced04 100644 --- a/src/renderer/api/endpoints/helm-charts.api.ts +++ b/src/renderer/api/endpoints/helm-charts.api.ts @@ -1,7 +1,7 @@ import { compile } from "path-to-regexp"; import { apiBase } from "../index"; import { stringify } from "querystring"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; export type RepoHelmChartList = Record; export type HelmChartList = Record; @@ -62,10 +62,10 @@ export async function getChartValues(repo: string, name: string, version: string return apiBase.get(`/v2/charts/${repo}/${name}/values?${stringify({ version })}`); } -@autobind() export class HelmChart { constructor(data: any) { Object.assign(this, data); + autoBind(this); } static create(data: any) { diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index a0556a9a91..5dd69f4032 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -1,6 +1,6 @@ import jsYaml from "js-yaml"; import { compile } from "path-to-regexp"; -import { autobind, formatDuration } from "../../utils"; +import { autoBind, formatDuration } from "../../utils"; import capitalize from "lodash/capitalize"; import { apiBase } from "../index"; import { helmChartStore } from "../../components/+apps-helm-charts/helm-chart.store"; @@ -134,10 +134,10 @@ export async function rollbackRelease(name: string, namespace: string, revision: }); } -@autobind() export class HelmRelease implements ItemObject { constructor(data: any) { Object.assign(this, data); + autoBind(this); } static create(data: any) { diff --git a/src/renderer/api/endpoints/ingress.api.ts b/src/renderer/api/endpoints/ingress.api.ts index 7d035ad591..ee7e4fadd4 100644 --- a/src/renderer/api/endpoints/ingress.api.ts +++ b/src/renderer/api/endpoints/ingress.api.ts @@ -1,7 +1,8 @@ import { KubeObject } from "../kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IMetrics, metricsApi } from "./metrics.api"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class IngressApi extends KubeApi { getMetrics(ingress: string, namespace: string): Promise { @@ -61,12 +62,16 @@ export const getBackendServiceNamePort = (backend: IIngressBackend) => { return { serviceName, servicePort }; }; -@autobind() export class Ingress extends KubeObject { static kind = "Ingress"; static namespaced = true; static apiBase = "/apis/networking.k8s.io/v1/ingresses"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { tls: { secretName: string; diff --git a/src/renderer/api/endpoints/job.api.ts b/src/renderer/api/endpoints/job.api.ts index 65b9bcfdc3..7a92a94fa6 100644 --- a/src/renderer/api/endpoints/job.api.ts +++ b/src/renderer/api/endpoints/job.api.ts @@ -1,16 +1,21 @@ import get from "lodash/get"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { IPodContainer } from "./pods.api"; import { KubeApi } from "../kube-api"; import { JsonApiParams } from "../json-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class Job extends WorkloadKubeObject { static kind = "Job"; static namespaced = true; static apiBase = "/apis/batch/v1/jobs"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { parallelism?: number; completions?: number; diff --git a/src/renderer/api/endpoints/limit-range.api.ts b/src/renderer/api/endpoints/limit-range.api.ts index bbb3941c87..a97ca28c43 100644 --- a/src/renderer/api/endpoints/limit-range.api.ts +++ b/src/renderer/api/endpoints/limit-range.api.ts @@ -1,6 +1,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; +import { KubeJsonApiData } from "../kube-json-api"; export enum LimitType { CONTAINER = "Container", @@ -29,12 +30,16 @@ export interface LimitRangeItem extends LimitRangeParts { type: string } -@autobind() export class LimitRange extends KubeObject { static kind = "LimitRange"; static namespaced = true; static apiBase = "/api/v1/limitranges"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { limits: LimitRangeItem[]; }; diff --git a/src/renderer/api/endpoints/namespaces.api.ts b/src/renderer/api/endpoints/namespaces.api.ts index 430565bf57..848a34bd32 100644 --- a/src/renderer/api/endpoints/namespaces.api.ts +++ b/src/renderer/api/endpoints/namespaces.api.ts @@ -1,18 +1,23 @@ import { KubeApi } from "../kube-api"; import { KubeObject } from "../kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; +import { KubeJsonApiData } from "../kube-json-api"; export enum NamespaceStatus { ACTIVE = "Active", TERMINATING = "Terminating", } -@autobind() export class Namespace extends KubeObject { static kind = "Namespace"; static namespaced = false; static apiBase = "/api/v1/namespaces"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + status?: { phase: string; }; diff --git a/src/renderer/api/endpoints/network-policy.api.ts b/src/renderer/api/endpoints/network-policy.api.ts index eb531990c2..72e828bfc0 100644 --- a/src/renderer/api/endpoints/network-policy.api.ts +++ b/src/renderer/api/endpoints/network-policy.api.ts @@ -1,6 +1,7 @@ import { KubeObject } from "../kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export interface IPolicyIpBlock { cidr: string; @@ -35,12 +36,16 @@ export interface IPolicyEgress { }[]; } -@autobind() export class NetworkPolicy extends KubeObject { static kind = "NetworkPolicy"; static namespaced = true; static apiBase = "/apis/networking.k8s.io/v1/networkpolicies"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { podSelector: { matchLabels: { diff --git a/src/renderer/api/endpoints/nodes.api.ts b/src/renderer/api/endpoints/nodes.api.ts index d1794f0fb7..a95cff26a4 100644 --- a/src/renderer/api/endpoints/nodes.api.ts +++ b/src/renderer/api/endpoints/nodes.api.ts @@ -1,7 +1,8 @@ import { KubeObject } from "../kube-object"; -import { autobind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; +import { autoBind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; import { IMetrics, metricsApi } from "./metrics.api"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class NodesApi extends KubeApi { getMetrics(): Promise { @@ -28,12 +29,16 @@ export interface INodeMetrics { fsSize: T; } -@autobind() export class Node extends KubeObject { static kind = "Node"; static namespaced = false; static apiBase = "/api/v1/nodes"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { podCIDR: string; externalID: string; diff --git a/src/renderer/api/endpoints/persistent-volume-claims.api.ts b/src/renderer/api/endpoints/persistent-volume-claims.api.ts index 1d9e1f1dce..dab5040cdc 100644 --- a/src/renderer/api/endpoints/persistent-volume-claims.api.ts +++ b/src/renderer/api/endpoints/persistent-volume-claims.api.ts @@ -1,8 +1,9 @@ import { KubeObject } from "../kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IMetrics, metricsApi } from "./metrics.api"; import { Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class PersistentVolumeClaimsApi extends KubeApi { getMetrics(pvcName: string, namespace: string): Promise { @@ -21,12 +22,16 @@ export interface IPvcMetrics { diskCapacity: T; } -@autobind() export class PersistentVolumeClaim extends KubeObject { static kind = "PersistentVolumeClaim"; static namespaced = true; static apiBase = "/api/v1/persistentvolumeclaims"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { accessModes: string[]; storageClassName: string; diff --git a/src/renderer/api/endpoints/persistent-volume.api.ts b/src/renderer/api/endpoints/persistent-volume.api.ts index db286db062..ce8f04eabd 100644 --- a/src/renderer/api/endpoints/persistent-volume.api.ts +++ b/src/renderer/api/endpoints/persistent-volume.api.ts @@ -1,14 +1,19 @@ import { KubeObject } from "../kube-object"; import { unitsToBytes } from "../../utils/convertMemory"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class PersistentVolume extends KubeObject { static kind = "PersistentVolume"; static namespaced = false; static apiBase = "/api/v1/persistentvolumes"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { capacity: { storage: string; // 8Gi diff --git a/src/renderer/api/endpoints/poddisruptionbudget.api.ts b/src/renderer/api/endpoints/poddisruptionbudget.api.ts index 50ab2d5b3d..654e1785f5 100644 --- a/src/renderer/api/endpoints/poddisruptionbudget.api.ts +++ b/src/renderer/api/endpoints/poddisruptionbudget.api.ts @@ -1,13 +1,18 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class PodDisruptionBudget extends KubeObject { static kind = "PodDisruptionBudget"; static namespaced = true; static apiBase = "/apis/policy/v1beta1/poddisruptionbudgets"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { minAvailable: string; maxUnavailable: string; diff --git a/src/renderer/api/endpoints/pods.api.ts b/src/renderer/api/endpoints/pods.api.ts index d03e679414..fad991de37 100644 --- a/src/renderer/api/endpoints/pods.api.ts +++ b/src/renderer/api/endpoints/pods.api.ts @@ -1,7 +1,8 @@ import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IMetrics, metricsApi } from "./metrics.api"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class PodsApi extends KubeApi { async getLogs(params: { namespace: string; name: string }, query?: IPodLogsQuery): Promise { @@ -181,12 +182,16 @@ export interface IPodContainerStatus { started?: boolean; } -@autobind() export class Pod extends WorkloadKubeObject { static kind = "Pod"; static namespaced = true; static apiBase = "/api/v1/pods"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { volumes?: { name: string; diff --git a/src/renderer/api/endpoints/podsecuritypolicy.api.ts b/src/renderer/api/endpoints/podsecuritypolicy.api.ts index dc5113625d..f33d70299e 100644 --- a/src/renderer/api/endpoints/podsecuritypolicy.api.ts +++ b/src/renderer/api/endpoints/podsecuritypolicy.api.ts @@ -1,13 +1,18 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class PodSecurityPolicy extends KubeObject { static kind = "PodSecurityPolicy"; static namespaced = false; static apiBase = "/apis/policy/v1beta1/podsecuritypolicies"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { allowPrivilegeEscalation?: boolean; allowedCSIDrivers?: { diff --git a/src/renderer/api/endpoints/replica-set.api.ts b/src/renderer/api/endpoints/replica-set.api.ts index eb1131f645..e5795444b4 100644 --- a/src/renderer/api/endpoints/replica-set.api.ts +++ b/src/renderer/api/endpoints/replica-set.api.ts @@ -1,8 +1,9 @@ import get from "lodash/get"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { WorkloadKubeObject } from "../workload-kube-object"; import { IPodContainer, Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class ReplicaSetApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -27,11 +28,16 @@ export class ReplicaSetApi extends KubeApi { } } -@autobind() export class ReplicaSet extends WorkloadKubeObject { static kind = "ReplicaSet"; static namespaced = true; static apiBase = "/apis/apps/v1/replicasets"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { replicas?: number; selector: { matchLabels: { [app: string]: string } }; diff --git a/src/renderer/api/endpoints/role-binding.api.ts b/src/renderer/api/endpoints/role-binding.api.ts index 866656ee56..9fe103d0ae 100644 --- a/src/renderer/api/endpoints/role-binding.api.ts +++ b/src/renderer/api/endpoints/role-binding.api.ts @@ -1,6 +1,7 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export interface IRoleBindingSubject { kind: string; @@ -9,12 +10,16 @@ export interface IRoleBindingSubject { apiGroup?: string; } -@autobind() export class RoleBinding extends KubeObject { static kind = "RoleBinding"; static namespaced = true; static apiBase = "/apis/rbac.authorization.k8s.io/v1/rolebindings"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + subjects?: IRoleBindingSubject[]; roleRef: { kind: string; diff --git a/src/renderer/api/endpoints/secret.api.ts b/src/renderer/api/endpoints/secret.api.ts index 16262570df..8710c5f2ca 100644 --- a/src/renderer/api/endpoints/secret.api.ts +++ b/src/renderer/api/endpoints/secret.api.ts @@ -1,6 +1,6 @@ import { KubeObject } from "../kube-object"; import { KubeJsonApiData } from "../kube-json-api"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; export enum SecretType { @@ -19,22 +19,21 @@ export interface ISecretRef { name: string; } -@autobind() export class Secret extends KubeObject { static kind = "Secret"; static namespaced = true; static apiBase = "/api/v1/secrets"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + type: SecretType; data: { [prop: string]: string; token?: string; - }; - - constructor(data: KubeJsonApiData) { - super(data); - this.data = this.data || {}; - } + } = {}; getKeys(): string[] { return Object.keys(this.data); diff --git a/src/renderer/api/endpoints/service-accounts.api.ts b/src/renderer/api/endpoints/service-accounts.api.ts index 9f449cdec4..f502e792bd 100644 --- a/src/renderer/api/endpoints/service-accounts.api.ts +++ b/src/renderer/api/endpoints/service-accounts.api.ts @@ -1,13 +1,18 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class ServiceAccount extends KubeObject { static kind = "ServiceAccount"; static namespaced = true; static apiBase = "/api/v1/serviceaccounts"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + secrets?: { name: string; }[]; diff --git a/src/renderer/api/endpoints/service.api.ts b/src/renderer/api/endpoints/service.api.ts index 6c02873139..9dce4df628 100644 --- a/src/renderer/api/endpoints/service.api.ts +++ b/src/renderer/api/endpoints/service.api.ts @@ -1,6 +1,7 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export interface IServicePort { name?: string; @@ -29,12 +30,16 @@ export class ServicePort implements IServicePort { } } -@autobind() export class Service extends KubeObject { static kind = "Service"; static namespaced = true; static apiBase = "/api/v1/services"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { type: string; clusterIP: string; diff --git a/src/renderer/api/endpoints/stateful-set.api.ts b/src/renderer/api/endpoints/stateful-set.api.ts index add2a554ba..cad00a365d 100644 --- a/src/renderer/api/endpoints/stateful-set.api.ts +++ b/src/renderer/api/endpoints/stateful-set.api.ts @@ -1,8 +1,9 @@ import get from "lodash/get"; import { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; export class StatefulSetApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { @@ -27,12 +28,16 @@ export class StatefulSetApi extends KubeApi { } } -@autobind() export class StatefulSet extends WorkloadKubeObject { static kind = "StatefulSet"; static namespaced = true; static apiBase = "/apis/apps/v1/statefulsets"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + spec: { serviceName: string; replicas: number; diff --git a/src/renderer/api/endpoints/storage-class.api.ts b/src/renderer/api/endpoints/storage-class.api.ts index 085701742c..f49fe9b0b5 100644 --- a/src/renderer/api/endpoints/storage-class.api.ts +++ b/src/renderer/api/endpoints/storage-class.api.ts @@ -1,13 +1,18 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; +import { KubeJsonApiData } from "../kube-json-api"; -@autobind() export class StorageClass extends KubeObject { static kind = "StorageClass"; static namespaced = false; static apiBase = "/apis/storage.k8s.io/v1/storageclasses"; + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } + provisioner: string; // e.g. "storage.k8s.io/v1" mountOptions?: string[]; volumeBindingMode: string; diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 8699a3c94f..2e296496c6 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -2,7 +2,7 @@ import moment from "moment"; import { KubeJsonApiData, KubeJsonApiDataList, KubeJsonApiListMetadata, KubeJsonApiMetadata } from "./kube-json-api"; -import { autobind, formatDuration } from "../utils"; +import { autoBind, formatDuration } from "../utils"; import { ItemObject } from "../item.store"; import { apiKube } from "./index"; import { JsonApiParams } from "./json-api"; @@ -66,7 +66,6 @@ export class KubeStatus { export type IKubeMetaField = keyof IKubeObjectMetadata; -@autobind() export class KubeObject implements ItemObject { static readonly kind: string; static readonly namespaced: boolean; @@ -139,6 +138,7 @@ export class KubeObject implements ItemObject { constructor(data: KubeJsonApiData) { Object.assign(this, data); + autoBind(this); } apiVersion: string; diff --git a/src/renderer/api/kube-watch-api.ts b/src/renderer/api/kube-watch-api.ts index 4599626c08..4574820dc1 100644 --- a/src/renderer/api/kube-watch-api.ts +++ b/src/renderer/api/kube-watch-api.ts @@ -6,7 +6,7 @@ import type { ClusterContext } from "../components/context"; import plimit from "p-limit"; import { comparer, IReactionDisposer, observable, reaction, when, makeObservable } from "mobx"; -import { autobind, noop } from "../utils"; +import { autoBind, noop } from "../utils"; import { KubeApi } from "./kube-api"; import { KubeJsonApiData } from "./kube-json-api"; import { isDebugging, isProduction } from "../../common/vars"; @@ -29,7 +29,6 @@ export interface IKubeWatchLog { cssStyle?: string; } -@autobind() export class KubeWatchApi { @observable context: ClusterContext = null; @@ -37,6 +36,7 @@ export class KubeWatchApi { constructor() { makeObservable(this); + autoBind(this); } isAllowedApi(api: KubeApi): boolean { diff --git a/src/renderer/components/+apps-helm-charts/helm-chart.store.ts b/src/renderer/components/+apps-helm-charts/helm-chart.store.ts index 6d7df9b0d3..687008f04a 100644 --- a/src/renderer/components/+apps-helm-charts/helm-chart.store.ts +++ b/src/renderer/components/+apps-helm-charts/helm-chart.store.ts @@ -1,6 +1,6 @@ import semver from "semver"; import { observable, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { getChartDetails, HelmChart, listCharts } from "../../api/endpoints/helm-charts.api"; import { ItemStore } from "../../item.store"; import flatten from "lodash/flatten"; @@ -10,7 +10,6 @@ export interface IChartVersion { version: string; } -@autobind() export class HelmChartStore extends ItemStore { @observable versions = observable.map(); @@ -18,6 +17,7 @@ export class HelmChartStore extends ItemStore { super(); makeObservable(this); + autoBind(this); } async loadAll() { diff --git a/src/renderer/components/+apps-releases/release.store.ts b/src/renderer/components/+apps-releases/release.store.ts index 35d248cf58..606cfd3d0a 100644 --- a/src/renderer/components/+apps-releases/release.store.ts +++ b/src/renderer/components/+apps-releases/release.store.ts @@ -1,6 +1,6 @@ import isEqual from "lodash/isEqual"; import { action, observable, reaction, when, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { createRelease, deleteRelease, HelmRelease, IReleaseCreatePayload, IReleaseUpdatePayload, listReleases, rollbackRelease, updateRelease } from "../../api/endpoints/helm-releases.api"; import { ItemStore } from "../../item.store"; import { Secret } from "../../api/endpoints"; @@ -8,13 +8,14 @@ import { secretsStore } from "../+config-secrets/secrets.store"; import { namespaceStore } from "../+namespaces/namespace.store"; import { Notifications } from "../notifications"; -@autobind() export class ReleaseStore extends ItemStore { releaseSecrets = observable.map(); constructor() { super(); makeObservable(this); + autoBind(this); + when(() => secretsStore.isLoaded, () => { this.releaseSecrets.replace(this.getReleaseSecrets()); }); diff --git a/src/renderer/components/+catalog/catalog-entity.store.ts b/src/renderer/components/+catalog/catalog-entity.store.ts index e5f59ea1d7..2900a5fb08 100644 --- a/src/renderer/components/+catalog/catalog-entity.store.ts +++ b/src/renderer/components/+catalog/catalog-entity.store.ts @@ -2,7 +2,7 @@ import { action, computed, IReactionDisposer, observable, reaction, makeObservab import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; import { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; import { ItemObject, ItemStore } from "../../item.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { CatalogCategory } from "../../../common/catalog"; export class CatalogEntityItem implements ItemObject { @@ -65,7 +65,6 @@ export class CatalogEntityItem implements ItemObject { } } -@autobind() export class CatalogEntityStore extends ItemStore { @observable activeCategory?: CatalogCategory; @@ -73,6 +72,7 @@ export class CatalogEntityStore extends ItemStore { super(); makeObservable(this); + autoBind(this); } @computed get entities() { diff --git a/src/renderer/components/+cluster/cluster-overview.store.ts b/src/renderer/components/+cluster/cluster-overview.store.ts index 500039762f..49f9d86875 100644 --- a/src/renderer/components/+cluster/cluster-overview.store.ts +++ b/src/renderer/components/+cluster/cluster-overview.store.ts @@ -1,7 +1,7 @@ import { action, observable, reaction, when, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; import { Cluster, clusterApi, IClusterMetrics } from "../../api/endpoints"; -import { autobind, createStorage } from "../../utils"; +import { autoBind, createStorage } from "../../utils"; import { IMetricsReqParams, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { nodesStore } from "../+nodes/nodes.store"; import { apiManager } from "../../api/api-manager"; @@ -21,7 +21,6 @@ export interface ClusterOverviewStorageState { metricNodeRole: MetricNodeRole, } -@autobind() export class ClusterOverviewStore extends KubeObjectStore implements ClusterOverviewStorageState { api = clusterApi; @@ -52,6 +51,8 @@ export class ClusterOverviewStore extends KubeObjectStore implements Cl constructor() { super(); makeObservable(this); + autoBind(this); + this.init(); } diff --git a/src/renderer/components/+config-autoscalers/hpa.store.ts b/src/renderer/components/+config-autoscalers/hpa.store.ts index 478c2ca563..f45a7f9d64 100644 --- a/src/renderer/components/+config-autoscalers/hpa.store.ts +++ b/src/renderer/components/+config-autoscalers/hpa.store.ts @@ -1,9 +1,7 @@ -import { autobind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; import { HorizontalPodAutoscaler, hpaApi } from "../../api/endpoints/hpa.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class HPAStore extends KubeObjectStore { api = hpaApi; } diff --git a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts b/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts index bd760efadd..f5311c02f8 100644 --- a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts +++ b/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts @@ -1,9 +1,7 @@ -import { autobind } from "../../../common/utils/autobind"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; import { LimitRange, limitRangeApi } from "../../api/endpoints/limit-range.api"; -@autobind() export class LimitRangesStore extends KubeObjectStore { api = limitRangeApi; } diff --git a/src/renderer/components/+config-maps/config-maps.store.ts b/src/renderer/components/+config-maps/config-maps.store.ts index 23a80a9f4a..151203e0dc 100644 --- a/src/renderer/components/+config-maps/config-maps.store.ts +++ b/src/renderer/components/+config-maps/config-maps.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { ConfigMap, configMapApi } from "../../api/endpoints/configmap.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class ConfigMapsStore extends KubeObjectStore { api = configMapApi; } diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts index 0f0d79ab2d..04fd163ea9 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; -import { PodDisruptionBudget, pdbApi } from "../../api/endpoints/poddisruptionbudget.api"; +import { pdbApi, PodDisruptionBudget } from "../../api/endpoints/poddisruptionbudget.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class PodDisruptionBudgetsStore extends KubeObjectStore { api = pdbApi; } diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts b/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts index 554fec891a..5b62683d46 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { ResourceQuota, resourceQuotaApi } from "../../api/endpoints/resource-quota.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class ResourceQuotasStore extends KubeObjectStore { api = resourceQuotaApi; } diff --git a/src/renderer/components/+config-secrets/secrets.store.ts b/src/renderer/components/+config-secrets/secrets.store.ts index 9dfc8cb6af..1eb39a4e85 100644 --- a/src/renderer/components/+config-secrets/secrets.store.ts +++ b/src/renderer/components/+config-secrets/secrets.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { Secret, secretsApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; -@autobind() export class SecretsStore extends KubeObjectStore { api = secretsApi; } diff --git a/src/renderer/components/+custom-resources/crd-resource.store.ts b/src/renderer/components/+custom-resources/crd-resource.store.ts index 963ca3cd17..18ab9c029a 100644 --- a/src/renderer/components/+custom-resources/crd-resource.store.ts +++ b/src/renderer/components/+custom-resources/crd-resource.store.ts @@ -1,9 +1,7 @@ -import { autobind } from "../../utils"; import { KubeApi } from "../../api/kube-api"; import { KubeObjectStore } from "../../kube-object.store"; import { KubeObject } from "../../api/kube-object"; -@autobind() export class CRDResourceStore extends KubeObjectStore { api: KubeApi; diff --git a/src/renderer/components/+custom-resources/crd.store.ts b/src/renderer/components/+custom-resources/crd.store.ts index a8d95ab200..ad0f673736 100644 --- a/src/renderer/components/+custom-resources/crd.store.ts +++ b/src/renderer/components/+custom-resources/crd.store.ts @@ -1,6 +1,6 @@ import { computed, reaction, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { crdApi, CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { apiManager } from "../../api/api-manager"; import { KubeApi } from "../../api/kube-api"; @@ -18,7 +18,6 @@ function initStore(crd: CustomResourceDefinition) { } } -@autobind() export class CRDStore extends KubeObjectStore { api = crdApi; @@ -26,6 +25,7 @@ export class CRDStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); // auto-init stores for crd-s reaction(() => this.items.toJSON(), items => items.forEach(initStore)); diff --git a/src/renderer/components/+events/event.store.ts b/src/renderer/components/+events/event.store.ts index 03d272643f..f28d7919c5 100644 --- a/src/renderer/components/+events/event.store.ts +++ b/src/renderer/components/+events/event.store.ts @@ -1,19 +1,23 @@ import groupBy from "lodash/groupBy"; import compact from "lodash/compact"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { eventApi, KubeEvent } from "../../api/endpoints/events.api"; import { KubeObject } from "../../api/kube-object"; import { Pod } from "../../api/endpoints/pods.api"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class EventStore extends KubeObjectStore { api = eventApi; limit = 1000; saveLimit = 50000; + constructor() { + super(); + autoBind(this); + } + protected bindWatchEventsUpdater() { return super.bindWatchEventsUpdater(5000); } diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index fb92c942c0..56ac39bb32 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -8,7 +8,7 @@ import { reaction, makeObservable, } from "mobx"; -import { autobind, createStorage } from "../../utils"; +import { autoBind, createStorage } from "../../utils"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { Namespace, namespacesApi } from "../../api/endpoints/namespaces.api"; import { createPageParam } from "../../navigation"; @@ -34,7 +34,6 @@ export function getDummyNamespace(name: string) { }); } -@autobind() export class NamespaceStore extends KubeObjectStore { api = namespacesApi; @@ -43,6 +42,8 @@ export class NamespaceStore extends KubeObjectStore { constructor() { super(); makeObservable(this); + autoBind(this); + this.init(); } diff --git a/src/renderer/components/+network-endpoints/endpoints.store.ts b/src/renderer/components/+network-endpoints/endpoints.store.ts index d61a12126e..db19e927c3 100644 --- a/src/renderer/components/+network-endpoints/endpoints.store.ts +++ b/src/renderer/components/+network-endpoints/endpoints.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { Endpoint, endpointApi } from "../../api/endpoints/endpoint.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class EndpointStore extends KubeObjectStore { api = endpointApi; } diff --git a/src/renderer/components/+network-ingresses/ingress.store.ts b/src/renderer/components/+network-ingresses/ingress.store.ts index a80599fdcd..ea7ca190de 100644 --- a/src/renderer/components/+network-ingresses/ingress.store.ts +++ b/src/renderer/components/+network-ingresses/ingress.store.ts @@ -1,10 +1,9 @@ import { observable, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IIngressMetrics, Ingress, ingressApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; -@autobind() export class IngressStore extends KubeObjectStore { api = ingressApi; @observable metrics: IIngressMetrics = null; @@ -13,6 +12,7 @@ export class IngressStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } async loadMetrics(ingress: Ingress) { diff --git a/src/renderer/components/+network-policies/network-policy.store.ts b/src/renderer/components/+network-policies/network-policy.store.ts index e33a17fa09..5ee584dd93 100644 --- a/src/renderer/components/+network-policies/network-policy.store.ts +++ b/src/renderer/components/+network-policies/network-policy.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { NetworkPolicy, networkPolicyApi } from "../../api/endpoints/network-policy.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class NetworkPolicyStore extends KubeObjectStore { api = networkPolicyApi; } diff --git a/src/renderer/components/+network-services/services.store.ts b/src/renderer/components/+network-services/services.store.ts index 8c6d16d746..62c7c63736 100644 --- a/src/renderer/components/+network-services/services.store.ts +++ b/src/renderer/components/+network-services/services.store.ts @@ -1,9 +1,7 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; import { Service, serviceApi } from "../../api/endpoints/service.api"; import { apiManager } from "../../api/api-manager"; -@autobind() export class ServiceStore extends KubeObjectStore { api = serviceApi; } diff --git a/src/renderer/components/+nodes/nodes.store.ts b/src/renderer/components/+nodes/nodes.store.ts index 362ae378ac..de71cbe9d1 100644 --- a/src/renderer/components/+nodes/nodes.store.ts +++ b/src/renderer/components/+nodes/nodes.store.ts @@ -1,11 +1,10 @@ import { sum } from "lodash"; import { action, computed, observable, makeObservable } from "mobx"; import { clusterApi, IClusterMetrics, INodeMetrics, Node, nodesApi } from "../../api/endpoints"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class NodesStore extends KubeObjectStore { api = nodesApi; @@ -18,6 +17,7 @@ export class NodesStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } @action diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts b/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts index 53ecde3d9d..784aedb889 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts @@ -1,9 +1,7 @@ import { PodSecurityPolicy, pspApi } from "../../api/endpoints"; -import { autobind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class PodSecurityPoliciesStore extends KubeObjectStore { api = pspApi; } diff --git a/src/renderer/components/+storage-classes/storage-class.store.ts b/src/renderer/components/+storage-classes/storage-class.store.ts index 0050c432b5..37b88c2719 100644 --- a/src/renderer/components/+storage-classes/storage-class.store.ts +++ b/src/renderer/components/+storage-classes/storage-class.store.ts @@ -1,13 +1,17 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { StorageClass, storageClassApi } from "../../api/endpoints/storage-class.api"; import { apiManager } from "../../api/api-manager"; import { volumesStore } from "../+storage-volumes/volumes.store"; -@autobind() export class StorageClassStore extends KubeObjectStore { api = storageClassApi; + constructor() { + super(); + autoBind(this); + } + getPersistentVolumes(storageClass: StorageClass) { return volumesStore.getByStorageClass(storageClass); } diff --git a/src/renderer/components/+storage-volume-claims/volume-claim.store.ts b/src/renderer/components/+storage-volume-claims/volume-claim.store.ts index 41b4f3bcc6..f54c6c2e3e 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim.store.ts +++ b/src/renderer/components/+storage-volume-claims/volume-claim.store.ts @@ -1,10 +1,9 @@ import { action, observable, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { IPvcMetrics, PersistentVolumeClaim, pvcApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; -@autobind() export class VolumeClaimStore extends KubeObjectStore { api = pvcApi; @observable metrics: IPvcMetrics = null; @@ -13,6 +12,7 @@ export class VolumeClaimStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } @action diff --git a/src/renderer/components/+storage-volumes/volumes.store.ts b/src/renderer/components/+storage-volumes/volumes.store.ts index b2601f9b12..7ad9ed92a6 100644 --- a/src/renderer/components/+storage-volumes/volumes.store.ts +++ b/src/renderer/components/+storage-volumes/volumes.store.ts @@ -1,13 +1,17 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { PersistentVolume, persistentVolumeApi } from "../../api/endpoints/persistent-volume.api"; import { apiManager } from "../../api/api-manager"; import { StorageClass } from "../../api/endpoints/storage-class.api"; -@autobind() export class PersistentVolumesStore extends KubeObjectStore { api = persistentVolumeApi; + constructor() { + super(); + autoBind(this); + } + getByStorageClass(storageClass: StorageClass): PersistentVolume[] { return this.items.filter(volume => volume.getStorageClassName() === storageClass.getName() diff --git a/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts b/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts index 620fbd86ac..ecd1ec2010 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts +++ b/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts @@ -2,13 +2,17 @@ import difference from "lodash/difference"; import uniqBy from "lodash/uniqBy"; import { clusterRoleBindingApi, IRoleBindingSubject, RoleBinding, roleBindingApi } from "../../api/endpoints"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { apiManager } from "../../api/api-manager"; -@autobind() export class RoleBindingsStore extends KubeObjectStore { api = clusterRoleBindingApi; + constructor() { + super(); + autoBind(this); + } + getSubscribeApis() { return [clusterRoleBindingApi, roleBindingApi]; } diff --git a/src/renderer/components/+user-management-roles/roles.store.ts b/src/renderer/components/+user-management-roles/roles.store.ts index 82b0e66612..797e53d236 100644 --- a/src/renderer/components/+user-management-roles/roles.store.ts +++ b/src/renderer/components/+user-management-roles/roles.store.ts @@ -1,12 +1,16 @@ import { clusterRoleApi, Role, roleApi } from "../../api/endpoints"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class RolesStore extends KubeObjectStore { api = clusterRoleApi; + constructor() { + super(); + autoBind(this); + } + getSubscribeApis() { return [roleApi, clusterRoleApi]; } diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts b/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts index 808fcab046..562c7f0913 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts +++ b/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts @@ -1,12 +1,16 @@ -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { ServiceAccount, serviceAccountsApi } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class ServiceAccountsStore extends KubeObjectStore { api = serviceAccountsApi; + constructor() { + super(); + autoBind(this); + } + protected async createItem(params: { name: string; namespace?: string }) { await super.createItem(params); diff --git a/src/renderer/components/+workloads-cronjobs/cronjob.store.ts b/src/renderer/components/+workloads-cronjobs/cronjob.store.ts index 84fd0fc4f2..150df97608 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjob.store.ts +++ b/src/renderer/components/+workloads-cronjobs/cronjob.store.ts @@ -1,13 +1,17 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { CronJob, cronJobApi } from "../../api/endpoints/cron-job.api"; import { jobStore } from "../+workloads-jobs/job.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class CronJobStore extends KubeObjectStore { api = cronJobApi; + constructor() { + super(); + autoBind(this); + } + getStatuses(cronJobs?: CronJob[]) { const status = { suspended: 0, scheduled: 0 }; diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts index fd41192fee..faffa1f102 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts +++ b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts @@ -1,11 +1,10 @@ import { observable, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { DaemonSet, daemonSetApi, IPodMetrics, Pod, podsApi, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class DaemonSetStore extends KubeObjectStore { api = daemonSetApi; @@ -15,6 +14,7 @@ export class DaemonSetStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } async loadMetrics(daemonSet: DaemonSet) { diff --git a/src/renderer/components/+workloads-deployments/deployments.store.ts b/src/renderer/components/+workloads-deployments/deployments.store.ts index bf9c8e41d3..35a14b295a 100644 --- a/src/renderer/components/+workloads-deployments/deployments.store.ts +++ b/src/renderer/components/+workloads-deployments/deployments.store.ts @@ -1,11 +1,10 @@ import { observable, makeObservable } from "mobx"; import { Deployment, deploymentApi, IPodMetrics, podsApi, PodStatus } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class DeploymentStore extends KubeObjectStore { api = deploymentApi; @observable metrics: IPodMetrics = null; @@ -14,6 +13,7 @@ export class DeploymentStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } protected sortItems(items: Deployment[]) { diff --git a/src/renderer/components/+workloads-jobs/job.store.ts b/src/renderer/components/+workloads-jobs/job.store.ts index 41d514df8d..2ffdcbdec3 100644 --- a/src/renderer/components/+workloads-jobs/job.store.ts +++ b/src/renderer/components/+workloads-jobs/job.store.ts @@ -1,14 +1,18 @@ import { KubeObjectStore } from "../../kube-object.store"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { Job, jobApi } from "../../api/endpoints/job.api"; import { CronJob, Pod, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class JobStore extends KubeObjectStore { api = jobApi; + constructor() { + super(); + autoBind(this); + } + getChildPods(job: Job): Pod[] { return podsStore.getPodsByOwnerId(job.getId()); } diff --git a/src/renderer/components/+workloads-pods/pods.store.ts b/src/renderer/components/+workloads-pods/pods.store.ts index 6ae56e5066..d6ea41634e 100644 --- a/src/renderer/components/+workloads-pods/pods.store.ts +++ b/src/renderer/components/+workloads-pods/pods.store.ts @@ -1,12 +1,11 @@ import countBy from "lodash/countBy"; import { action, observable, makeObservable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { autobind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; +import { autoBind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; import { IPodMetrics, Pod, PodMetrics, podMetricsApi, podsApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; import { WorkloadKubeObject } from "../../api/workload-kube-object"; -@autobind() export class PodsStore extends KubeObjectStore { api = podsApi; @@ -17,6 +16,7 @@ export class PodsStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } @action diff --git a/src/renderer/components/+workloads-replicasets/replicasets.store.ts b/src/renderer/components/+workloads-replicasets/replicasets.store.ts index fbcb4f878b..24ccc9f3bb 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.store.ts +++ b/src/renderer/components/+workloads-replicasets/replicasets.store.ts @@ -1,12 +1,11 @@ import { observable, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; import { Deployment, IPodMetrics, podsApi, ReplicaSet, replicaSetApi } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; import { PodStatus } from "../../api/endpoints/pods.api"; -@autobind() export class ReplicaSetStore extends KubeObjectStore { api = replicaSetApi; @observable metrics: IPodMetrics = null; @@ -15,6 +14,7 @@ export class ReplicaSetStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } async loadMetrics(replicaSet: ReplicaSet) { diff --git a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts index 2faed90fb1..df0a947fcd 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts +++ b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts @@ -1,11 +1,10 @@ import { observable, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { KubeObjectStore } from "../../kube-object.store"; import { IPodMetrics, podsApi, PodStatus, StatefulSet, statefulSetApi } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; -@autobind() export class StatefulSetStore extends KubeObjectStore { api = statefulSetApi; @observable metrics: IPodMetrics = null; @@ -14,8 +13,10 @@ export class StatefulSetStore extends KubeObjectStore { super(); makeObservable(this); + autoBind(this); } + async loadMetrics(statefulSet: StatefulSet) { const pods = this.getChildPods(statefulSet); diff --git a/src/renderer/components/dock/create-resource.store.ts b/src/renderer/components/dock/create-resource.store.ts index bdc1f4c139..77d11e91a5 100644 --- a/src/renderer/components/dock/create-resource.store.ts +++ b/src/renderer/components/dock/create-resource.store.ts @@ -4,17 +4,16 @@ import os from "os"; import groupBy from "lodash/groupBy"; import filehound from "filehound"; import { watch } from "chokidar"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { DockTabStore } from "./dock-tab.store"; import { dockStore, IDockTab, TabKind } from "./dock.store"; -@autobind() export class CreateResourceStore extends DockTabStore { - constructor() { super({ storageKey: "create_resource" }); + autoBind(this); fs.ensureDirSync(this.userTemplatesFolder); } diff --git a/src/renderer/components/dock/dock-tab.store.ts b/src/renderer/components/dock/dock-tab.store.ts index f3c083d234..0757b8212f 100644 --- a/src/renderer/components/dock/dock-tab.store.ts +++ b/src/renderer/components/dock/dock-tab.store.ts @@ -1,5 +1,5 @@ import { autorun, observable, reaction, toJS } from "mobx"; -import { autobind, createStorage, StorageHelper } from "../../utils"; +import { autoBind, createStorage, StorageHelper } from "../../utils"; import { dockStore, TabId } from "./dock.store"; export interface DockTabStoreOptions { @@ -9,12 +9,13 @@ export interface DockTabStoreOptions { export type DockTabStorageState = Record; -@autobind() export class DockTabStore { protected storage?: StorageHelper>; protected data = observable.map(); constructor(protected options: DockTabStoreOptions = {}) { + autoBind(this); + this.options = { autoInit: true, ...this.options, diff --git a/src/renderer/components/dock/dock.store.ts b/src/renderer/components/dock/dock.store.ts index ece3dc334d..465abf3127 100644 --- a/src/renderer/components/dock/dock.store.ts +++ b/src/renderer/components/dock/dock.store.ts @@ -1,6 +1,6 @@ import MD5 from "crypto-js/md5"; import { action, computed, IReactionOptions, observable, reaction, makeObservable } from "mobx"; -import { autobind, createStorage } from "../../utils"; +import { autoBind, createStorage } from "../../utils"; import throttle from "lodash/throttle"; export type TabId = string; @@ -28,8 +28,13 @@ export interface DockStorageState { isOpen?: boolean; } -@autobind() export class DockStore implements DockStorageState { + constructor() { + makeObservable(this); + autoBind(this); + this.init(); + } + readonly minHeight = 100; @observable fullSize = false; @@ -80,11 +85,6 @@ export class DockStore implements DockStorageState { return this.tabs.find(tab => tab.id === this.selectedTabId); } - constructor() { - makeObservable(this); - this.init(); - } - private init() { // adjust terminal height if window size changes window.addEventListener("resize", throttle(this.adjustHeight, 250)); diff --git a/src/renderer/components/dock/edit-resource.store.ts b/src/renderer/components/dock/edit-resource.store.ts index c7c82048e1..90b603fd9f 100644 --- a/src/renderer/components/dock/edit-resource.store.ts +++ b/src/renderer/components/dock/edit-resource.store.ts @@ -1,4 +1,4 @@ -import { autobind, noop } from "../../utils"; +import { autoBind, noop } from "../../utils"; import { DockTabStore } from "./dock-tab.store"; import { autorun, IReactionDisposer } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; @@ -11,7 +11,6 @@ export interface EditingResource { draft?: string; // edited draft in yaml } -@autobind() export class EditResourceStore extends DockTabStore { private watchers = new Map(); @@ -19,6 +18,7 @@ export class EditResourceStore extends DockTabStore { super({ storageKey: "edit_resource_store", }); + autoBind(this); } protected async init() { diff --git a/src/renderer/components/dock/log.store.ts b/src/renderer/components/dock/log.store.ts index f7694ccdc4..0c7964a16f 100644 --- a/src/renderer/components/dock/log.store.ts +++ b/src/renderer/components/dock/log.store.ts @@ -1,7 +1,7 @@ import { autorun, computed, observable, makeObservable } from "mobx"; import { IPodLogsQuery, Pod, podsApi } from "../../api/endpoints"; -import { autobind, interval } from "../../utils"; +import { autoBind, interval } from "../../utils"; import { dockStore, TabId } from "./dock.store"; import { isLogsTab, logTabStore } from "./log-tab.store"; @@ -9,7 +9,6 @@ type PodLogLine = string; const logLinesToLoad = 500; -@autobind() export class LogStore { private refresher = interval(10, () => { const id = dockStore.selectedTabId; @@ -22,6 +21,8 @@ export class LogStore { constructor() { makeObservable(this); + autoBind(this); + autorun(() => { const { selectedTab, isOpen } = dockStore; diff --git a/src/renderer/components/dock/terminal.store.ts b/src/renderer/components/dock/terminal.store.ts index 1c5d0431ca..593c5f2c43 100644 --- a/src/renderer/components/dock/terminal.store.ts +++ b/src/renderer/components/dock/terminal.store.ts @@ -1,5 +1,5 @@ import { autorun, observable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { Terminal } from "./terminal"; import { TerminalApi } from "../../api/terminal-api"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; @@ -21,12 +21,13 @@ export function createTerminalTab(tabParams: Partial = {}) { }); } -@autobind() export class TerminalStore { protected terminals = new Map(); protected connections = observable.map(); constructor() { + autoBind(this); + // connect active tab autorun(() => { const { selectedTab, isOpen } = dockStore; diff --git a/src/renderer/components/item-object-list/page-filters.store.ts b/src/renderer/components/item-object-list/page-filters.store.ts index ef07fafab3..39deeea03e 100644 --- a/src/renderer/components/item-object-list/page-filters.store.ts +++ b/src/renderer/components/item-object-list/page-filters.store.ts @@ -1,5 +1,5 @@ import { computed, observable, reaction, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import { searchUrlParam } from "../input/search-input-url"; export enum FilterType { @@ -12,7 +12,6 @@ export interface Filter { value: string; } -@autobind() export class PageFiltersStore { protected filters = observable.array([], { deep: false }); protected isDisabled = observable.map(); @@ -23,6 +22,8 @@ export class PageFiltersStore { constructor() { makeObservable(this); + autoBind(this); + this.syncWithGlobalSearch(); } diff --git a/src/renderer/components/menu/menu.tsx b/src/renderer/components/menu/menu.tsx index f0d172b0d7..ff30b24c30 100644 --- a/src/renderer/components/menu/menu.tsx +++ b/src/renderer/components/menu/menu.tsx @@ -2,7 +2,7 @@ import "./menu.scss"; import React, { Fragment, ReactElement, ReactNode } from "react"; import { createPortal } from "react-dom"; -import { autobind, cssNames, noop } from "../../utils"; +import { autoBind, cssNames, noop } from "../../utils"; import { Animate } from "../animate"; import { Icon, IconProps } from "../icon"; @@ -47,14 +47,17 @@ const defaultPropsMenu: Partial = { toggleEvent: "click" }; -@autobind() export class Menu extends React.Component { static defaultProps = defaultPropsMenu as object; + constructor(props: MenuProps) { + super(props); + autoBind(this); + } + public opener: HTMLElement; public elem: HTMLUListElement; protected items: { [index: number]: MenuItem } = {}; - public state: State = {}; get isOpen() { @@ -319,7 +322,6 @@ const defaultPropsMenuItem: Partial = { onClick: noop, }; -@autobind() export class MenuItem extends React.Component { static defaultProps = defaultPropsMenuItem as object; static contextType = MenuContext; @@ -327,6 +329,11 @@ export class MenuItem extends React.Component { public context: MenuContextValue; public elem: HTMLElement; + constructor(props: MenuItemProps) { + super(props); + autoBind(this); + } + get isFocusable() { const { disabled, spacer } = this.props; diff --git a/src/renderer/components/notifications/notifications.store.tsx b/src/renderer/components/notifications/notifications.store.tsx index d1c18d2e19..93bc5a1421 100644 --- a/src/renderer/components/notifications/notifications.store.tsx +++ b/src/renderer/components/notifications/notifications.store.tsx @@ -1,6 +1,6 @@ import React from "react"; import { action, observable, makeObservable } from "mobx"; -import { autobind } from "../../utils"; +import { autoBind } from "../../utils"; import uniqueId from "lodash/uniqueId"; import { JsonApiErrorParsed } from "../../api/json-api"; @@ -21,7 +21,6 @@ export interface Notification { onClose?(): void; // additonal logic on when the notification times out or is closed by the "x" } -@autobind() export class NotificationsStore { public notifications = observable.array([], { deep: false }); @@ -29,6 +28,7 @@ export class NotificationsStore { constructor() { makeObservable(this); + autoBind(this); } getById(id: NotificationId): Notification | null { diff --git a/src/renderer/navigation/page-param.ts b/src/renderer/navigation/page-param.ts index d6d93f4813..7d99496004 100644 --- a/src/renderer/navigation/page-param.ts +++ b/src/renderer/navigation/page-param.ts @@ -103,6 +103,7 @@ export class PageParam { this.stringify(value).forEach(value => { searchParams.append(this.name, value); }); + return `${withPrefix ? "?" : ""}${searchParams}`; } diff --git a/src/renderer/theme.store.ts b/src/renderer/theme.store.ts index 231da05149..83aac8eb19 100644 --- a/src/renderer/theme.store.ts +++ b/src/renderer/theme.store.ts @@ -1,5 +1,5 @@ import { computed, observable, reaction, makeObservable } from "mobx"; -import { autobind, Singleton } from "./utils"; +import { autoBind, autobind, Singleton } from "./utils"; import { UserStore } from "../common/user-store"; import logger from "../main/logger"; @@ -19,7 +19,6 @@ export interface Theme { author?: string; } -@autobind() export class ThemeStore extends Singleton { protected styles: HTMLStyleElement; @@ -54,6 +53,7 @@ export class ThemeStore extends Singleton { super(); makeObservable(this); + autoBind(this); // auto-apply active theme reaction(() => this.activeThemeId, async themeId => { diff --git a/yarn.lock b/yarn.lock index b0980140d1..41fd213e27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2708,10 +2708,10 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autobind-decorator@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/autobind-decorator/-/autobind-decorator-2.4.0.tgz#ea9e1c98708cf3b5b356f7cf9f10f265ff18239c" - integrity sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw== +auto-bind@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== await-lock@^2.1.0: version "2.1.0" @@ -4428,7 +4428,7 @@ debug@^4.3.2: dependencies: ms "2.1.2" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -7090,7 +7090,7 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -8911,11 +8911,6 @@ lodash-es@^4.17.20: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -8924,33 +8919,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -8971,11 +8944,6 @@ lodash.memoize@4.x: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"