mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Merge branch 'master' into wrap-pod-logs
This commit is contained in:
commit
e02278d515
@ -1,57 +0,0 @@
|
|||||||
variables:
|
|
||||||
YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
|
|
||||||
node_version: 12.x
|
|
||||||
pr:
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- master
|
|
||||||
- releases/*
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- .github/*
|
|
||||||
- docs/*
|
|
||||||
- mkdocs/*
|
|
||||||
trigger: none
|
|
||||||
jobs:
|
|
||||||
- job: Linux
|
|
||||||
pool:
|
|
||||||
vmImage: ubuntu-18.04
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
kube_1.16:
|
|
||||||
kubernetes_version: v1.16.15
|
|
||||||
kube_1.17:
|
|
||||||
kubernetes_version: v1.17.15
|
|
||||||
kube_1.18:
|
|
||||||
kubernetes_version: v1.18.13
|
|
||||||
kube_1.19:
|
|
||||||
kubernetes_version: v1.19.5
|
|
||||||
kube_1.20:
|
|
||||||
kubernetes_version: v1.20.0
|
|
||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: $(node_version)
|
|
||||||
displayName: Install Node.js
|
|
||||||
- task: Cache@2
|
|
||||||
inputs:
|
|
||||||
key: 'yarn | "$(Agent.OS)" | yarn.lock'
|
|
||||||
restoreKeys: |
|
|
||||||
yarn | "$(Agent.OS)"
|
|
||||||
path: $(YARN_CACHE_FOLDER)
|
|
||||||
displayName: Cache Yarn packages
|
|
||||||
- bash: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install libgconf-2-4 conntrack -y
|
|
||||||
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
|
|
||||||
sudo install minikube-linux-amd64 /usr/local/bin/minikube
|
|
||||||
sudo minikube start --driver=none --kubernetes-version $(kubernetes_version)
|
|
||||||
sudo mv /root/.kube /root/.minikube $HOME
|
|
||||||
sudo chown -R $USER $HOME/.kube $HOME/.minikube
|
|
||||||
displayName: Install integration test dependencies
|
|
||||||
- script: make node_modules
|
|
||||||
displayName: Install dependencies
|
|
||||||
- script: make -j2 build
|
|
||||||
displayName: Run build
|
|
||||||
- script: xvfb-run --auto-servernum --server-args='-screen 0, 1600x900x24' yarn integration
|
|
||||||
displayName: Run integration tests for Kubernetes $(kubernetes_version)
|
|
||||||
@ -1,168 +0,0 @@
|
|||||||
variables:
|
|
||||||
YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
|
|
||||||
pr: none
|
|
||||||
trigger:
|
|
||||||
tags:
|
|
||||||
include:
|
|
||||||
- "*"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- .github/*
|
|
||||||
- docs/*
|
|
||||||
- mkdocs/*
|
|
||||||
jobs:
|
|
||||||
- job: Windows
|
|
||||||
pool:
|
|
||||||
vmImage: windows-2019
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node:
|
|
||||||
node_version: 16.x
|
|
||||||
steps:
|
|
||||||
- powershell: |
|
|
||||||
$CI_BUILD_TAG = git describe --tags
|
|
||||||
Write-Output ("##vso[task.setvariable variable=CI_BUILD_TAG;]$CI_BUILD_TAG")
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
displayName: Set the tag name as an environment variable
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: $(node_version)
|
|
||||||
displayName: Install Node.js
|
|
||||||
|
|
||||||
- task: Cache@2
|
|
||||||
inputs:
|
|
||||||
key: 'yarn | "$(Agent.OS)"" | yarn.lock'
|
|
||||||
restoreKeys: |
|
|
||||||
yarn | "$(Agent.OS)"
|
|
||||||
path: $(YARN_CACHE_FOLDER)
|
|
||||||
displayName: Cache Yarn packages
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
|
|
||||||
rm -rf .lens-ide-overlay/.git
|
|
||||||
cp -r .lens-ide-overlay/* ./
|
|
||||||
jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
|
|
||||||
env:
|
|
||||||
GH_TOKEN: $(LENS_IDE_GH_TOKEN)
|
|
||||||
displayName: Customize config
|
|
||||||
|
|
||||||
- script: make build
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
env:
|
|
||||||
WIN_CSC_LINK: $(WIN_CSC_LINK)
|
|
||||||
WIN_CSC_KEY_PASSWORD: $(WIN_CSC_KEY_PASSWORD)
|
|
||||||
AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
|
|
||||||
AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
|
|
||||||
BUILD_NUMBER: $(Build.BuildNumber)
|
|
||||||
ELECTRON_BUILDER_EXTRA_ARGS: "--x64 --ia32"
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
- job: macOS
|
|
||||||
timeoutInMinutes: 90
|
|
||||||
pool:
|
|
||||||
vmImage: macOS-11
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node:
|
|
||||||
node_version: 16.x
|
|
||||||
steps:
|
|
||||||
- script: CI_BUILD_TAG=`git describe --tags` && echo "##vso[task.setvariable variable=CI_BUILD_TAG]$CI_BUILD_TAG"
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
displayName: Set the tag name as an environment variable
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: $(node_version)
|
|
||||||
displayName: Install Node.js
|
|
||||||
|
|
||||||
- task: Cache@2
|
|
||||||
inputs:
|
|
||||||
key: 'yarn | "$(Agent.OS)" | yarn.lock'
|
|
||||||
restoreKeys: |
|
|
||||||
yarn | "$(Agent.OS)"
|
|
||||||
path: $(YARN_CACHE_FOLDER)
|
|
||||||
displayName: Cache Yarn packages
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
|
|
||||||
rm -rf .lens-ide-overlay/.git
|
|
||||||
cp -r .lens-ide-overlay/* ./
|
|
||||||
jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
|
|
||||||
env:
|
|
||||||
GH_TOKEN: $(LENS_IDE_GH_TOKEN)
|
|
||||||
displayName: Customize config
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Importing codesign certificate ..."
|
|
||||||
echo $CSC_LINK | base64 -D > certificate.p12
|
|
||||||
security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
|
|
||||||
security set-keychain-settings -lut 21600 build.keychain
|
|
||||||
security default-keychain -s build.keychain
|
|
||||||
security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
|
|
||||||
security import certificate.p12 -k build.keychain -P $CSC_KEY_PASSWORD -T /usr/bin/codesign -T /usr/bin/security -A
|
|
||||||
security set-key-partition-list -S apple-tool:,apple: -k $KEYCHAIN_PASSWORD build.keychain
|
|
||||||
|
|
||||||
rm certificate.p12
|
|
||||||
echo "Codesign certificate imported!"
|
|
||||||
|
|
||||||
make build
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
env:
|
|
||||||
KEYCHAIN_PASSWORD: secretz
|
|
||||||
APPLEID: $(APPLEID)
|
|
||||||
APPLEIDPASS: $(APPLEIDPASS)
|
|
||||||
CSC_LINK: $(CSC_LINK)
|
|
||||||
CSC_KEY_PASSWORD: $(CSC_KEY_PASSWORD)
|
|
||||||
AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
|
|
||||||
AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
|
|
||||||
BUILD_NUMBER: $(Build.BuildNumber)
|
|
||||||
ELECTRON_BUILDER_EXTRA_ARGS: "--x64 --arm64"
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
- job: Linux
|
|
||||||
pool:
|
|
||||||
vmImage: ubuntu-18.04
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node:
|
|
||||||
node_version: 16.x
|
|
||||||
steps:
|
|
||||||
- script: CI_BUILD_TAG=`git describe --tags` && echo "##vso[task.setvariable variable=CI_BUILD_TAG]$CI_BUILD_TAG"
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
displayName: Set the tag name as an environment variable
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: $(node_version)
|
|
||||||
displayName: Install Node.js
|
|
||||||
|
|
||||||
- task: Cache@2
|
|
||||||
inputs:
|
|
||||||
key: 'yarn | "$(Agent.OS)" | yarn.lock'
|
|
||||||
restoreKeys: |
|
|
||||||
yarn | "$(Agent.OS)"
|
|
||||||
path: $(YARN_CACHE_FOLDER)
|
|
||||||
displayName: Cache Yarn packages
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
|
|
||||||
rm -rf .lens-ide-overlay/.git
|
|
||||||
cp -r .lens-ide-overlay/* ./
|
|
||||||
jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
|
|
||||||
env:
|
|
||||||
GH_TOKEN: $(LENS_IDE_GH_TOKEN)
|
|
||||||
displayName: Customize config
|
|
||||||
|
|
||||||
- script: make build
|
|
||||||
condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
|
|
||||||
env:
|
|
||||||
AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
|
|
||||||
AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
|
|
||||||
BUILD_NUMBER: $(Build.BuildNumber)
|
|
||||||
displayName: Build
|
|
||||||
@ -113,13 +113,13 @@ utils.describeIf(minikubeReady(TEST_NAMESPACE))("Minikube based tests", () => {
|
|||||||
await frame.waitForSelector(".LogList .list span.active");
|
await frame.waitForSelector(".LogList .list span.active");
|
||||||
|
|
||||||
const showTimestampsButton = await frame.waitForSelector(
|
const showTimestampsButton = await frame.waitForSelector(
|
||||||
".LogControls .show-timestamps",
|
"[data-testid='log-controls'] .show-timestamps",
|
||||||
);
|
);
|
||||||
|
|
||||||
await showTimestampsButton.click();
|
await showTimestampsButton.click();
|
||||||
|
|
||||||
const showPreviousButton = await frame.waitForSelector(
|
const showPreviousButton = await frame.waitForSelector(
|
||||||
".LogControls .show-previous",
|
"[data-testid='log-controls'] .show-previous",
|
||||||
);
|
);
|
||||||
|
|
||||||
await showPreviousButton.click();
|
await showPreviousButton.click();
|
||||||
|
|||||||
20
package.json
20
package.json
@ -252,7 +252,7 @@
|
|||||||
"jsdom": "^16.7.0",
|
"jsdom": "^16.7.0",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"mac-ca": "^1.0.6",
|
"mac-ca": "^1.0.6",
|
||||||
"marked": "^4.0.19",
|
"marked": "^4.1.0",
|
||||||
"md5-file": "^5.0.0",
|
"md5-file": "^5.0.0",
|
||||||
"mobx": "^6.6.1",
|
"mobx": "^6.6.1",
|
||||||
"mobx-observable-history": "^2.0.3",
|
"mobx-observable-history": "^2.0.3",
|
||||||
@ -349,7 +349,7 @@
|
|||||||
"@types/readable-stream": "^2.3.13",
|
"@types/readable-stream": "^2.3.13",
|
||||||
"@types/request": "^2.48.7",
|
"@types/request": "^2.48.7",
|
||||||
"@types/request-promise-native": "^1.0.18",
|
"@types/request-promise-native": "^1.0.18",
|
||||||
"@types/semver": "^7.3.10",
|
"@types/semver": "^7.3.12",
|
||||||
"@types/sharp": "^0.30.5",
|
"@types/sharp": "^0.30.5",
|
||||||
"@types/spdy": "^3.4.5",
|
"@types/spdy": "^3.4.5",
|
||||||
"@types/tar": "^4.0.5",
|
"@types/tar": "^4.0.5",
|
||||||
@ -379,12 +379,12 @@
|
|||||||
"electron": "^19.0.13",
|
"electron": "^19.0.13",
|
||||||
"electron-builder": "^23.3.3",
|
"electron-builder": "^23.3.3",
|
||||||
"electron-notarize": "^0.3.0",
|
"electron-notarize": "^0.3.0",
|
||||||
"esbuild": "^0.15.5",
|
"esbuild": "^0.15.6",
|
||||||
"esbuild-loader": "^2.19.0",
|
"esbuild-loader": "^2.19.0",
|
||||||
"eslint": "^8.22.0",
|
"eslint": "^8.23.0",
|
||||||
"eslint-plugin-header": "^3.1.1",
|
"eslint-plugin-header": "^3.1.1",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-react": "^7.31.0",
|
"eslint-plugin-react": "7.30.1",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"eslint-plugin-unused-imports": "^2.0.0",
|
"eslint-plugin-unused-imports": "^2.0.0",
|
||||||
"flex.box": "^3.4.4",
|
"flex.box": "^3.4.4",
|
||||||
@ -405,11 +405,11 @@
|
|||||||
"node-gyp": "^8.3.0",
|
"node-gyp": "^8.3.0",
|
||||||
"node-loader": "^2.0.0",
|
"node-loader": "^2.0.0",
|
||||||
"nodemon": "^2.0.19",
|
"nodemon": "^2.0.19",
|
||||||
"playwright": "^1.24.2",
|
"playwright": "^1.25.1",
|
||||||
"postcss": "^8.4.16",
|
"postcss": "^8.4.16",
|
||||||
"postcss-loader": "^6.2.1",
|
"postcss-loader": "^6.2.1",
|
||||||
"randomcolor": "^0.6.2",
|
"randomcolor": "^0.6.2",
|
||||||
"react-beautiful-dnd": "^13.1.0",
|
"react-beautiful-dnd": "^13.1.1",
|
||||||
"react-refresh": "^0.14.0",
|
"react-refresh": "^0.14.0",
|
||||||
"react-refresh-typescript": "^2.0.7",
|
"react-refresh-typescript": "^2.0.7",
|
||||||
"react-router-dom": "^5.3.3",
|
"react-router-dom": "^5.3.3",
|
||||||
@ -417,7 +417,7 @@
|
|||||||
"react-select-event": "^5.5.1",
|
"react-select-event": "^5.5.1",
|
||||||
"react-table": "^7.8.0",
|
"react-table": "^7.8.0",
|
||||||
"react-window": "^1.8.7",
|
"react-window": "^1.8.7",
|
||||||
"sass": "^1.54.5",
|
"sass": "^1.54.7",
|
||||||
"sass-loader": "^12.6.0",
|
"sass-loader": "^12.6.0",
|
||||||
"sharp": "^0.30.7",
|
"sharp": "^0.30.7",
|
||||||
"style-loader": "^3.3.1",
|
"style-loader": "^3.3.1",
|
||||||
@ -427,13 +427,13 @@
|
|||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
"type-fest": "^2.14.0",
|
"type-fest": "^2.14.0",
|
||||||
"typed-emitter": "^1.4.0",
|
"typed-emitter": "^1.4.0",
|
||||||
"typedoc": "0.23.10",
|
"typedoc": "0.23.11",
|
||||||
"typedoc-plugin-markdown": "^3.13.1",
|
"typedoc-plugin-markdown": "^3.13.1",
|
||||||
"typescript": "^4.7.4",
|
"typescript": "^4.7.4",
|
||||||
"typescript-plugin-css-modules": "^3.4.0",
|
"typescript-plugin-css-modules": "^3.4.0",
|
||||||
"webpack": "^5.74.0",
|
"webpack": "^5.74.0",
|
||||||
"webpack-cli": "^4.9.2",
|
"webpack-cli": "^4.9.2",
|
||||||
"webpack-dev-server": "^4.10.0",
|
"webpack-dev-server": "^4.10.1",
|
||||||
"webpack-node-externals": "^3.0.0",
|
"webpack-node-externals": "^3.0.0",
|
||||||
"xterm": "^4.19.0",
|
"xterm": "^4.19.0",
|
||||||
"xterm-addon-fit": "^0.5.0"
|
"xterm-addon-fit": "^0.5.0"
|
||||||
|
|||||||
@ -0,0 +1,865 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`download logs options in pod logs dock tab when opening pod logs renders 1`] = `
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="Notifications flex column align-flex-end"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="mainLayout"
|
||||||
|
style="--sidebar-width: 200px;"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="sidebar"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex flex-col"
|
||||||
|
data-testid="cluster-sidebar"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="SidebarCluster"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Avatar rounded loadingAvatar"
|
||||||
|
style="width: 40px; height: 40px;"
|
||||||
|
>
|
||||||
|
??
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="loadingClusterName"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="sidebarNav sidebar-active-status"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="true"
|
||||||
|
data-testid="sidebar-item-workloads"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
aria-current="page"
|
||||||
|
class="nav-item flex gaps align-center expandable active"
|
||||||
|
data-testid="sidebar-item-link-for-workloads"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon svg focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Workloads
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-config"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-config"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="list"
|
||||||
|
>
|
||||||
|
list
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Config
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-network"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-network"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="device_hub"
|
||||||
|
>
|
||||||
|
device_hub
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Network
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-storage"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-storage"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="storage"
|
||||||
|
>
|
||||||
|
storage
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Storage
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-helm"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-helm"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon svg focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Helm
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-user-management"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-user-management"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="security"
|
||||||
|
>
|
||||||
|
security
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Access Control
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-custom-resources"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-custom-resources"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="extension"
|
||||||
|
>
|
||||||
|
extension
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Custom Resources
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="ResizingAnchor horizontal trailing"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="contents"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="TabLayout"
|
||||||
|
data-testid="tab-layout"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tabs center scrollable"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tab flex gaps align-center active"
|
||||||
|
data-is-active-test="true"
|
||||||
|
data-testid="tab-link-for-overview"
|
||||||
|
role="tab"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
Overview
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<main>
|
||||||
|
<div
|
||||||
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="header flex gaps align-center"
|
||||||
|
>
|
||||||
|
<h5
|
||||||
|
class="box grow"
|
||||||
|
>
|
||||||
|
Overview
|
||||||
|
</h5>
|
||||||
|
<div
|
||||||
|
class="NamespaceSelectFilterParent"
|
||||||
|
data-testid="namespace-select-filter"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select theme-dark NamespaceSelect NamespaceSelectFilter css-b62m3t-container"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
id="react-select-overview-namespace-select-filter-input-live-region"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
aria-atomic="false"
|
||||||
|
aria-live="polite"
|
||||||
|
aria-relevant="additions text"
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="Select__control css-1s2u09g-control"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__value-container Select__value-container--is-multi css-319lph-ValueContainer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
|
id="react-select-overview-namespace-select-filter-input-placeholder"
|
||||||
|
>
|
||||||
|
All namespaces
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__input-container css-6j8wv5-Input"
|
||||||
|
data-value=""
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-autocomplete="list"
|
||||||
|
aria-describedby="react-select-overview-namespace-select-filter-input-placeholder"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-haspopup="true"
|
||||||
|
autocapitalize="none"
|
||||||
|
autocomplete="off"
|
||||||
|
autocorrect="off"
|
||||||
|
class="Select__input"
|
||||||
|
id="overview-namespace-select-filter-input"
|
||||||
|
role="combobox"
|
||||||
|
spellcheck="false"
|
||||||
|
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
|
||||||
|
tabindex="0"
|
||||||
|
type="text"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="Select__indicator-separator css-1okebmr-indicatorSeparator"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
|
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
class="css-tj5bde-Svg"
|
||||||
|
focusable="false"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
width="20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="OverviewStatuses"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="workloads"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="footer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Dock isOpen"
|
||||||
|
tabindex="-1"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="ResizingAnchor vertical leading"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="tabs-container flex align-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="dockTabs"
|
||||||
|
role="tablist"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tabs tabs"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tab flex gaps align-center DockTab active"
|
||||||
|
data-testid="dock-tab-for-log-tab-some-irrelevant-random-id"
|
||||||
|
id="tab-log-tab-some-irrelevant-random-id"
|
||||||
|
role="tab"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable small"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="subject"
|
||||||
|
>
|
||||||
|
subject
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex align-center"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="title"
|
||||||
|
>
|
||||||
|
Pod dockerExporter
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
class="close"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable small"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="close"
|
||||||
|
>
|
||||||
|
close
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Close ⌘+W
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="toolbar flex gaps align-center box grow"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="dock-menu box grow"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon new-dock-tab material interactive focusable"
|
||||||
|
id="menu-actions-for-dock"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="add"
|
||||||
|
>
|
||||||
|
add
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
New tab
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="fullscreen"
|
||||||
|
>
|
||||||
|
fullscreen
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Fit to window
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Minimize
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="tab-content pod-logs"
|
||||||
|
data-testid="dock-tab-content-for-log-tab-some-irrelevant-random-id"
|
||||||
|
style="flex-basis: 300px;"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="PodLogs flex column"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="InfoPanel flex gaps align-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="controls"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex gaps"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="LogResourceSelector flex gaps align-center"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
Namespace
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="badge"
|
||||||
|
data-testid="namespace-badge"
|
||||||
|
>
|
||||||
|
default
|
||||||
|
</div>
|
||||||
|
<span>
|
||||||
|
Pod
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
class="Select theme-dark pod-selector css-b62m3t-container"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
id="react-select-2-live-region"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
aria-atomic="false"
|
||||||
|
aria-live="polite"
|
||||||
|
aria-relevant="additions text"
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="Select__control css-1s2u09g-control"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__value-container Select__value-container--has-value css-319lph-ValueContainer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__single-value css-qc6sy-singleValue"
|
||||||
|
>
|
||||||
|
dockerExporter
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__input-container css-6j8wv5-Input"
|
||||||
|
data-value=""
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-autocomplete="list"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-haspopup="true"
|
||||||
|
autocapitalize="none"
|
||||||
|
autocomplete="off"
|
||||||
|
autocorrect="off"
|
||||||
|
class="Select__input"
|
||||||
|
id="react-select-2-input"
|
||||||
|
role="combobox"
|
||||||
|
spellcheck="false"
|
||||||
|
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
|
||||||
|
tabindex="0"
|
||||||
|
type="text"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="Select__indicator-separator css-1okebmr-indicatorSeparator"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
|
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
class="css-tj5bde-Svg"
|
||||||
|
focusable="false"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
width="20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span>
|
||||||
|
Container
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
class="Select theme-dark container-selector css-b62m3t-container"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
id="react-select-container-selector-input-live-region"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
aria-atomic="false"
|
||||||
|
aria-live="polite"
|
||||||
|
aria-relevant="additions text"
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="Select__control css-1s2u09g-control"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__value-container Select__value-container--has-value css-319lph-ValueContainer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__single-value css-qc6sy-singleValue"
|
||||||
|
>
|
||||||
|
docker-exporter
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__input-container css-6j8wv5-Input"
|
||||||
|
data-value=""
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-autocomplete="list"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-haspopup="true"
|
||||||
|
autocapitalize="none"
|
||||||
|
autocomplete="off"
|
||||||
|
autocorrect="off"
|
||||||
|
class="Select__input"
|
||||||
|
id="container-selector-input"
|
||||||
|
role="combobox"
|
||||||
|
spellcheck="false"
|
||||||
|
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
|
||||||
|
tabindex="0"
|
||||||
|
type="text"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="Select__indicator-separator css-1okebmr-indicatorSeparator"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
|
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
class="css-tj5bde-Svg"
|
||||||
|
focusable="false"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
width="20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="LogSearch flex box grow justify-flex-end gaps align-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Input SearchInput focused"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
class="input-area flex gaps align-center"
|
||||||
|
id=""
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="input box grow"
|
||||||
|
placeholder="Search..."
|
||||||
|
spellcheck="false"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable small"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="search"
|
||||||
|
>
|
||||||
|
search
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
<div
|
||||||
|
class="input-info flex gaps"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive disabled focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_up"
|
||||||
|
>
|
||||||
|
keyboard_arrow_up
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Previous
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive disabled focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Next
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="LogList flex"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="VirtualList box grow"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="list"
|
||||||
|
style="position: relative; height: 420000px; width: 100%; overflow: auto; will-change: transform; direction: ltr;"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style="height: 18px; width: 100%;"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="LogRow"
|
||||||
|
style="position: absolute; left: 0px; top: 0px; height: 18px; width: 100%;"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
some-logs
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="controls"
|
||||||
|
data-testid="log-controls"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span>
|
||||||
|
Logs from
|
||||||
|
|
||||||
|
<b>
|
||||||
|
Invalid Date
|
||||||
|
</b>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="flex gaps align-center"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
class="Checkbox flex align-center show-timestamps"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
<i
|
||||||
|
class="box flex align-center"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
Show timestamps
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<label
|
||||||
|
class="Checkbox flex align-center show-previous checked"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
checked=""
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
<i
|
||||||
|
class="box flex align-center"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
Show previous terminated container
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
id="download-logs-dropdown"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="dropdown"
|
||||||
|
data-testid="download-logs-dropdown"
|
||||||
|
>
|
||||||
|
Download
|
||||||
|
<i
|
||||||
|
class="Icon material focusable smallest"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="arrow_drop_down"
|
||||||
|
>
|
||||||
|
arrow_drop_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
`;
|
||||||
263
src/behaviours/pod-logs/download-logs.test.tsx
Normal file
263
src/behaviours/pod-logs/download-logs.test.tsx
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
import { act, waitFor } from "@testing-library/react";
|
||||||
|
import getPodByIdInjectable from "../../renderer/components/+workloads-pods/get-pod-by-id.injectable";
|
||||||
|
import getPodsByOwnerIdInjectable from "../../renderer/components/+workloads-pods/get-pods-by-owner-id.injectable";
|
||||||
|
import openSaveFileDialogInjectable from "../../renderer/utils/save-file.injectable";
|
||||||
|
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import dockStoreInjectable from "../../renderer/components/dock/dock/store.injectable";
|
||||||
|
import areLogsPresentInjectable from "../../renderer/components/dock/logs/are-logs-present.injectable";
|
||||||
|
import type { CallForLogs } from "../../renderer/components/dock/logs/call-for-logs.injectable";
|
||||||
|
import callForLogsInjectable from "../../renderer/components/dock/logs/call-for-logs.injectable";
|
||||||
|
import createPodLogsTabInjectable from "../../renderer/components/dock/logs/create-pod-logs-tab.injectable";
|
||||||
|
import getLogTabDataInjectable from "../../renderer/components/dock/logs/get-log-tab-data.injectable";
|
||||||
|
import getLogsWithoutTimestampsInjectable from "../../renderer/components/dock/logs/get-logs-without-timestamps.injectable";
|
||||||
|
import getLogsInjectable from "../../renderer/components/dock/logs/get-logs.injectable";
|
||||||
|
import getRandomIdForPodLogsTabInjectable from "../../renderer/components/dock/logs/get-random-id-for-pod-logs-tab.injectable";
|
||||||
|
import getTimestampSplitLogsInjectable from "../../renderer/components/dock/logs/get-timestamp-split-logs.injectable";
|
||||||
|
import loadLogsInjectable from "../../renderer/components/dock/logs/load-logs.injectable";
|
||||||
|
import reloadLogsInjectable from "../../renderer/components/dock/logs/reload-logs.injectable";
|
||||||
|
import setLogTabDataInjectable from "../../renderer/components/dock/logs/set-log-tab-data.injectable";
|
||||||
|
import stopLoadingLogsInjectable from "../../renderer/components/dock/logs/stop-loading-logs.injectable";
|
||||||
|
import { dockerPod } from "../../renderer/components/dock/logs/__test__/pod.mock";
|
||||||
|
|
||||||
|
describe("download logs options in pod logs dock tab", () => {
|
||||||
|
let rendered: RenderResult;
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
let openSaveFileDialogMock: jest.MockedFunction<() => void>;
|
||||||
|
let callForLogsMock: jest.MockedFunction<CallForLogs>;
|
||||||
|
const logs = new Map([["timestamp", "some-logs"]]);
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
const selectedPod = dockerPod;
|
||||||
|
|
||||||
|
builder = getApplicationBuilder();
|
||||||
|
|
||||||
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
|
callForLogsMock = jest.fn();
|
||||||
|
|
||||||
|
builder.beforeWindowStart((windowDi) => {
|
||||||
|
windowDi.override(callForLogsInjectable, () => callForLogsMock);
|
||||||
|
|
||||||
|
// Overriding internals of logsViewModelInjectable
|
||||||
|
windowDi.override(getLogsInjectable, () => () => ["some-logs"]);
|
||||||
|
windowDi.override(getLogsWithoutTimestampsInjectable, () => () => ["some-logs"]);
|
||||||
|
windowDi.override(getTimestampSplitLogsInjectable, () => () => [...logs]);
|
||||||
|
windowDi.override(reloadLogsInjectable, () => jest.fn());
|
||||||
|
windowDi.override(getLogTabDataInjectable, () => () => ({
|
||||||
|
selectedPodId: selectedPod.getId(),
|
||||||
|
selectedContainer: selectedPod.getContainers()[0].name,
|
||||||
|
namespace: "default",
|
||||||
|
showPrevious: true,
|
||||||
|
showTimestamps: false,
|
||||||
|
}));
|
||||||
|
windowDi.override(setLogTabDataInjectable, () => jest.fn());
|
||||||
|
windowDi.override(loadLogsInjectable, () => jest.fn());
|
||||||
|
windowDi.override(stopLoadingLogsInjectable, () => jest.fn());
|
||||||
|
windowDi.override(areLogsPresentInjectable, () => jest.fn());
|
||||||
|
windowDi.override(getPodByIdInjectable, () => (id) => {
|
||||||
|
if (id === selectedPod.getId()) {
|
||||||
|
return selectedPod;
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
});
|
||||||
|
windowDi.override(getPodsByOwnerIdInjectable, () => jest.fn());
|
||||||
|
|
||||||
|
windowDi.override(getRandomIdForPodLogsTabInjectable, () => jest.fn(() => "some-irrelevant-random-id"));
|
||||||
|
|
||||||
|
openSaveFileDialogMock = jest.fn();
|
||||||
|
windowDi.override(openSaveFileDialogInjectable, () => openSaveFileDialogMock);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when opening pod logs", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
rendered = await builder.render();
|
||||||
|
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
const pod = dockerPod;
|
||||||
|
const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
|
||||||
|
const container = {
|
||||||
|
name: "docker-exporter",
|
||||||
|
image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
|
||||||
|
imagePullPolicy: "pull",
|
||||||
|
};
|
||||||
|
|
||||||
|
const dockStore = windowDi.inject(dockStoreInjectable);
|
||||||
|
|
||||||
|
dockStore.closeTab("terminal");
|
||||||
|
|
||||||
|
createLogsTab({
|
||||||
|
selectedPod: pod,
|
||||||
|
selectedContainer: container,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("renders", () => {
|
||||||
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("contains download dropdown button", () => {
|
||||||
|
expect(rendered.getByTestId("download-logs-dropdown")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when clicking on button", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const button = rendered.getByTestId("download-logs-dropdown");
|
||||||
|
|
||||||
|
act(() => button.click());
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows download visible logs menu item", () => {
|
||||||
|
expect(rendered.getByTestId("download-visible-logs")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows download all logs menu item", () => {
|
||||||
|
expect(rendered.getByTestId("download-all-logs")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when call for logs resolves with logs", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
callForLogsMock.mockResolvedValue("all-logs");
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download visible logs'", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const button = rendered.getByTestId("download-visible-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows save dialog with proper attributes", () => {
|
||||||
|
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download all logs'", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await act(async () => {
|
||||||
|
const button = rendered.getByTestId("download-all-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs have been called with query", () => {
|
||||||
|
expect(callForLogsMock).toHaveBeenCalledWith(
|
||||||
|
{ name: "dockerExporter", namespace: "default" },
|
||||||
|
{ "previous": true, "timestamps": false },
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows save dialog with proper attributes", async () => {
|
||||||
|
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "all-logs", "text/plain");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("doesn't block download dropdown for interaction after click", async () => {
|
||||||
|
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("blocking user interaction after menu item click", () => {
|
||||||
|
it("block download dropdown for interaction when selected 'download all logs'", async () => {
|
||||||
|
const downloadMenuItem = rendered.getByTestId("download-all-logs");
|
||||||
|
|
||||||
|
act(() => downloadMenuItem.click());
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(rendered.getByTestId("download-logs-dropdown")).toHaveAttribute("disabled");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("doesn't block dropdown for interaction when selected 'download visible logs'", () => {
|
||||||
|
const downloadMenuItem = rendered.getByTestId("download-visible-logs");
|
||||||
|
|
||||||
|
act(() => downloadMenuItem.click());
|
||||||
|
|
||||||
|
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when call for logs resolves with no logs", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
callForLogsMock.mockResolvedValue("");
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download visible logs'", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const button = rendered.getByTestId("download-visible-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows save dialog with proper attributes", () => {
|
||||||
|
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download all logs'", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await act(async () => {
|
||||||
|
const button = rendered.getByTestId("download-all-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("doesn't show save dialog", async () => {
|
||||||
|
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when call for logs rejects", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
callForLogsMock.mockRejectedValue("error");
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download visible logs'", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await act(async () => {
|
||||||
|
const button = rendered.getByTestId("download-visible-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows save dialog with proper attributes", () => {
|
||||||
|
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when selected 'download all logs'", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await act(async () => {
|
||||||
|
const button = rendered.getByTestId("download-all-logs");
|
||||||
|
|
||||||
|
button.click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs have been called", () => {
|
||||||
|
expect(callForLogsMock).toHaveBeenCalledWith(
|
||||||
|
{ name: "dockerExporter", namespace: "default" },
|
||||||
|
{ "previous": true, "timestamps": false },
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("doesn't show save dialog", async () => {
|
||||||
|
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -6,8 +6,6 @@
|
|||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { IComputedValue } from "mobx";
|
import type { IComputedValue } from "mobx";
|
||||||
|
|
||||||
export const allowedResourcesInjectionToken = getInjectionToken<
|
export const allowedResourcesInjectionToken = getInjectionToken<IComputedValue<Set<string>>>({
|
||||||
IComputedValue<Set<string>>
|
|
||||||
>({
|
|
||||||
id: "allowed-resources",
|
id: "allowed-resources",
|
||||||
});
|
});
|
||||||
|
|||||||
@ -81,7 +81,7 @@ export function sortCharts(charts: RawHelmChart[]) {
|
|||||||
iter.map(
|
iter.map(
|
||||||
charts,
|
charts,
|
||||||
chart => {
|
chart => {
|
||||||
const __version = coerce(chart.version, { includePrerelease: true, loose: true });
|
const __version = coerce(chart.version, { loose: true });
|
||||||
|
|
||||||
if (!__version) {
|
if (!__version) {
|
||||||
logger.warn(`[HELM-SERVICE]: Version from helm chart is not loosely coercable to semver.`, { name: chart.name, version: chart.version, repo: chart.repo });
|
logger.warn(`[HELM-SERVICE]: Version from helm chart is not loosely coercable to semver.`, { name: chart.name, version: chart.version, repo: chart.repo });
|
||||||
|
|||||||
@ -27,7 +27,6 @@ export const isCompatibleExtension = ({ appSemVer }: Dependencies): ((manifest:
|
|||||||
|
|
||||||
const { major: extMajor, minor: extMinor } = semver.coerce(manifestLensEngine, {
|
const { major: extMajor, minor: extMinor } = semver.coerce(manifestLensEngine, {
|
||||||
loose: true,
|
loose: true,
|
||||||
includePrerelease: false,
|
|
||||||
}) as semver.SemVer;
|
}) as semver.SemVer;
|
||||||
const supportedVersionsByExtension = semver.validRange(`^${extMajor}.${extMinor}`) as string;
|
const supportedVersionsByExtension = semver.validRange(`^${extMajor}.${extMinor}`) as string;
|
||||||
|
|
||||||
|
|||||||
@ -3,11 +3,17 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import themeStoreInjectable from "../../renderer/themes/store.injectable";
|
import activeThemeInjectable from "../../renderer/themes/active.injectable";
|
||||||
|
import type { LensTheme } from "../../renderer/themes/store";
|
||||||
import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
|
import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
|
||||||
|
|
||||||
const themeStore = asLegacyGlobalForExtensionApi(themeStoreInjectable);
|
export const activeTheme = asLegacyGlobalForExtensionApi(activeThemeInjectable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This hides the reactivity of active theme, use {@link activeTheme} instead
|
||||||
|
*/
|
||||||
export function getActiveTheme() {
|
export function getActiveTheme() {
|
||||||
return themeStore.activeTheme;
|
return activeTheme.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type { LensTheme };
|
||||||
|
|||||||
@ -298,6 +298,7 @@ exports[`add-cluster - navigation using application menu when navigating to add
|
|||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
|
data-waiting="false"
|
||||||
disabled=""
|
disabled=""
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -350,6 +350,7 @@ exports[`cluster - order of sidebar items when rendered renders 1`] = `
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -987,6 +988,7 @@ exports[`cluster - order of sidebar items when rendered when parent is expanded
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -319,6 +319,7 @@ exports[`cluster - sidebar and tab navigation for core given core registrations
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -867,6 +868,7 @@ exports[`cluster - sidebar and tab navigation for core given core registrations
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -1437,6 +1439,7 @@ exports[`cluster - sidebar and tab navigation for core given core registrations
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -2886,6 +2889,7 @@ exports[`cluster - sidebar and tab navigation for core given core registrations
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -3434,6 +3438,7 @@ exports[`cluster - sidebar and tab navigation for core given core registrations
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -319,6 +319,7 @@ exports[`cluster - sidebar and tab navigation for extensions given extension wit
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -867,6 +868,7 @@ exports[`cluster - sidebar and tab navigation for extensions given extension wit
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -1455,6 +1457,7 @@ exports[`cluster - sidebar and tab navigation for extensions given extension wit
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -3526,6 +3529,7 @@ exports[`cluster - sidebar and tab navigation for extensions given extension wit
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -4074,6 +4078,7 @@ exports[`cluster - sidebar and tab navigation for extensions given extension wit
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -289,6 +289,7 @@ exports[`cluster - visibility of sidebar items given kube resource for route is
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -851,6 +852,7 @@ exports[`cluster - visibility of sidebar items given kube resource for route is
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -0,0 +1,576 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`workload overview when navigating to workload overview renders 1`] = `
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="Notifications flex column align-flex-end"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="mainLayout"
|
||||||
|
style="--sidebar-width: 200px;"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="sidebar"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex flex-col"
|
||||||
|
data-testid="cluster-sidebar"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="SidebarCluster"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Avatar rounded loadingAvatar"
|
||||||
|
style="width: 40px; height: 40px;"
|
||||||
|
>
|
||||||
|
??
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="loadingClusterName"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="sidebarNav sidebar-active-status"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="true"
|
||||||
|
data-testid="sidebar-item-workloads"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
aria-current="page"
|
||||||
|
class="nav-item flex gaps align-center expandable active"
|
||||||
|
data-testid="sidebar-item-link-for-workloads"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon svg focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Workloads
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-config"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-config"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="list"
|
||||||
|
>
|
||||||
|
list
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Config
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-network"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-network"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="device_hub"
|
||||||
|
>
|
||||||
|
device_hub
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Network
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-storage"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-storage"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="storage"
|
||||||
|
>
|
||||||
|
storage
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Storage
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-helm"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-helm"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon svg focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Helm
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-user-management"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center"
|
||||||
|
data-testid="sidebar-item-link-for-user-management"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="security"
|
||||||
|
>
|
||||||
|
security
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Access Control
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="SidebarItem"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="sidebar-item-custom-resources"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="nav-item flex gaps align-center expandable"
|
||||||
|
data-testid="sidebar-item-link-for-custom-resources"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="extension"
|
||||||
|
>
|
||||||
|
extension
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<span
|
||||||
|
class="link-text box grow"
|
||||||
|
>
|
||||||
|
Custom Resources
|
||||||
|
</span>
|
||||||
|
<i
|
||||||
|
class="Icon expand-icon box right material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_down"
|
||||||
|
>
|
||||||
|
keyboard_arrow_down
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="ResizingAnchor horizontal trailing"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="contents"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="TabLayout"
|
||||||
|
data-testid="tab-layout"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tabs center scrollable"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tab flex gaps align-center active"
|
||||||
|
data-is-active-test="true"
|
||||||
|
data-testid="tab-link-for-overview"
|
||||||
|
role="tab"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
Overview
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Tab flex gaps align-center"
|
||||||
|
data-is-active-test="false"
|
||||||
|
data-testid="tab-link-for-pods"
|
||||||
|
role="tab"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
Pods
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<main>
|
||||||
|
<div
|
||||||
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="header flex gaps align-center"
|
||||||
|
>
|
||||||
|
<h5
|
||||||
|
class="box grow"
|
||||||
|
>
|
||||||
|
Overview
|
||||||
|
</h5>
|
||||||
|
<div
|
||||||
|
class="NamespaceSelectFilterParent"
|
||||||
|
data-testid="namespace-select-filter"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select theme-dark NamespaceSelect NamespaceSelectFilter css-b62m3t-container"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
id="react-select-overview-namespace-select-filter-input-live-region"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
aria-atomic="false"
|
||||||
|
aria-live="polite"
|
||||||
|
aria-relevant="additions text"
|
||||||
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="Select__control css-1s2u09g-control"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__value-container Select__value-container--is-multi css-319lph-ValueContainer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
|
id="react-select-overview-namespace-select-filter-input-placeholder"
|
||||||
|
>
|
||||||
|
All namespaces
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__input-container css-6j8wv5-Input"
|
||||||
|
data-value=""
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-autocomplete="list"
|
||||||
|
aria-describedby="react-select-overview-namespace-select-filter-input-placeholder"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-haspopup="true"
|
||||||
|
autocapitalize="none"
|
||||||
|
autocomplete="off"
|
||||||
|
autocorrect="off"
|
||||||
|
class="Select__input"
|
||||||
|
id="overview-namespace-select-filter-input"
|
||||||
|
role="combobox"
|
||||||
|
spellcheck="false"
|
||||||
|
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
|
||||||
|
tabindex="0"
|
||||||
|
type="text"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="Select__indicator-separator css-1okebmr-indicatorSeparator"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
|
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
class="css-tj5bde-Svg"
|
||||||
|
focusable="false"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
width="20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="OverviewStatuses"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="workloads"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="workload"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="title"
|
||||||
|
>
|
||||||
|
<a>
|
||||||
|
Pods (0)
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="OverviewWorkloadStatus"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex column align-center box grow"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Chart PieChart flex column align-center"
|
||||||
|
data-testid="workload-overview-status-chart-pods"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="chart-container"
|
||||||
|
>
|
||||||
|
<canvas
|
||||||
|
class="chartjs-render-monitor"
|
||||||
|
height="0"
|
||||||
|
style="display: block;"
|
||||||
|
width="0"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="chartjs-tooltip flex column"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="legend flex wrap"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="footer"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Dock"
|
||||||
|
tabindex="-1"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="ResizingAnchor vertical leading"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="tabs-container flex align-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="dockTabs"
|
||||||
|
role="tablist"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tabs tabs"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="Tab flex gaps align-center DockTab TerminalTab active"
|
||||||
|
data-testid="dock-tab-for-terminal"
|
||||||
|
id="tab-terminal"
|
||||||
|
role="tab"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material focusable"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="terminal"
|
||||||
|
>
|
||||||
|
terminal
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div
|
||||||
|
class="label"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex align-center"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="title"
|
||||||
|
>
|
||||||
|
Terminal
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
class="close"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable small"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="close"
|
||||||
|
>
|
||||||
|
close
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Close ⌘+W
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="toolbar flex gaps align-center box grow"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="dock-menu box grow"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="Icon new-dock-tab material interactive focusable"
|
||||||
|
id="menu-actions-for-dock"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="add"
|
||||||
|
>
|
||||||
|
add
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
New tab
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="fullscreen"
|
||||||
|
>
|
||||||
|
fullscreen
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Fit to window
|
||||||
|
</div>
|
||||||
|
<i
|
||||||
|
class="Icon material interactive focusable"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
data-icon-name="keyboard_arrow_up"
|
||||||
|
>
|
||||||
|
keyboard_arrow_up
|
||||||
|
</span>
|
||||||
|
</i>
|
||||||
|
<div>
|
||||||
|
Open
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
`;
|
||||||
@ -691,6 +691,7 @@ exports[`disable-cluster-pages-when-cluster-is-not-relevant given extension shou
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -1211,6 +1212,7 @@ exports[`disable-cluster-pages-when-cluster-is-not-relevant given not yet known
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -310,6 +310,7 @@ exports[`disable sidebar items when cluster is not relevant given extension shou
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -830,6 +831,7 @@ exports[`disable sidebar items when cluster is not relevant given extension shou
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -1350,6 +1352,7 @@ exports[`disable sidebar items when cluster is not relevant given not yet known
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -317,6 +317,7 @@ exports[`cluster/namespaces - edit namespaces from previously opened tab given t
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -874,6 +875,7 @@ exports[`cluster/namespaces - edit namespaces from previously opened tab given t
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
37
src/features/cluster/workload-overview.test.tsx
Normal file
37
src/features/cluster/workload-overview.test.tsx
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
import navigateToWorkloadsOverviewInjectable from "../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
||||||
|
import { type ApplicationBuilder, getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
||||||
|
|
||||||
|
describe("workload overview", () => {
|
||||||
|
let rendered: RenderResult;
|
||||||
|
let applicationBuilder: ApplicationBuilder;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
applicationBuilder = getApplicationBuilder().setEnvironmentToClusterFrame();
|
||||||
|
applicationBuilder.allowKubeResource("pods");
|
||||||
|
rendered = await applicationBuilder.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when navigating to workload overview", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
applicationBuilder.navigateWith(navigateToWorkloadsOverviewInjectable);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("renders", () => {
|
||||||
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows workload overview", () => {
|
||||||
|
expect(rendered.queryByTestId("page-for-workloads-overview")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows pods pie chart", () => {
|
||||||
|
expect(rendered.queryByTestId("workload-overview-status-chart-pods")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -290,6 +290,7 @@ exports[`disable workloads overview details when cluster is not relevant given e
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -815,6 +816,7 @@ exports[`disable workloads overview details when cluster is not relevant given e
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -1335,6 +1337,7 @@ exports[`disable workloads overview details when cluster is not relevant given n
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -306,6 +306,7 @@ exports[`extensions - navigation using application menu when navigating to exten
|
|||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class="Button button primary"
|
class="Button button primary"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Install
|
Install
|
||||||
|
|||||||
@ -6316,6 +6316,7 @@ exports[`add custom helm repository in preferences when navigating to preference
|
|||||||
<button
|
<button
|
||||||
class="Button waiting primary"
|
class="Button waiting primary"
|
||||||
data-testid="custom-helm-repository-submit-button"
|
data-testid="custom-helm-repository-submit-button"
|
||||||
|
data-waiting="true"
|
||||||
type="submit"
|
type="submit"
|
||||||
>
|
>
|
||||||
Add
|
Add
|
||||||
|
|||||||
@ -290,6 +290,7 @@ exports[`installing helm chart from new tab given tab for installing chart was n
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -290,6 +290,7 @@ exports[`installing helm chart from previously opened tab given tab for installi
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
@ -820,6 +821,7 @@ exports[`installing helm chart from previously opened tab given tab for installi
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
@ -7430,6 +7430,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
@ -8668,6 +8669,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
@ -9906,6 +9908,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button waiting primary"
|
class="Button waiting primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="true"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
@ -10971,6 +10974,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
@ -12037,6 +12041,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="false"
|
||||||
disabled=""
|
disabled=""
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
@ -13276,6 +13281,7 @@ exports[`showing details for helm release given application is started when navi
|
|||||||
<button
|
<button
|
||||||
class="Button primary"
|
class="Button primary"
|
||||||
data-testid="helm-release-configuration-save-button"
|
data-testid="helm-release-configuration-save-button"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
|
|||||||
@ -155,6 +155,12 @@ export class ContextHandler implements ClusterContextHandler {
|
|||||||
|
|
||||||
if (this.clusterUrl.hostname) {
|
if (this.clusterUrl.hostname) {
|
||||||
headers.Host = this.clusterUrl.hostname;
|
headers.Host = this.clusterUrl.hostname;
|
||||||
|
|
||||||
|
// fix current IPv6 inconsistency in url.Parse() and httpProxy.
|
||||||
|
// with url.Parse the IPv6 Hostname has no Square brackets but httpProxy needs the Square brackets to work.
|
||||||
|
if (headers.Host.includes(":")) {
|
||||||
|
headers.Host = `[${headers.Host}]`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -67,7 +67,7 @@ export class Kubectl {
|
|||||||
let version: SemVer;
|
let version: SemVer;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
version = new SemVer(clusterVersion, { includePrerelease: false });
|
version = new SemVer(clusterVersion);
|
||||||
} catch {
|
} catch {
|
||||||
version = new SemVer(Kubectl.bundledKubectlVersion);
|
version = new SemVer(Kubectl.bundledKubectlVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,11 +3,10 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { PrometheusLens } from "./lens";
|
|
||||||
import type { CoreV1Api } from "@kubernetes/client-node";
|
import type { CoreV1Api } from "@kubernetes/client-node";
|
||||||
import type { PrometheusService } from "./provider-registry";
|
import { inspect } from "util";
|
||||||
|
import { PrometheusProvider, type PrometheusService } from "./provider-registry";
|
||||||
export class PrometheusHelm extends PrometheusLens {
|
export class PrometheusHelm extends PrometheusProvider {
|
||||||
readonly id: string = "helm";
|
readonly id: string = "helm";
|
||||||
readonly name: string = "Helm";
|
readonly name: string = "Helm";
|
||||||
readonly rateAccuracy: string = "5m";
|
readonly rateAccuracy: string = "5m";
|
||||||
@ -16,4 +15,115 @@ export class PrometheusHelm extends PrometheusLens {
|
|||||||
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
||||||
return this.getFirstNamespacedService(client, "app=prometheus,component=server,heritage=Helm");
|
return this.getFirstNamespacedService(client, "app=prometheus,component=server,heritage=Helm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getQuery(opts: Record<string, string>, queryName: string): string {
|
||||||
|
switch(opts.category) {
|
||||||
|
case "cluster":
|
||||||
|
switch (queryName) {
|
||||||
|
case "memoryUsage":
|
||||||
|
return `sum(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) by (component)`.replace(/_bytes/g, `_bytes{node=~"${opts.nodes}"}`);
|
||||||
|
case "workloadMemoryUsage":
|
||||||
|
return `sum(container_memory_working_set_bytes{container!="POD",container!="",instance=~"${opts.nodes}"}) by (component)`;
|
||||||
|
case "memoryRequests":
|
||||||
|
return `sum(kube_pod_container_resource_requests{node=~"${opts.nodes}", resource="memory"}) by (component)`;
|
||||||
|
case "memoryLimits":
|
||||||
|
return `sum(kube_pod_container_resource_limits{node=~"${opts.nodes}", resource="memory"}) by (component)`;
|
||||||
|
case "memoryCapacity":
|
||||||
|
return `sum(kube_node_status_capacity{node=~"${opts.nodes}", resource="memory"}) by (component)`;
|
||||||
|
case "memoryAllocatableCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="memory"}) by (component)`;
|
||||||
|
case "cpuUsage":
|
||||||
|
return `sum(rate(node_cpu_seconds_total{node=~"${opts.nodes}", mode=~"user|system"}[${this.rateAccuracy}]))`;
|
||||||
|
case "cpuRequests":
|
||||||
|
return `sum(kube_pod_container_resource_requests{node=~"${opts.nodes}", resource="cpu"}) by (component)`;
|
||||||
|
case "cpuLimits":
|
||||||
|
return `sum(kube_pod_container_resource_limits{node=~"${opts.nodes}", resource="cpu"}) by (component)`;
|
||||||
|
case "cpuCapacity":
|
||||||
|
return `sum(kube_node_status_capacity{node=~"${opts.nodes}", resource="cpu"}) by (component)`;
|
||||||
|
case "cpuAllocatableCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="cpu"}) by (component)`;
|
||||||
|
case "podUsage":
|
||||||
|
return `sum({__name__=~"kubelet_running_pod_count|kubelet_running_pods", instance=~"${opts.nodes}"})`;
|
||||||
|
case "podCapacity":
|
||||||
|
return `sum(kube_node_status_capacity{node=~"${opts.nodes}", resource="pods"}) by (component)`;
|
||||||
|
case "podAllocatableCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"}) by (component)`;
|
||||||
|
case "fsSize":
|
||||||
|
return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`;
|
||||||
|
case "fsUsage":
|
||||||
|
return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "nodes":
|
||||||
|
switch (queryName) {
|
||||||
|
case "memoryUsage":
|
||||||
|
return `sum(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) by (node)`;
|
||||||
|
case "workloadMemoryUsage":
|
||||||
|
return `sum(container_memory_working_set_bytes{container!="POD",container!=""}) by (instance)`;
|
||||||
|
case "memoryCapacity":
|
||||||
|
return `sum(kube_node_status_capacity{resource="memory"}) by (node)`;
|
||||||
|
case "memoryAllocatableCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{resource="memory"}) by (node)`;
|
||||||
|
case "cpuUsage":
|
||||||
|
return `sum(rate(node_cpu_seconds_total{mode=~"user|system"}[${this.rateAccuracy}])) by(node)`;
|
||||||
|
case "cpuCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`;
|
||||||
|
case "cpuAllocatableCapacity":
|
||||||
|
return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`;
|
||||||
|
case "fsSize":
|
||||||
|
return `sum(node_filesystem_size_bytes{mountpoint="/"}) by (node)`;
|
||||||
|
case "fsUsage":
|
||||||
|
return `sum(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) by (node)`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "pods":
|
||||||
|
switch (queryName) {
|
||||||
|
case "cpuUsage":
|
||||||
|
return `sum(rate(container_cpu_usage_seconds_total{container!="POD",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
|
||||||
|
case "cpuRequests":
|
||||||
|
return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}",resource="cpu",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "cpuLimits":
|
||||||
|
return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}",resource="cpu",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "memoryUsage":
|
||||||
|
return `sum(container_memory_working_set_bytes{container!="POD",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "memoryRequests":
|
||||||
|
return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}",resource="memory",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "memoryLimits":
|
||||||
|
return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}",resource="memory",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "fsUsage":
|
||||||
|
return `sum(container_fs_usage_bytes{container!="POD",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}) by (${opts.selector})`;
|
||||||
|
case "fsWrites":
|
||||||
|
return `sum(rate(container_fs_writes_bytes_total{container!="", pod=~"${opts.pods}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
|
||||||
|
case "fsReads":
|
||||||
|
return `sum(rate(container_fs_reads_bytes_total{container!="", pod=~"${opts.pods}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
|
||||||
|
case "networkReceive":
|
||||||
|
return `sum(rate(container_network_receive_bytes_total{pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
|
||||||
|
case "networkTransmit":
|
||||||
|
return `sum(rate(container_network_transmit_bytes_total{pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "pvc":
|
||||||
|
switch (queryName) {
|
||||||
|
case "diskUsage":
|
||||||
|
return `sum(kubelet_volume_stats_used_bytes{persistentvolumeclaim="${opts.pvc}",namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
|
||||||
|
case "diskCapacity":
|
||||||
|
return `sum(kubelet_volume_stats_capacity_bytes{persistentvolumeclaim="${opts.pvc}",namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "ingress":
|
||||||
|
switch (queryName) {
|
||||||
|
case "bytesSentSuccess":
|
||||||
|
return this.bytesSent(opts.ingress, opts.namespace, "^2\\\\d*");
|
||||||
|
case "bytesSentFailure":
|
||||||
|
return this.bytesSent(opts.ingress, opts.namespace, "^5\\\\d*");
|
||||||
|
case "requestDurationSeconds":
|
||||||
|
return `sum(rate(nginx_ingress_controller_request_duration_seconds_sum{ingress="${opts.ingress}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
|
||||||
|
case "responseDurationSeconds":
|
||||||
|
return `sum(rate(nginx_ingress_controller_response_duration_seconds_sum{ingress="${opts.ingress}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Unknown query name ${inspect(queryName, false, undefined, false)} for category: ${inspect(opts.category, false, undefined, false)}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ export class PrometheusOperator extends PrometheusProvider {
|
|||||||
readonly isConfigurable: boolean = true;
|
readonly isConfigurable: boolean = true;
|
||||||
|
|
||||||
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
||||||
return this.getFirstNamespacedService(client, "operated-prometheus=true", "self-monitor=true");
|
return this.getFirstNamespacedService(client, "operated-prometheus=true");
|
||||||
}
|
}
|
||||||
|
|
||||||
public getQuery(opts: Record<string, string>, queryName: string): string {
|
public getQuery(opts: Record<string, string>, queryName: string): string {
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import styles from "./cluster-issues.module.scss";
|
|||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
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";
|
||||||
@ -14,11 +15,9 @@ import { Table, TableCell, TableHead, TableRow } from "../table";
|
|||||||
import { cssNames, prevDefault } from "../../utils";
|
import { cssNames, prevDefault } from "../../utils";
|
||||||
import type { ItemObject } from "../../../common/item.store";
|
import type { ItemObject } from "../../../common/item.store";
|
||||||
import { Spinner } from "../spinner";
|
import { Spinner } from "../spinner";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
|
||||||
import type { ApiManager } from "../../../common/k8s-api/api-manager";
|
import type { ApiManager } from "../../../common/k8s-api/api-manager";
|
||||||
import { KubeObjectAge } from "../kube-object/age";
|
import { KubeObjectAge } from "../kube-object/age";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
|
||||||
import type { NodeStore } from "../+nodes/store";
|
import type { NodeStore } from "../+nodes/store";
|
||||||
import type { EventStore } from "../+events/store";
|
import type { EventStore } from "../+events/store";
|
||||||
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
|
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
|
||||||
@ -28,6 +27,8 @@ import type { PageParam } from "../../navigation";
|
|||||||
import type { ToggleKubeDetailsPane } from "../kube-detail-params/toggle-details.injectable";
|
import type { ToggleKubeDetailsPane } from "../kube-detail-params/toggle-details.injectable";
|
||||||
import kubeSelectedUrlParamInjectable from "../kube-detail-params/kube-selected-url.injectable";
|
import kubeSelectedUrlParamInjectable from "../kube-detail-params/kube-selected-url.injectable";
|
||||||
import toggleKubeDetailsPaneInjectable from "../kube-detail-params/toggle-details.injectable";
|
import toggleKubeDetailsPaneInjectable from "../kube-detail-params/toggle-details.injectable";
|
||||||
|
import type { LensTheme } from "../../themes/store";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface ClusterIssuesProps {
|
export interface ClusterIssuesProps {
|
||||||
className?: string;
|
className?: string;
|
||||||
@ -48,7 +49,7 @@ enum sortBy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
nodeStore: NodeStore;
|
nodeStore: NodeStore;
|
||||||
eventStore: EventStore;
|
eventStore: EventStore;
|
||||||
apiManager: ApiManager;
|
apiManager: ApiManager;
|
||||||
@ -166,7 +167,7 @@ class NonInjectedClusterIssues extends React.Component<ClusterIssuesProps & Depe
|
|||||||
sortByDefault={{ sortBy: sortBy.object, orderBy: "asc" }}
|
sortByDefault={{ sortBy: sortBy.object, orderBy: "asc" }}
|
||||||
sortSyncWithUrl={false}
|
sortSyncWithUrl={false}
|
||||||
getTableRow={this.getTableRow}
|
getTableRow={this.getTableRow}
|
||||||
className={cssNames("box grow", this.props.themeStore.activeTheme.type)}
|
className={cssNames("box grow", this.props.activeTheme.get().type)}
|
||||||
>
|
>
|
||||||
<TableHead nowrap>
|
<TableHead nowrap>
|
||||||
<TableCell className="message">Message</TableCell>
|
<TableCell className="message">Message</TableCell>
|
||||||
@ -191,7 +192,7 @@ class NonInjectedClusterIssues extends React.Component<ClusterIssuesProps & Depe
|
|||||||
export const ClusterIssues = withInjectables<Dependencies, ClusterIssuesProps>(NonInjectedClusterIssues, {
|
export const ClusterIssues = withInjectables<Dependencies, ClusterIssuesProps>(NonInjectedClusterIssues, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
apiManager: di.inject(apiManagerInjectable),
|
apiManager: di.inject(apiManagerInjectable),
|
||||||
eventStore: di.inject(eventStoreInjectable),
|
eventStore: di.inject(eventStoreInjectable),
|
||||||
nodeStore: di.inject(nodeStoreInjectable),
|
nodeStore: di.inject(nodeStoreInjectable),
|
||||||
|
|||||||
@ -16,12 +16,13 @@ import type { PieChartData } from "../chart";
|
|||||||
import { PieChart } from "../chart";
|
import { PieChart } from "../chart";
|
||||||
import { ClusterNoMetrics } from "./cluster-no-metrics";
|
import { ClusterNoMetrics } from "./cluster-no-metrics";
|
||||||
import { bytesToUnits, cssNames } from "../../utils";
|
import { bytesToUnits, cssNames } from "../../utils";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { getMetricLastPoints } from "../../../common/k8s-api/endpoints/metrics.api";
|
import { getMetricLastPoints } from "../../../common/k8s-api/endpoints/metrics.api";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
|
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
|
||||||
import nodeStoreInjectable from "../+nodes/store.injectable";
|
import nodeStoreInjectable from "../+nodes/store.injectable";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
function createLabels(rawLabelData: [string, number | undefined][]): string[] {
|
function createLabels(rawLabelData: [string, number | undefined][]): string[] {
|
||||||
return rawLabelData.map(([key, value]) => `${key}: ${value?.toFixed(2) || "N/A"}`);
|
return rawLabelData.map(([key, value]) => `${key}: ${value?.toFixed(2) || "N/A"}`);
|
||||||
@ -30,13 +31,13 @@ function createLabels(rawLabelData: [string, number | undefined][]): string[] {
|
|||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
clusterOverviewStore: ClusterOverviewStore;
|
clusterOverviewStore: ClusterOverviewStore;
|
||||||
nodeStore: NodeStore;
|
nodeStore: NodeStore;
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedClusterPieCharts = observer(({
|
const NonInjectedClusterPieCharts = observer(({
|
||||||
clusterOverviewStore,
|
clusterOverviewStore,
|
||||||
nodeStore,
|
nodeStore,
|
||||||
themeStore,
|
activeTheme,
|
||||||
}: Dependencies) => {
|
}: Dependencies) => {
|
||||||
const renderLimitWarning = () => {
|
const renderLimitWarning = () => {
|
||||||
return (
|
return (
|
||||||
@ -54,7 +55,7 @@ const NonInjectedClusterPieCharts = observer(({
|
|||||||
const { podUsage, podAllocatableCapacity, podCapacity } = data;
|
const { podUsage, podAllocatableCapacity, podCapacity } = data;
|
||||||
const cpuLimitsOverload = cpuLimits > cpuAllocatableCapacity;
|
const cpuLimitsOverload = cpuLimits > cpuAllocatableCapacity;
|
||||||
const memoryLimitsOverload = memoryLimits > memoryAllocatableCapacity;
|
const memoryLimitsOverload = memoryLimits > memoryAllocatableCapacity;
|
||||||
const defaultColor = themeStore.activeTheme.colors.pieChartDefaultColor;
|
const defaultColor = activeTheme.get().colors.pieChartDefaultColor;
|
||||||
|
|
||||||
if (!memoryCapacity || !cpuCapacity || !podCapacity || !memoryAllocatableCapacity || !cpuAllocatableCapacity || !podAllocatableCapacity) return null;
|
if (!memoryCapacity || !cpuCapacity || !podCapacity || !memoryAllocatableCapacity || !cpuAllocatableCapacity || !podAllocatableCapacity) return null;
|
||||||
const cpuData: PieChartData = {
|
const cpuData: PieChartData = {
|
||||||
@ -261,6 +262,6 @@ export const ClusterPieCharts = withInjectables<Dependencies>(NonInjectedCluster
|
|||||||
getProps: (di) => ({
|
getProps: (di) => ({
|
||||||
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
|
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
|
||||||
nodeStore: di.inject(nodeStoreInjectable),
|
nodeStore: di.inject(nodeStoreInjectable),
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -91,7 +91,7 @@ const attemptInstallByInfo = ({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const versions = Object.keys(json.versions)
|
const versions = Object.keys(json.versions)
|
||||||
.map(version => new SemVer(version, { loose: true, includePrerelease: true }))
|
.map(version => new SemVer(version, { loose: true }))
|
||||||
// ignore pre-releases for auto picking the version
|
// ignore pre-releases for auto picking the version
|
||||||
.filter(version => version.prerelease.length === 0);
|
.filter(version => version.prerelease.length === 0);
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,7 @@ export class HelmChartStore extends ItemStore<HelmChart> {
|
|||||||
|
|
||||||
protected sortVersions = (versions: ChartVersion[]) => {
|
protected sortVersions = (versions: ChartVersion[]) => {
|
||||||
return versions
|
return versions
|
||||||
.map(chartVersion => ({ ...chartVersion, __version: semver.coerce(chartVersion.version, { includePrerelease: true, loose: true }) }))
|
.map(chartVersion => ({ ...chartVersion, __version: semver.coerce(chartVersion.version, { loose: true }) }))
|
||||||
.sort(sortCompareChartVersions)
|
.sort(sortCompareChartVersions)
|
||||||
.map(({ __version, ...chartVersion }) => chartVersion);
|
.map(({ __version, ...chartVersion }) => chartVersion);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -3,13 +3,12 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
|
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IComputedValue, IObservableValue } from "mobx";
|
||||||
import { runInAction, action, observable, computed } from "mobx";
|
import { runInAction, action, observable, computed } from "mobx";
|
||||||
import type { TargetHelmRelease } from "../target-helm-release.injectable";
|
import type { TargetHelmRelease } from "../target-helm-release.injectable";
|
||||||
import type { CallForHelmRelease, DetailedHelmRelease } from "./call-for-helm-release/call-for-helm-release.injectable";
|
import type { CallForHelmRelease, DetailedHelmRelease } from "./call-for-helm-release/call-for-helm-release.injectable";
|
||||||
import callForHelmReleaseInjectable from "./call-for-helm-release/call-for-helm-release.injectable";
|
import callForHelmReleaseInjectable from "./call-for-helm-release/call-for-helm-release.injectable";
|
||||||
import type { ThemeStore } from "../../../../themes/store";
|
import type { LensTheme } from "../../../../themes/store";
|
||||||
import themeStoreInjectable from "../../../../themes/store.injectable";
|
|
||||||
import type { CallForHelmReleaseConfiguration } from "./call-for-helm-release-configuration/call-for-helm-release-configuration.injectable";
|
import type { CallForHelmReleaseConfiguration } from "./call-for-helm-release-configuration/call-for-helm-release-configuration.injectable";
|
||||||
import callForHelmReleaseConfigurationInjectable from "./call-for-helm-release-configuration/call-for-helm-release-configuration.injectable";
|
import callForHelmReleaseConfigurationInjectable from "./call-for-helm-release-configuration/call-for-helm-release-configuration.injectable";
|
||||||
import { toHelmRelease } from "../../releases.injectable";
|
import { toHelmRelease } from "../../releases.injectable";
|
||||||
@ -31,6 +30,7 @@ import type { NavigateToHelmReleases } from "../../../../../common/front-end-rou
|
|||||||
import navigateToHelmReleasesInjectable from "../../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
import navigateToHelmReleasesInjectable from "../../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import withOrphanPromiseInjectable from "../../../../../common/utils/with-orphan-promise/with-orphan-promise.injectable";
|
import withOrphanPromiseInjectable from "../../../../../common/utils/with-orphan-promise/with-orphan-promise.injectable";
|
||||||
|
import activeThemeInjectable from "../../../../themes/active.injectable";
|
||||||
|
|
||||||
const releaseDetailsModelInjectable = getInjectable({
|
const releaseDetailsModelInjectable = getInjectable({
|
||||||
id: "release-details-model",
|
id: "release-details-model",
|
||||||
@ -38,7 +38,7 @@ const releaseDetailsModelInjectable = getInjectable({
|
|||||||
instantiate: (di, targetRelease: TargetHelmRelease) => {
|
instantiate: (di, targetRelease: TargetHelmRelease) => {
|
||||||
const callForHelmRelease = di.inject(callForHelmReleaseInjectable);
|
const callForHelmRelease = di.inject(callForHelmReleaseInjectable);
|
||||||
const callForHelmReleaseConfiguration = di.inject(callForHelmReleaseConfigurationInjectable);
|
const callForHelmReleaseConfiguration = di.inject(callForHelmReleaseConfigurationInjectable);
|
||||||
const themeStore = di.inject(themeStoreInjectable);
|
const activeTheme = di.inject(activeThemeInjectable);
|
||||||
const getResourceDetailsUrl = di.inject(getResourceDetailsUrlInjectable);
|
const getResourceDetailsUrl = di.inject(getResourceDetailsUrlInjectable);
|
||||||
const updateRelease = di.inject(updateReleaseInjectable);
|
const updateRelease = di.inject(updateReleaseInjectable);
|
||||||
const showCheckedErrorNotification = di.inject(showCheckedErrorNotificationInjectable);
|
const showCheckedErrorNotification = di.inject(showCheckedErrorNotificationInjectable);
|
||||||
@ -50,7 +50,7 @@ const releaseDetailsModelInjectable = getInjectable({
|
|||||||
const model = new ReleaseDetailsModel({
|
const model = new ReleaseDetailsModel({
|
||||||
callForHelmRelease,
|
callForHelmRelease,
|
||||||
targetRelease,
|
targetRelease,
|
||||||
themeStore,
|
activeTheme,
|
||||||
callForHelmReleaseConfiguration,
|
callForHelmReleaseConfiguration,
|
||||||
getResourceDetailsUrl,
|
getResourceDetailsUrl,
|
||||||
updateRelease,
|
updateRelease,
|
||||||
@ -92,7 +92,7 @@ export interface ConfigurationInput {
|
|||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
callForHelmRelease: CallForHelmRelease;
|
callForHelmRelease: CallForHelmRelease;
|
||||||
targetRelease: TargetHelmRelease;
|
targetRelease: TargetHelmRelease;
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
callForHelmReleaseConfiguration: CallForHelmReleaseConfiguration;
|
callForHelmReleaseConfiguration: CallForHelmReleaseConfiguration;
|
||||||
getResourceDetailsUrl: GetResourceDetailsUrl;
|
getResourceDetailsUrl: GetResourceDetailsUrl;
|
||||||
updateRelease: CallForHelmReleaseUpdate;
|
updateRelease: CallForHelmReleaseUpdate;
|
||||||
@ -259,7 +259,7 @@ export class ReleaseDetailsModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@computed get activeTheme() {
|
@computed get activeTheme() {
|
||||||
return this.dependencies.themeStore.activeTheme.type;
|
return this.dependencies.activeTheme.get().type;
|
||||||
}
|
}
|
||||||
|
|
||||||
close = () => {
|
close = () => {
|
||||||
|
|||||||
@ -12,18 +12,19 @@ import { ResourceMetricsContext } from "../resource-metrics";
|
|||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import { mapValues } from "lodash";
|
import { mapValues } from "lodash";
|
||||||
import { type MetricsTab, metricTabOptions } from "../chart/options";
|
import { type MetricsTab, metricTabOptions } from "../chart/options";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface NodeChartsProps {}
|
export interface NodeChartsProps {}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedNodeCharts = observer(({
|
const NonInjectedNodeCharts = observer(({
|
||||||
themeStore,
|
activeTheme,
|
||||||
}: Dependencies & NodeChartsProps) => {
|
}: Dependencies & NodeChartsProps) => {
|
||||||
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ const NonInjectedNodeCharts = observer(({
|
|||||||
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
||||||
|
|
||||||
const id = object.getId();
|
const id = object.getId();
|
||||||
const { chartCapacityColor } = themeStore.activeTheme.colors;
|
const { chartCapacityColor } = activeTheme.get().colors;
|
||||||
const {
|
const {
|
||||||
memoryUsage,
|
memoryUsage,
|
||||||
workloadMemoryUsage,
|
workloadMemoryUsage,
|
||||||
@ -162,6 +163,6 @@ const NonInjectedNodeCharts = observer(({
|
|||||||
export const NodeCharts = withInjectables<Dependencies, NodeChartsProps>(NonInjectedNodeCharts, {
|
export const NodeCharts = withInjectables<Dependencies, NodeChartsProps>(NonInjectedNodeCharts, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -10,18 +10,19 @@ import { BarChart, memoryOptions } from "../chart";
|
|||||||
import { isMetricsEmpty, normalizeMetrics } from "../../../common/k8s-api/endpoints/metrics.api";
|
import { isMetricsEmpty, normalizeMetrics } from "../../../common/k8s-api/endpoints/metrics.api";
|
||||||
import { NoMetrics } from "../resource-metrics/no-metrics";
|
import { NoMetrics } from "../resource-metrics/no-metrics";
|
||||||
import { ResourceMetricsContext } from "../resource-metrics";
|
import { ResourceMetricsContext } from "../resource-metrics";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface VolumeClaimDiskChartProps {}
|
export interface VolumeClaimDiskChartProps {}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedVolumeClaimDiskChart = observer(({
|
const NonInjectedVolumeClaimDiskChart = observer(({
|
||||||
themeStore,
|
activeTheme,
|
||||||
}: Dependencies & VolumeClaimDiskChartProps) => {
|
}: Dependencies & VolumeClaimDiskChartProps) => {
|
||||||
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ const NonInjectedVolumeClaimDiskChart = observer(({
|
|||||||
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
||||||
|
|
||||||
const id = object.getId();
|
const id = object.getId();
|
||||||
const { chartCapacityColor } = themeStore.activeTheme.colors;
|
const { chartCapacityColor } = activeTheme.get().colors;
|
||||||
const { diskUsage, diskCapacity } = metrics;
|
const { diskUsage, diskCapacity } = metrics;
|
||||||
const usage = normalizeMetrics(diskUsage).data.result[0].values;
|
const usage = normalizeMetrics(diskUsage).data.result[0].values;
|
||||||
const capacity = normalizeMetrics(diskCapacity).data.result[0].values;
|
const capacity = normalizeMetrics(diskCapacity).data.result[0].values;
|
||||||
@ -65,6 +66,6 @@ const NonInjectedVolumeClaimDiskChart = observer(({
|
|||||||
export const VolumeClaimDiskChart = withInjectables<Dependencies, VolumeClaimDiskChartProps>(NonInjectedVolumeClaimDiskChart, {
|
export const VolumeClaimDiskChart = withInjectables<Dependencies, VolumeClaimDiskChartProps>(NonInjectedVolumeClaimDiskChart, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -31,7 +31,7 @@ const NonInjectedOverviewStatuses = observer(
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<OverviewWorkloadStatus status={workload.status.get()} />
|
<OverviewWorkloadStatus workload={workload} />
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -8,92 +8,101 @@ import "./overview-workload-status.scss";
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import capitalize from "lodash/capitalize";
|
import capitalize from "lodash/capitalize";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { DatasetTooltipLabel, PieChartData } from "../chart";
|
import type { PieChartData } from "../chart";
|
||||||
import { PieChart } from "../chart";
|
import { PieChart } from "../chart";
|
||||||
import { cssVar, object } from "../../utils";
|
import { object } from "../../utils";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { PascalCase } from "type-fest";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
import type { Workload } from "./workloads/workload-injection-token";
|
||||||
|
|
||||||
|
export type LowercaseOrPascalCase<T extends string> = Lowercase<T> | PascalCase<T>;
|
||||||
|
|
||||||
|
export type WorkloadStatus = Partial<Record<LowercaseOrPascalCase<keyof typeof statusBackgroundColorMapping>, number>>;
|
||||||
|
|
||||||
|
function toLowercase<T extends string>(src: T): Lowercase<T> {
|
||||||
|
return src.toLowerCase() as Lowercase<T>;
|
||||||
|
}
|
||||||
|
|
||||||
export interface OverviewWorkloadStatusProps {
|
export interface OverviewWorkloadStatusProps {
|
||||||
status: Partial<Record<string, number>>;
|
workload: Workload;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@observer
|
const statusBackgroundColorMapping = {
|
||||||
class NonInjectedOverviewWorkloadStatus extends React.Component<OverviewWorkloadStatusProps & Dependencies> {
|
"running": "colorOk",
|
||||||
private elem: HTMLElement | null = null;
|
"scheduled": "colorOk",
|
||||||
|
"pending": "colorWarning",
|
||||||
|
"suspended": "colorWarning",
|
||||||
|
"evicted": "colorError",
|
||||||
|
"succeeded": "colorSuccess",
|
||||||
|
"failed": "colorError",
|
||||||
|
"terminated": "colorTerminated",
|
||||||
|
"terminating": "colorTerminated",
|
||||||
|
"unknown": "colorVague",
|
||||||
|
"complete": "colorSuccess",
|
||||||
|
} as const;
|
||||||
|
|
||||||
renderChart() {
|
const NonInjectedOverviewWorkloadStatus = observer((props: OverviewWorkloadStatusProps & Dependencies) => {
|
||||||
if (!this.elem) {
|
const {
|
||||||
return null;
|
workload,
|
||||||
}
|
activeTheme,
|
||||||
|
} = props;
|
||||||
|
|
||||||
const cssVars = cssVar(this.elem);
|
const statusesToBeShown = object.entries(workload.status.get()).filter(([, val]) => val > 0);
|
||||||
const chartData: Required<PieChartData> = {
|
const theme = activeTheme.get();
|
||||||
labels: [],
|
|
||||||
datasets: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
const statuses = object.entries(this.props.status).filter(([, val]) => val > 0);
|
const emptyDataSet = {
|
||||||
|
data: [1],
|
||||||
|
backgroundColor: [theme.colors.pieChartDefaultColor],
|
||||||
|
label: "Empty",
|
||||||
|
};
|
||||||
|
const statusDataSet = {
|
||||||
|
label: "Status",
|
||||||
|
data: statusesToBeShown.map(([, value]) => value),
|
||||||
|
backgroundColor: statusesToBeShown.map(([status]) => (
|
||||||
|
theme.colors[statusBackgroundColorMapping[toLowercase(status)]]
|
||||||
|
)),
|
||||||
|
tooltipLabels: statusesToBeShown.map(([status]) => (
|
||||||
|
(percent: string) => `${capitalize(status)}: ${percent}`
|
||||||
|
)),
|
||||||
|
};
|
||||||
|
|
||||||
if (statuses.length === 0) {
|
const chartData: Required<PieChartData> = {
|
||||||
chartData.datasets.push({
|
datasets: [statusesToBeShown.length > 0 ? statusDataSet : emptyDataSet],
|
||||||
data: [1],
|
|
||||||
backgroundColor: [this.props.themeStore.activeTheme.colors.pieChartDefaultColor],
|
|
||||||
label: "Empty",
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const data: number[] = [];
|
|
||||||
const backgroundColor: string[] = [];
|
|
||||||
const tooltipLabels: DatasetTooltipLabel[] = [];
|
|
||||||
|
|
||||||
for (const [status, value] of statuses) {
|
labels: statusesToBeShown.map(
|
||||||
data.push(value);
|
([status, value]) => `${capitalize(status)}: ${value}`,
|
||||||
backgroundColor.push(cssVars.get(`--workload-status-${status.toLowerCase()}`).toString());
|
),
|
||||||
tooltipLabels.push(percent => `${capitalize(status)}: ${percent}`);
|
};
|
||||||
chartData.labels.push(`${capitalize(status)}: ${value}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
chartData.datasets.push({
|
return (
|
||||||
data,
|
<div className="OverviewWorkloadStatus">
|
||||||
backgroundColor,
|
<div className="flex column align-center box grow">
|
||||||
label: "Status",
|
<PieChart
|
||||||
tooltipLabels,
|
data={chartData}
|
||||||
});
|
options={{
|
||||||
}
|
elements: {
|
||||||
|
arc: {
|
||||||
return (
|
borderWidth: 0,
|
||||||
<PieChart
|
},
|
||||||
data={chartData}
|
|
||||||
options={{
|
|
||||||
elements: {
|
|
||||||
arc: {
|
|
||||||
borderWidth: 0,
|
|
||||||
},
|
},
|
||||||
},
|
}}
|
||||||
}}
|
data-testid={`workload-overview-status-chart-${workload.title.toLowerCase().replace(/\s+/, "-")}`}
|
||||||
/>
|
/>
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className="OverviewWorkloadStatus" ref={e => this.elem = e}>
|
|
||||||
<div className="flex column align-center box grow">
|
|
||||||
{this.renderChart()}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
</div>
|
||||||
}
|
);
|
||||||
}
|
});
|
||||||
|
|
||||||
export const OverviewWorkloadStatus = withInjectables<Dependencies, OverviewWorkloadStatusProps>(NonInjectedOverviewWorkloadStatus, {
|
export const OverviewWorkloadStatus = withInjectables<Dependencies, OverviewWorkloadStatusProps>(NonInjectedOverviewWorkloadStatus, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -104,7 +104,7 @@ class NonInjectedWorkloadsOverview extends React.Component<Dependencies> {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<SiblingsInTabLayout>
|
<SiblingsInTabLayout>
|
||||||
<div className="WorkloadsOverview flex column gaps">
|
<div className="WorkloadsOverview flex column gaps" data-testid="page-for-workloads-overview">
|
||||||
<div className="header flex gaps align-center">
|
<div className="header flex gaps align-center">
|
||||||
<h5 className="box grow">Overview</h5>
|
<h5 className="box grow">Overview</h5>
|
||||||
{this.renderLoadErrors()}
|
{this.renderLoadErrors()}
|
||||||
|
|||||||
@ -4,12 +4,13 @@
|
|||||||
*/
|
*/
|
||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { IComputedValue } from "mobx";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import type { WorkloadStatus } from "../overview-workload-status";
|
||||||
|
|
||||||
export interface Workload {
|
export interface Workload {
|
||||||
resourceName: string;
|
resourceName: string;
|
||||||
open: () => void;
|
open: () => void;
|
||||||
amountOfItems: IComputedValue<number>;
|
amountOfItems: IComputedValue<number>;
|
||||||
status: IComputedValue<Partial<Record<string, number>>>;
|
status: IComputedValue<WorkloadStatus>;
|
||||||
title: string;
|
title: string;
|
||||||
orderNumber: number;
|
orderNumber: number;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,27 +10,28 @@ import { BarChart } from "../chart";
|
|||||||
import { isMetricsEmpty, normalizeMetrics } from "../../../common/k8s-api/endpoints/metrics.api";
|
import { isMetricsEmpty, normalizeMetrics } from "../../../common/k8s-api/endpoints/metrics.api";
|
||||||
import { NoMetrics } from "../resource-metrics/no-metrics";
|
import { NoMetrics } from "../resource-metrics/no-metrics";
|
||||||
import { ResourceMetricsContext } from "../resource-metrics";
|
import { ResourceMetricsContext } from "../resource-metrics";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { mapValues } from "lodash";
|
import { mapValues } from "lodash";
|
||||||
import { type MetricsTab, metricTabOptions } from "../chart/options";
|
import { type MetricsTab, metricTabOptions } from "../chart/options";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
|
||||||
export interface ContainerChartsProps {}
|
export interface ContainerChartsProps {}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedContainerCharts = observer(({
|
const NonInjectedContainerCharts = observer(({
|
||||||
themeStore,
|
activeTheme,
|
||||||
}: Dependencies & ContainerChartsProps) => {
|
}: Dependencies & ContainerChartsProps) => {
|
||||||
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
const { metrics, tab, object } = useContext(ResourceMetricsContext) ?? {};
|
||||||
|
|
||||||
if (!metrics || !object || !tab) return null;
|
if (!metrics || !object || !tab) return null;
|
||||||
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
|
||||||
|
|
||||||
const { chartCapacityColor } = themeStore.activeTheme.colors;
|
const { chartCapacityColor } = activeTheme.get().colors;
|
||||||
const {
|
const {
|
||||||
cpuUsage,
|
cpuUsage,
|
||||||
cpuRequests,
|
cpuRequests,
|
||||||
@ -127,6 +128,6 @@ const NonInjectedContainerCharts = observer(({
|
|||||||
export const ContainerCharts = withInjectables<Dependencies, ContainerChartsProps>(NonInjectedContainerCharts, {
|
export const ContainerCharts = withInjectables<Dependencies, ContainerChartsProps>(NonInjectedContainerCharts, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -49,7 +49,11 @@ export const Button = withTooltip((props: ButtonProps) => {
|
|||||||
|
|
||||||
// render as button
|
// render as button
|
||||||
return (
|
return (
|
||||||
<button type="button" {...btnProps}>
|
<button
|
||||||
|
type="button"
|
||||||
|
{...btnProps}
|
||||||
|
data-waiting={typeof waiting === "boolean" ? String(waiting) : undefined}
|
||||||
|
>
|
||||||
{label}
|
{label}
|
||||||
{children}
|
{children}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -13,11 +13,12 @@ import type { ChartProps } from "./chart";
|
|||||||
import { Chart, ChartKind } from "./chart";
|
import { Chart, ChartKind } from "./chart";
|
||||||
import { bytesToUnits, cssNames, isObject } from "../../utils";
|
import { bytesToUnits, cssNames, isObject } from "../../utils";
|
||||||
import { ZebraStripesPlugin } from "./zebra-stripes.plugin";
|
import { ZebraStripesPlugin } from "./zebra-stripes.plugin";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { NoMetrics } from "../resource-metrics/no-metrics";
|
import { NoMetrics } from "../resource-metrics/no-metrics";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface BarChartProps extends ChartProps {
|
export interface BarChartProps extends ChartProps {
|
||||||
name?: string;
|
name?: string;
|
||||||
@ -27,11 +28,11 @@ export interface BarChartProps extends ChartProps {
|
|||||||
const getBarColor: Scriptable<string> = ({ dataset }) => Color(dataset?.borderColor).alpha(0.2).string();
|
const getBarColor: Scriptable<string> = ({ dataset }) => Color(dataset?.borderColor).alpha(0.2).string();
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedBarChart = observer(({
|
const NonInjectedBarChart = observer(({
|
||||||
themeStore,
|
activeTheme,
|
||||||
name,
|
name,
|
||||||
data,
|
data,
|
||||||
className,
|
className,
|
||||||
@ -40,7 +41,7 @@ const NonInjectedBarChart = observer(({
|
|||||||
options: customOptions,
|
options: customOptions,
|
||||||
...settings
|
...settings
|
||||||
}: Dependencies & BarChartProps) => {
|
}: Dependencies & BarChartProps) => {
|
||||||
const { textColorPrimary, borderFaintColor, chartStripesColor } = themeStore.activeTheme.colors;
|
const { textColorPrimary, borderFaintColor, chartStripesColor } = activeTheme.get().colors;
|
||||||
const { datasets: rawDatasets = [], ...rest } = data;
|
const { datasets: rawDatasets = [], ...rest } = data;
|
||||||
const datasets = rawDatasets
|
const datasets = rawDatasets
|
||||||
.filter(set => set.data?.length)
|
.filter(set => set.data?.length)
|
||||||
@ -168,7 +169,7 @@ const NonInjectedBarChart = observer(({
|
|||||||
export const BarChart = withInjectables<Dependencies, BarChartProps>(NonInjectedBarChart, {
|
export const BarChart = withInjectables<Dependencies, BarChartProps>(NonInjectedBarChart, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -36,6 +36,7 @@ export interface ChartProps {
|
|||||||
redraw?: boolean; // If true - recreate chart instance with no animation
|
redraw?: boolean; // If true - recreate chart instance with no animation
|
||||||
title?: string;
|
title?: string;
|
||||||
className?: string;
|
className?: string;
|
||||||
|
"data-testid"?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ChartKind {
|
export enum ChartKind {
|
||||||
@ -212,25 +213,26 @@ export class Chart extends React.Component<ChartProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { width, height, showChart, title, className } = this.props;
|
const { width, height, showChart, title, className, "data-testid": dataTestId } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div
|
||||||
<div className={cssNames("Chart", className)}>
|
className={cssNames("Chart", className)}
|
||||||
{title && <div className="chart-title">{title}</div>}
|
data-testid={dataTestId}
|
||||||
{showChart && (
|
>
|
||||||
<div className="chart-container">
|
{title && <div className="chart-title">{title}</div>}
|
||||||
<canvas
|
{showChart && (
|
||||||
ref={this.canvas}
|
<div className="chart-container">
|
||||||
width={width}
|
<canvas
|
||||||
height={height}
|
ref={this.canvas}
|
||||||
/>
|
width={width}
|
||||||
<div className="chartjs-tooltip flex column"></div>
|
height={height}
|
||||||
</div>
|
/>
|
||||||
)}
|
<div className="chartjs-tooltip flex column"></div>
|
||||||
{this.renderLegend()}
|
</div>
|
||||||
</div>
|
)}
|
||||||
</>
|
{this.renderLegend()}
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,9 +11,10 @@ import ChartJS from "chart.js";
|
|||||||
import type { ChartProps } from "./chart";
|
import type { ChartProps } from "./chart";
|
||||||
import { Chart } from "./chart";
|
import { Chart } from "./chart";
|
||||||
import { cssNames } from "../../utils";
|
import { cssNames } from "../../utils";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import type { IComputedValue } from "mobx";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface PieChartProps extends ChartProps {
|
export interface PieChartProps extends ChartProps {
|
||||||
}
|
}
|
||||||
@ -44,18 +45,18 @@ function getCutout(length: number | undefined): number {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedPieChart = observer(({
|
const NonInjectedPieChart = observer(({
|
||||||
themeStore,
|
activeTheme,
|
||||||
data,
|
data,
|
||||||
className,
|
className,
|
||||||
options,
|
options,
|
||||||
showChart,
|
showChart,
|
||||||
...chartProps
|
...chartProps
|
||||||
}: Dependencies & PieChartProps) => {
|
}: Dependencies & PieChartProps) => {
|
||||||
const { contentColor } = themeStore.activeTheme.colors;
|
const { contentColor } = activeTheme.get().colors;
|
||||||
const opts: ChartOptions = {
|
const opts: ChartOptions = {
|
||||||
maintainAspectRatio: false,
|
maintainAspectRatio: false,
|
||||||
tooltips: {
|
tooltips: {
|
||||||
@ -68,18 +69,11 @@ const NonInjectedPieChart = observer(({
|
|||||||
const total = datasetData.reduce((acc, cur) => acc + cur, 0);
|
const total = datasetData.reduce((acc, cur) => acc + cur, 0);
|
||||||
const percent = Math.round((datasetData[tooltipItem.index] as number / total) * 100);
|
const percent = Math.round((datasetData[tooltipItem.index] as number / total) * 100);
|
||||||
const percentLabel = isNaN(percent) ? "N/A" : `${percent}%`;
|
const percentLabel = isNaN(percent) ? "N/A" : `${percent}%`;
|
||||||
const tooltipLabel = dataset.tooltipLabels?.[tooltipItem.index];
|
const tooltipLabelCustomizer = dataset.tooltipLabels?.[tooltipItem.index];
|
||||||
let tooltip = `${dataset.label}: ${percentLabel}`;
|
|
||||||
|
|
||||||
if (tooltipLabel) {
|
return tooltipLabelCustomizer
|
||||||
if (typeof tooltipLabel === "function") {
|
? tooltipLabelCustomizer(percentLabel)
|
||||||
tooltip = tooltipLabel(percentLabel);
|
: `${dataset.label}: ${percentLabel}`;
|
||||||
} else {
|
|
||||||
tooltip = tooltipLabel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tooltip;
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
filter: ({ datasetIndex, index }, { datasets = [] }) => {
|
filter: ({ datasetIndex, index }, { datasets = [] }) => {
|
||||||
@ -120,7 +114,7 @@ const NonInjectedPieChart = observer(({
|
|||||||
export const PieChart = withInjectables<Dependencies, PieChartProps>(NonInjectedPieChart, {
|
export const PieChart = withInjectables<Dependencies, PieChartProps>(NonInjectedPieChart, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,8 @@ function mockLogTabViewModel(tabId: TabId, deps: Partial<LogTabViewModelDependen
|
|||||||
getPodsByOwnerId: jest.fn(),
|
getPodsByOwnerId: jest.fn(),
|
||||||
searchStore: new SearchStore(),
|
searchStore: new SearchStore(),
|
||||||
areLogsPresent: jest.fn(),
|
areLogsPresent: jest.fn(),
|
||||||
|
downloadLogs: jest.fn(),
|
||||||
|
downloadAllLogs: jest.fn(),
|
||||||
...deps,
|
...deps,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,6 +31,8 @@ function mockLogTabViewModel(tabId: TabId, deps: Partial<LogTabViewModelDependen
|
|||||||
getPodsByOwnerId: jest.fn(),
|
getPodsByOwnerId: jest.fn(),
|
||||||
areLogsPresent: jest.fn(),
|
areLogsPresent: jest.fn(),
|
||||||
searchStore: new SearchStore(),
|
searchStore: new SearchStore(),
|
||||||
|
downloadLogs: jest.fn(),
|
||||||
|
downloadAllLogs: jest.fn(),
|
||||||
...deps,
|
...deps,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/renderer/components/dock/logs/controls.module.scss
Normal file
11
src/renderer/components/dock/logs/controls.module.scss
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.controls {
|
||||||
|
@include hidden-scrollbar;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
gap: var(--padding);
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
background: var(--dockInfoBackground);
|
||||||
|
padding: var(--padding) calc(var(--padding) * 2);
|
||||||
|
}
|
||||||
@ -1,9 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.LogControls {
|
|
||||||
background: var(--dockInfoBackground);
|
|
||||||
padding: $padding $padding * 2;
|
|
||||||
}
|
|
||||||
@ -3,27 +3,20 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import "./controls.scss";
|
import styles from "./controls.module.scss";
|
||||||
|
|
||||||
import React from "react";
|
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
import { cssNames } from "../../../utils";
|
|
||||||
import { Checkbox } from "../../checkbox";
|
import { Checkbox } from "../../checkbox";
|
||||||
import { Icon } from "../../icon";
|
import { DownloadLogsDropdown } from "./download-logs-dropdown";
|
||||||
import type { LogTabViewModel } from "./logs-view-model";
|
import type { LogTabViewModel } from "./logs-view-model";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
|
||||||
import openSaveFileDialogInjectable from "../../../utils/save-file.injectable";
|
|
||||||
|
|
||||||
export interface LogControlsProps {
|
export interface LogControlsProps {
|
||||||
model: LogTabViewModel;
|
model: LogTabViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
export const LogControls = observer(({ model }: LogControlsProps) => {
|
||||||
openSaveFileDialog: (filename: string, contents: BlobPart | BlobPart[], type: string) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NonInjectedLogControls = observer(({ openSaveFileDialog, model }: Dependencies & LogControlsProps) => {
|
|
||||||
const tabData = model.logTabData.get();
|
const tabData = model.logTabData.get();
|
||||||
const pod = model.pod.get();
|
const pod = model.pod.get();
|
||||||
|
|
||||||
@ -44,18 +37,9 @@ const NonInjectedLogControls = observer(({ openSaveFileDialog, model }: Dependen
|
|||||||
model.reloadLogs();
|
model.reloadLogs();
|
||||||
};
|
};
|
||||||
|
|
||||||
const downloadLogs = () => {
|
|
||||||
const fileName = pod.getName();
|
|
||||||
const logsToDownload: string[] = showTimestamps
|
|
||||||
? model.logs.get()
|
|
||||||
: model.logsWithoutTimestamps.get();
|
|
||||||
|
|
||||||
openSaveFileDialog(`${fileName}.log`, logsToDownload.join("\n"), "text/plain");
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cssNames("LogControls flex gaps align-center justify-space-between wrap")}>
|
<div className={styles.controls} data-testid="log-controls">
|
||||||
<div className="time-range">
|
<div>
|
||||||
{since && (
|
{since && (
|
||||||
<span>
|
<span>
|
||||||
Logs from
|
Logs from
|
||||||
@ -77,20 +61,13 @@ const NonInjectedLogControls = observer(({ openSaveFileDialog, model }: Dependen
|
|||||||
onChange={togglePrevious}
|
onChange={togglePrevious}
|
||||||
className="show-previous"
|
className="show-previous"
|
||||||
/>
|
/>
|
||||||
<Icon
|
|
||||||
material="get_app"
|
<DownloadLogsDropdown
|
||||||
onClick={downloadLogs}
|
downloadVisibleLogs={model.downloadLogs}
|
||||||
tooltip="Download"
|
downloadAllLogs={model.downloadAllLogs}
|
||||||
className="download-icon"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
export const LogControls = withInjectables<Dependencies, LogControlsProps>(NonInjectedLogControls, {
|
|
||||||
getProps: (di, props) => ({
|
|
||||||
openSaveFileDialog: di.inject(openSaveFileDialogInjectable),
|
|
||||||
...props,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|||||||
@ -6,20 +6,21 @@ import { getInjectable } from "@ogre-tools/injectable";
|
|||||||
import type { DockTabCreate, DockTab, TabId } from "../dock/store";
|
import type { DockTabCreate, DockTab, TabId } from "../dock/store";
|
||||||
import { TabKind } from "../dock/store";
|
import { TabKind } from "../dock/store";
|
||||||
import type { LogTabData } from "./tab-store";
|
import type { LogTabData } from "./tab-store";
|
||||||
import * as uuid from "uuid";
|
|
||||||
import { runInAction } from "mobx";
|
import { runInAction } from "mobx";
|
||||||
import createDockTabInjectable from "../dock/create-dock-tab.injectable";
|
import createDockTabInjectable from "../dock/create-dock-tab.injectable";
|
||||||
import setLogTabDataInjectable from "./set-log-tab-data.injectable";
|
import setLogTabDataInjectable from "./set-log-tab-data.injectable";
|
||||||
|
import getRandomIdForPodLogsTabInjectable from "./get-random-id-for-pod-logs-tab.injectable";
|
||||||
|
|
||||||
export type CreateLogsTabData = Pick<LogTabData, "owner" | "selectedPodId" | "selectedContainer" | "namespace"> & Omit<Partial<LogTabData>, "owner" | "selectedPodId" | "selectedContainer" | "namespace">;
|
export type CreateLogsTabData = Pick<LogTabData, "owner" | "selectedPodId" | "selectedContainer" | "namespace"> & Omit<Partial<LogTabData>, "owner" | "selectedPodId" | "selectedContainer" | "namespace">;
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
createDockTab: (rawTabDesc: DockTabCreate, addNumber?: boolean) => DockTab;
|
createDockTab: (rawTabDesc: DockTabCreate, addNumber?: boolean) => DockTab;
|
||||||
setLogTabData: (tabId: string, data: LogTabData) => void;
|
setLogTabData: (tabId: string, data: LogTabData) => void;
|
||||||
|
getRandomId: () => string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const createLogsTab = ({ createDockTab, setLogTabData }: Dependencies) => (title: string, data: CreateLogsTabData): TabId => {
|
const createLogsTab = ({ createDockTab, setLogTabData, getRandomId }: Dependencies) => (title: string, data: CreateLogsTabData): TabId => {
|
||||||
const id = `log-tab-${uuid.v4()}`;
|
const id = `log-tab-${getRandomId()}`;
|
||||||
|
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
createDockTab({
|
createDockTab({
|
||||||
@ -43,6 +44,7 @@ const createLogsTabInjectable = getInjectable({
|
|||||||
instantiate: (di) => createLogsTab({
|
instantiate: (di) => createLogsTab({
|
||||||
createDockTab: di.inject(createDockTabInjectable),
|
createDockTab: di.inject(createDockTabInjectable),
|
||||||
setLogTabData: di.inject(setLogTabDataInjectable),
|
setLogTabData: di.inject(setLogTabDataInjectable),
|
||||||
|
getRandomId: di.inject(getRandomIdForPodLogsTabInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import type { PodLogsQuery } from "../../../../common/k8s-api/endpoints";
|
||||||
|
import type { ResourceDescriptor } from "../../../../common/k8s-api/kube-api";
|
||||||
|
import loggerInjectable from "../../../../common/logger.injectable";
|
||||||
|
import openSaveFileDialogInjectable from "../../../utils/save-file.injectable";
|
||||||
|
import callForLogsInjectable from "./call-for-logs.injectable";
|
||||||
|
|
||||||
|
const downloadAllLogsInjectable = getInjectable({
|
||||||
|
id: "download-all-logs",
|
||||||
|
|
||||||
|
instantiate: (di) => {
|
||||||
|
const callForLogs = di.inject(callForLogsInjectable);
|
||||||
|
const openSaveFileDialog = di.inject(openSaveFileDialogInjectable);
|
||||||
|
const logger = di.inject(loggerInjectable);
|
||||||
|
|
||||||
|
return async (params: ResourceDescriptor, query: PodLogsQuery) => {
|
||||||
|
const logs = await callForLogs(params, query).catch(error => {
|
||||||
|
logger.error("Can't download logs: ", error);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (logs) {
|
||||||
|
openSaveFileDialog(`${params.name}.log`, logs, "text/plain");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default downloadAllLogsInjectable;
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
.dropdown {
|
||||||
|
--accent-color: var(--colorInfo);
|
||||||
|
|
||||||
|
border: 1px solid var(--accent-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
color: var(--accent-color);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: calc(var(--padding) / 4) var(--padding);
|
||||||
|
gap: 6px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
cursor: progress;
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover::before{
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
box-shadow: 0 0 0 2px var(--accent-color);
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: " ";
|
||||||
|
position: absolute;
|
||||||
|
background: var(--accent-color);
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.1s;
|
||||||
|
}
|
||||||
|
}
|
||||||
53
src/renderer/components/dock/logs/download-logs-dropdown.tsx
Normal file
53
src/renderer/components/dock/logs/download-logs-dropdown.tsx
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import styles from "./download-logs-dropdown.module.scss";
|
||||||
|
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { Icon } from "../../icon";
|
||||||
|
import { MenuItem } from "../../menu";
|
||||||
|
import { Dropdown } from "../../dropdown/dropdown";
|
||||||
|
|
||||||
|
interface DownloadLogsDropdownProps {
|
||||||
|
downloadVisibleLogs: () => void;
|
||||||
|
downloadAllLogs: () => Promise<void> | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function DownloadLogsDropdown({ downloadAllLogs, downloadVisibleLogs }: DownloadLogsDropdownProps) {
|
||||||
|
const [waiting, setWaiting] = useState(false);
|
||||||
|
|
||||||
|
const downloadAll = async () => {
|
||||||
|
setWaiting(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await downloadAllLogs();
|
||||||
|
} finally {
|
||||||
|
setWaiting(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dropdown
|
||||||
|
id="download-logs-dropdown"
|
||||||
|
contentForToggle={(
|
||||||
|
<button
|
||||||
|
data-testid="download-logs-dropdown"
|
||||||
|
className={styles.dropdown}
|
||||||
|
disabled={waiting}
|
||||||
|
>
|
||||||
|
Download
|
||||||
|
<Icon material="arrow_drop_down" smallest/>
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<MenuItem onClick={downloadVisibleLogs} data-testid="download-visible-logs">
|
||||||
|
Visible logs
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem onClick={downloadAll} data-testid="download-all-logs">
|
||||||
|
All logs
|
||||||
|
</MenuItem>
|
||||||
|
</Dropdown>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import openSaveFileDialogInjectable from "../../../utils/save-file.injectable";
|
||||||
|
|
||||||
|
const downloadLogsInjectable = getInjectable({
|
||||||
|
id: "download-logs",
|
||||||
|
|
||||||
|
instantiate: (di) => {
|
||||||
|
const openSaveFileDialog = di.inject(openSaveFileDialogInjectable);
|
||||||
|
|
||||||
|
return (filename: string, logs: string[]) => {
|
||||||
|
openSaveFileDialog(filename, logs.join("\n"), "text/plain");
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default downloadLogsInjectable;
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import getRandomIdInjectable from "../../../../common/utils/get-random-id.injectable";
|
||||||
|
|
||||||
|
const getRandomIdForPodLogsTabInjectable = getInjectable({
|
||||||
|
id: "get-random-id-for-pod-logs-tab",
|
||||||
|
instantiate: (di) => di.inject(getRandomIdInjectable),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default getRandomIdForPodLogsTabInjectable;
|
||||||
@ -18,6 +18,8 @@ import areLogsPresentInjectable from "./are-logs-present.injectable";
|
|||||||
import searchStoreInjectable from "../../../search-store/search-store.injectable";
|
import searchStoreInjectable from "../../../search-store/search-store.injectable";
|
||||||
import getPodsByOwnerIdInjectable from "../../+workloads-pods/get-pods-by-owner-id.injectable";
|
import getPodsByOwnerIdInjectable from "../../+workloads-pods/get-pods-by-owner-id.injectable";
|
||||||
import getPodByIdInjectable from "../../+workloads-pods/get-pod-by-id.injectable";
|
import getPodByIdInjectable from "../../+workloads-pods/get-pod-by-id.injectable";
|
||||||
|
import downloadLogsInjectable from "./download-logs.injectable";
|
||||||
|
import downloadAllLogsInjectable from "./download-all-logs.injectable";
|
||||||
|
|
||||||
export interface InstantiateArgs {
|
export interface InstantiateArgs {
|
||||||
tabId: TabId;
|
tabId: TabId;
|
||||||
@ -39,6 +41,8 @@ const logsViewModelInjectable = getInjectable({
|
|||||||
areLogsPresent: di.inject(areLogsPresentInjectable),
|
areLogsPresent: di.inject(areLogsPresentInjectable),
|
||||||
getPodById: di.inject(getPodByIdInjectable),
|
getPodById: di.inject(getPodByIdInjectable),
|
||||||
getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable),
|
getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable),
|
||||||
|
downloadLogs: di.inject(downloadLogsInjectable),
|
||||||
|
downloadAllLogs: di.inject(downloadAllLogsInjectable),
|
||||||
searchStore: di.inject(searchStoreInjectable),
|
searchStore: di.inject(searchStoreInjectable),
|
||||||
}),
|
}),
|
||||||
lifecycle: lifecycleEnum.transient,
|
lifecycle: lifecycleEnum.transient,
|
||||||
|
|||||||
@ -7,12 +7,13 @@ import type { IComputedValue } from "mobx";
|
|||||||
import { computed } from "mobx";
|
import { computed } from "mobx";
|
||||||
import type { TabId } from "../dock/store";
|
import type { TabId } from "../dock/store";
|
||||||
import type { SearchStore } from "../../../search-store/search-store";
|
import type { SearchStore } from "../../../search-store/search-store";
|
||||||
import type { Pod } from "../../../../common/k8s-api/endpoints";
|
import type { Pod, PodLogsQuery } from "../../../../common/k8s-api/endpoints";
|
||||||
import { isDefined } from "../../../utils";
|
import { isDefined } from "../../../utils";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import type { GetPodById } from "../../+workloads-pods/get-pod-by-id.injectable";
|
import type { GetPodById } from "../../+workloads-pods/get-pod-by-id.injectable";
|
||||||
import type { GetPodsByOwnerId } from "../../+workloads-pods/get-pods-by-owner-id.injectable";
|
import type { GetPodsByOwnerId } from "../../+workloads-pods/get-pods-by-owner-id.injectable";
|
||||||
import type { LoadLogs } from "./load-logs.injectable";
|
import type { LoadLogs } from "./load-logs.injectable";
|
||||||
|
import type { ResourceDescriptor } from "../../../../common/k8s-api/kube-api";
|
||||||
|
|
||||||
export interface LogTabViewModelDependencies {
|
export interface LogTabViewModelDependencies {
|
||||||
getLogs: (tabId: TabId) => string[];
|
getLogs: (tabId: TabId) => string[];
|
||||||
@ -27,6 +28,8 @@ export interface LogTabViewModelDependencies {
|
|||||||
getPodById: GetPodById;
|
getPodById: GetPodById;
|
||||||
getPodsByOwnerId: GetPodsByOwnerId;
|
getPodsByOwnerId: GetPodsByOwnerId;
|
||||||
areLogsPresent: (tabId: TabId) => boolean;
|
areLogsPresent: (tabId: TabId) => boolean;
|
||||||
|
downloadLogs: (filename: string, logs: string[]) => void;
|
||||||
|
downloadAllLogs: (params: ResourceDescriptor, query: PodLogsQuery) => Promise<void>;
|
||||||
searchStore: SearchStore;
|
searchStore: SearchStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,4 +80,32 @@ export class LogTabViewModel {
|
|||||||
reloadLogs = () => this.dependencies.reloadLogs(this.tabId, this.pod, this.logTabData);
|
reloadLogs = () => this.dependencies.reloadLogs(this.tabId, this.pod, this.logTabData);
|
||||||
renameTab = (title: string) => this.dependencies.renameTab(this.tabId, title);
|
renameTab = (title: string) => this.dependencies.renameTab(this.tabId, title);
|
||||||
stopLoadingLogs = () => this.dependencies.stopLoadingLogs(this.tabId);
|
stopLoadingLogs = () => this.dependencies.stopLoadingLogs(this.tabId);
|
||||||
|
|
||||||
|
downloadLogs = () => {
|
||||||
|
const pod = this.pod.get();
|
||||||
|
const tabData = this.logTabData.get();
|
||||||
|
|
||||||
|
if (pod && tabData) {
|
||||||
|
const fileName = pod.getName();
|
||||||
|
const logsToDownload: string[] = tabData.showTimestamps
|
||||||
|
? this.logs.get()
|
||||||
|
: this.logsWithoutTimestamps.get();
|
||||||
|
|
||||||
|
this.dependencies.downloadLogs(`${fileName}.log`, logsToDownload);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
downloadAllLogs = () => {
|
||||||
|
const pod = this.pod.get();
|
||||||
|
const tabData = this.logTabData.get();
|
||||||
|
|
||||||
|
if (pod && tabData) {
|
||||||
|
const params = { name: pod.getName(), namespace: pod.getNs() };
|
||||||
|
const query = { timestamps: tabData.showTimestamps, previous: tabData.showPrevious };
|
||||||
|
|
||||||
|
return this.dependencies.downloadAllLogs(params, query);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,13 +10,14 @@ import { disposeOnUnmount, observer } from "mobx-react";
|
|||||||
import { cssNames } from "../../../utils";
|
import { cssNames } from "../../../utils";
|
||||||
import type { Terminal } from "./terminal";
|
import type { Terminal } from "./terminal";
|
||||||
import type { TerminalStore } from "./store";
|
import type { TerminalStore } from "./store";
|
||||||
import type { ThemeStore } from "../../../themes/store";
|
import type { LensTheme } from "../../../themes/store";
|
||||||
import type { DockTab, DockStore } from "../dock/store";
|
import type { DockTab, DockStore } from "../dock/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import dockStoreInjectable from "../dock/store.injectable";
|
import dockStoreInjectable from "../dock/store.injectable";
|
||||||
import terminalStoreInjectable from "./store.injectable";
|
import terminalStoreInjectable from "./store.injectable";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import themeStoreInjectable from "../../../themes/store.injectable";
|
import activeThemeInjectable from "../../../themes/active.injectable";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
|
||||||
export interface TerminalWindowProps {
|
export interface TerminalWindowProps {
|
||||||
tab: DockTab;
|
tab: DockTab;
|
||||||
@ -25,7 +26,7 @@ export interface TerminalWindowProps {
|
|||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
dockStore: DockStore;
|
dockStore: DockStore;
|
||||||
terminalStore: TerminalStore;
|
terminalStore: TerminalStore;
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
@ -68,7 +69,7 @@ class NonInjectedTerminalWindow extends React.Component<TerminalWindowProps & De
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={cssNames("TerminalWindow", this.props.themeStore.activeTheme.type)}
|
className={cssNames("TerminalWindow", this.props.activeTheme.get().type)}
|
||||||
ref={elem => this.elem = elem}
|
ref={elem => this.elem = elem}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@ -80,7 +81,7 @@ export const TerminalWindow = withInjectables<Dependencies, TerminalWindowProps>
|
|||||||
...props,
|
...props,
|
||||||
dockStore: di.inject(dockStoreInjectable),
|
dockStore: di.inject(dockStoreInjectable),
|
||||||
terminalStore: di.inject(terminalStoreInjectable),
|
terminalStore: di.inject(terminalStoreInjectable),
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
38
src/renderer/components/dropdown/dropdown.tsx
Normal file
38
src/renderer/components/dropdown/dropdown.tsx
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { HTMLAttributes } from "react";
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { Menu } from "../menu";
|
||||||
|
|
||||||
|
interface DropdownProps extends HTMLAttributes<HTMLDivElement> {
|
||||||
|
contentForToggle: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Dropdown(props: DropdownProps) {
|
||||||
|
const { id, contentForToggle, children, ...rest } = props;
|
||||||
|
const [opened, setOpened] = useState(false);
|
||||||
|
|
||||||
|
const toggle = () => {
|
||||||
|
setOpened(!opened);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div {...rest}>
|
||||||
|
<div id={id}>
|
||||||
|
{contentForToggle}
|
||||||
|
</div>
|
||||||
|
<Menu
|
||||||
|
usePortal
|
||||||
|
htmlFor={id}
|
||||||
|
isOpen={opened}
|
||||||
|
close={toggle}
|
||||||
|
open={toggle}
|
||||||
|
>
|
||||||
|
{React.Children.toArray(children)}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -7,6 +7,7 @@ import "./item-list-layout.scss";
|
|||||||
|
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
import { computed, makeObservable } from "mobx";
|
import { computed, makeObservable } from "mobx";
|
||||||
import { Observer, observer } from "mobx-react";
|
import { Observer, observer } from "mobx-react";
|
||||||
import type { ConfirmDialogParams } from "../confirm-dialog";
|
import type { ConfirmDialogParams } from "../confirm-dialog";
|
||||||
@ -20,18 +21,18 @@ import { NoItems } from "../no-items";
|
|||||||
import { Spinner } from "../spinner";
|
import { Spinner } from "../spinner";
|
||||||
import type { ItemObject } from "../../../common/item.store";
|
import type { ItemObject } from "../../../common/item.store";
|
||||||
import type { Filter, PageFiltersStore } from "./page-filters/store";
|
import type { Filter, PageFiltersStore } from "./page-filters/store";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { MenuActions } from "../menu/menu-actions";
|
import { MenuActions } from "../menu/menu-actions";
|
||||||
import { MenuItem } from "../menu";
|
import { MenuItem } from "../menu";
|
||||||
import { Checkbox } from "../checkbox";
|
import { Checkbox } from "../checkbox";
|
||||||
import type { UserStore } from "../../../common/user-store";
|
import type { UserStore } from "../../../common/user-store";
|
||||||
import type { ItemListStore } from "./list-layout";
|
import type { ItemListStore } from "./list-layout";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
|
||||||
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
|
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
|
||||||
import pageFiltersStoreInjectable from "./page-filters/store.injectable";
|
import pageFiltersStoreInjectable from "./page-filters/store.injectable";
|
||||||
import type { OpenConfirmDialog } from "../confirm-dialog/open.injectable";
|
import type { OpenConfirmDialog } from "../confirm-dialog/open.injectable";
|
||||||
import openConfirmDialogInjectable from "../confirm-dialog/open.injectable";
|
import openConfirmDialogInjectable from "../confirm-dialog/open.injectable";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStores extends boolean> {
|
export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStores extends boolean> {
|
||||||
getFilters: () => Filter[];
|
getFilters: () => Filter[];
|
||||||
@ -71,7 +72,7 @@ export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStor
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
userStore: UserStore;
|
userStore: UserStore;
|
||||||
pageFiltersStore: PageFiltersStore;
|
pageFiltersStore: PageFiltersStore;
|
||||||
openConfirmDialog: OpenConfirmDialog;
|
openConfirmDialog: OpenConfirmDialog;
|
||||||
@ -291,10 +292,10 @@ class NonInjectedItemListLayoutContent<
|
|||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks,
|
store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks,
|
||||||
detailsItem, className, tableProps = {}, tableId, getItems, themeStore,
|
detailsItem, className, tableProps = {}, tableId, getItems, activeTheme,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const selectedItemId = detailsItem && detailsItem.getId();
|
const selectedItemId = detailsItem && detailsItem.getId();
|
||||||
const classNames = cssNames(className, "box", "grow", themeStore.activeTheme.type);
|
const classNames = cssNames(className, "box", "grow", activeTheme.get().type);
|
||||||
const items = getItems();
|
const items = getItems();
|
||||||
const selectedItems = store.pickOnlySelected(items);
|
const selectedItems = store.pickOnlySelected(items);
|
||||||
|
|
||||||
@ -377,7 +378,7 @@ class NonInjectedItemListLayoutContent<
|
|||||||
export const ItemListLayoutContent = withInjectables<Dependencies, ItemListLayoutContentProps<ItemObject, boolean>>(NonInjectedItemListLayoutContent, {
|
export const ItemListLayoutContent = withInjectables<Dependencies, ItemListLayoutContentProps<ItemObject, boolean>>(NonInjectedItemListLayoutContent, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
userStore: di.inject(userStoreInjectable),
|
userStore: di.inject(userStoreInjectable),
|
||||||
pageFiltersStore: di.inject(pageFiltersStoreInjectable),
|
pageFiltersStore: di.inject(pageFiltersStoreInjectable),
|
||||||
openConfirmDialog: di.inject(openConfirmDialogInjectable),
|
openConfirmDialog: di.inject(openConfirmDialogInjectable),
|
||||||
|
|||||||
@ -126,6 +126,7 @@ exports[`kube-object-menu given kube object when removing kube object renders 1`
|
|||||||
<button
|
<button
|
||||||
class="Button ok primary"
|
class="Button ok primary"
|
||||||
data-testid="confirm"
|
data-testid="confirm"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Remove
|
Remove
|
||||||
@ -256,6 +257,7 @@ exports[`kube-object-menu given kube object when rerendered with different kube
|
|||||||
<button
|
<button
|
||||||
class="Button ok primary"
|
class="Button ok primary"
|
||||||
data-testid="confirm"
|
data-testid="confirm"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Remove
|
Remove
|
||||||
@ -350,6 +352,7 @@ exports[`kube-object-menu given kube object with namespace when removing kube ob
|
|||||||
<button
|
<button
|
||||||
class="Button ok primary"
|
class="Button ok primary"
|
||||||
data-testid="confirm"
|
data-testid="confirm"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Remove
|
Remove
|
||||||
@ -444,6 +447,7 @@ exports[`kube-object-menu given kube object without namespace when removing kube
|
|||||||
<button
|
<button
|
||||||
class="Button ok primary"
|
class="Button ok primary"
|
||||||
data-testid="confirm"
|
data-testid="confirm"
|
||||||
|
data-waiting="false"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
Remove
|
Remove
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
import styles from "./monaco-editor.module.scss";
|
import styles from "./monaco-editor.module.scss";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
import { action, computed, makeObservable, observable, reaction } from "mobx";
|
import { action, computed, makeObservable, observable, reaction } from "mobx";
|
||||||
import { editor, Uri } from "monaco-editor";
|
import { editor, Uri } from "monaco-editor";
|
||||||
import type { MonacoTheme } from "./monaco-themes";
|
import type { MonacoTheme } from "./monaco-themes";
|
||||||
@ -13,10 +14,10 @@ import { type MonacoValidator, monacoValidators } from "./monaco-validators";
|
|||||||
import { debounce, merge } from "lodash";
|
import { debounce, merge } from "lodash";
|
||||||
import { autoBind, cssNames, disposer } from "../../utils";
|
import { autoBind, cssNames, disposer } from "../../utils";
|
||||||
import type { UserStore } from "../../../common/user-store";
|
import type { UserStore } from "../../../common/user-store";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
|
||||||
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
|
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
|
||||||
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
export type MonacoEditorId = string;
|
export type MonacoEditorId = string;
|
||||||
|
|
||||||
@ -39,8 +40,8 @@ export interface MonacoEditorProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
|
||||||
userStore: UserStore;
|
userStore: UserStore;
|
||||||
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createMonacoUri(id: MonacoEditorId): Uri {
|
export function createMonacoUri(id: MonacoEditorId): Uri {
|
||||||
@ -83,7 +84,7 @@ class NonInjectedMonacoEditor extends React.Component<MonacoEditorProps & Depend
|
|||||||
}
|
}
|
||||||
|
|
||||||
@computed get theme() {
|
@computed get theme() {
|
||||||
return this.props.theme ?? this.props.themeStore.activeTheme.monacoTheme;
|
return this.props.theme ?? this.props.activeTheme.get().monacoTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
@computed get model(): editor.ITextModel {
|
@computed get model(): editor.ITextModel {
|
||||||
@ -306,8 +307,8 @@ export const MonacoEditor = withInjectables<Dependencies, MonacoEditorProps, Mon
|
|||||||
{
|
{
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
|
||||||
userStore: di.inject(userStoreInjectable),
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -19,19 +19,15 @@ export function ResourceMetricsText({ metrics }: ResourceMetricsTextProps) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { cpuUsage, cpuRequests, cpuLimits, memoryUsage, memoryRequests, memoryLimits } = getMetricLastPoints(metrics);
|
const { cpuUsage, memoryUsage } = getMetricLastPoints(metrics);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<DrawerItem name="CPU" labelsOnly>
|
<DrawerItem name="CPU" labelsOnly>
|
||||||
{cpuUsage > 0 && <Badge label={`Usage: ${cpuUsage.toPrecision(2)}`}/>}
|
{cpuUsage > 0 && <Badge label={`Usage: ${cpuUsage.toPrecision(2)}`}/>}
|
||||||
{cpuRequests > 0 && <Badge label={`Requests: ${cpuRequests.toPrecision(2)}`}/>}
|
|
||||||
{cpuLimits > 0 && <Badge label={`Limits: ${cpuLimits.toPrecision(2)}`}/>}
|
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
<DrawerItem name="Memory" labelsOnly>
|
<DrawerItem name="Memory" labelsOnly>
|
||||||
{memoryUsage > 0 && <Badge label={`Usage: ${bytesToUnits(memoryUsage)}`}/>}
|
{memoryUsage > 0 && <Badge label={`Usage: ${bytesToUnits(memoryUsage)}`}/>}
|
||||||
{memoryRequests > 0 && <Badge label={`Requests: ${bytesToUnits(memoryRequests)}`}/>}
|
|
||||||
{memoryLimits > 0 && <Badge label={`Limits: ${bytesToUnits(memoryLimits)}`}/>}
|
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -8,15 +8,15 @@
|
|||||||
import "./select.scss";
|
import "./select.scss";
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { ObservableSet } from "mobx";
|
import type { IComputedValue, ObservableSet } from "mobx";
|
||||||
import { action, computed, makeObservable } from "mobx";
|
import { action, computed, makeObservable } from "mobx";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import ReactSelect, { components, createFilter } from "react-select";
|
import ReactSelect, { components, createFilter } from "react-select";
|
||||||
import type { Props as ReactSelectProps, GroupBase, MultiValue, OptionsOrGroups, PropsValue, SingleValue } from "react-select";
|
import type { Props as ReactSelectProps, GroupBase, MultiValue, OptionsOrGroups, PropsValue, SingleValue } from "react-select";
|
||||||
import type { ThemeStore } from "../../themes/store";
|
import type { LensTheme } from "../../themes/store";
|
||||||
import { autoBind, cssNames } from "../../utils";
|
import { autoBind, cssNames } from "../../utils";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import themeStoreInjectable from "../../themes/store.injectable";
|
import activeThemeInjectable from "../../themes/active.injectable";
|
||||||
|
|
||||||
const { Menu } = components;
|
const { Menu } = components;
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ const defaultFilter = createFilter({
|
|||||||
});
|
});
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
themeStore: ThemeStore;
|
activeTheme: IComputedValue<LensTheme>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function onMultiSelectFor<Value, Option extends SelectOption<Value>, Group extends GroupBase<Option> = GroupBase<Option>>(collection: Set<Value> | ObservableSet<Value>): SelectProps<Value, Option, true, Group>["onChange"] {
|
export function onMultiSelectFor<Value, Option extends SelectOption<Value>, Group extends GroupBase<Option> = GroupBase<Option>>(collection: Set<Value> | ObservableSet<Value>): SelectProps<Value, Option, true, Group>["onChange"] {
|
||||||
@ -124,7 +124,7 @@ class NonInjectedSelect<
|
|||||||
}
|
}
|
||||||
|
|
||||||
@computed get themeClass() {
|
@computed get themeClass() {
|
||||||
const themeName = this.props.themeName || this.props.themeStore.activeTheme.type;
|
const themeName = this.props.themeName || this.props.activeTheme.get().type;
|
||||||
|
|
||||||
return `theme-${themeName}`;
|
return `theme-${themeName}`;
|
||||||
}
|
}
|
||||||
@ -248,7 +248,7 @@ class NonInjectedSelect<
|
|||||||
export const Select = withInjectables<Dependencies, SelectProps<unknown, SelectOption<unknown>, boolean>>(NonInjectedSelect, {
|
export const Select = withInjectables<Dependencies, SelectProps<unknown, SelectOption<unknown>, boolean>>(NonInjectedSelect, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
themeStore: di.inject(themeStoreInjectable),
|
activeTheme: di.inject(activeThemeInjectable),
|
||||||
}),
|
}),
|
||||||
}) as <
|
}) as <
|
||||||
Value,
|
Value,
|
||||||
|
|||||||
@ -125,7 +125,7 @@ export interface ApplicationBuilder {
|
|||||||
helmCharts: {
|
helmCharts: {
|
||||||
navigate: NavigateToHelmCharts;
|
navigate: NavigateToHelmCharts;
|
||||||
};
|
};
|
||||||
|
navigateWith: (token: Injectable<() => void, any, void>) => void;
|
||||||
select: {
|
select: {
|
||||||
openMenu: (id: string) => { selectOption: (labelText: string) => void };
|
openMenu: (id: string) => { selectOption: (labelText: string) => void };
|
||||||
selectOption: (menuId: string, labelText: string) => void;
|
selectOption: (menuId: string, labelText: string) => void;
|
||||||
@ -441,6 +441,13 @@ export const getApplicationBuilder = () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
navigateWith: (token) => {
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
const navigate = windowDi.inject(token);
|
||||||
|
|
||||||
|
navigate();
|
||||||
|
},
|
||||||
|
|
||||||
setEnvironmentToClusterFrame: () => {
|
setEnvironmentToClusterFrame: () => {
|
||||||
environment = environments.clusterFrame;
|
environment = environments.clusterFrame;
|
||||||
|
|
||||||
|
|||||||
@ -1281,6 +1281,7 @@ exports[`<ClusterFrame /> given cluster without list nodes, but with namespaces
|
|||||||
<main>
|
<main>
|
||||||
<div
|
<div
|
||||||
class="WorkloadsOverview flex column gaps"
|
class="WorkloadsOverview flex column gaps"
|
||||||
|
data-testid="page-for-workloads-overview"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="header flex gaps align-center"
|
class="header flex gaps align-center"
|
||||||
|
|||||||
18
src/renderer/themes/active.injectable.ts
Normal file
18
src/renderer/themes/active.injectable.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { computed } from "mobx";
|
||||||
|
import themeStoreInjectable from "./store.injectable";
|
||||||
|
|
||||||
|
const activeThemeInjectable = getInjectable({
|
||||||
|
id: "active-theme",
|
||||||
|
instantiate: (di) => {
|
||||||
|
const store = di.inject(themeStoreInjectable);
|
||||||
|
|
||||||
|
return computed(() => store.activeTheme);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default activeThemeInjectable;
|
||||||
@ -3,9 +3,9 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { Theme } from "./store";
|
import type { LensTheme } from "./store";
|
||||||
|
|
||||||
const lensDarkTheme: Theme = {
|
const lensDarkTheme: LensTheme = {
|
||||||
"name": "Dark",
|
"name": "Dark",
|
||||||
"type": "dark",
|
"type": "dark",
|
||||||
"description": "Original Lens dark theme",
|
"description": "Original Lens dark theme",
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { Theme } from "./store";
|
import type { LensTheme } from "./store";
|
||||||
|
|
||||||
const lensLightTheme: Theme = {
|
const lensLightTheme: LensTheme = {
|
||||||
"name": "Light",
|
"name": "Light",
|
||||||
"type": "light",
|
"type": "light",
|
||||||
"description": "Original Lens light theme",
|
"description": "Original Lens light theme",
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import assert from "assert";
|
|||||||
|
|
||||||
export type ThemeId = string;
|
export type ThemeId = string;
|
||||||
|
|
||||||
export interface Theme {
|
export interface LensTheme {
|
||||||
name: string;
|
name: string;
|
||||||
type: "dark" | "light";
|
type: "dark" | "light";
|
||||||
colors: Record<string, string>;
|
colors: Record<string, string>;
|
||||||
@ -39,7 +39,7 @@ interface Dependencies {
|
|||||||
export class ThemeStore {
|
export class ThemeStore {
|
||||||
private terminalColorPrefix = "terminal";
|
private terminalColorPrefix = "terminal";
|
||||||
|
|
||||||
#themes = observable.map<ThemeId, Theme>({
|
#themes = observable.map<ThemeId, LensTheme>({
|
||||||
"lens-dark": lensDarkTheme,
|
"lens-dark": lensDarkTheme,
|
||||||
"lens-light": lensLightTheme,
|
"lens-light": lensLightTheme,
|
||||||
});
|
});
|
||||||
@ -66,9 +66,9 @@ export class ThemeStore {
|
|||||||
return this.dependencies.userStore.terminalTheme;
|
return this.dependencies.userStore.terminalTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly defaultTheme: Theme;
|
private readonly defaultTheme: LensTheme;
|
||||||
|
|
||||||
@computed get activeTheme(): Theme {
|
@computed get activeTheme(): LensTheme {
|
||||||
return this.themes.get(this.activeThemeId) ?? this.defaultTheme;
|
return this.themes.get(this.activeThemeId) ?? this.defaultTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ export class ThemeStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get themes() {
|
get themes() {
|
||||||
return this.#themes as ReadonlyDeep<Map<string, Theme>>;
|
return this.#themes as ReadonlyDeep<Map<string, LensTheme>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(protected readonly dependencies: Dependencies) {
|
constructor(protected readonly dependencies: Dependencies) {
|
||||||
@ -130,7 +130,7 @@ export class ThemeStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getThemeById(themeId: ThemeId): Theme | undefined {
|
getThemeById(themeId: ThemeId): LensTheme | undefined {
|
||||||
return this.themes.get(themeId);
|
return this.themes.get(themeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
356
yarn.lock
356
yarn.lock
@ -603,19 +603,19 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6"
|
||||||
integrity sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==
|
integrity sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.15.5":
|
"@esbuild/linux-loong64@0.15.6":
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.6.tgz#45be4184f00e505411bc265a05e709764114acd8"
|
||||||
integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==
|
integrity sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw==
|
||||||
|
|
||||||
"@eslint/eslintrc@^1.3.0":
|
"@eslint/eslintrc@^1.3.1":
|
||||||
version "1.3.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
|
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d"
|
||||||
integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
|
integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^6.12.4"
|
ajv "^6.12.4"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
espree "^9.3.2"
|
espree "^9.4.0"
|
||||||
globals "^13.15.0"
|
globals "^13.15.0"
|
||||||
ignore "^5.2.0"
|
ignore "^5.2.0"
|
||||||
import-fresh "^3.2.1"
|
import-fresh "^3.2.1"
|
||||||
@ -753,6 +753,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
|
||||||
integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
|
integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
|
||||||
|
|
||||||
|
"@humanwhocodes/module-importer@^1.0.1":
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
|
||||||
|
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
|
||||||
|
|
||||||
"@humanwhocodes/object-schema@^1.2.1":
|
"@humanwhocodes/object-schema@^1.2.1":
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
||||||
@ -2349,10 +2354,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
|
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
|
||||||
integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
|
integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
|
||||||
|
|
||||||
"@types/semver@^7.3.10", "@types/semver@^7.3.6":
|
"@types/semver@^7.3.12", "@types/semver@^7.3.6":
|
||||||
version "7.3.10"
|
version "7.3.12"
|
||||||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73"
|
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c"
|
||||||
integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==
|
integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==
|
||||||
|
|
||||||
"@types/serve-index@^1.9.1":
|
"@types/serve-index@^1.9.1":
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
@ -5504,140 +5509,140 @@ esbuild-android-64@0.14.53:
|
|||||||
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz#259bc3ef1399a3cad8f4f67c40ee20779c4de675"
|
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz#259bc3ef1399a3cad8f4f67c40ee20779c4de675"
|
||||||
integrity sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==
|
integrity sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==
|
||||||
|
|
||||||
esbuild-android-64@0.15.5:
|
esbuild-android-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8"
|
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.6.tgz#baaed943ca510c2ad546e116728132e76d1d2044"
|
||||||
integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==
|
integrity sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA==
|
||||||
|
|
||||||
esbuild-android-arm64@0.14.53:
|
esbuild-android-arm64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz#2158253d4e8f9fdd2a081bbb4f73b8806178841e"
|
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz#2158253d4e8f9fdd2a081bbb4f73b8806178841e"
|
||||||
integrity sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==
|
integrity sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==
|
||||||
|
|
||||||
esbuild-android-arm64@0.15.5:
|
esbuild-android-arm64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193"
|
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.6.tgz#1c33c73d4c074969e014e31958116460c8e75a7a"
|
||||||
integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==
|
integrity sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw==
|
||||||
|
|
||||||
esbuild-darwin-64@0.14.53:
|
esbuild-darwin-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz#b4681831fd8f8d06feb5048acbe90d742074cc2a"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz#b4681831fd8f8d06feb5048acbe90d742074cc2a"
|
||||||
integrity sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==
|
integrity sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==
|
||||||
|
|
||||||
esbuild-darwin-64@0.15.5:
|
esbuild-darwin-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.6.tgz#388592ba61bf31993d79f6311f7452aa1ef255b9"
|
||||||
integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==
|
integrity sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw==
|
||||||
|
|
||||||
esbuild-darwin-arm64@0.14.53:
|
esbuild-darwin-arm64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz#d267d957852d121b261b3f76ead86e5b5463acc9"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz#d267d957852d121b261b3f76ead86e5b5463acc9"
|
||||||
integrity sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==
|
integrity sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==
|
||||||
|
|
||||||
esbuild-darwin-arm64@0.15.5:
|
esbuild-darwin-arm64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.6.tgz#194e987849dc4688654008a1792f26e948f52e74"
|
||||||
integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==
|
integrity sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA==
|
||||||
|
|
||||||
esbuild-freebsd-64@0.14.53:
|
esbuild-freebsd-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz#aca2af6d72b537fe66a38eb8f374fb66d4c98ca0"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz#aca2af6d72b537fe66a38eb8f374fb66d4c98ca0"
|
||||||
integrity sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==
|
integrity sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==
|
||||||
|
|
||||||
esbuild-freebsd-64@0.15.5:
|
esbuild-freebsd-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.6.tgz#daa72faee585ec2ec27cc65e86a6ce0786373e66"
|
||||||
integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==
|
integrity sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg==
|
||||||
|
|
||||||
esbuild-freebsd-arm64@0.14.53:
|
esbuild-freebsd-arm64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz#76282e19312d914c34343c8a7da6cc5f051580b9"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz#76282e19312d914c34343c8a7da6cc5f051580b9"
|
||||||
integrity sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==
|
integrity sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==
|
||||||
|
|
||||||
esbuild-freebsd-arm64@0.15.5:
|
esbuild-freebsd-arm64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.6.tgz#70c8a2a30bf6bb9d547a0d8dc93aa015ec4f77f9"
|
||||||
integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==
|
integrity sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw==
|
||||||
|
|
||||||
esbuild-linux-32@0.14.53:
|
esbuild-linux-32@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz#1045d34cf7c5faaf2af3b29cc1573b06580c37e5"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz#1045d34cf7c5faaf2af3b29cc1573b06580c37e5"
|
||||||
integrity sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==
|
integrity sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==
|
||||||
|
|
||||||
esbuild-linux-32@0.15.5:
|
esbuild-linux-32@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.6.tgz#d69ed2335b2d68c00b3248254b432172077b7ced"
|
||||||
integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==
|
integrity sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg==
|
||||||
|
|
||||||
esbuild-linux-64@0.14.53:
|
esbuild-linux-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz#ab3f2ee2ebb5a6930c72d9539cb34b428808cbe4"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz#ab3f2ee2ebb5a6930c72d9539cb34b428808cbe4"
|
||||||
integrity sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==
|
integrity sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==
|
||||||
|
|
||||||
esbuild-linux-64@0.15.5:
|
esbuild-linux-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz#dca821e8f129cccde23ac947fd0d4bea3b333808"
|
||||||
integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==
|
integrity sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A==
|
||||||
|
|
||||||
esbuild-linux-arm64@0.14.53:
|
esbuild-linux-arm64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz#1f5530412f6690949e78297122350488d3266cfe"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz#1f5530412f6690949e78297122350488d3266cfe"
|
||||||
integrity sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==
|
integrity sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==
|
||||||
|
|
||||||
esbuild-linux-arm64@0.15.5:
|
esbuild-linux-arm64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.6.tgz#c9e8bc86f3c58a7c8ff1ded5880c6a39ade7621b"
|
||||||
integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==
|
integrity sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA==
|
||||||
|
|
||||||
esbuild-linux-arm@0.14.53:
|
esbuild-linux-arm@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz#a44ec9b5b42007ab6c0d65a224ccc6bbd97c54cf"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz#a44ec9b5b42007ab6c0d65a224ccc6bbd97c54cf"
|
||||||
integrity sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==
|
integrity sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==
|
||||||
|
|
||||||
esbuild-linux-arm@0.15.5:
|
esbuild-linux-arm@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.6.tgz#354ecad0223f5b176995cf4462560eec2633de24"
|
||||||
integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==
|
integrity sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ==
|
||||||
|
|
||||||
esbuild-linux-mips64le@0.14.53:
|
esbuild-linux-mips64le@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz#a4d0b6b17cfdeea4e41b0b085a5f73d99311be9f"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz#a4d0b6b17cfdeea4e41b0b085a5f73d99311be9f"
|
||||||
integrity sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==
|
integrity sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==
|
||||||
|
|
||||||
esbuild-linux-mips64le@0.15.5:
|
esbuild-linux-mips64le@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.6.tgz#f4fb941a4ff0af437deed69a2e0712983c8fff3e"
|
||||||
integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==
|
integrity sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw==
|
||||||
|
|
||||||
esbuild-linux-ppc64le@0.14.53:
|
esbuild-linux-ppc64le@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz#8c331822c85465434e086e3e6065863770c38139"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz#8c331822c85465434e086e3e6065863770c38139"
|
||||||
integrity sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==
|
integrity sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==
|
||||||
|
|
||||||
esbuild-linux-ppc64le@0.15.5:
|
esbuild-linux-ppc64le@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.6.tgz#19774a8b52c77173f2d4f171b8a8cf839b12e686"
|
||||||
integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==
|
integrity sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw==
|
||||||
|
|
||||||
esbuild-linux-riscv64@0.14.53:
|
esbuild-linux-riscv64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz#36fd75543401304bea8a2d63bf8ea18aaa508e00"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz#36fd75543401304bea8a2d63bf8ea18aaa508e00"
|
||||||
integrity sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==
|
integrity sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==
|
||||||
|
|
||||||
esbuild-linux-riscv64@0.15.5:
|
esbuild-linux-riscv64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.6.tgz#66bd83b065c4a1e623df02c122bc7e4e15fd8486"
|
||||||
integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==
|
integrity sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw==
|
||||||
|
|
||||||
esbuild-linux-s390x@0.14.53:
|
esbuild-linux-s390x@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz#1622677ab6824123f48f75d3afc031cd41936129"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz#1622677ab6824123f48f75d3afc031cd41936129"
|
||||||
integrity sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==
|
integrity sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==
|
||||||
|
|
||||||
esbuild-linux-s390x@0.15.5:
|
esbuild-linux-s390x@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.6.tgz#1e024bddc75afe8dc70ed48fc9627af770d7f34b"
|
||||||
integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==
|
integrity sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q==
|
||||||
|
|
||||||
esbuild-loader@^2.19.0:
|
esbuild-loader@^2.19.0:
|
||||||
version "2.19.0"
|
version "2.19.0"
|
||||||
@ -5656,60 +5661,60 @@ esbuild-netbsd-64@0.14.53:
|
|||||||
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz#e86d0efd0116658be335492ed12e66b26b4baf52"
|
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz#e86d0efd0116658be335492ed12e66b26b4baf52"
|
||||||
integrity sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==
|
integrity sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==
|
||||||
|
|
||||||
esbuild-netbsd-64@0.15.5:
|
esbuild-netbsd-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8"
|
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.6.tgz#c11477d197f059c8794ee1691e3399201f7c4b9a"
|
||||||
integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==
|
integrity sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA==
|
||||||
|
|
||||||
esbuild-openbsd-64@0.14.53:
|
esbuild-openbsd-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz#9bcbbe6f86304872c6e91f64c8eb73fc29c3588b"
|
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz#9bcbbe6f86304872c6e91f64c8eb73fc29c3588b"
|
||||||
integrity sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==
|
integrity sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==
|
||||||
|
|
||||||
esbuild-openbsd-64@0.15.5:
|
esbuild-openbsd-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035"
|
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.6.tgz#b29e7faed5b8d2aeaf3884c47c1a96b1cba8e263"
|
||||||
integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==
|
integrity sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw==
|
||||||
|
|
||||||
esbuild-sunos-64@0.14.53:
|
esbuild-sunos-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz#f7a872f7460bfb7b131f7188a95fbce3d1c577e8"
|
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz#f7a872f7460bfb7b131f7188a95fbce3d1c577e8"
|
||||||
integrity sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==
|
integrity sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==
|
||||||
|
|
||||||
esbuild-sunos-64@0.15.5:
|
esbuild-sunos-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141"
|
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.6.tgz#9668f39e47179f50c0435040904b9c6e10e84a70"
|
||||||
integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==
|
integrity sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg==
|
||||||
|
|
||||||
esbuild-windows-32@0.14.53:
|
esbuild-windows-32@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz#c5e3ca50e2d1439cc2c9fe4defa63bcd474ce709"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz#c5e3ca50e2d1439cc2c9fe4defa63bcd474ce709"
|
||||||
integrity sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==
|
integrity sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==
|
||||||
|
|
||||||
esbuild-windows-32@0.15.5:
|
esbuild-windows-32@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.6.tgz#9ddcd56e3c4fb9729a218c713c4e76bdbc1678b4"
|
||||||
integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==
|
integrity sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA==
|
||||||
|
|
||||||
esbuild-windows-64@0.14.53:
|
esbuild-windows-64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz#ec2ab4a60c5215f092ffe1eab6d01319e88238af"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz#ec2ab4a60c5215f092ffe1eab6d01319e88238af"
|
||||||
integrity sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==
|
integrity sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==
|
||||||
|
|
||||||
esbuild-windows-64@0.15.5:
|
esbuild-windows-64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.6.tgz#1eaadeadfd995e9d065d35cb3e9f02607202f339"
|
||||||
integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==
|
integrity sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg==
|
||||||
|
|
||||||
esbuild-windows-arm64@0.14.53:
|
esbuild-windows-arm64@0.14.53:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz#f71d403806bdf9f4a1f9d097db9aec949bd675c8"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz#f71d403806bdf9f4a1f9d097db9aec949bd675c8"
|
||||||
integrity sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==
|
integrity sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==
|
||||||
|
|
||||||
esbuild-windows-arm64@0.15.5:
|
esbuild-windows-arm64@0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.6.tgz#e18a778d354fc2ca2306688f3fedad8a3e57819e"
|
||||||
integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==
|
integrity sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg==
|
||||||
|
|
||||||
esbuild@^0.14.39:
|
esbuild@^0.14.39:
|
||||||
version "0.14.53"
|
version "0.14.53"
|
||||||
@ -5738,32 +5743,32 @@ esbuild@^0.14.39:
|
|||||||
esbuild-windows-64 "0.14.53"
|
esbuild-windows-64 "0.14.53"
|
||||||
esbuild-windows-arm64 "0.14.53"
|
esbuild-windows-arm64 "0.14.53"
|
||||||
|
|
||||||
esbuild@^0.15.5:
|
esbuild@^0.15.6:
|
||||||
version "0.15.5"
|
version "0.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.5.tgz#5effd05666f621d4ff2fe2c76a67c198292193ff"
|
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.6.tgz#626e5941b98de506b862047be3c4b33f89278923"
|
||||||
integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==
|
integrity sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@esbuild/linux-loong64" "0.15.5"
|
"@esbuild/linux-loong64" "0.15.6"
|
||||||
esbuild-android-64 "0.15.5"
|
esbuild-android-64 "0.15.6"
|
||||||
esbuild-android-arm64 "0.15.5"
|
esbuild-android-arm64 "0.15.6"
|
||||||
esbuild-darwin-64 "0.15.5"
|
esbuild-darwin-64 "0.15.6"
|
||||||
esbuild-darwin-arm64 "0.15.5"
|
esbuild-darwin-arm64 "0.15.6"
|
||||||
esbuild-freebsd-64 "0.15.5"
|
esbuild-freebsd-64 "0.15.6"
|
||||||
esbuild-freebsd-arm64 "0.15.5"
|
esbuild-freebsd-arm64 "0.15.6"
|
||||||
esbuild-linux-32 "0.15.5"
|
esbuild-linux-32 "0.15.6"
|
||||||
esbuild-linux-64 "0.15.5"
|
esbuild-linux-64 "0.15.6"
|
||||||
esbuild-linux-arm "0.15.5"
|
esbuild-linux-arm "0.15.6"
|
||||||
esbuild-linux-arm64 "0.15.5"
|
esbuild-linux-arm64 "0.15.6"
|
||||||
esbuild-linux-mips64le "0.15.5"
|
esbuild-linux-mips64le "0.15.6"
|
||||||
esbuild-linux-ppc64le "0.15.5"
|
esbuild-linux-ppc64le "0.15.6"
|
||||||
esbuild-linux-riscv64 "0.15.5"
|
esbuild-linux-riscv64 "0.15.6"
|
||||||
esbuild-linux-s390x "0.15.5"
|
esbuild-linux-s390x "0.15.6"
|
||||||
esbuild-netbsd-64 "0.15.5"
|
esbuild-netbsd-64 "0.15.6"
|
||||||
esbuild-openbsd-64 "0.15.5"
|
esbuild-openbsd-64 "0.15.6"
|
||||||
esbuild-sunos-64 "0.15.5"
|
esbuild-sunos-64 "0.15.6"
|
||||||
esbuild-windows-32 "0.15.5"
|
esbuild-windows-32 "0.15.6"
|
||||||
esbuild-windows-64 "0.15.5"
|
esbuild-windows-64 "0.15.6"
|
||||||
esbuild-windows-arm64 "0.15.5"
|
esbuild-windows-arm64 "0.15.6"
|
||||||
|
|
||||||
escalade@^3.1.1:
|
escalade@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
@ -5864,10 +5869,10 @@ eslint-plugin-react-hooks@^4.6.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
|
||||||
integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
|
integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
|
||||||
|
|
||||||
eslint-plugin-react@^7.31.0:
|
eslint-plugin-react@7.30.1:
|
||||||
version "7.31.1"
|
version "7.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz#d29793ed27743f3ed8a473c347b1bf5a0a8fb9af"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22"
|
||||||
integrity sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==
|
integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes "^3.1.5"
|
array-includes "^3.1.5"
|
||||||
array.prototype.flatmap "^1.3.0"
|
array.prototype.flatmap "^1.3.0"
|
||||||
@ -5929,14 +5934,15 @@ eslint-visitor-keys@^3.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||||
|
|
||||||
eslint@^8.22.0:
|
eslint@^8.23.0:
|
||||||
version "8.22.0"
|
version "8.23.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040"
|
||||||
integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==
|
integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint/eslintrc" "^1.3.0"
|
"@eslint/eslintrc" "^1.3.1"
|
||||||
"@humanwhocodes/config-array" "^0.10.4"
|
"@humanwhocodes/config-array" "^0.10.4"
|
||||||
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
|
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
|
||||||
|
"@humanwhocodes/module-importer" "^1.0.1"
|
||||||
ajv "^6.10.0"
|
ajv "^6.10.0"
|
||||||
chalk "^4.0.0"
|
chalk "^4.0.0"
|
||||||
cross-spawn "^7.0.2"
|
cross-spawn "^7.0.2"
|
||||||
@ -5946,7 +5952,7 @@ eslint@^8.22.0:
|
|||||||
eslint-scope "^7.1.1"
|
eslint-scope "^7.1.1"
|
||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
eslint-visitor-keys "^3.3.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
espree "^9.3.3"
|
espree "^9.4.0"
|
||||||
esquery "^1.4.0"
|
esquery "^1.4.0"
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
fast-deep-equal "^3.1.3"
|
fast-deep-equal "^3.1.3"
|
||||||
@ -5972,12 +5978,11 @@ eslint@^8.22.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
strip-json-comments "^3.1.0"
|
strip-json-comments "^3.1.0"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
v8-compile-cache "^2.0.3"
|
|
||||||
|
|
||||||
espree@^9.3.2, espree@^9.3.3:
|
espree@^9.4.0:
|
||||||
version "9.3.3"
|
version "9.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a"
|
||||||
integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==
|
integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^8.8.0"
|
acorn "^8.8.0"
|
||||||
acorn-jsx "^5.3.2"
|
acorn-jsx "^5.3.2"
|
||||||
@ -9399,10 +9404,10 @@ markdown@^0.5.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
nopt "~2.1.1"
|
nopt "~2.1.1"
|
||||||
|
|
||||||
marked@^4.0.18, marked@^4.0.19:
|
marked@^4.0.19, marked@^4.1.0:
|
||||||
version "4.0.19"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.19.tgz#d36198d1ac1255525153c351c68c75bc1d7aee46"
|
resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.0.tgz#3fc6e7485f21c1ca5d6ec4a39de820e146954796"
|
||||||
integrity sha512-rgQF/OxOiLcvgUAj1Q1tAf4Bgxn5h5JZTp04Fx4XUkVhs7B+7YA9JEWJhJpoO8eJt8MkZMwqLCNeNqj1bCREZQ==
|
integrity sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==
|
||||||
|
|
||||||
matcher-collection@^2.0.0:
|
matcher-collection@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@ -10896,17 +10901,17 @@ pkg-up@^3.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
find-up "^3.0.0"
|
find-up "^3.0.0"
|
||||||
|
|
||||||
playwright-core@1.24.2:
|
playwright-core@1.25.1:
|
||||||
version "1.24.2"
|
version "1.25.1"
|
||||||
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.24.2.tgz#47bc5adf3dcfcc297a5a7a332449c9009987db26"
|
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.25.1.tgz#abe56aec8bef645fba988320d9f9328fafab0446"
|
||||||
integrity sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==
|
integrity sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==
|
||||||
|
|
||||||
playwright@^1.24.2:
|
playwright@^1.25.1:
|
||||||
version "1.24.2"
|
version "1.25.1"
|
||||||
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.24.2.tgz#51e60f128b386023e5ee83deca23453aaf73ba6d"
|
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.25.1.tgz#23fe129ca05568a72ee2a3842baa0a1985d1b345"
|
||||||
integrity sha512-iMWDLgaFRT+7dXsNeYwgl8nhLHsUrzFyaRVC+ftr++P1dVs70mPrFKBZrGp1fOKigHV9d1syC03IpPbqLKlPsg==
|
integrity sha512-kOlW7mllnQ70ALTwAor73q/FhdH9EEXLUqjdzqioYLcSVC4n4NBfDqeCikGuayFZrLECLkU6Hcbziy/szqTXSA==
|
||||||
dependencies:
|
dependencies:
|
||||||
playwright-core "1.24.2"
|
playwright-core "1.25.1"
|
||||||
|
|
||||||
plist@^3.0.1, plist@^3.0.4:
|
plist@^3.0.1, plist@^3.0.4:
|
||||||
version "3.0.5"
|
version "3.0.5"
|
||||||
@ -11386,10 +11391,10 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8:
|
|||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
react-beautiful-dnd@^13.1.0:
|
react-beautiful-dnd@^13.1.1:
|
||||||
version "13.1.0"
|
version "13.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d"
|
resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2"
|
||||||
integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==
|
integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.9.2"
|
"@babel/runtime" "^7.9.2"
|
||||||
css-box-model "^1.2.0"
|
css-box-model "^1.2.0"
|
||||||
@ -12065,10 +12070,10 @@ sass-loader@^12.6.0:
|
|||||||
klona "^2.0.4"
|
klona "^2.0.4"
|
||||||
neo-async "^2.6.2"
|
neo-async "^2.6.2"
|
||||||
|
|
||||||
sass@^1.32.13, sass@^1.54.5:
|
sass@^1.32.13, sass@^1.54.7:
|
||||||
version "1.54.5"
|
version "1.54.7"
|
||||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.5.tgz#93708f5560784f6ff2eab8542ade021a4a947b3a"
|
resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.7.tgz#a93fb1690472b161fab8f4ab34a66a0f3000c478"
|
||||||
integrity sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==
|
integrity sha512-3q7MQz7sCpVG6TLhUfZwGOcd2/sm2ghYN2JEdRjNiW04ILdvahdo9GuAs+bxsxZ3hDCKv+wUT5w0iFWGU0CxlA==
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar ">=3.0.0 <4.0.0"
|
chokidar ">=3.0.0 <4.0.0"
|
||||||
immutable "^4.0.0"
|
immutable "^4.0.0"
|
||||||
@ -12333,14 +12338,14 @@ shelljs@^0.8.5:
|
|||||||
interpret "^1.0.0"
|
interpret "^1.0.0"
|
||||||
rechoir "^0.6.2"
|
rechoir "^0.6.2"
|
||||||
|
|
||||||
shiki@^0.10.1:
|
shiki@^0.11.1:
|
||||||
version "0.10.1"
|
version "0.11.1"
|
||||||
resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14"
|
resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc"
|
||||||
integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==
|
integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==
|
||||||
dependencies:
|
dependencies:
|
||||||
jsonc-parser "^3.0.0"
|
jsonc-parser "^3.0.0"
|
||||||
vscode-oniguruma "^1.6.1"
|
vscode-oniguruma "^1.6.1"
|
||||||
vscode-textmate "5.2.0"
|
vscode-textmate "^6.0.0"
|
||||||
|
|
||||||
side-channel@^1.0.4:
|
side-channel@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
@ -13476,15 +13481,15 @@ typedoc-plugin-markdown@^3.13.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
handlebars "^4.7.7"
|
handlebars "^4.7.7"
|
||||||
|
|
||||||
typedoc@0.23.10:
|
typedoc@0.23.11:
|
||||||
version "0.23.10"
|
version "0.23.11"
|
||||||
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.10.tgz#285d595a5f2e35ccdf6f38eba4dfe951d5bff461"
|
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.11.tgz#eacdc389038efd6de40a3c4561c413ad00f1ab16"
|
||||||
integrity sha512-03EUiu/ZuScUBMnY6p0lY+HTH8SwhzvRE3gImoemdPDWXPXlks83UGTx++lyquWeB1MTwm9D9Ca8RIjkK3AFfQ==
|
integrity sha512-FhZ2HfqlS++53UwHk4txCsTrTlpYR0So/0osMyBeP1E7llRNRqycJGfYK1qx9Wvvv5VO8tGdpwzOwDW5FrTi7A==
|
||||||
dependencies:
|
dependencies:
|
||||||
lunr "^2.3.9"
|
lunr "^2.3.9"
|
||||||
marked "^4.0.18"
|
marked "^4.0.19"
|
||||||
minimatch "^5.1.0"
|
minimatch "^5.1.0"
|
||||||
shiki "^0.10.1"
|
shiki "^0.11.1"
|
||||||
|
|
||||||
typescript-plugin-css-modules@^3.4.0:
|
typescript-plugin-css-modules@^3.4.0:
|
||||||
version "3.4.0"
|
version "3.4.0"
|
||||||
@ -13748,11 +13753,6 @@ v8-compile-cache-lib@^3.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
|
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
|
||||||
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
|
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
|
||||||
|
|
||||||
v8-compile-cache@^2.0.3:
|
|
||||||
version "2.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
|
|
||||||
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
|
|
||||||
|
|
||||||
v8-to-istanbul@^9.0.1:
|
v8-to-istanbul@^9.0.1:
|
||||||
version "9.0.1"
|
version "9.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4"
|
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4"
|
||||||
@ -13810,10 +13810,10 @@ vscode-oniguruma@^1.6.1:
|
|||||||
resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607"
|
resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607"
|
||||||
integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==
|
integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==
|
||||||
|
|
||||||
vscode-textmate@5.2.0:
|
vscode-textmate@^6.0.0:
|
||||||
version "5.2.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e"
|
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210"
|
||||||
integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==
|
integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==
|
||||||
|
|
||||||
w3c-hr-time@^1.0.2:
|
w3c-hr-time@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
@ -13931,10 +13931,10 @@ webpack-dev-middleware@^5.3.1:
|
|||||||
range-parser "^1.2.1"
|
range-parser "^1.2.1"
|
||||||
schema-utils "^4.0.0"
|
schema-utils "^4.0.0"
|
||||||
|
|
||||||
webpack-dev-server@*, webpack-dev-server@^4.10.0:
|
webpack-dev-server@*, webpack-dev-server@^4.10.1:
|
||||||
version "4.10.0"
|
version "4.10.1"
|
||||||
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz#de270d0009eba050546912be90116e7fd740a9ca"
|
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.1.tgz#124ac9ac261e75303d74d95ab6712b4aec3e12ed"
|
||||||
integrity sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==
|
integrity sha512-FIzMq3jbBarz3ld9l7rbM7m6Rj1lOsgq/DyLGMX/fPEB1UBUPtf5iL/4eNfhx8YYJTRlzfv107UfWSWcBK5Odw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/bonjour" "^3.5.9"
|
"@types/bonjour" "^3.5.9"
|
||||||
"@types/connect-history-api-fallback" "^1.3.5"
|
"@types/connect-history-api-fallback" "^1.3.5"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user