Compare commits

...

8 Commits

Author SHA1 Message Date
Amir Raminfar
7c486d57fc Release 4.1.8 2022-09-27 10:27:57 -07:00
Amir Raminfar
41acf28be9 Updates modules 2022-09-26 09:54:25 -07:00
Amir Raminfar
21e5f4fc56 Removes fuzzysearch and uses fuse.js (#1888)
* Removes fuzzysearch and uses fuse.js

* Fix search bug

* Adds locale

* Fixes more locale

* Fixes search to not update with stats

* Fixes sort order
2022-09-23 09:54:55 -07:00
kodiakhq[bot]
2d54cbba9c Merge pull request #1887 from amir20/keyboard
Improves keyboard short cuts and adds a test
2022-09-22 18:19:41 +00:00
Amir Raminfar
88844c895c Fixes comment 2022-09-22 11:15:43 -07:00
Amir Raminfar
7aa7f42c52 Improves keyboard short cuts and adds a test 2022-09-22 11:13:28 -07:00
Amir Raminfar
59f4b0da4f Release 4.1.7 2022-09-20 14:31:07 -07:00
Amir Raminfar
e99e6ebd49 Fixes bubble for search and #1886 2022-09-20 14:30:54 -07:00
12 changed files with 248 additions and 177 deletions

View File

@@ -10,15 +10,17 @@ WORKDIR /build
COPY pnpm-lock.yaml ./
RUN pnpm fetch --prod
# Copy files
COPY package.json .* vite.config.ts index.html ./
# Copy package.json and install dependencies
COPY package.json ./
RUN pnpm install -r --offline --prod --ignore-scripts
# Copy assets and translations to build
COPY .* vite.config.ts index.html ./
COPY assets ./assets
COPY locales ./locales
# Install dependencies
RUN pnpm install -r --offline --prod --ignore-scripts && pnpm build
# Build assets
RUN pnpm build
FROM --platform=$BUILDPLATFORM golang:1.19.1-alpine AS builder

View File

@@ -3,26 +3,29 @@
<o-autocomplete
ref="autocomplete"
v-model="query"
placeholder="Search containers using ⌘ + k or ctrl + k"
field="name"
:placeholder="$t('placeholder.search-containers')"
open-on-focus
keep-first
expanded
:data="results"
:data="data"
@select="selected"
>
<template #default="props">
<template #default="{ option: item }">
<div class="media">
<div class="media-left">
<span class="icon is-small" :class="props.option.state">
<span class="icon is-small" :class="item.state">
<octicon-container-24 />
</span>
</div>
<div class="media-content">
{{ props.option.name }}
{{ item.name }}
</div>
<div class="media-right">
<span class="icon is-small column-icon" @click.stop.prevent="addColumn(props.option)" title="Pin as column">
<span
class="icon is-small column-icon"
@click.stop.prevent="addColumn(item)"
:title="$t('tooltip.pin-column')"
>
<cil-columns />
</span>
</div>
@@ -33,55 +36,61 @@
</template>
<script lang="ts" setup>
import fuzzysort from "fuzzysort";
import { type Container } from "@/types/Container";
import { useFuse } from "@vueuse/integrations/useFuse";
const { maxResults = 20 } = defineProps<{
const { maxResults: resultLimit = 20 } = defineProps<{
maxResults?: number;
}>();
const emit = defineEmits(["close"]);
const emit = defineEmits<{
(e: "close"): void;
}>();
const query = ref("");
const autocomplete = ref<HTMLElement>();
const router = useRouter();
const store = useContainerStore();
const { containers } = storeToRefs(store);
const preparedContainers = computed(() =>
containers.value.map(({ name, id, created, state }) =>
reactive({
name,
const list = computed(() => {
return containers.value.map(({ id, created, name, state }) => {
return {
id,
created,
name,
state,
preparedName: fuzzysort.prepare(name),
})
)
);
const results = computed(() => {
const options = {
limit: maxResults,
key: "preparedName",
};
if (query.value) {
const results = fuzzysort.go(query.value, preparedContainers.value, options);
results.forEach((result) => {
if (result.obj.state === "running") {
// @ts-ignore
result.score += 1;
}
});
return [...results].sort((a, b) => b.score - a.score).map((i) => i.obj);
} else {
return [...preparedContainers.value].sort((a, b) => b.created - a.created);
}
};
});
});
onMounted(() => nextTick(() => autocomplete.value?.focus()));
const { results } = useFuse(query, list, {
fuseOptions: { keys: ["name"], includeScore: true },
resultLimit,
matchAllWhenSearchEmpty: true,
});
function selected(item: { id: string; name: string }) {
router.push({ name: "container-id", params: { id: item.id } });
const data = computed(() => {
return results.value
.sort((a, b) => {
if (a.score === b.score) {
if (a.item.state === "running" && b.item.state !== "running") {
return -1;
} else {
return 1;
}
} else if (a.score && b.score) {
return a.score - b.score;
} else {
return 0;
}
})
.map(({ item }) => item);
});
watchOnce(autocomplete, () => autocomplete.value?.focus());
function selected({ id }: { id: string }) {
router.push({ name: "container-id", params: { id } });
emit("close");
}
function addColumn(container: Container) {

View File

@@ -22,23 +22,17 @@
</template>
<script lang="ts" setup>
const { Meta_F, Ctrl_F, esc } = useMagicKeys({
passive: false,
onEventFired(e) {
if ((e.ctrlKey || e.metaKey) && e.key === "f" && e.type === "keydown") e.preventDefault();
},
});
const input = ref<HTMLInputElement>();
const { searchFilter, showSearch, resetSearch } = useSearchFilter();
whenever(
() => Meta_F.value || Ctrl_F.value,
() => {
onKeyStroke("f", (e) => {
if (e.ctrlKey || e.metaKey) {
showSearch.value = true;
nextTick(() => input.value?.focus() || input.value?.select());
e.preventDefault();
}
);
whenever(esc, () => resetSearch());
});
onUnmounted(() => resetSearch());
</script>

View File

@@ -50,19 +50,21 @@ import FuzzySearchModal from "@/components/FuzzySearchModal.vue";
const collapseNav = ref(false);
const { oruga } = useProgrammatic();
const { authorizationNeeded } = config;
const { Meta_K, Ctrl_K } = useMagicKeys();
const containerStore = useContainerStore();
const { activeContainers, visibleContainers } = storeToRefs(containerStore);
whenever(
() => Meta_K.value || Ctrl_K.value,
() => showFuzzySearch()
);
watchEffect(() => {
setTitle(`${visibleContainers.value.length} containers`);
});
onKeyStroke("k", (e) => {
if (e.ctrlKey || e.metaKey) {
showFuzzySearch();
e.preventDefault();
}
});
function showFuzzySearch() {
oruga.modal.open({
// parent: this,

View File

@@ -54,8 +54,8 @@
class="input"
type="text"
:placeholder="$t('placeholder.search-containers')"
v-model="search"
@keyup.esc="search.value = null"
v-model="query"
@keyup.esc="query = ''"
@keyup.enter="onEnter()"
/>
<span class="icon is-left">
@@ -63,13 +63,13 @@
</span>
</p>
</div>
<p class="panel-tabs" v-if="!search">
<p class="panel-tabs" v-if="query === ''">
<a :class="{ 'is-active': sort === 'running' }" @click="sort = 'running'">{{ $t("label.running") }}</a>
<a :class="{ 'is-active': sort === 'all' }" @click="sort = 'all'">{{ $t("label.all") }}</a>
</p>
<router-link
:to="{ name: 'container-id', params: { id: item.id } }"
v-for="item in results.slice(0, 10)"
v-for="item in data.slice(0, 10)"
:key="item.id"
class="panel-block"
>
@@ -86,54 +86,59 @@
</template>
<script lang="ts" setup>
import fuzzysort from "fuzzysort";
import SearchIcon from "~icons/mdi-light/magnify";
import { useFuse } from "@vueuse/integrations/useFuse";
const { base, version, secured } = config;
const containerStore = useContainerStore();
const { containers } = storeToRefs(containerStore);
const router = useRouter();
const sort = ref("running");
const search = ref();
const sort = $ref("running");
const query = ref("");
const results = computed(() => {
if (search.value) {
return fuzzysort.go(search.value, containers.value, { key: "name" }).map((i) => i.obj);
const mostRecentContainers = $computed(() => [...containers.value].sort((a, b) => b.created - a.created));
const runningContainers = $computed(() => mostRecentContainers.filter((c) => c.state === "running"));
const { results } = useFuse(query, containers, {
fuseOptions: { keys: ["name"] },
matchAllWhenSearchEmpty: false,
});
const data = computed(() => {
if (results.value.length) {
return results.value.map(({ item }) => item);
}
switch (sort.value) {
switch (sort) {
case "all":
return mostRecentContainers.value;
return mostRecentContainers;
case "running":
return runningContainers.value;
return runningContainers;
default:
throw `Invalid sort order: ${sort.value}`;
throw `Invalid sort order: ${sort}`;
}
});
const mostRecentContainers = computed(() => [...containers.value].sort((a, b) => b.created - a.created));
const runningContainers = computed(() => mostRecentContainers.value.filter((c) => c.state === "running"));
const totalCpu = ref(0);
let totalCpu = $ref(0);
useIntervalFn(
() => {
totalCpu.value = runningContainers.value.reduce((acc, c) => acc + (c.stat?.cpu ?? 0), 0);
totalCpu = runningContainers.reduce((acc, c) => acc + (c.stat?.cpu ?? 0), 0);
},
1000,
{ immediate: true }
);
const totalMem = ref(0);
let totalMem = $ref(0);
useIntervalFn(
() => {
totalMem.value = runningContainers.value.reduce((acc, c) => acc + (c.stat?.memoryUsage ?? 0), 0);
totalMem = runningContainers.reduce((acc, c) => acc + (c.stat?.memoryUsage ?? 0), 0);
},
1000,
{ immediate: true }
);
function onEnter() {
if (results.value.length == 1) {
const [item] = results.value;
if (data.value.length > 0) {
const item = data.value[0];
router.push({ name: "container-id", params: { id: item.id } });
}
}

View File

@@ -54,8 +54,8 @@
class="input"
type="text"
:placeholder="$t('placeholder.search-containers')"
v-model="search"
@keyup.esc="search.value = null"
v-model="query"
@keyup.esc="query = ''"
@keyup.enter="onEnter()"
/>
<span class="icon is-left">
@@ -63,13 +63,13 @@
</span>
</p>
</div>
<p class="panel-tabs" v-if="!search">
<p class="panel-tabs" v-if="query === ''">
<a :class="{ 'is-active': sort === 'running' }" @click="sort = 'running'">{{ $t("label.running") }}</a>
<a :class="{ 'is-active': sort === 'all' }" @click="sort = 'all'">{{ $t("label.all") }}</a>
</p>
<router-link
:to="{ name: 'container-id', params: { id: item.id } }"
v-for="item in results.slice(0, 10)"
v-for="item in data.slice(0, 10)"
:key="item.id"
class="panel-block"
>
@@ -86,54 +86,59 @@
</template>
<script lang="ts" setup>
import fuzzysort from "fuzzysort";
import SearchIcon from "~icons/mdi-light/magnify";
import { useFuse } from "@vueuse/integrations/useFuse";
const { base, version, secured } = config;
const containerStore = useContainerStore();
const { containers } = storeToRefs(containerStore);
const router = useRouter();
const sort = ref("running");
const search = ref();
const sort = $ref("running");
const query = ref("");
const results = computed(() => {
if (search.value) {
return fuzzysort.go(search.value, containers.value, { key: "name" }).map((i) => i.obj);
const mostRecentContainers = $computed(() => [...containers.value].sort((a, b) => b.created - a.created));
const runningContainers = $computed(() => mostRecentContainers.filter((c) => c.state === "running"));
const { results } = useFuse(query, containers, {
fuseOptions: { keys: ["name"] },
matchAllWhenSearchEmpty: false,
});
const data = computed(() => {
if (results.value.length) {
return results.value.map(({ item }) => item);
}
switch (sort.value) {
switch (sort) {
case "all":
return mostRecentContainers.value;
return mostRecentContainers;
case "running":
return runningContainers.value;
return runningContainers;
default:
throw `Invalid sort order: ${sort.value}`;
throw `Invalid sort order: ${sort}`;
}
});
const mostRecentContainers = computed(() => [...containers.value].sort((a, b) => b.created - a.created));
const runningContainers = computed(() => mostRecentContainers.value.filter((c) => c.state === "running"));
const totalCpu = ref(0);
let totalCpu = $ref(0);
useIntervalFn(
() => {
totalCpu.value = runningContainers.value.reduce((acc, c) => acc + (c.stat?.cpu ?? 0), 0);
totalCpu = runningContainers.reduce((acc, c) => acc + (c.stat?.cpu ?? 0), 0);
},
1000,
{ immediate: true }
);
const totalMem = ref(0);
let totalMem = $ref(0);
useIntervalFn(
() => {
totalMem.value = runningContainers.value.reduce((acc, c) => acc + (c.stat?.memoryUsage ?? 0), 0);
totalMem = runningContainers.reduce((acc, c) => acc + (c.stat?.memoryUsage ?? 0), 0);
},
1000,
{ immediate: true }
);
function onEnter() {
if (results.value.length == 1) {
const [item] = results.value;
if (data.value.length > 0) {
const item = data.value[0];
router.push({ name: "container-id", params: { id: item.id } });
}
}

View File

@@ -9,7 +9,7 @@ context("Dozzle default mode", { baseUrl: Cypress.env("DOZZLE_DEFAULT") }, () =>
cy.get("li.running", { timeout: 10000 }).removeDates().replaceSkippedElements().matchImage();
});
it("correct title", () => {
it("correct title is shown", () => {
cy.title().should("eq", "1 containers - Dozzle");
cy.get("li.running:first a").click();
@@ -17,9 +17,15 @@ context("Dozzle default mode", { baseUrl: Cypress.env("DOZZLE_DEFAULT") }, () =>
cy.title().should("include", "- Dozzle");
});
it("settings page", () => {
it("navigating to setting page works ", () => {
cy.get("a[href='/settings']").click();
cy.contains("About");
});
it("shortcut for fuzzy search works", () => {
cy.get("body").type("{ctrl}k");
cy.get("input[placeholder='Search containers (⌘ + k, ⌃k)']").should("be.visible");
});
});

View File

@@ -27,7 +27,7 @@ button:
logout: Logout
login: Login
placeholder:
search-containers: Search Containers
search-containers: Search containers (⌘ + k, ⌃k)
settings:
display: Display
small-scrollbars: Use smaller scrollbars

View File

@@ -27,7 +27,7 @@ button:
logout: Cerrar la sesión
login: Iniciar sesión
placeholder:
search-containers: Buscar Contenedores
search-containers: Buscar contenedores (⌘ + K, CTRL + K)
settings:
display: Vista
small-scrollbars: Utilizar barras de desplazamiento más pequeñas

View File

@@ -27,7 +27,7 @@ button:
logout: Terminar sessão
login: Iniciar sessão
placeholder:
search-containers: Pesquisar Contentores
search-containers: Pesquisar contentores (⌘ + K, CTRL + K)
settings:
display: Visão
small-scrollbars: Usar barras de rolagem mais pequenas

View File

@@ -1,6 +1,6 @@
{
"name": "dozzle",
"version": "4.1.6",
"version": "4.1.8",
"description": "Realtime log viewer for docker containers. ",
"homepage": "https://github.com/amir20/dozzle#readme",
"bugs": {
@@ -26,21 +26,22 @@
"@iconify-json/cil": "^1.1.2",
"@iconify-json/mdi": "^1.1.33",
"@iconify-json/mdi-light": "^1.1.2",
"@iconify-json/octicon": "^1.1.17",
"@intlify/vite-plugin-vue-i18n": "^6.0.1",
"@iconify-json/octicon": "^1.1.19",
"@intlify/vite-plugin-vue-i18n": "^6.0.2",
"@oruga-ui/oruga-next": "^0.5.6",
"@oruga-ui/theme-bulma": "^0.2.7",
"@vitejs/plugin-vue": "3.1.0",
"@vue/compiler-sfc": "^3.2.39",
"@vueuse/core": "^9.2.0",
"@vueuse/router": "^9.2.0",
"@vueuse/core": "^9.3.0",
"@vueuse/integrations": "^9.3.0",
"@vueuse/router": "^9.3.0",
"ansi-to-html": "^0.7.2",
"bulma": "^0.9.4",
"date-fns": "^2.29.3",
"fuzzysort": "^2.0.1",
"fuse.js": "^6.6.2",
"lodash.debounce": "^4.0.8",
"pinia": "^2.0.22",
"sass": "^1.54.9",
"sass": "^1.55.0",
"semver": "^7.3.7",
"splitpanes": "^3.1.1",
"typescript": "^4.8.3",
@@ -57,7 +58,7 @@
"devDependencies": {
"@pinia/testing": "^0.0.14",
"@types/lodash.debounce": "^4.0.7",
"@types/node": "^18.7.18",
"@types/node": "^18.7.22",
"@types/semver": "^7.3.12",
"@vue/test-utils": "^2.0.2",
"c8": "^7.12.0",

167
pnpm-lock.yaml generated
View File

@@ -5,25 +5,26 @@ specifiers:
'@iconify-json/cil': ^1.1.2
'@iconify-json/mdi': ^1.1.33
'@iconify-json/mdi-light': ^1.1.2
'@iconify-json/octicon': ^1.1.17
'@intlify/vite-plugin-vue-i18n': ^6.0.1
'@iconify-json/octicon': ^1.1.19
'@intlify/vite-plugin-vue-i18n': ^6.0.2
'@oruga-ui/oruga-next': ^0.5.6
'@oruga-ui/theme-bulma': ^0.2.7
'@pinia/testing': ^0.0.14
'@types/lodash.debounce': ^4.0.7
'@types/node': ^18.7.18
'@types/node': ^18.7.22
'@types/semver': ^7.3.12
'@vitejs/plugin-vue': 3.1.0
'@vue/compiler-sfc': ^3.2.39
'@vue/test-utils': ^2.0.2
'@vueuse/core': ^9.2.0
'@vueuse/router': ^9.2.0
'@vueuse/core': ^9.3.0
'@vueuse/integrations': ^9.3.0
'@vueuse/router': ^9.3.0
ansi-to-html: ^0.7.2
bulma: ^0.9.4
c8: ^7.12.0
date-fns: ^2.29.3
eventsourcemock: ^2.0.0
fuzzysort: ^2.0.1
fuse.js: ^6.6.2
husky: ^8.0.1
jest-serializer-vue: ^2.0.2
jsdom: ^20.0.0
@@ -33,7 +34,7 @@ specifiers:
pinia: ^2.0.22
prettier: ^2.7.1
release-it: ^15.4.2
sass: ^1.54.9
sass: ^1.55.0
semver: ^7.3.7
splitpanes: ^3.1.1
ts-node: ^10.9.1
@@ -55,28 +56,29 @@ dependencies:
'@iconify-json/cil': 1.1.2
'@iconify-json/mdi': 1.1.33
'@iconify-json/mdi-light': 1.1.2
'@iconify-json/octicon': 1.1.17
'@intlify/vite-plugin-vue-i18n': 6.0.1_vite@3.1.3+vue-i18n@9.2.2
'@iconify-json/octicon': 1.1.19
'@intlify/vite-plugin-vue-i18n': 6.0.2_vite@3.1.3+vue-i18n@9.2.2
'@oruga-ui/oruga-next': 0.5.6_vue@3.2.39
'@oruga-ui/theme-bulma': 0.2.7
'@vitejs/plugin-vue': 3.1.0_vite@3.1.3+vue@3.2.39
'@vue/compiler-sfc': 3.2.39
'@vueuse/core': 9.2.0_vue@3.2.39
'@vueuse/router': 9.2.0_u55wpvgoaskkfdnhr4v2vlugdi
'@vueuse/core': 9.3.0_vue@3.2.39
'@vueuse/integrations': 9.3.0_fuse.js@6.6.2+vue@3.2.39
'@vueuse/router': 9.3.0_u55wpvgoaskkfdnhr4v2vlugdi
ansi-to-html: 0.7.2
bulma: 0.9.4
date-fns: 2.29.3
fuzzysort: 2.0.1
fuse.js: 6.6.2
lodash.debounce: 4.0.8
pinia: 2.0.22_arz4dztosvwy2ghjrlh2wdhejm
sass: 1.54.9
sass: 1.55.0
semver: 7.3.7
splitpanes: 3.1.1
typescript: 4.8.3
unplugin-auto-import: 0.11.2_ddncce744ormlo74xpe4fre3qq
unplugin-auto-import: 0.11.2_2omhfktzjy2g6eniar2t4fuh44
unplugin-icons: 0.14.10_4s7vbzbcgwpqv5yc35umdpgf4a
unplugin-vue-components: 0.22.7_vite@3.1.3+vue@3.2.39
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
vite-plugin-pages: 0.26.0_4s7vbzbcgwpqv5yc35umdpgf4a
vite-plugin-vue-layouts: 0.7.0_xkhgfkrxwsspbw2hhglk5wewfa
vue: 3.2.39
@@ -86,7 +88,7 @@ dependencies:
devDependencies:
'@pinia/testing': 0.0.14_pinia@2.0.22+vue@3.2.39
'@types/lodash.debounce': 4.0.7
'@types/node': 18.7.18
'@types/node': 18.7.22
'@types/semver': 7.3.12
'@vue/test-utils': 2.0.2_vue@3.2.39
c8: 7.12.0
@@ -98,8 +100,8 @@ devDependencies:
npm-run-all: 4.1.5
prettier: 2.7.1
release-it: 15.4.2
ts-node: 10.9.1_bidgzm5cq2du6gnjtweqqjrrn4
vitest: 0.23.4_jsdom@20.0.0+sass@1.54.9
ts-node: 10.9.1_6zqjvw2hgekulz3zqkevhtb2gy
vitest: 0.23.4_jsdom@20.0.0+sass@1.55.0
vue-tsc: 0.40.13_typescript@4.8.3
packages:
@@ -216,10 +218,10 @@ packages:
'@iconify/types': 2.0.0
dev: false
/@iconify-json/octicon/1.1.17:
resolution: {integrity: sha512-W4NqIozJ/PXJAC96u3BQag/Eh5ykqSHbzzxt6f78l+sYYc23jymp1pH1ZXDV8QnKXMbHwS/oFV2zKeHZfS1tcQ==}
/@iconify-json/octicon/1.1.19:
resolution: {integrity: sha512-4sgrZ2D6h70UF6GDhgsF5XE6+GOmULlGgGvi0gXRFvPHW/hXcRGzxuCspx0/hXoLUNfja2kNLLVAt8GCnDDu8Q==}
dependencies:
'@iconify/types': 1.1.0
'@iconify/types': 2.0.0
dev: false
/@iconify/types/1.1.0:
@@ -306,8 +308,8 @@ packages:
engines: {node: '>= 14'}
dev: false
/@intlify/vite-plugin-vue-i18n/6.0.1_vite@3.1.3+vue-i18n@9.2.2:
resolution: {integrity: sha512-FFVcxVU4bR9vdDLNbltM5mrhndnXMErO01i0RrpdyMegEt3Nu/YLoH0sFdjRun7/RY4vaEnhTnFvVf9uO0dQvg==}
/@intlify/vite-plugin-vue-i18n/6.0.2_vite@3.1.3+vue-i18n@9.2.2:
resolution: {integrity: sha512-Z0fpq5NYxnvcofw94Ok54vXz+iRSSlF/Tx1/DmnW+FqPS2Uq7W1bah+fmjIWAUcV91ImTGm1egA7XujjzeB0ZA==}
engines: {node: '>= 14.6'}
peerDependencies:
petite-vue-i18n: '*'
@@ -325,9 +327,9 @@ packages:
'@intlify/shared': 9.3.0-beta.3
'@rollup/pluginutils': 4.2.1
debug: 4.3.4
fast-glob: 3.2.11
fast-glob: 3.2.12
source-map: 0.6.1
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
vue-i18n: 9.2.2_vue@3.2.39
transitivePeerDependencies:
- supports-color
@@ -595,7 +597,7 @@ packages:
dependencies:
'@types/http-cache-semantics': 4.0.1
'@types/keyv': 3.1.4
'@types/node': 18.7.18
'@types/node': 18.7.22
'@types/responselike': 1.0.0
dev: true
@@ -626,7 +628,7 @@ packages:
/@types/keyv/3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies:
'@types/node': 18.7.18
'@types/node': 18.7.22
dev: true
/@types/lodash.debounce/4.0.7:
@@ -643,8 +645,8 @@ packages:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false
/@types/node/18.7.18:
resolution: {integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==}
/@types/node/18.7.22:
resolution: {integrity: sha512-TsmoXYd4zrkkKjJB0URF/mTIKPl+kVcbqClB2F/ykU7vil1BfWZVndOnpEIozPv4fURD28gyPFeIkW2G+KXOvw==}
dev: true
/@types/parse-json/4.0.0:
@@ -654,7 +656,7 @@ packages:
/@types/responselike/1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
'@types/node': 18.7.18
'@types/node': 18.7.22
dev: true
/@types/semver/7.3.12:
@@ -672,7 +674,7 @@ packages:
vite: ^3.0.0
vue: ^3.2.25
dependencies:
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
vue: 3.2.39
dev: false
@@ -808,28 +810,72 @@ packages:
vue: 3.2.39
dev: true
/@vueuse/core/9.2.0_vue@3.2.39:
resolution: {integrity: sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==}
/@vueuse/core/9.3.0_vue@3.2.39:
resolution: {integrity: sha512-64Rna8IQDWpdrJxgitDg7yv1yTp41ZmvV8zlLEylK4QQLWAhz1OFGZDPZ8bU4lwcGgbEJ2sGi2jrdNh4LttUSQ==}
dependencies:
'@types/web-bluetooth': 0.0.15
'@vueuse/metadata': 9.2.0
'@vueuse/shared': 9.2.0_vue@3.2.39
'@vueuse/metadata': 9.3.0
'@vueuse/shared': 9.3.0_vue@3.2.39
vue-demi: 0.13.11_vue@3.2.39
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/metadata/9.2.0:
resolution: {integrity: sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw==}
/@vueuse/integrations/9.3.0_fuse.js@6.6.2+vue@3.2.39:
resolution: {integrity: sha512-KkJpC97VioZUpSw7rvgnqoLgTztLlLLGdYp6WQKn69cJiItsJVSRZrmI+X9YVxPBzuLvRymYZfp0RMyISVFHTw==}
peerDependencies:
async-validator: '*'
axios: '*'
change-case: '*'
drauu: '*'
focus-trap: '*'
fuse.js: '*'
jwt-decode: '*'
nprogress: '*'
qrcode: '*'
universal-cookie: '*'
peerDependenciesMeta:
async-validator:
optional: true
axios:
optional: true
change-case:
optional: true
drauu:
optional: true
focus-trap:
optional: true
fuse.js:
optional: true
jwt-decode:
optional: true
nprogress:
optional: true
qrcode:
optional: true
universal-cookie:
optional: true
dependencies:
'@vueuse/core': 9.3.0_vue@3.2.39
'@vueuse/shared': 9.3.0_vue@3.2.39
fuse.js: 6.6.2
vue-demi: 0.13.11_vue@3.2.39
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/router/9.2.0_u55wpvgoaskkfdnhr4v2vlugdi:
resolution: {integrity: sha512-N80vwh6EGFJiUIyCbfGhEDHzolNvTEPzJBLTuwy7pJU91VjNotMsSvUhwEI8l/cBpdBaIL9dUxRqXDBVrQBahA==}
/@vueuse/metadata/9.3.0:
resolution: {integrity: sha512-GnnfjbzIPJIh9ngL9s9oGU1+Hx/h5/KFqTfJykzh/1xjaHkedV9g0MASpdmPZIP+ynNhKAcEfA6g5i8KXwtoMA==}
dev: false
/@vueuse/router/9.3.0_u55wpvgoaskkfdnhr4v2vlugdi:
resolution: {integrity: sha512-UFN2MFciprH21oYsAgNHeDJ4Bd86HpRm9gximSN8j6h4fc2aa62fvfhprfHqdTxYAcgcGkMwcc9TO75jOvr8gg==}
peerDependencies:
vue-router: '>=4.0.0-rc.1'
dependencies:
'@vueuse/shared': 9.2.0_vue@3.2.39
'@vueuse/shared': 9.3.0_vue@3.2.39
vue-demi: 0.13.11_vue@3.2.39
vue-router: 4.1.5_vue@3.2.39
transitivePeerDependencies:
@@ -837,8 +883,8 @@ packages:
- vue
dev: false
/@vueuse/shared/9.2.0_vue@3.2.39:
resolution: {integrity: sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==}
/@vueuse/shared/9.3.0_vue@3.2.39:
resolution: {integrity: sha512-caGUWLY0DpPC6l31KxeUy6vPVNA0yKxx81jFYLoMpyP6cF84FG5Dkf69DfSUqL57wX8JcUkJDMnQaQIZPWFEQQ==}
dependencies:
vue-demi: 0.13.11_vue@3.2.39
transitivePeerDependencies:
@@ -2195,8 +2241,9 @@ packages:
/functions-have-names/1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
/fuzzysort/2.0.1:
resolution: {integrity: sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg==}
/fuse.js/6.6.2:
resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
engines: {node: '>=10'}
dev: false
/get-caller-file/2.0.5:
@@ -3969,8 +4016,8 @@ packages:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
/sass/1.54.9:
resolution: {integrity: sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==}
/sass/1.55.0:
resolution: {integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==}
engines: {node: '>=12.0.0'}
hasBin: true
dependencies:
@@ -4355,7 +4402,7 @@ packages:
punycode: 2.1.1
dev: true
/ts-node/10.9.1_bidgzm5cq2du6gnjtweqqjrrn4:
/ts-node/10.9.1_6zqjvw2hgekulz3zqkevhtb2gy:
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
peerDependencies:
@@ -4374,7 +4421,7 @@ packages:
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.3
'@types/node': 18.7.18
'@types/node': 18.7.22
acorn: 8.7.1
acorn-walk: 8.2.0
arg: 4.1.3
@@ -4445,7 +4492,7 @@ packages:
dependencies:
'@rollup/pluginutils': 4.2.1
escape-string-regexp: 5.0.0
fast-glob: 3.2.11
fast-glob: 3.2.12
local-pkg: 0.4.2
magic-string: 0.26.2
mlly: 0.5.13
@@ -4481,7 +4528,7 @@ packages:
engines: {node: '>= 0.8'}
dev: true
/unplugin-auto-import/0.11.2_ddncce744ormlo74xpe4fre3qq:
/unplugin-auto-import/0.11.2_2omhfktzjy2g6eniar2t4fuh44:
resolution: {integrity: sha512-1+VwBfn9dtiYv9SQLKP1AvZolUbK9xTVeAT+iOcEk4EHSFUlmIqBVLEKI76cifSQTLOJ3rZyPrEgptf3SZNLlQ==}
engines: {node: '>=14'}
peerDependencies:
@@ -4492,7 +4539,7 @@ packages:
dependencies:
'@antfu/utils': 0.5.2
'@rollup/pluginutils': 4.2.1
'@vueuse/core': 9.2.0_vue@3.2.39
'@vueuse/core': 9.3.0_vue@3.2.39
local-pkg: 0.4.2
magic-string: 0.26.2
unimport: 0.6.7_vite@3.1.3
@@ -4585,7 +4632,7 @@ packages:
dependencies:
acorn: 8.8.0
chokidar: 3.5.3
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
webpack-sources: 3.2.3
webpack-virtual-modules: 0.4.4
dev: false
@@ -4609,7 +4656,7 @@ packages:
dependencies:
acorn: 8.8.0
chokidar: 3.5.3
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
webpack-sources: 3.2.3
webpack-virtual-modules: 0.4.5
dev: false
@@ -4681,7 +4728,7 @@ packages:
json5: 2.2.1
local-pkg: 0.4.2
picocolors: 1.0.0
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
yaml: 2.1.1
transitivePeerDependencies:
- supports-color
@@ -4697,14 +4744,14 @@ packages:
'@vue/compiler-sfc': 3.2.39
debug: 4.3.4
fast-glob: 3.2.11
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
vue: 3.2.39
vue-router: 4.1.5_vue@3.2.39
transitivePeerDependencies:
- supports-color
dev: false
/vite/3.1.3_sass@1.54.9:
/vite/3.1.3_sass@1.55.0:
resolution: {integrity: sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -4727,11 +4774,11 @@ packages:
postcss: 8.4.16
resolve: 1.22.1
rollup: 2.78.1
sass: 1.54.9
sass: 1.55.0
optionalDependencies:
fsevents: 2.3.2
/vitest/0.23.4_jsdom@20.0.0+sass@1.54.9:
/vitest/0.23.4_jsdom@20.0.0+sass@1.55.0:
resolution: {integrity: sha512-iukBNWqQAv8EKDBUNntspLp9SfpaVFbmzmM0sNcnTxASQZMzRw3PsM6DMlsHiI+I6GeO5/sYDg3ecpC+SNFLrQ==}
engines: {node: '>=v14.16.0'}
hasBin: true
@@ -4755,7 +4802,7 @@ packages:
dependencies:
'@types/chai': 4.3.3
'@types/chai-subset': 1.3.3
'@types/node': 18.7.18
'@types/node': 18.7.22
chai: 4.3.6
debug: 4.3.4
jsdom: 20.0.0
@@ -4764,7 +4811,7 @@ packages:
tinybench: 2.1.5
tinypool: 0.3.0
tinyspy: 1.0.2
vite: 3.1.3_sass@1.54.9
vite: 3.1.3_sass@1.55.0
transitivePeerDependencies:
- less
- sass