Compare commits
32 Commits
Author | SHA1 | Date |
---|---|---|
|
3860415429 | |
|
dec906a69b | |
|
118b9b8870 | |
|
864bd74029 | |
|
aedf4d4222 | |
|
a4d7c598f9 | |
|
480e4cc7fd | |
|
1016df4a25 | |
|
46d7ba2a9f | |
|
19c8368dff | |
|
1c322fdac5 | |
|
53e8c26380 | |
|
400a908cf9 | |
|
edd77182a5 | |
|
6e44c64441 | |
|
51beb7249f | |
|
79fd2a6d39 | |
|
30c3decd65 | |
|
23fc32e92f | |
|
f458a1a0e4 | |
|
52aaad6339 | |
|
dd70d6b595 | |
|
5d425aadb1 | |
|
c02a24ee94 | |
|
e03fc8ad28 | |
|
3367f13d80 | |
|
b601ba255b | |
|
ccb4bb85ae | |
|
b0dfe348bd | |
|
a3a1a17af3 | |
|
ca9f0a08e1 | |
|
3f5b63a36f |
|
@ -105,6 +105,7 @@ jobs:
|
|||
-ldflags "-X main.version=v${{ steps.normalise_version.outputs.version }}"
|
||||
|
||||
- name: Codesign Windows NSIS installer
|
||||
shell: powershell
|
||||
working-directory: ./build/bin
|
||||
run: |
|
||||
echo "Creating certificate file"
|
||||
|
@ -112,7 +113,7 @@ jobs:
|
|||
Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}'
|
||||
certutil -decode certificate\certificate.txt certificate\certificate.pfx
|
||||
echo "Signing TinyRDM installer"
|
||||
& 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' TinyRDM-${{ steps.normalise_platform_name.outputs.pname }}-installer.exe
|
||||
& 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://timestamp.digicert.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' TinyRDM-${{ steps.normalise_platform_name.outputs.pname }}-installer.exe
|
||||
|
||||
- name: Rename installer
|
||||
working-directory: ./build/bin
|
||||
|
|
|
@ -876,7 +876,8 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
|
|||
continue
|
||||
}
|
||||
items = append(items, types.ListEntryItem{
|
||||
Value: val,
|
||||
Index: len(items),
|
||||
Value: strutil.EncodeRedisKey(val),
|
||||
})
|
||||
if doConvert {
|
||||
if dv, _, _ := convutil.ConvertTo(val, param.Decode, param.Format, decoder); dv != val {
|
||||
|
@ -993,7 +994,7 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
|
|||
}
|
||||
for _, val := range loadedKey {
|
||||
items = append(items, types.SetEntryItem{
|
||||
Value: val,
|
||||
Value: strutil.EncodeRedisKey(val),
|
||||
})
|
||||
if doConvert {
|
||||
if dv, _, _ := convutil.ConvertTo(val, param.Decode, param.Format, decoder); dv != val {
|
||||
|
@ -1014,7 +1015,7 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
|
|||
loadedKey, cursor, subErr = client.SScan(ctx, key, cursor, matchPattern, scanSize).Result()
|
||||
items = make([]types.SetEntryItem, len(loadedKey))
|
||||
for i, val := range loadedKey {
|
||||
items[i].Value = val
|
||||
items[i].Value = strutil.EncodeRedisKey(val)
|
||||
if doConvert {
|
||||
if dv, _, _ := convutil.ConvertTo(val, param.Decode, param.Format, decoder); dv != val {
|
||||
items[i].DisplayValue = dv
|
||||
|
@ -1060,7 +1061,7 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
|
|||
for i := 0; i < len(loadedVal); i += 2 {
|
||||
if score, err = strconv.ParseFloat(loadedVal[i+1], 64); err == nil {
|
||||
items = append(items, types.ZSetEntryItem{
|
||||
Value: loadedVal[i],
|
||||
Value: strutil.EncodeRedisKey(loadedVal[i]),
|
||||
Score: score,
|
||||
})
|
||||
if doConvert {
|
||||
|
@ -1094,7 +1095,7 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
|
|||
continue
|
||||
}
|
||||
entry := types.ZSetEntryItem{
|
||||
Value: val,
|
||||
Value: strutil.EncodeRedisKey(val),
|
||||
}
|
||||
if math.IsInf(z.Score, 1) {
|
||||
entry.ScoreStr = "+inf"
|
||||
|
@ -1614,10 +1615,11 @@ func (b *browserService) SetListItem(param types.SetListParam) (resp types.JSRes
|
|||
client, ctx := item.client, item.ctx
|
||||
key := strutil.DecodeRedisKey(param.Key)
|
||||
str := strutil.DecodeRedisKey(param.Value)
|
||||
index := int64(param.Index)
|
||||
var replaced, removed []types.ListReplaceItem
|
||||
if len(str) <= 0 {
|
||||
// remove from list
|
||||
err = client.LSet(ctx, key, param.Index, "---VALUE_REMOVED_BY_TINY_RDM---").Err()
|
||||
err = client.LSet(ctx, key, index, "---VALUE_REMOVED_BY_TINY_RDM---").Err()
|
||||
if err != nil {
|
||||
resp.Msg = err.Error()
|
||||
return
|
||||
|
@ -1639,7 +1641,7 @@ func (b *browserService) SetListItem(param types.SetListParam) (resp types.JSRes
|
|||
resp.Msg = fmt.Sprintf(`save to type "%s" fail: %s`, param.Format, err.Error())
|
||||
return
|
||||
}
|
||||
err = client.LSet(ctx, key, param.Index, saveStr).Err()
|
||||
err = client.LSet(ctx, key, index, saveStr).Err()
|
||||
if err != nil {
|
||||
resp.Msg = err.Error()
|
||||
return
|
||||
|
|
|
@ -226,6 +226,10 @@ func (c *connectionService) createRedisClient(config types.ConnectionConfig) (re
|
|||
option.Addr = net.JoinHostPort(addr[0], addr[1])
|
||||
option.Username = config.Sentinel.Username
|
||||
option.Password = config.Sentinel.Password
|
||||
if option.Dialer != nil {
|
||||
option.ReadTimeout = -2
|
||||
option.WriteTimeout = -2
|
||||
}
|
||||
}
|
||||
|
||||
if config.LastDB > 0 {
|
||||
|
|
|
@ -138,6 +138,7 @@ func (c *monitorService) StopMonitor(server string) (resp types.JSResp) {
|
|||
}
|
||||
|
||||
//close(item.ch)
|
||||
item.client.Close()
|
||||
close(item.closeCh)
|
||||
delete(c.items, server)
|
||||
resp.Success = true
|
||||
|
|
|
@ -222,22 +222,31 @@ func (p *preferencesService) GetDecoder() []convutil.CmdConvert {
|
|||
})
|
||||
}
|
||||
|
||||
type latestRelease struct {
|
||||
Name string `json:"name"`
|
||||
TagName string `json:"tag_name"`
|
||||
Url string `json:"url"`
|
||||
HtmlUrl string `json:"html_url"`
|
||||
type sponsorItem struct {
|
||||
Name string `json:"name"`
|
||||
Link string `json:"link"`
|
||||
Region []string `json:"region"`
|
||||
}
|
||||
|
||||
type upgradeInfo struct {
|
||||
Version string `json:"version"`
|
||||
Changelog map[string]string `json:"changelog"`
|
||||
Description map[string]string `json:"description"`
|
||||
DownloadURl map[string]string `json:"download_url"`
|
||||
DownloadPage map[string]string `json:"download_page"`
|
||||
Sponsor []sponsorItem `json:"sponsor,omitempty"`
|
||||
}
|
||||
|
||||
func (p *preferencesService) CheckForUpdate() (resp types.JSResp) {
|
||||
// request latest version
|
||||
res, err := http.Get("https://api.github.com/repos/tiny-craft/tiny-rdm/releases/latest")
|
||||
//res, err := http.Get("https://api.github.com/repos/tiny-craft/tiny-rdm/releases/latest")
|
||||
res, err := http.Get("https://redis.tinycraft.cc/client_version.json")
|
||||
if err != nil || res.StatusCode != http.StatusOK {
|
||||
resp.Msg = "network error"
|
||||
return
|
||||
}
|
||||
|
||||
var respObj latestRelease
|
||||
var respObj upgradeInfo
|
||||
err = json.NewDecoder(res.Body).Decode(&respObj)
|
||||
if err != nil {
|
||||
resp.Msg = "invalid content"
|
||||
|
@ -247,9 +256,11 @@ func (p *preferencesService) CheckForUpdate() (resp types.JSResp) {
|
|||
// compare with current version
|
||||
resp.Success = true
|
||||
resp.Data = map[string]any{
|
||||
"version": p.clientVersion,
|
||||
"latest": respObj.TagName,
|
||||
"page_url": respObj.HtmlUrl,
|
||||
"version": p.clientVersion,
|
||||
"latest": respObj.Version,
|
||||
"description": respObj.Description,
|
||||
"download_page": respObj.DownloadPage,
|
||||
"sponsor": respObj.Sponsor,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ type SetListParam struct {
|
|||
Server string `json:"server"`
|
||||
DB int `json:"db"`
|
||||
Key any `json:"key"`
|
||||
Index int64 `json:"index"`
|
||||
Index int `json:"index"`
|
||||
Value any `json:"value"`
|
||||
Format string `json:"format,omitempty"`
|
||||
Decode string `json:"decode,omitempty"`
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package types
|
||||
|
||||
type ListEntryItem struct {
|
||||
Index int `json:"index"`
|
||||
Value any `json:"v"`
|
||||
DisplayValue string `json:"dv,omitempty"`
|
||||
}
|
||||
|
||||
type ListReplaceItem struct {
|
||||
Index int64 `json:"index"`
|
||||
Index int `json:"index"`
|
||||
Value any `json:"v,omitempty"`
|
||||
DisplayValue string `json:"dv,omitempty"`
|
||||
}
|
||||
|
@ -32,7 +33,7 @@ type SetEntryItem struct {
|
|||
type ZSetEntryItem struct {
|
||||
Score float64 `json:"s"`
|
||||
ScoreStr string `json:"ss,omitempty"`
|
||||
Value string `json:"v"`
|
||||
Value any `json:"v"`
|
||||
DisplayValue string `json:"dv,omitempty"`
|
||||
}
|
||||
|
||||
|
|
|
@ -11,9 +11,12 @@ func (MsgpackConvert) Enable() bool {
|
|||
return true
|
||||
}
|
||||
|
||||
func (MsgpackConvert) Encode(str string) (string, bool) {
|
||||
func (c MsgpackConvert) Encode(str string) (string, bool) {
|
||||
var obj map[string]any
|
||||
if err := json.Unmarshal([]byte(str), &obj); err == nil {
|
||||
for k, v := range obj {
|
||||
obj[k] = c.TryFloatToInt(v)
|
||||
}
|
||||
if b, err := msgpack.Marshal(obj); err == nil {
|
||||
return string(b), true
|
||||
}
|
||||
|
@ -43,3 +46,25 @@ func (MsgpackConvert) Decode(str string) (string, bool) {
|
|||
|
||||
return str, false
|
||||
}
|
||||
|
||||
func (c MsgpackConvert) TryFloatToInt(input any) any {
|
||||
switch val := input.(type) {
|
||||
case map[string]any:
|
||||
for k, v := range val {
|
||||
val[k] = c.TryFloatToInt(v)
|
||||
}
|
||||
return val
|
||||
case []any:
|
||||
for i, v := range val {
|
||||
val[i] = c.TryFloatToInt(v)
|
||||
}
|
||||
return val
|
||||
case float64:
|
||||
if val == float64(int(val)) {
|
||||
return int(val)
|
||||
}
|
||||
return val
|
||||
default:
|
||||
return val
|
||||
}
|
||||
}
|
||||
|
|
|
@ -107,27 +107,6 @@ func Merge[M ~map[K]V, K Hashable, V any](mapArr ...M) M {
|
|||
return result
|
||||
}
|
||||
|
||||
// DeepMerge 深度递归覆盖src值到dst中
|
||||
// 将返回新的值
|
||||
func DeepMerge[M ~map[K]any, K Hashable](src1, src2 M) M {
|
||||
out := make(map[K]any, len(src1))
|
||||
for k, v := range src1 {
|
||||
out[k] = v
|
||||
}
|
||||
for k, v := range src2 {
|
||||
if v1, ok := v.(map[K]any); ok {
|
||||
if bv, ok := out[k]; ok {
|
||||
if bv1, ok := bv.(map[K]any); ok {
|
||||
out[k] = DeepMerge(bv1, v1)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
out[k] = v
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// Omit 根据条件省略指定元素
|
||||
func Omit[M ~map[K]V, K Hashable, V any](m M, omitFunc func(k K, v V) bool) (M, []K) {
|
||||
result := M{}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -9,26 +9,26 @@
|
|||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"chart.js": "^4.4.4",
|
||||
"chart.js": "^4.4.8",
|
||||
"copy-text-to-clipboard": "^3.2.0",
|
||||
"dayjs": "^1.11.13",
|
||||
"lodash": "^4.17.21",
|
||||
"monaco-editor": "^0.47.0",
|
||||
"pinia": "^2.2.2",
|
||||
"sass": "^1.79.4",
|
||||
"vue": "^3.5.10",
|
||||
"vue-chartjs": "^5.3.1",
|
||||
"vue-i18n": "^9.14.1",
|
||||
"pinia": "^3.0.1",
|
||||
"sass": "^1.85.1",
|
||||
"vue": "^3.5.13",
|
||||
"vue-chartjs": "^5.3.2",
|
||||
"vue-i18n": "^11.1.2",
|
||||
"xterm": "^5.3.0",
|
||||
"xterm-addon-fit": "^0.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-vue": "^5.1.4",
|
||||
"naive-ui": "^2.40.1",
|
||||
"prettier": "^3.3.3",
|
||||
"unplugin-auto-import": "^0.18.3",
|
||||
"unplugin-icons": "^0.19.3",
|
||||
"unplugin-vue-components": "^0.27.4",
|
||||
"vite": "^5.4.8"
|
||||
"@vitejs/plugin-vue": "^5.2.1",
|
||||
"naive-ui": "^2.41.0",
|
||||
"prettier": "^3.5.3",
|
||||
"unplugin-auto-import": "^19.1.1",
|
||||
"unplugin-icons": "^22.1.0",
|
||||
"unplugin-vue-components": "^28.4.1",
|
||||
"vite": "^6.2.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
2f0a4f74673fd665e9ccdd7a172a2118
|
||||
47ebcfd89e9e219e5b4ccf43ca2aa197
|
|
@ -12,6 +12,10 @@ const props = defineProps({
|
|||
},
|
||||
icons: Array,
|
||||
tTooltips: Array,
|
||||
tTooltipPlacement: {
|
||||
type: String,
|
||||
default: 'bottom',
|
||||
},
|
||||
iconSize: {
|
||||
type: [Number, String],
|
||||
default: 20,
|
||||
|
@ -45,6 +49,7 @@ const handleSwitch = (idx) => {
|
|||
v-for="(icon, i) in props.icons"
|
||||
:key="i"
|
||||
:disabled="!(props.tTooltips && props.tTooltips[i])"
|
||||
:placement="props.tTooltipPlacement"
|
||||
:show-arrow="false">
|
||||
<template #trigger>
|
||||
<n-button :focusable="false" :size="props.size" :tertiary="i !== props.value" @click="handleSwitch(i)">
|
||||
|
|
|
@ -168,5 +168,5 @@ defineExpose({
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
</style>
|
||||
|
|
|
@ -70,7 +70,7 @@ const isBlankValue = computed(() => {
|
|||
})
|
||||
|
||||
const selectedSubTab = computed(() => {
|
||||
const { subTab = 'status' } = tabStore.currentTab || {}
|
||||
const { subTab = BrowserTabType.Status } = tabStore.currentTab || {}
|
||||
return subTab
|
||||
})
|
||||
|
||||
|
@ -104,7 +104,7 @@ watch(
|
|||
}"
|
||||
:value="selectedSubTab"
|
||||
class="content-sub-tab"
|
||||
default-value="status"
|
||||
:default-value="BrowserTabType.Status.toString()"
|
||||
pane-class="content-sub-tab-pane"
|
||||
placement="top"
|
||||
tab-style="padding-left: 10px; padding-right: 10px;"
|
||||
|
@ -212,7 +212,7 @@ watch(
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.content-container {
|
||||
//padding: 5px 5px 0;
|
||||
|
|
|
@ -1,8 +1,32 @@
|
|||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
import AddLink from '@/components/icons/AddLink.vue'
|
||||
import useDialogStore from 'stores/dialog.js'
|
||||
import { NButton, useThemeVars } from 'naive-ui'
|
||||
import { BrowserOpenURL } from 'wailsjs/runtime/runtime.js'
|
||||
import { find, includes, isEmpty } from 'lodash'
|
||||
import usePreferencesStore from 'stores/preferences.js'
|
||||
|
||||
const themeVars = useThemeVars()
|
||||
const dialogStore = useDialogStore()
|
||||
const prefStore = usePreferencesStore()
|
||||
|
||||
const onOpenSponsor = (link) => {
|
||||
BrowserOpenURL(link)
|
||||
}
|
||||
|
||||
const sponsorAd = computed(() => {
|
||||
try {
|
||||
const content = localStorage.getItem('sponsor_ad')
|
||||
const ads = JSON.parse(content)
|
||||
const ad = find(ads, ({ region }) => {
|
||||
return isEmpty(region) || includes(region, prefStore.currentLanguage)
|
||||
})
|
||||
return ad || null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -18,16 +42,27 @@ const dialogStore = useDialogStore()
|
|||
</n-button>
|
||||
</template>
|
||||
</n-empty>
|
||||
|
||||
<n-button v-if="sponsorAd != null" class="sponsor-ad" style="" text @click="onOpenSponsor(sponsorAd.link)">
|
||||
{{ sponsorAd.name }}
|
||||
</n-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.content-container {
|
||||
justify-content: center;
|
||||
padding: 5px;
|
||||
box-sizing: border-box;
|
||||
|
||||
& > .sponsor-ad {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
vertical-align: bottom;
|
||||
color: v-bind('themeVars.textColor3');
|
||||
}
|
||||
}
|
||||
|
||||
.color-preset-item {
|
||||
|
|
|
@ -23,7 +23,7 @@ const props = defineProps({
|
|||
type: [String, Number],
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
type: [String, Array],
|
||||
},
|
||||
fieldLabel: {
|
||||
type: String,
|
||||
|
|
|
@ -181,7 +181,7 @@ const onCleanLog = () => {
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.line-item {
|
||||
margin-bottom: 5px;
|
||||
|
|
|
@ -281,7 +281,7 @@ const onPublish = async () => {
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.total-message {
|
||||
margin: 10px 0 0;
|
||||
|
|
|
@ -776,7 +776,7 @@ const clientTableColumns = computed(() => {
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.line-chart {
|
||||
display: flex;
|
||||
|
|
|
@ -222,5 +222,5 @@ const onListLimitChanged = (limit) => {
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
</style>
|
||||
|
|
|
@ -15,7 +15,7 @@ import IconButton from '@/components/common/IconButton.vue'
|
|||
import ContentEntryEditor from '@/components/content_value/ContentEntryEditor.vue'
|
||||
import Edit from '@/components/icons/Edit.vue'
|
||||
import FormatSelector from '@/components/content_value/FormatSelector.vue'
|
||||
import { decodeRedisKey } from '@/utils/key_convert.js'
|
||||
import { decodeRedisKey, nativeRedisKey } from '@/utils/key_convert.js'
|
||||
import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue'
|
||||
import { formatBytes } from '@/utils/byte_convert.js'
|
||||
import copy from 'copy-text-to-clipboard'
|
||||
|
@ -40,7 +40,7 @@ const props = defineProps({
|
|||
default: -1,
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
type: [String, Array],
|
||||
default: () => [],
|
||||
},
|
||||
size: Number,
|
||||
|
@ -140,13 +140,14 @@ const valueColumn = computed(() => ({
|
|||
// return !!~row.v.indexOf(value.toString())
|
||||
// },
|
||||
render: (row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
if (isCode.value) {
|
||||
return h('pre', { class: 'pre-wrap' }, row.dv || row.v)
|
||||
return h('pre', { class: 'pre-wrap' }, val)
|
||||
}
|
||||
if (row.rm === true) {
|
||||
return h('s', {}, row.dv || row.v)
|
||||
return h('s', {}, val)
|
||||
}
|
||||
return row.dv || row.v
|
||||
return val
|
||||
},
|
||||
}))
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import { TextAlignType } from '@/consts/text_align_type.js'
|
|||
import AlignLeft from '@/components/icons/AlignLeft.vue'
|
||||
import AlignCenter from '@/components/icons/AlignCenter.vue'
|
||||
import SwitchButton from '@/components/common/SwitchButton.vue'
|
||||
import { nativeRedisKey } from '@/utils/key_convert.js'
|
||||
|
||||
const i18n = useI18n()
|
||||
const themeVars = useThemeVars()
|
||||
|
@ -105,17 +106,16 @@ const valueColumn = computed(() => ({
|
|||
},
|
||||
filterOptionValue: valueFilterOption.value,
|
||||
className: inEdit.value ? 'clickable' : '',
|
||||
filter: (value, row) => {
|
||||
if (row.dv) {
|
||||
return !!~row.dv.indexOf(value.toString())
|
||||
}
|
||||
return !!~row.v.indexOf(value.toString())
|
||||
filter: (filterValue, row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
return !!~val.indexOf(filterValue.toString())
|
||||
},
|
||||
render: (row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
if (isCode.value) {
|
||||
return h('pre', { class: 'pre-wrap' }, row.dv || row.v)
|
||||
return h('pre', { class: 'pre-wrap' }, val)
|
||||
}
|
||||
return row.dv || row.v
|
||||
return val
|
||||
},
|
||||
}))
|
||||
|
||||
|
@ -150,7 +150,7 @@ const saveEdit = async (pos, value, decode, format) => {
|
|||
server: props.name,
|
||||
db: props.db,
|
||||
key: keyName.value,
|
||||
index,
|
||||
index: row.index,
|
||||
value,
|
||||
decode,
|
||||
format,
|
||||
|
@ -180,16 +180,16 @@ const actionColumn = {
|
|||
align: 'center',
|
||||
titleAlign: 'center',
|
||||
fixed: 'right',
|
||||
render: (row, index) => {
|
||||
render: ({ index, v }, _) => {
|
||||
return h(EditableTableColumn, {
|
||||
editing: false,
|
||||
bindKey: `#${index + 1}`,
|
||||
onCopy: async () => {
|
||||
copy(row.v)
|
||||
copy(v)
|
||||
$message.success(i18n.t('interface.copy_succ'))
|
||||
},
|
||||
onEdit: () => {
|
||||
startEdit(index + 1, row.v)
|
||||
startEdit(index + 1, v)
|
||||
},
|
||||
onDelete: async () => {
|
||||
try {
|
||||
|
@ -221,7 +221,7 @@ const columns = computed(() => {
|
|||
width: 80,
|
||||
align: 'center',
|
||||
titleAlign: 'center',
|
||||
render: (row, index) => {
|
||||
render: ({ index }, _) => {
|
||||
return index + 1
|
||||
},
|
||||
},
|
||||
|
@ -236,7 +236,7 @@ const columns = computed(() => {
|
|||
width: 80,
|
||||
align: 'center',
|
||||
titleAlign: 'center',
|
||||
render: (row, index) => {
|
||||
render: ({ index }, _) => {
|
||||
if (index + 1 === currentEditRow.no) {
|
||||
// editing row, show edit state
|
||||
return h(NIcon, { size: 16, color: 'red' }, () => h(Edit, { strokeWidth: 5 }))
|
||||
|
@ -250,12 +250,12 @@ const columns = computed(() => {
|
|||
}
|
||||
})
|
||||
|
||||
const rowProps = (row, index) => {
|
||||
const rowProps = ({ index, v }, _) => {
|
||||
return {
|
||||
onClick: () => {
|
||||
// in edit mode, switch edit row by click
|
||||
if (inEdit.value) {
|
||||
startEdit(index + 1, row.v)
|
||||
startEdit(index + 1, v)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import AlignLeft from '@/components/icons/AlignLeft.vue'
|
|||
import AlignCenter from '@/components/icons/AlignCenter.vue'
|
||||
import SwitchButton from '@/components/common/SwitchButton.vue'
|
||||
import { TextAlignType } from '@/consts/text_align_type.js'
|
||||
import { nativeRedisKey } from '@/utils/key_convert.js'
|
||||
|
||||
const i18n = useI18n()
|
||||
const themeVars = useThemeVars()
|
||||
|
@ -104,17 +105,16 @@ const valueColumn = computed(() => ({
|
|||
},
|
||||
filterOptionValue: valueFilterOption.value,
|
||||
className: inEdit.value ? 'clickable' : '',
|
||||
filter: (value, row) => {
|
||||
if (row.dv) {
|
||||
return !!~row.dv.indexOf(value.toString())
|
||||
}
|
||||
return !!~row.v.indexOf(value.toString())
|
||||
filter: (filterValue, row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
return !!~val.indexOf(filterValue.toString())
|
||||
},
|
||||
render: (row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
if (isCode.value) {
|
||||
return h('pre', { class: 'pre-wrap' }, row.dv || row.v)
|
||||
return h('pre', { class: 'pre-wrap' }, val)
|
||||
}
|
||||
return row.dv || row.v
|
||||
return val
|
||||
},
|
||||
}))
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import { TextAlignType } from '@/consts/text_align_type.js'
|
|||
import AlignLeft from '@/components/icons/AlignLeft.vue'
|
||||
import AlignCenter from '@/components/icons/AlignCenter.vue'
|
||||
import SwitchButton from '@/components/common/SwitchButton.vue'
|
||||
import { nativeRedisKey } from '@/utils/key_convert.js'
|
||||
|
||||
const i18n = useI18n()
|
||||
const themeVars = useThemeVars()
|
||||
|
@ -153,18 +154,17 @@ const valueColumn = computed(() => ({
|
|||
},
|
||||
filterOptionValue: valueFilterOption.value,
|
||||
className: inEdit.value ? 'clickable' : '',
|
||||
filter(value, row) {
|
||||
if (row.dv) {
|
||||
return !!~row.dv.indexOf(value.toString())
|
||||
}
|
||||
return !!~row.v.indexOf(value.toString())
|
||||
filter(filterValue, row) {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
return !!~val.indexOf(filterValue.toString())
|
||||
},
|
||||
// sorter: (row1, row2) => row1.value - row2.value,
|
||||
render: (row) => {
|
||||
const val = row.dv || nativeRedisKey(row.v)
|
||||
if (isCode.value) {
|
||||
return h('pre', { class: 'pre-wrap' }, row.dv || row.v)
|
||||
return h('pre', { class: 'pre-wrap' }, val)
|
||||
}
|
||||
return row.dv || row.v
|
||||
return val
|
||||
},
|
||||
}))
|
||||
|
||||
|
|
|
@ -93,7 +93,7 @@ const onDecodeMenu = (key) => {
|
|||
:icon="Code"
|
||||
:options="formatTypeOption"
|
||||
:tooltip="$t('interface.view_as')"
|
||||
:value="props.format"
|
||||
:value="props.format || formatTypes.RAW"
|
||||
@update:value="(f) => onFormatChanged(props.decode, f)" />
|
||||
<n-divider vertical />
|
||||
<dropdown-selector
|
||||
|
@ -103,7 +103,7 @@ const onDecodeMenu = (key) => {
|
|||
:menu-option="decodeMenuOption"
|
||||
:options="decodeTypeOption"
|
||||
:tooltip="$t('interface.decode_with')"
|
||||
:value="props.decode"
|
||||
:value="props.decode || decodeTypes.NONE"
|
||||
@menu="onDecodeMenu"
|
||||
@update:value="(d) => onFormatChanged(d, '')" />
|
||||
</n-space>
|
||||
|
|
|
@ -203,5 +203,5 @@ const onClose = () => {}
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
</style>
|
||||
|
|
|
@ -458,7 +458,7 @@ watch(
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/style';
|
||||
@use '@/styles/style' as style;
|
||||
|
||||
:deep(.toggle-btn) {
|
||||
border-style: solid;
|
||||
|
@ -483,7 +483,7 @@ watch(
|
|||
}
|
||||
|
||||
.nav-pane-bottom {
|
||||
@include top-shadow(0.1);
|
||||
@include style.top-shadow(0.1);
|
||||
color: v-bind('themeVars.iconColor');
|
||||
border-top: v-bind('themeVars.borderColor') 1px solid;
|
||||
}
|
||||
|
|
|
@ -850,7 +850,7 @@ defineExpose({
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.browser-tree-wrapper {
|
||||
height: 100%;
|
||||
|
|
|
@ -295,6 +295,7 @@ const openConnection = async (name) => {
|
|||
tabStore.upsertTab({
|
||||
server: name,
|
||||
db: browserStore.getSelectedDB(name),
|
||||
forceSwitch: true,
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
|
@ -542,7 +543,7 @@ const onCancelOpen = () => {
|
|||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/content';
|
||||
@use '@/styles/content';
|
||||
|
||||
.connection-tree-wrapper {
|
||||
height: 100%;
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
"show_linenum": "显示行号",
|
||||
"show_folding": "启用代码折叠",
|
||||
"drop_text": "允许拖放文本",
|
||||
"links": "支持连接跳转"
|
||||
"links": "支持链接跳转"
|
||||
},
|
||||
"cli": {
|
||||
"name": "命令行",
|
||||
|
|
|
@ -386,9 +386,10 @@ const useBrowserStore = defineStore('browser', {
|
|||
* @param {number} db
|
||||
* @param {string|number[]} [key] null or blank indicate that update tab to display normal content (blank content or server status)
|
||||
* @param {boolean} [clearValue]
|
||||
* @param {boolean} [redirect] redirect to key detail tab
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
async loadKeySummary({ server, db, key, clearValue }) {
|
||||
async loadKeySummary({ server, db, key, clearValue, redirect = true }) {
|
||||
try {
|
||||
const tab = useTabStore()
|
||||
if (!isEmpty(key)) {
|
||||
|
@ -402,7 +403,7 @@ const useBrowserStore = defineStore('browser', {
|
|||
const k = nativeRedisKey(key)
|
||||
const binaryKey = k !== key
|
||||
tab.upsertTab({
|
||||
subTab: BrowserTabType.KeyDetail,
|
||||
subTab: redirect === false ? null : BrowserTabType.KeyDetail,
|
||||
server,
|
||||
db,
|
||||
type,
|
||||
|
@ -492,7 +493,7 @@ const useBrowserStore = defineStore('browser', {
|
|||
if (showLoading) {
|
||||
tab.updateLoading({ server, db, loading: true })
|
||||
}
|
||||
await this.loadKeySummary({ server, db, key, clearValue: true })
|
||||
await this.loadKeySummary({ server, db, key, clearValue: true, redirect: false })
|
||||
await this.loadKeyDetail({
|
||||
server,
|
||||
db,
|
||||
|
@ -2092,7 +2093,7 @@ const useBrowserStore = defineStore('browser', {
|
|||
if (serverInst == null) {
|
||||
serverInst = new RedisServerState({
|
||||
name: server,
|
||||
separator: this.getSeparator(name),
|
||||
separator: this.getSeparator(server),
|
||||
})
|
||||
}
|
||||
return serverInst.getFilter()
|
||||
|
|
|
@ -467,15 +467,27 @@ const usePreferencesStore = defineStore('preferences', {
|
|||
try {
|
||||
const { success, data = {} } = await CheckForUpdate()
|
||||
if (success) {
|
||||
const { version = 'v1.0.0', latest, page_url: pageUrl } = data
|
||||
const {
|
||||
version = 'v1.0.0',
|
||||
latest,
|
||||
download_page: pageUrl = {},
|
||||
description = {},
|
||||
sponsor = [],
|
||||
} = data
|
||||
const downUrl = pageUrl[this.currentLanguage] || pageUrl['en']
|
||||
const descStr = description[this.currentLanguage] || description['en']
|
||||
// save sponsor ad
|
||||
if (!isEmpty(sponsor)) {
|
||||
localStorage.setItem('sponsor_ad', JSON.stringify(sponsor))
|
||||
}
|
||||
if (
|
||||
(manual || latest > this.general.skipVersion) &&
|
||||
(manual || compareVersion(latest, this.general.skipVersion) !== 0) &&
|
||||
compareVersion(latest, version) > 0 &&
|
||||
!isEmpty(pageUrl)
|
||||
!isEmpty(downUrl)
|
||||
) {
|
||||
const notiRef = $notification.show({
|
||||
title: i18nGlobal.t('dialogue.upgrade.title'),
|
||||
content: i18nGlobal.t('dialogue.upgrade.new_version_tip', { ver: latest }),
|
||||
title: `${i18nGlobal.t('dialogue.upgrade.title')} - ${latest}`,
|
||||
content: descStr || i18nGlobal.t('dialogue.upgrade.new_version_tip', { ver: latest }),
|
||||
action: () =>
|
||||
h('div', { class: 'flex-box-h flex-item-expand' }, [
|
||||
h(NSpace, { wrapItem: false }, () => [
|
||||
|
@ -508,13 +520,13 @@ const usePreferencesStore = defineStore('preferences', {
|
|||
type: 'primary',
|
||||
size: 'small',
|
||||
secondary: true,
|
||||
onClick: () => BrowserOpenURL(pageUrl),
|
||||
onClick: () => BrowserOpenURL(downUrl),
|
||||
},
|
||||
() => i18nGlobal.t('dialogue.upgrade.download_now'),
|
||||
),
|
||||
]),
|
||||
]),
|
||||
onPositiveClick: () => BrowserOpenURL(pageUrl),
|
||||
onPositiveClick: () => BrowserOpenURL(downUrl),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ import { defineStore } from 'pinia'
|
|||
import { TabItem } from '@/objects/tabItem.js'
|
||||
import useBrowserStore from 'stores/browser.js'
|
||||
import { i18nGlobal } from '@/utils/i18n.js'
|
||||
import { BrowserTabType } from '@/consts/browser_tab_type.js'
|
||||
|
||||
const useTabStore = defineStore('tab', {
|
||||
/**
|
||||
|
@ -160,6 +161,7 @@ const useTabStore = defineStore('tab', {
|
|||
* @param {boolean} [clearValue]
|
||||
* @param {string} format
|
||||
* @param {string} decode
|
||||
* @param {boolean} forceSwitch
|
||||
* @param {*} [value]
|
||||
*/
|
||||
upsertTab({
|
||||
|
@ -176,9 +178,11 @@ const useTabStore = defineStore('tab', {
|
|||
clearValue,
|
||||
format = '',
|
||||
decode = '',
|
||||
forceSwitch = false,
|
||||
}) {
|
||||
let tabIndex = findIndex(this.tabList, { name: server })
|
||||
if (tabIndex === -1) {
|
||||
subTab = subTab || BrowserTabType.Status
|
||||
const tabItem = new TabItem({
|
||||
name: server,
|
||||
title: server,
|
||||
|
@ -202,7 +206,7 @@ const useTabStore = defineStore('tab', {
|
|||
} else {
|
||||
const tab = this.tabList[tabIndex]
|
||||
tab.blank = false
|
||||
tab.subTab = subTab
|
||||
tab.subTab = subTab || tab.subTab
|
||||
// tab.title = db !== undefined ? `${server}/db${db}` : `${server}`
|
||||
tab.title = server
|
||||
tab.server = server
|
||||
|
@ -219,6 +223,9 @@ const useTabStore = defineStore('tab', {
|
|||
if (clearValue === true) {
|
||||
tab.value = undefined
|
||||
}
|
||||
if (forceSwitch === true) {
|
||||
this._setActivatedIndex(tabIndex, true, subTab)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -289,9 +296,25 @@ const useTabStore = defineStore('tab', {
|
|||
case 'list': // {v:string, dv:[string]}[]
|
||||
tab.value = tab.value || []
|
||||
if (prepend === true) {
|
||||
tab.value = [...entries, ...tab.value]
|
||||
const originList = tab.value
|
||||
const list = []
|
||||
let starIndex = 0
|
||||
for (const entry of entries) {
|
||||
entry.index = starIndex++
|
||||
list.push(entry)
|
||||
}
|
||||
for (const entry of originList) {
|
||||
entry.index = starIndex++
|
||||
list.push(entry)
|
||||
}
|
||||
tab.value = list
|
||||
} else {
|
||||
tab.value.push(...entries)
|
||||
const list = tab.value
|
||||
let starIndex = list.length
|
||||
for (const entry of entries) {
|
||||
entry.index = starIndex++
|
||||
list.push(entry)
|
||||
}
|
||||
}
|
||||
tab.length += size(entries)
|
||||
break
|
||||
|
@ -390,6 +413,7 @@ const useTabStore = defineStore('tab', {
|
|||
for (const entry of entries) {
|
||||
if (size(tab.value) > entry.index) {
|
||||
tab.value[entry.index] = {
|
||||
index: entry.index,
|
||||
v: entry.v,
|
||||
dv: entry.dv,
|
||||
}
|
||||
|
|
|
@ -29,4 +29,11 @@ export default defineConfig({
|
|||
wailsjs: rootPath + 'wailsjs',
|
||||
},
|
||||
},
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
scss: {
|
||||
api: 'modern-compiler',
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
40
go.mod
40
go.mod
|
@ -1,55 +1,53 @@
|
|||
module tinyrdm
|
||||
|
||||
go 1.21
|
||||
go 1.24.0
|
||||
|
||||
require (
|
||||
github.com/adrg/sysfont v0.1.2
|
||||
github.com/andybalholm/brotli v1.1.0
|
||||
github.com/andybalholm/brotli v1.1.1
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/klauspost/compress v1.17.10
|
||||
github.com/pierrec/lz4/v4 v4.1.21
|
||||
github.com/redis/go-redis/v9 v9.6.1
|
||||
github.com/klauspost/compress v1.18.0
|
||||
github.com/pierrec/lz4/v4 v4.1.22
|
||||
github.com/redis/go-redis/v9 v9.7.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.2
|
||||
golang.org/x/crypto v0.27.0
|
||||
golang.org/x/net v0.29.0
|
||||
github.com/wailsapp/wails/v2 v2.10.1
|
||||
golang.org/x/crypto v0.36.0
|
||||
golang.org/x/net v0.37.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/adrg/strutil v0.3.1 // indirect
|
||||
github.com/adrg/xdg v0.4.0 // indirect
|
||||
github.com/adrg/xdg v0.5.3 // indirect
|
||||
github.com/bep/debounce v1.2.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/labstack/echo/v4 v4.11.4 // indirect
|
||||
github.com/labstack/echo/v4 v4.13.3 // indirect
|
||||
github.com/labstack/gommon v0.4.2 // indirect
|
||||
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
|
||||
github.com/leaanthony/gosod v1.0.3 // indirect
|
||||
github.com/leaanthony/gosod v1.0.4 // indirect
|
||||
github.com/leaanthony/slicer v1.6.0 // indirect
|
||||
github.com/leaanthony/u v1.1.1 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
github.com/samber/lo v1.39.0 // indirect
|
||||
github.com/tkrajina/go-reflector v0.5.6 // indirect
|
||||
github.com/samber/lo v1.49.1 // indirect
|
||||
github.com/tkrajina/go-reflector v0.5.8 // indirect
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
github.com/valyala/fasttemplate v1.2.2 // indirect
|
||||
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
||||
github.com/wailsapp/go-webview2 v1.0.16 // indirect
|
||||
github.com/wailsapp/go-webview2 v1.0.19 // indirect
|
||||
github.com/wailsapp/mimetype v1.4.1 // indirect
|
||||
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect
|
||||
golang.org/x/sys v0.25.0 // indirect
|
||||
golang.org/x/text v0.18.0 // indirect
|
||||
golang.org/x/sys v0.31.0 // indirect
|
||||
golang.org/x/text v0.23.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.2 => ~/go/pkg/mod
|
||||
// replace github.com/wailsapp/wails/v2 v2.10.1 => ~/go/pkg/mod
|
||||
|
|
97
go.sum
97
go.sum
|
@ -4,19 +4,18 @@ github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6M
|
|||
github.com/adrg/sysfont v0.1.2 h1:MSU3KREM4RhsQ+7QgH7wPEPTgAgBIz0Hw6Nd4u7QgjE=
|
||||
github.com/adrg/sysfont v0.1.2/go.mod h1:6d3l7/BSjX9VaeXWJt9fcrftFaD/t7l11xgSywCPZGk=
|
||||
github.com/adrg/xdg v0.3.0/go.mod h1:7I2hH/IT30IsupOpKZ5ue7/qNi3CoKzD6tL3HwpaRMQ=
|
||||
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
|
||||
github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=
|
||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
|
||||
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
|
||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
|
||||
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -30,62 +29,61 @@ 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.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0=
|
||||
github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
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=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8=
|
||||
github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8=
|
||||
github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY=
|
||||
github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g=
|
||||
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
|
||||
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
|
||||
github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=
|
||||
github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
|
||||
github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A=
|
||||
github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
|
||||
github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=
|
||||
github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
|
||||
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||
github.com/leaanthony/gosod v1.0.4 h1:YLAbVyd591MRffDgxUOU1NwLhT9T1/YiwjKZpkNFeaI=
|
||||
github.com/leaanthony/gosod v1.0.4/go.mod h1:GKuIL0zzPj3O1SdWQOdgURSuhkF+Urizzxh26t9f1cw=
|
||||
github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js=
|
||||
github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8=
|
||||
github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M=
|
||||
github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
|
||||
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
||||
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
|
||||
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
||||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||
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.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
|
||||
github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
|
||||
github.com/redis/go-redis/v9 v9.7.1 h1:4LhKRCIduqXqtvCUlaq9c8bdHOkICjDMrr1+Zb3osAc=
|
||||
github.com/redis/go-redis/v9 v9.7.1/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
||||
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=
|
||||
github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA=
|
||||
github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
|
||||
github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew=
|
||||
github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
|
||||
github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/tkrajina/go-reflector v0.5.8 h1:yPADHrwmUbMq4RGEyaOUpz2H90sRsETNVpjzo3DLVQQ=
|
||||
github.com/tkrajina/go-reflector v0.5.8/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
|
||||
|
@ -96,34 +94,41 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh
|
|||
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
|
||||
github.com/vrischmann/userdir v0.0.0-20151206171402-20f291cebd68 h1:Ah2/69Z24rwD6OByyOdpJDmttftz0FTF8Q4QZ/SF1E4=
|
||||
github.com/vrischmann/userdir v0.0.0-20151206171402-20f291cebd68/go.mod h1:EqKqAeKddSL9XSGnfXd/7iLncccKhR16HBKVva7ENw8=
|
||||
github.com/wailsapp/go-webview2 v1.0.16 h1:wffnvnkkLvhRex/aOrA3R7FP7rkvOqL/bir1br7BekU=
|
||||
github.com/wailsapp/go-webview2 v1.0.16/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo=
|
||||
github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU=
|
||||
github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc=
|
||||
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.2 h1:Xb5YRTos1w5N7DTMyYegWaGukCP2fIaX9WF21kPPF2k=
|
||||
github.com/wailsapp/wails/v2 v2.9.2/go.mod h1:uehvlCwJSFcBq7rMCGfk4rxca67QQGsbg5Nm4m9UnBs=
|
||||
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
||||
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
|
||||
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=
|
||||
github.com/wailsapp/wails/v2 v2.10.1 h1:QWHvWMXII2nI/nXz77gpPG8P3ehl6zKe+u4su5BWIns=
|
||||
github.com/wailsapp/wails/v2 v2.10.1/go.mod h1:zrebnFV6MQf9kx8HI4iAv63vsR5v67oS7GTEZ7Pz1TY=
|
||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
|
||||
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
|
||||
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
|
||||
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
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=
|
||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
|
||||
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
|
||||
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
|
||||
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||
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