mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Merge remote-tracking branch 'origin/master' into monaco_editor_refactoring
# Conflicts: # package.json
This commit is contained in:
commit
960ec456ce
@ -229,7 +229,7 @@
|
|||||||
"proper-lockfile": "^4.1.2",
|
"proper-lockfile": "^4.1.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-material-ui-carousel": "^2.3.1",
|
"react-material-ui-carousel": "^2.3.5",
|
||||||
"react-router": "^5.2.0",
|
"react-router": "^5.2.0",
|
||||||
"react-virtualized-auto-sizer": "^1.0.6",
|
"react-virtualized-auto-sizer": "^1.0.6",
|
||||||
"readable-stream": "^3.6.0",
|
"readable-stream": "^3.6.0",
|
||||||
@ -376,7 +376,7 @@
|
|||||||
"ts-node": "^10.2.1",
|
"ts-node": "^10.2.1",
|
||||||
"type-fest": "^1.0.2",
|
"type-fest": "^1.0.2",
|
||||||
"typed-emitter": "^1.3.1",
|
"typed-emitter": "^1.3.1",
|
||||||
"typedoc": "0.22.5",
|
"typedoc": "0.22.6",
|
||||||
"typedoc-plugin-markdown": "^3.11.3",
|
"typedoc-plugin-markdown": "^3.11.3",
|
||||||
"typeface-roboto": "^1.1.13",
|
"typeface-roboto": "^1.1.13",
|
||||||
"typescript": "^4.4.3",
|
"typescript": "^4.4.3",
|
||||||
|
|||||||
@ -58,7 +58,7 @@ export class CatalogCategoryRegistry {
|
|||||||
iter.reduce(
|
iter.reduce(
|
||||||
this.filters,
|
this.filters,
|
||||||
iter.filter,
|
iter.filter,
|
||||||
this.items,
|
this.items.values(),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -105,7 +105,7 @@ export abstract class CatalogCategory extends (EventEmitter as new () => TypedEm
|
|||||||
iter.reduce(
|
iter.reduce(
|
||||||
this.filters,
|
this.filters,
|
||||||
iter.filter,
|
iter.filter,
|
||||||
menuItems,
|
menuItems.values(),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { KubeObject } from "../kube-object";
|
import { KubeObject } from "../kube-object";
|
||||||
import { autoBind, cpuUnitsToNumber, unitsToBytes } from "../../../renderer/utils";
|
import { autoBind, cpuUnitsToNumber, iter, unitsToBytes } from "../../../renderer/utils";
|
||||||
import { IMetrics, metricsApi } from "./metrics.api";
|
import { IMetrics, metricsApi } from "./metrics.api";
|
||||||
import { KubeApi } from "../kube-api";
|
import { KubeApi } from "../kube-api";
|
||||||
import type { KubeJsonApiData } from "../kube-json-api";
|
import type { KubeJsonApiData } from "../kube-json-api";
|
||||||
@ -71,6 +71,15 @@ export function formatNodeTaint(taint: NodeTaint): string {
|
|||||||
return `${taint.key}:${taint.effect}`;
|
return `${taint.key}:${taint.effect}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NodeCondition {
|
||||||
|
type: string;
|
||||||
|
status: string;
|
||||||
|
lastHeartbeatTime?: string;
|
||||||
|
lastTransitionTime?: string;
|
||||||
|
reason?: string;
|
||||||
|
message?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Node {
|
export interface Node {
|
||||||
spec: {
|
spec: {
|
||||||
podCIDR?: string;
|
podCIDR?: string;
|
||||||
@ -100,14 +109,7 @@ export interface Node {
|
|||||||
memory: string;
|
memory: string;
|
||||||
pods: string;
|
pods: string;
|
||||||
};
|
};
|
||||||
conditions?: {
|
conditions?: NodeCondition[];
|
||||||
type: string;
|
|
||||||
status: string;
|
|
||||||
lastHeartbeatTime?: string;
|
|
||||||
lastTransitionTime?: string;
|
|
||||||
reason?: string;
|
|
||||||
message?: string;
|
|
||||||
}[];
|
|
||||||
addresses?: {
|
addresses?: {
|
||||||
type: string;
|
type: string;
|
||||||
address: string;
|
address: string;
|
||||||
@ -141,6 +143,19 @@ export interface Node {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over `conditions` yielding the `type` field if the `status` field is
|
||||||
|
* the string `"True"`
|
||||||
|
* @param conditions An iterator of some conditions
|
||||||
|
*/
|
||||||
|
function* getTrueConditionTypes(conditions: IterableIterator<NodeCondition> | Iterable<NodeCondition>): IterableIterator<string> {
|
||||||
|
for (const { status, type } of conditions) {
|
||||||
|
if (status === "True") {
|
||||||
|
yield type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class Node extends KubeObject {
|
export class Node extends KubeObject {
|
||||||
static kind = "Node";
|
static kind = "Node";
|
||||||
static namespaced = false;
|
static namespaced = false;
|
||||||
@ -151,16 +166,15 @@ export class Node extends KubeObject {
|
|||||||
autoBind(this);
|
autoBind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
getNodeConditionText() {
|
/**
|
||||||
const { conditions } = this.status;
|
* Returns the concatination of all current condition types which have a status
|
||||||
|
* of `"True"`
|
||||||
if (!conditions) return "";
|
*/
|
||||||
|
getNodeConditionText(): string {
|
||||||
return conditions.reduce((types, current) => {
|
return iter.join(
|
||||||
if (current.status !== "True") return "";
|
getTrueConditionTypes(this.status?.conditions ?? []),
|
||||||
|
" ",
|
||||||
return types += ` ${current.type}`;
|
);
|
||||||
}, "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTaints() {
|
getTaints() {
|
||||||
|
|||||||
@ -25,7 +25,7 @@ export type Falsey = false | 0 | "" | null | undefined;
|
|||||||
* Create a new type safe empty Iterable
|
* Create a new type safe empty Iterable
|
||||||
* @returns An `Iterable` that yields 0 items
|
* @returns An `Iterable` that yields 0 items
|
||||||
*/
|
*/
|
||||||
export function* newEmpty<T>(): Iterable<T> {
|
export function* newEmpty<T>(): IterableIterator<T> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ export function* newEmpty<T>(): Iterable<T> {
|
|||||||
* @param src An initial iterator
|
* @param src An initial iterator
|
||||||
* @param n The maximum number of elements to take from src. Yields up to the floor of `n` and 0 items if n < 0
|
* @param n The maximum number of elements to take from src. Yields up to the floor of `n` and 0 items if n < 0
|
||||||
*/
|
*/
|
||||||
export function* take<T>(src: Iterable<T>, n: number): Iterable<T> {
|
export function* take<T>(src: Iterable<T>, n: number): IterableIterator<T> {
|
||||||
outer: for (let i = 0; i < n; i += 1) {
|
outer: for (let i = 0; i < n; i += 1) {
|
||||||
for (const item of src) {
|
for (const item of src) {
|
||||||
yield item;
|
yield item;
|
||||||
@ -53,7 +53,7 @@ export function* take<T>(src: Iterable<T>, n: number): Iterable<T> {
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn The function that is called for each value
|
* @param fn The function that is called for each value
|
||||||
*/
|
*/
|
||||||
export function* map<T, U>(src: Iterable<T>, fn: (from: T) => U): Iterable<U> {
|
export function* map<T, U>(src: Iterable<T>, fn: (from: T) => U): IterableIterator<U> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
yield fn(from);
|
yield fn(from);
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ export function* map<T, U>(src: Iterable<T>, fn: (from: T) => U): Iterable<U> {
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn The function that returns either an iterable over items that should be filtered out or a `Falsey` value indicating that it should be ignored
|
* @param fn The function that returns either an iterable over items that should be filtered out or a `Falsey` value indicating that it should be ignored
|
||||||
*/
|
*/
|
||||||
export function* filterFlatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable<U | Falsey> | Falsey): Iterable<U> {
|
export function* filterFlatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable<U | Falsey> | Falsey): IterableIterator<U> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
if (!from) {
|
if (!from) {
|
||||||
continue;
|
continue;
|
||||||
@ -89,7 +89,7 @@ export function* filterFlatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn A function that returns an iterator
|
* @param fn A function that returns an iterator
|
||||||
*/
|
*/
|
||||||
export function* flatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable<U>): Iterable<U> {
|
export function* flatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable<U>): IterableIterator<U> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
yield* fn(from);
|
yield* fn(from);
|
||||||
}
|
}
|
||||||
@ -101,7 +101,7 @@ export function* flatMap<T, U>(src: Iterable<T>, fn: (from: T) => Iterable<U>):
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn The function that is called for each value
|
* @param fn The function that is called for each value
|
||||||
*/
|
*/
|
||||||
export function* filter<T>(src: Iterable<T>, fn: (from: T) => any): Iterable<T> {
|
export function* filter<T>(src: Iterable<T>, fn: (from: T) => any): IterableIterator<T> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
if (fn(from)) {
|
if (fn(from)) {
|
||||||
yield from;
|
yield from;
|
||||||
@ -115,7 +115,7 @@ export function* filter<T>(src: Iterable<T>, fn: (from: T) => any): Iterable<T>
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn The function that is called for each value
|
* @param fn The function that is called for each value
|
||||||
*/
|
*/
|
||||||
export function* filterMap<T, U>(src: Iterable<T>, fn: (from: T) => U | Falsey): Iterable<U> {
|
export function* filterMap<T, U>(src: Iterable<T>, fn: (from: T) => U | Falsey): IterableIterator<U> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
const res = fn(from);
|
const res = fn(from);
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ export function* filterMap<T, U>(src: Iterable<T>, fn: (from: T) => U | Falsey):
|
|||||||
* @param src A type that can be iterated over
|
* @param src A type that can be iterated over
|
||||||
* @param fn The function that is called for each value
|
* @param fn The function that is called for each value
|
||||||
*/
|
*/
|
||||||
export function* filterMapStrict<T, U>(src: Iterable<T>, fn: (from: T) => U | null | undefined): Iterable<U> {
|
export function* filterMapStrict<T, U>(src: Iterable<T>, fn: (from: T) => U | null | undefined): IterableIterator<U> {
|
||||||
for (const from of src) {
|
for (const from of src) {
|
||||||
const res = fn(from);
|
const res = fn(from);
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ export function find<T>(src: Iterable<T>, match: (i: T) => any): T | undefined {
|
|||||||
* @param reducer A function for producing the next item from an accumilation and the current item
|
* @param reducer A function for producing the next item from an accumilation and the current item
|
||||||
* @param initial The initial value for the iteration
|
* @param initial The initial value for the iteration
|
||||||
*/
|
*/
|
||||||
export function reduce<T, R>(src: Iterable<T>, reducer: (acc: Iterable<R>, cur: T) => Iterable<R>, initial: Iterable<R>): Iterable<R>;
|
export function reduce<T, R extends Iterable<any>>(src: Iterable<T>, reducer: (acc: R, cur: T) => R, initial: R): R;
|
||||||
|
|
||||||
export function reduce<T, R = T>(src: Iterable<T>, reducer: (acc: R, cur: T) => R, initial: R): R {
|
export function reduce<T, R = T>(src: Iterable<T>, reducer: (acc: R, cur: T) => R, initial: R): R {
|
||||||
let acc = initial;
|
let acc = initial;
|
||||||
@ -175,3 +175,13 @@ export function reduce<T, R = T>(src: Iterable<T>, reducer: (acc: R, cur: T) =>
|
|||||||
|
|
||||||
return acc;
|
return acc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenience function for reducing over an iterator of strings and concatenating them together
|
||||||
|
* @param src The value to iterate over
|
||||||
|
* @param connector The string value to intersperse between the yielded values
|
||||||
|
* @returns The concatenated entries of `src` interspersed with copies of `connector`
|
||||||
|
*/
|
||||||
|
export function join(src: Iterable<string>, connector = ","): string {
|
||||||
|
return reduce(src, (acc, cur) => `${acc}${connector}${cur}`, "");
|
||||||
|
}
|
||||||
|
|||||||
@ -130,7 +130,7 @@ export class CatalogEntityRegistry {
|
|||||||
iter.reduce(
|
iter.reduce(
|
||||||
this.filters,
|
this.filters,
|
||||||
iter.filter,
|
iter.filter,
|
||||||
this.items,
|
this.items.values(),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
import "./cluster-issues.scss";
|
import "./cluster-issues.scss";
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { disposeOnUnmount, observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import { computed, makeObservable } from "mobx";
|
import { computed, makeObservable } from "mobx";
|
||||||
import { Icon } from "../icon";
|
import { Icon } from "../icon";
|
||||||
import { SubHeader } from "../layout/sub-header";
|
import { SubHeader } from "../layout/sub-header";
|
||||||
@ -34,7 +34,6 @@ import type { ItemObject } from "../../../common/item.store";
|
|||||||
import { Spinner } from "../spinner";
|
import { Spinner } from "../spinner";
|
||||||
import { ThemeStore } from "../../theme.store";
|
import { ThemeStore } from "../../theme.store";
|
||||||
import { kubeSelectedUrlParam, toggleDetails } from "../kube-detail-params";
|
import { kubeSelectedUrlParam, toggleDetails } from "../kube-detail-params";
|
||||||
import { kubeWatchApi } from "../../../common/k8s-api/kube-watch-api";
|
|
||||||
import { apiManager } from "../../../common/k8s-api/api-manager";
|
import { apiManager } from "../../../common/k8s-api/api-manager";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@ -66,10 +65,6 @@ export class ClusterIssues extends React.Component<Props> {
|
|||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
|
|
||||||
disposeOnUnmount(this, [
|
|
||||||
kubeWatchApi.subscribeStores([eventStore, nodesStore])
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@computed get warnings() {
|
@computed get warnings() {
|
||||||
|
|||||||
@ -36,6 +36,8 @@ import { ClusterPieCharts } from "./cluster-pie-charts";
|
|||||||
import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
|
import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
|
||||||
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
|
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
|
||||||
import { ClusterStore } from "../../../common/cluster-store";
|
import { ClusterStore } from "../../../common/cluster-store";
|
||||||
|
import { kubeWatchApi } from "../../../common/k8s-api/kube-watch-api";
|
||||||
|
import { eventStore } from "../+events/event.store";
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class ClusterOverview extends React.Component {
|
export class ClusterOverview extends React.Component {
|
||||||
@ -53,6 +55,9 @@ export class ClusterOverview extends React.Component {
|
|||||||
this.metricPoller.start(true);
|
this.metricPoller.start(true);
|
||||||
|
|
||||||
disposeOnUnmount(this, [
|
disposeOnUnmount(this, [
|
||||||
|
kubeWatchApi.subscribeStores([podsStore, eventStore, nodesStore], {
|
||||||
|
preload: true,
|
||||||
|
}),
|
||||||
reaction(
|
reaction(
|
||||||
() => clusterOverviewStore.metricNodeRole, // Toggle Master/Worker node switcher
|
() => clusterOverviewStore.metricNodeRole, // Toggle Master/Worker node switcher
|
||||||
() => this.metricPoller.restart(true)
|
() => this.metricPoller.restart(true)
|
||||||
@ -91,7 +96,7 @@ export class ClusterOverview extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const isLoaded = nodesStore.isLoaded && podsStore.isLoaded;
|
const isLoaded = nodesStore.isLoaded && eventStore.isLoaded;
|
||||||
const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Cluster);
|
const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Cluster);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -42,9 +42,6 @@ import whatInput from "what-input";
|
|||||||
import { clusterSetFrameIdHandler } from "../../common/cluster-ipc";
|
import { clusterSetFrameIdHandler } from "../../common/cluster-ipc";
|
||||||
import { ClusterPageMenuRegistration, ClusterPageMenuRegistry } from "../../extensions/registries";
|
import { ClusterPageMenuRegistration, ClusterPageMenuRegistry } from "../../extensions/registries";
|
||||||
import { StatefulSetScaleDialog } from "./+workloads-statefulsets/statefulset-scale-dialog";
|
import { StatefulSetScaleDialog } from "./+workloads-statefulsets/statefulset-scale-dialog";
|
||||||
import { eventStore } from "./+events/event.store";
|
|
||||||
import { nodesStore } from "./+nodes/nodes.store";
|
|
||||||
import { podsStore } from "./+workloads-pods/pods.store";
|
|
||||||
import { kubeWatchApi } from "../../common/k8s-api/kube-watch-api";
|
import { kubeWatchApi } from "../../common/k8s-api/kube-watch-api";
|
||||||
import { ReplicaSetScaleDialog } from "./+workloads-replicasets/replicaset-scale-dialog";
|
import { ReplicaSetScaleDialog } from "./+workloads-replicasets/replicaset-scale-dialog";
|
||||||
import { CommandContainer } from "./command-palette/command-container";
|
import { CommandContainer } from "./command-palette/command-container";
|
||||||
@ -137,7 +134,7 @@ export class App extends React.Component {
|
|||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
disposeOnUnmount(this, [
|
disposeOnUnmount(this, [
|
||||||
kubeWatchApi.subscribeStores([podsStore, nodesStore, eventStore, namespaceStore], {
|
kubeWatchApi.subscribeStores([namespaceStore], {
|
||||||
preload: true,
|
preload: true,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
16
yarn.lock
16
yarn.lock
@ -11569,10 +11569,10 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
|
|||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339"
|
||||||
integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==
|
integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==
|
||||||
|
|
||||||
react-material-ui-carousel@^2.3.1:
|
react-material-ui-carousel@^2.3.5:
|
||||||
version "2.3.1"
|
version "2.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/react-material-ui-carousel/-/react-material-ui-carousel-2.3.1.tgz#73b516f831d45df70bb9219f56fee14a2788e332"
|
resolved "https://registry.yarnpkg.com/react-material-ui-carousel/-/react-material-ui-carousel-2.3.5.tgz#c6b4514333564ff4d49d2447f6d67f6c7651e813"
|
||||||
integrity sha512-QV3z+x10x19rSAPSHMmkHtdx/PSiwqo6FeAaY8Y04LtuKM0ZxHsgeMslNdcI8M1G2B48391YqN+ouWFPYqAbTA==
|
integrity sha512-laiysIaA47rX0/lIVjprX5MHrDyjLxgzAsyBnG8OKgO2ad5o3Pg88PAmu6RlMy/L/H6PKFYQ8H5bAqpeZETeYw==
|
||||||
dependencies:
|
dependencies:
|
||||||
auto-bind "^2.1.1"
|
auto-bind "^2.1.1"
|
||||||
react-swipeable "^6.1.0"
|
react-swipeable "^6.1.0"
|
||||||
@ -13851,10 +13851,10 @@ typedoc-plugin-markdown@^3.11.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
handlebars "^4.7.7"
|
handlebars "^4.7.7"
|
||||||
|
|
||||||
typedoc@0.22.5:
|
typedoc@0.22.6:
|
||||||
version "0.22.5"
|
version "0.22.6"
|
||||||
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.5.tgz#c1a7c33fcdc808f57c766584a6afb47762944229"
|
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.6.tgz#1122f83a6eb5cd7dbb26d1924de1f9de9e8c7c7e"
|
||||||
integrity sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==
|
integrity sha512-ePbJqOaz0GNkU2ehRwFwBpLD4Gp6m7jbJfHysXmDdjVKc1g8DFJ83r/LOZ9TZrkC661vgpoIY3FjSPEtUilHNA==
|
||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.2.0"
|
glob "^7.2.0"
|
||||||
lunr "^2.3.9"
|
lunr "^2.3.9"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user