Compare commits
No commits in common. "8c30daec150f1c47ad688da0338c30f3ac8a8052" and "bf71c6db0e4efde02951d7392594ae6fc5a03c92" have entirely different histories.
8c30daec15
...
bf71c6db0e
|
@ -2292,84 +2292,6 @@ func (b *browserService) DeleteKeys(server string, db int, ks []any, serialNo st
|
|||
return
|
||||
}
|
||||
|
||||
// DeleteKeysByPattern delete keys by pattern
|
||||
func (b *browserService) DeleteKeysByPattern(server string, db int, pattern string) (resp types.JSResp) {
|
||||
conf := Connection().getConnection(server)
|
||||
if conf == nil {
|
||||
resp.Msg = fmt.Sprintf("no connection profile named: %s", server)
|
||||
return
|
||||
}
|
||||
var client redis.UniversalClient
|
||||
var err error
|
||||
var connConfig = conf.ConnectionConfig
|
||||
connConfig.LastDB = db
|
||||
if client, err = b.createRedisClient(connConfig); err != nil {
|
||||
resp.Msg = err.Error()
|
||||
return
|
||||
}
|
||||
ctx, cancelFunc := context.WithCancel(b.ctx)
|
||||
defer client.Close()
|
||||
defer cancelFunc()
|
||||
|
||||
var ks []any
|
||||
ks, _, err = b.scanKeys(ctx, client, pattern, "", 0, 0)
|
||||
if err != nil {
|
||||
resp.Msg = err.Error()
|
||||
return
|
||||
}
|
||||
|
||||
total := len(ks)
|
||||
var canceled bool
|
||||
var deletedKeys = make([]any, 0, total)
|
||||
var mutex sync.Mutex
|
||||
del := func(ctx context.Context, cli redis.UniversalClient) error {
|
||||
const batchSize = 1000
|
||||
for i := 0; i < total; i += batchSize {
|
||||
pipe := cli.Pipeline()
|
||||
for j := 0; j < batchSize; j++ {
|
||||
if i+j < total {
|
||||
pipe.Del(ctx, strutil.DecodeRedisKey(ks[i+j]))
|
||||
}
|
||||
}
|
||||
cmders, delErr := pipe.Exec(ctx)
|
||||
for j, cmder := range cmders {
|
||||
if cmder.(*redis.IntCmd).Val() == 1 {
|
||||
// save deleted key
|
||||
mutex.Lock()
|
||||
deletedKeys = append(deletedKeys, ks[i+j])
|
||||
mutex.Unlock()
|
||||
}
|
||||
}
|
||||
if errors.Is(delErr, context.Canceled) || canceled {
|
||||
canceled = true
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if cluster, ok := client.(*redis.ClusterClient); ok {
|
||||
// cluster mode
|
||||
err = cluster.ForEachMaster(ctx, func(ctx context.Context, cli *redis.Client) error {
|
||||
return del(ctx, cli)
|
||||
})
|
||||
} else {
|
||||
err = del(ctx, client)
|
||||
}
|
||||
|
||||
resp.Success = true
|
||||
resp.Data = struct {
|
||||
Canceled bool `json:"canceled"`
|
||||
Deleted any `json:"deleted"`
|
||||
Failed int `json:"failed"`
|
||||
}{
|
||||
Canceled: canceled,
|
||||
Deleted: deletedKeys,
|
||||
Failed: len(ks) - len(deletedKeys),
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// ExportKey export keys
|
||||
func (b *browserService) ExportKey(server string, db int, ks []any, path string, includeExpire bool) (resp types.JSResp) {
|
||||
// connect a new connection to export keys
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,20 +14,20 @@
|
|||
"lodash": "^4.17.21",
|
||||
"monaco-editor": "^0.47.0",
|
||||
"pinia": "^2.1.7",
|
||||
"sass": "^1.77.5",
|
||||
"vue": "^3.4.29",
|
||||
"sass": "^1.77.2",
|
||||
"vue": "^3.4.27",
|
||||
"vue-chartjs": "^5.3.1",
|
||||
"vue-i18n": "^9.13.1",
|
||||
"xterm": "^5.3.0",
|
||||
"xterm-addon-fit": "^0.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-vue": "^5.0.5",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"naive-ui": "^2.38.2",
|
||||
"prettier": "^3.3.2",
|
||||
"prettier": "^3.2.5",
|
||||
"unplugin-auto-import": "^0.17.6",
|
||||
"unplugin-icons": "^0.19.0",
|
||||
"unplugin-vue-components": "^0.27.0",
|
||||
"vite": "^5.3.1"
|
||||
"vite": "^5.2.11"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
5e91e370b910c63446f418aca0c6e3a4
|
||||
76020c81d7419fcb32383b7b397a60c7
|
|
@ -43,7 +43,7 @@ const hasTooltip = computed(() => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<n-tooltip v-if="hasTooltip" :delay="tooltipDelay" :keep-alive-on-hover="false" :show-arrow="false">
|
||||
<n-tooltip v-if="hasTooltip" :delay="tooltipDelay" :show-arrow="false">
|
||||
<template #trigger>
|
||||
<n-button
|
||||
:class="props.buttonClass"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<script setup>
|
||||
import { computed, nextTick, reactive, ref, watchEffect } from 'vue'
|
||||
import useDialog from 'stores/dialog'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { isEmpty, map, size } from 'lodash'
|
||||
import useBrowserStore from 'stores/browser.js'
|
||||
import { decodeRedisKey } from '@/utils/key_convert.js'
|
||||
|
@ -13,7 +14,6 @@ const deleteForm = reactive({
|
|||
loadingAffected: false,
|
||||
affectedKeys: [],
|
||||
async: true,
|
||||
direct: false,
|
||||
})
|
||||
|
||||
const dialogStore = useDialog()
|
||||
|
@ -68,6 +68,7 @@ const keyLines = computed(() => {
|
|||
return map(deleteForm.affectedKeys, (k) => decodeRedisKey(k))
|
||||
})
|
||||
|
||||
const i18n = useI18n()
|
||||
const onConfirmDelete = async () => {
|
||||
try {
|
||||
deleting.value = true
|
||||
|
@ -83,21 +84,6 @@ const onConfirmDelete = async () => {
|
|||
dialogStore.closeDeleteKeyDialog()
|
||||
}
|
||||
|
||||
const onConfirmDirectDelete = async () => {
|
||||
try {
|
||||
deleting.value = true
|
||||
const { server, db, key } = deleteForm
|
||||
await nextTick()
|
||||
browserStore.deleteByPattern(server, db, key).catch((e) => {})
|
||||
} catch (e) {
|
||||
$message.error(e.message)
|
||||
return
|
||||
} finally {
|
||||
deleting.value = false
|
||||
}
|
||||
dialogStore.closeDeleteKeyDialog()
|
||||
}
|
||||
|
||||
const onClose = () => {
|
||||
dialogStore.closeDeleteKeyDialog()
|
||||
}
|
||||
|
@ -130,9 +116,9 @@ const onClose = () => {
|
|||
required>
|
||||
<n-input v-model:value="deleteForm.key" placeholder="" @input="resetAffected" />
|
||||
</n-form-item>
|
||||
<n-checkbox v-model:checked="deleteForm.direct">
|
||||
{{ $t('dialogue.key.direct_delete') }}
|
||||
</n-checkbox>
|
||||
<!-- <n-checkbox v-model:checked="deleteForm.async">-->
|
||||
<!-- {{ $t('dialogue.key.silent') }}-->
|
||||
<!-- </n-checkbox>-->
|
||||
<n-card
|
||||
v-if="deleteForm.showAffected"
|
||||
:title="$t('dialogue.key.affected_key') + `(${size(deleteForm.affectedKeys)})`"
|
||||
|
@ -154,32 +140,22 @@ const onClose = () => {
|
|||
<div class="flex-item n-dialog__action">
|
||||
<n-button :disabled="loading" :focusable="false" @click="onClose">{{ $t('common.cancel') }}</n-button>
|
||||
<n-button
|
||||
v-if="deleteForm.direct"
|
||||
v-if="!deleteForm.showAffected"
|
||||
:focusable="false"
|
||||
:loading="loading"
|
||||
type="primary"
|
||||
@click="onConfirmDirectDelete">
|
||||
{{ $t('dialogue.key.confirm_delete') }}
|
||||
@click="scanAffectedKey">
|
||||
{{ $t('dialogue.key.show_affected_key') }}
|
||||
</n-button>
|
||||
<n-button
|
||||
v-else
|
||||
:disabled="isEmpty(deleteForm.affectedKeys)"
|
||||
:focusable="false"
|
||||
:loading="loading"
|
||||
type="primary"
|
||||
@click="onConfirmDelete">
|
||||
{{ $t('dialogue.key.confirm_delete_key', { num: size(deleteForm.affectedKeys) }) }}
|
||||
</n-button>
|
||||
<template v-else>
|
||||
<n-button
|
||||
v-if="!deleteForm.showAffected"
|
||||
:focusable="false"
|
||||
:loading="loading"
|
||||
type="primary"
|
||||
@click="scanAffectedKey">
|
||||
{{ $t('dialogue.key.show_affected_key') }}
|
||||
</n-button>
|
||||
<n-button
|
||||
v-else
|
||||
:disabled="isEmpty(deleteForm.affectedKeys)"
|
||||
:focusable="false"
|
||||
:loading="loading"
|
||||
type="primary"
|
||||
@click="onConfirmDelete">
|
||||
{{ $t('dialogue.key.confirm_delete_key', { num: size(deleteForm.affectedKeys) }) }}
|
||||
</n-button>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</n-modal>
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "Affected Keys",
|
||||
"show_affected_key": "Show Affected Keys",
|
||||
"confirm_delete_key": "Confirm delete {num} key(s)",
|
||||
"direct_delete": "Delete match pattern directly",
|
||||
"confirm_delete": "Confirm Delete",
|
||||
"async_delete": "Async Execution",
|
||||
"async_delete_title": "Don't wait for result",
|
||||
"confirm_flush": "I know what I'm doing!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "Claves afectadas",
|
||||
"show_affected_key": "Mostrar claves afectadas",
|
||||
"confirm_delete_key": "Confirmar eliminar {num} clave(s)",
|
||||
"direct_delete": "Eliminar el patrón coincidente directamente",
|
||||
"confirm_delete": "Confirmar eliminación",
|
||||
"async_delete": "Ejecución asíncrona",
|
||||
"async_delete_title": "No esperar el resultado",
|
||||
"confirm_flush": "¡Sé lo que estoy haciendo!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "Clés affectées",
|
||||
"show_affected_key": "Afficher les clés affectées",
|
||||
"confirm_delete_key": "Confirmer la suppression de {num} clé(s)",
|
||||
"direct_delete": "Supprimer le modèle correspondant directement",
|
||||
"confirm_delete": "Confirmer la suppression",
|
||||
"async_delete": "Exécution asynchrone",
|
||||
"async_delete_title": "Ne pas attendre le résultat",
|
||||
"confirm_flush": "Je sais ce que je fais !",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "影響を受けるキー",
|
||||
"show_affected_key": "影響を受けるキーを表示",
|
||||
"confirm_delete_key": "{num}個のキーを削除することを確認",
|
||||
"direct_delete": "一致するパターンを直接削除",
|
||||
"confirm_delete": "削除を確認",
|
||||
"async_delete": "非同期実行",
|
||||
"async_delete_title": "結果を待たない",
|
||||
"confirm_flush": "自分が実行しようとしている操作を理解しています!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "영향받는 키",
|
||||
"show_affected_key": "영향받는 키 표시",
|
||||
"confirm_delete_key": "{num}개의 키를 삭제하시겠습니까?",
|
||||
"direct_delete": "일치하는 패턴 직접 삭제",
|
||||
"confirm_delete": "삭제 확인",
|
||||
"async_delete": "비동기 실행",
|
||||
"async_delete_title": "결과를 기다리지 않음",
|
||||
"confirm_flush": "진행 중인 작업을 알고 있습니다!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "Chaves Afetadas",
|
||||
"show_affected_key": "Mostrar Chaves Afetadas",
|
||||
"confirm_delete_key": "Confirmar Exclusão de {num} Chave(s)",
|
||||
"direct_delete": "Excluir padrão correspondente diretamente",
|
||||
"confirm_delete": "Confirmar exclusão",
|
||||
"async_delete": "Execução Assíncrona",
|
||||
"async_delete_title": "Não esperar pelo resultado da operação",
|
||||
"confirm_flush": "Eu sei o que estou fazendo!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "Затронутые ключи",
|
||||
"show_affected_key": "Показать затронутые ключи",
|
||||
"confirm_delete_key": "Подтвердить удаление {num} ключ(ей/ей)",
|
||||
"direct_delete": "Удалить совпадающий шаблон напрямую",
|
||||
"confirm_delete": "Подтвердить удаление",
|
||||
"async_delete": "Асинхронное выполнение",
|
||||
"async_delete_title": "Не ждать результата",
|
||||
"confirm_flush": "Я знаю, что делаю!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "受影响的键名",
|
||||
"show_affected_key": "查看受影响的键名",
|
||||
"confirm_delete_key": "确认删除{num}个键",
|
||||
"direct_delete": "直接匹配删除",
|
||||
"confirm_delete": "确认删除",
|
||||
"async_delete": "异步执行",
|
||||
"async_delete_title": "不等待操作结果",
|
||||
"confirm_flush": "我知道我正在执行的操作!",
|
||||
|
|
|
@ -296,8 +296,6 @@
|
|||
"affected_key": "受影響的鍵名",
|
||||
"show_affected_key": "檢視受影響的鍵名",
|
||||
"confirm_delete_key": "確認刪除{num}個鍵",
|
||||
"direct_delete": "直接匹配刪除",
|
||||
"confirm_delete": "確認刪除",
|
||||
"async_delete": "異步執行",
|
||||
"async_delete_title": "不等待操作結果",
|
||||
"confirm_flush": "我知道我正在執行的操作!",
|
||||
|
|
|
@ -11,7 +11,6 @@ import {
|
|||
ConvertValue,
|
||||
DeleteKey,
|
||||
DeleteKeys,
|
||||
DeleteKeysByPattern,
|
||||
ExportKey,
|
||||
FlushDB,
|
||||
GetClientList,
|
||||
|
@ -1775,66 +1774,6 @@ const useBrowserStore = defineStore('browser', {
|
|||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* delete multiple keys by pattern
|
||||
* @param server
|
||||
* @param db
|
||||
* @param pattern
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
async deleteByPattern(server, db, pattern) {
|
||||
const msgRef = $message.loading(i18nGlobal.t('dialogue.delete.deleting'), { duration: 0, closable: true })
|
||||
let deleted = []
|
||||
let failCount = 0
|
||||
let canceled = false
|
||||
try {
|
||||
const { success, msg, data } = await DeleteKeysByPattern(server, db, pattern)
|
||||
if (success) {
|
||||
canceled = get(data, 'canceled', false)
|
||||
deleted = get(data, 'deleted', [])
|
||||
failCount = get(data, 'failed', 0)
|
||||
} else {
|
||||
$message.error(msg)
|
||||
}
|
||||
} finally {
|
||||
msgRef.destroy()
|
||||
// clear checked keys
|
||||
const tab = useTabStore()
|
||||
tab.setCheckedKeys(server)
|
||||
}
|
||||
// refresh model data
|
||||
const deletedCount = size(deleted)
|
||||
if (canceled) {
|
||||
$message.info(i18nGlobal.t('dialogue.handle_cancel'))
|
||||
} else if (failCount <= 0) {
|
||||
// no fail
|
||||
$message.success(i18nGlobal.t('dialogue.delete.completed', { success: deletedCount, fail: failCount }))
|
||||
} else if (failCount >= deletedCount) {
|
||||
// all fail
|
||||
$message.error(i18nGlobal.t('dialogue.delete.completed', { success: deletedCount, fail: failCount }))
|
||||
} else {
|
||||
// some fail
|
||||
$message.warning(i18nGlobal.t('dialogue.delete.completed', { success: deletedCount, fail: failCount }))
|
||||
}
|
||||
// update ui
|
||||
timeout(100).then(async () => {
|
||||
/** @type RedisServerState **/
|
||||
const serverInst = this.servers[server]
|
||||
if (serverInst != null) {
|
||||
let start = now()
|
||||
for (let i = 0; i < deleted.length; i++) {
|
||||
serverInst.removeKeyNode(deleted[i], false)
|
||||
if (now() - start > 300) {
|
||||
await timeout(100)
|
||||
start = now()
|
||||
}
|
||||
}
|
||||
serverInst.tidyNode('', true)
|
||||
serverInst.updateDBKeyCount(db, -deletedCount)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* export multiple keys
|
||||
* @param {string} server
|
||||
|
|
17
go.mod
17
go.mod
|
@ -6,13 +6,13 @@ require (
|
|||
github.com/adrg/sysfont v0.1.2
|
||||
github.com/andybalholm/brotli v1.1.0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/klauspost/compress v1.17.9
|
||||
github.com/redis/go-redis/v9 v9.5.3
|
||||
github.com/klauspost/compress v1.17.8
|
||||
github.com/redis/go-redis/v9 v9.5.1
|
||||
github.com/vmihailenco/msgpack/v5 v5.4.1
|
||||
github.com/vrischmann/userdir v0.0.0-20151206171402-20f291cebd68
|
||||
github.com/wailsapp/wails/v2 v2.9.0
|
||||
golang.org/x/crypto v0.24.0
|
||||
golang.org/x/net v0.26.0
|
||||
github.com/wailsapp/wails/v2 v2.8.2
|
||||
golang.org/x/crypto v0.23.0
|
||||
golang.org/x/net v0.25.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
|
@ -45,10 +45,9 @@ require (
|
|||
github.com/wailsapp/go-webview2 v1.0.10 // indirect
|
||||
github.com/wailsapp/mimetype v1.4.1 // indirect
|
||||
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect
|
||||
golang.org/x/sys v0.21.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/text v0.15.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
)
|
||||
|
||||
// install latest wails: go install github.com/wailsapp/wails/v2/cmd/wails@latest
|
||||
// replace github.com/wailsapp/wails/v2 v2.9.0 => ~/go/pkg/mod
|
||||
// replace github.com/wailsapp/wails/v2 v2.8.2 => ~/go/pkg/mod
|
||||
|
|
32
go.sum
32
go.sum
|
@ -30,8 +30,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=
|
||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
|
@ -66,8 +66,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU=
|
||||
github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
||||
github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=
|
||||
github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
|
@ -98,15 +98,15 @@ github.com/wailsapp/go-webview2 v1.0.10 h1:PP5Hug6pnQEAhfRzLCoOh2jJaPdrqeRgJKZhy
|
|||
github.com/wailsapp/go-webview2 v1.0.10/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo=
|
||||
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
|
||||
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
|
||||
github.com/wailsapp/wails/v2 v2.9.0 h1:YAyMwj9WoW0cvvnOkcHCXwZ1AtSI7UYsHp20WyituzQ=
|
||||
github.com/wailsapp/wails/v2 v2.9.0/go.mod h1:7maJV2h+Egl11Ak8QZN/jlGLj2wg05bsQS+ywJPT0gI=
|
||||
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
|
||||
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
|
||||
github.com/wailsapp/wails/v2 v2.8.2 h1:rYOn9p+7bJiZuFSi2wDyq8rBLHrIX/FoUxov+RpdUOI=
|
||||
github.com/wailsapp/wails/v2 v2.8.2/go.mod h1:5pTURIST4yZ/wRcmqDUtnM0Mk+caNax/oS610hFiy74=
|
||||
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo=
|
||||
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
|
||||
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
|
||||
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -114,14 +114,14 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
|
||||
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
|
||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
|
|
Loading…
Reference in New Issue